pax_global_header00006660000000000000000000000064130315460150014510gustar00rootroot0000000000000052 comment=807f6f3b396a1722da38d4670849b3999e41a173 pplacer-1.1.alpha19/000077500000000000000000000000001303154601500142355ustar00rootroot00000000000000pplacer-1.1.alpha19/.gitignore000066400000000000000000000004111303154601500162210ustar00rootroot00000000000000/_build TAGS *.mltop *.top *.native *.swp *.byte *.annot .ocamlinit .toplevel_history .latest-upload top_tests bin common_src/install_common_pprs.txt common_src/version.ml makefile docs/generated_rst/ docs/_build/doctrees/ wiki Session.vim _builds _projects _steps pplacer-1.1.alpha19/.gitmodules000066400000000000000000000001411303154601500164060ustar00rootroot00000000000000[submodule "docs/_build/html"] path = docs/_build/html url = git@github.com:matsen/pplacer.git pplacer-1.1.alpha19/CHANGELOG000066400000000000000000000535151303154601500154600ustar00rootroot000000000000001.1.alpha19 ----------- * Closed GH-352: Showing percent identity in the CSV file. 1.1.alpha18 ----------- * Closed GH-346: Adding proper support for ambigious amino acid codes. 1.1.alpha17 ----------- * Closed GH-340: "malformed row in jplace" after pplacer warning "computed function value is infinite or NaN". * Closed GH-339: Better error message concerning strange mass. 1.1.alpha16 ----------- * Closed GH-334: multiclass_concat.py modifies placement database such that classif_table.py returns accurate tallies. 1.1.alpha15 ----------- * Closed GH-320: Now compiles fine with Batteries 2. * Closed GH-327: Ignore sequences that aren't in both jplace and sequence files. * Closed GH-312: An improved script for managing classification results, called ``classif_table.py``; ``classif_rect.py`` is now deprecated. * Closed GH-315: support ``rppr info`` on reference packages lacking a taxonomy * Closed GH-316: pplacer warns rather than fails when an alignment looks like nucleotides * Closed GH-317: ``pplacer --write-masked-out`` respects ``--out-dir`` * Closed GH-318: Apply alignment mask on a per-placement basis * Closed GH-319: ``pplacer --write-pre-masked`` no longer exits after writing mask. * Closed GH-322: Moved to Batteries version 2.1.0. Supports OCaml 4.01.0 * Closed GH-323: ``pplacer``, ``guppy``, and ``rppr`` support gzip-compressed alignment and ``.jplace`` files. * Closed GH-324: ``deduplicate_sequences.py`` supports gzip-compressed FASTA files. 1.1.alpha14 ----------- * Closed GH-181: Added ``guppy indep_c``; added ``--leaf-values`` to ``guppy mft``. * Closed GH-215: Added ``pca_for_qiime.py`` and ``extract_taxonomy_from_biom.py``; changed guppy and rppr to allow BIOM files to be passed as arguments where placefiles are allowed. * Closed GH-241: On the NBC classifier of ``guppy classify``: renamed ``--target-rank`` to ``--nbc-rank``; added ``--nbc-rank auto``. * Closed GH-248: Added premasking by default to the NBC classifier of ``guppy classify``; correspondingly added ``--no-pre-mask``. * Closed GH-250: Completely revamped classification. * Closed GH-251: Added the hybrid5 classifier. * Closed GH-256: Added ``--mmap-file`` to pplacer; changed ``--pretend`` in pplacer to show the amount of memory which would be allocated. * Closed GH-259: Added ``guppy mcl`` and a ``--mcl`` flag to ``guppy compress``. * Closed GH-260: Added ``rooted_pd`` to ``guppy fpd``; Added a ``--variance`` flag to ``guppy rarefact``. * Closed GH-261: Added ``rppr convex_taxids``. * Closed GH-262: Added ``--as-mass`` to ``guppy redup``; updated ``sort_placefile.py`` for the new placefile format; fixed pplacer to better deal with internal edges on a tree with a branch length of 0. * Closed GH-263: Fixed a bug that could sometimes cause failures in ``rppr min_adcl`` with the PAM algorithm. * Closed GH-265: Fixed a bug that could cometimes cause ``rppr reroot`` to return a suboptimal rooting. * Closed GH-266: Adding ``map_ratio`` and ``map_overlap`` columns to ``guppy to_csv``. * Closed GH-267: Added a ``leaf_count`` column to ``rppr convex_taxids``. * Closed GH-268: Merged various minor fixes. * Closed GH-273: Fix convexify for multifurcating trees * Closed GH-274: Added ``--weight-as-count`` to ``guppy rarefact``. * Closed GH-276: Added ``-k`` to ``guppy rarefact``. * Closed GH-277: Added ``--weight-as-count`` to ``guppy rarefy``. * Closed GH-278: Changed ``guppy rarefact`` to allow multiple placefiles to be passed instead of just one. * Closed GH-282: Added a ``--inflation`` flag to ``guppy mcl`` and ``guppy compress``. * Closed GH-286: Changed pplacer's ``--mmap-file`` to accept a path to either a directory or a file. * Closed GH-287: Added a more informative error message for the case of an input alignment containing some, but not all reference sequence names. * Closed GH-288: Added ``guppy placemat`` * Closed GH-290: Random tie breaking in NBC classifier * Closed GH-291: Added qD(T) alpha diversity measure from Chao et. al., 2010 (doi:10.1098/rstb.2010.0272) * Closed GH-293: Switched build system to use OPAM * Closed GH-294: Added ``--unitize`` option to ``guppy squash`` * Closed GH-297: Support multiprocessing during squash cluster bootstrapping * Closed GH-298: Faster upper-limit finding during integration * Closed GH-299: Fix NaN likelihoods for empirical frequencies + unseen state * Closed GH-303: Updated Batteries dependency to version 2.0.0 * Closed GH-305: Eliminate compilation warnings from CDD * Closed GH-306: Random tie breaking is default in NBC * Closed GH-307: Renamed ``--kappa`` to ``--theta``, ``awpd`` to ``bwpd`` in ``guppy fpd`` * Closed GH-309: Support overlap minimization (SOM) added to ``guppy epca`` (see also GH-221) 1.1.alpha13 ----------- * Fixed a bug where pplacer would sometimes fail abruptly with a Child_error of EBADF on close(2). [rc2] * Added missing ``-o`` and related flags to ``guppy to_csv``. [rc3] * Fixed minor errors in the documentation [r2] * Closed GH-216: Added ``guppy trim`` and ``guppy check``. * Closed GH-225: Added ``rppr vorotree``. * Closed GH-235: Added ``--rep-edges`` flag for the splitify subcommands. * Closed GH-237: Added a multiplicity column to ``guppy diplac``. * Closed GH-238: Added ``--epsilon`` for splitify commands to filter constant edges out of the resulting splitify matrices. * Closed GH-239: Added the ``pam`` algorithm to voronoi commands; cleaned up voronoi full algorithm and implementation. * Closed GH-240: Added a ``-o`` flag for pplacer. * Closed GH-242: Renamed ECLD to ADCL; added --max-adcl to voronoi commands. * Closed GH-243: Updated ``rppr reroot`` so it can run on reference packages which have unannotated sequences. * Closed GH-244: Updated ``rppr infer`` to handle sequences which could not be reasonably placed anywhere on the tree. * Closed GH-245: Updated code to allow refpkgs to be passed as .zip files as well as directories. * Closed GH-246: Added --always-include to voronoi commands. * Closed GH-247: Added ``guppy unifrac``. * Closed GH-249: Added ``guppy rarefy``. * Closed GH-252: Added ``--all-alternates`` to ``rppr convexify``. * Closed GH-253: Added ``--no-collapse`` to ``guppy diplac``. * Closed GH-255: Added ``guppy to_csv``. * Closed GH-257: Renamed ``rppr voronoi`` to ``rppr min_adcl``, ``rppr vorotree`` to ``rppr min_adcl_tree``, and ``guppy diplac`` to ``guppy adcl``. Added ``--seed`` to ``rppr min_adcl`` and ``rppr min_adcl_tree``. * Closed GH-280: Fixed a bug in which pplacer would fail if passed -t and -s flags without also passing a -c or -r flag. 1.1.alpha12 ----------- * Added ``guppy to_rdp`` and ``guppy classify_rdp``. * Closed GH-113: Updated the ``best_classification`` and ``multiclass`` SQL views; correspondingly changed the flags to ``rppr prep_db``; added the ``placement_evidence`` table for bayes classification. * Closed GH-183: Added documentation for more functions. * Closed GH-189: Added ``guppy pentropy``. * Closed GH-191: Added -m to ``guppy redup``; bumped the jplace format version to 3 with the ability to give each name for a pquery a different mass. * Closed GH-192: Added ``rppr infer``. * Closed GH-193: Added ``rppr reclass``. * Closed GH-194: Added a ``mass`` column to ``placement_names`` to parallel new features in the jplace format. * Closed GH-195: Added a --groups flag to pplacer for placing metagenomic sequences onto trees built from very wide alignments. * Closed GH-196: Added code to pplacer to better handle errors raised when calling fork(2). * Closed GH-198: Added progress reporting code to ``guppy compress``. * Closed GH-199: Renamed ``guppy pentropy`` to ``guppy entropy``; added quadratic entropy calculation. * Closed GH-200: Added --discard-below to ``guppy {islands,compress}``. * Closed GH-201: Added a setup.py file to the scripts directory. * Closed GH-202: Added ``rppr prepsim``; added --include-pendant to ``guppy diplac``. * Closed GH-204: Added more columns to ``rppr reclass``. * Closed GH-205: Added ``guppy error``. * Closed GH-206: Updated some pplacer documentation. * Closed GH-207: Added CSV output to ``guppy edpl``. * Closed GH-208: Fixed the -o flag to reflect the actual file written to for ``guppy {sing,tog,edpl}``. * Closed GH-209: Fixed a bug preventing Gcat_model refinement if the supplied alignment had a different number of sites from the refpkg; added --always-refine to pplacer. * Closed GH-210: Merged ``guppy {pd,wpd,entropy}`` into ``guppy fpd``. * Closed GH-212: Changed parsing error messages to be more specific. * Closed GH-213: Added PyNAST support to refpkg_align.py. * Closed GH-214: Added ``guppy ograph``. * Closed GH-218: Added --split-csv to ``guppy merge``. * Closed GH-219: Fixed some guppy commands which needed a zero root branch length. * Closed GH-220: Added error messages for some exceptions; fixed ``guppy rarefact``. * Closed GH-222: Added a -c flag to ``guppy bary``. * Closed GH-236: Fixed support for numeric leaf names when writing out XML. 1.1.alpha11 ----------- * Fixed a bug with parsing MAP identity from a jplace file. * Fixed a bug that occurred sometimes when running ``rppr convexify`` on a tree where not every leaf had a corresponding tax_id at a particular rank. * Fixed a bug with fasttree placements which caused failure when the site categories had to be calculated (ie. when using a combined reference + query alignment) * Changed versions to be parsed only out of git tags. * Closed GH-42: Added --edpl flag to ``guppy fat`` for EDPL coloring in fat trees. * Closed GH-146: Added an --unweighted flag to ``guppy pca``. * Closed GH-168: Changed guppy and rppr to list the subcommands in --help; reformatted the options flags to be more readable. * Closed GH-169: Fixed all commands that work on reference packages to use the -c flag to specify the reference package. * Closed GH-176: Fixed ``rppr reroot`` to handle cases where not all tax_ids are specified under the rank the rerooting is happening at. * Closed GH-177: Added --mass-gt and --mass-le flags to ``guppy filter``. * Closed GH-178: Fixed ``guppy compress`` to add a zero root branch length. * Closed GH-179: Changed the JSON emitter to be able to represent a wider range of floats. * Closed GH-182: Changed 'weighted' to 'spread' and 'unweighted' to 'point' across all the guppy and rppr commands. * Closed GH-184: Added a placement_median_identites table for guppy classify. * Closed GH-188: Added support for a reference package to be able to specify that some reference sequences are unclassified. 1.1.alpha10 ----------- * Closed GH-126: Split Glv/Model into Gmix_model and Gcat_model with the option of adding more models to pplacer later. * Closed GH-154: Added ``guppy islands``. * Closed GH-156: Added functionality for calculating multiple KR distances with only one tree traversal. * Closed GH-157: Added ``guppy compress``. * Closed GH-162: Added fig ranking to pplacer. * Closed GH-163: Added a --node-numbers flag to every command that emits a phyloxml tree which adds the tree's node numbers to the phyloxml output as bootstrap values. * Closed GH-172: Switched from using xml-light to xmlm. 1.1.alpha09 ----------- * Fixed a bug that was making classifications appear too specific when the placement was on the edge just proximal to an MRCA. * Fixed a bug wherein the Newick parser would add a '.' to the end of leaf names if the name was an integer. * In fixing a bug, made ``guppy diplac`` only emit the first name in a pquery in its results. * Fixed a bug that caused the trailing } in a JSON file to be omitted when the file was large enough. * Added a ``multiclass`` view and associated parameters to ``rppr prep_db``. * Fixed a bug where sometimes placements that fell too close to the root would vanish with the --map-identity flag on. * Fixed identity to give 0% sequence identity in the case of no overlap between sequences. * Fixed a bug by flushing all output buffers before forking, so that the same data isn't written multiple times. * Fixed a bug in pplacer in which it wouldn't write the original reference tree when creating a placefile. * Fixed some issues with phyloxml generation. * Closed GH-27: Reorganized functions that operate on alignments. * Closed GH-67: Added ``guppy wpd``. * Closed GH-72: Added new features to ``rppr convexify`` and fixed the implementation of the convexify algorithm, as it cut too many leaves in some corner cases. * Closed GH-75: Changed mass maps to use records types instead of tuples. * Closed GH-76: Added a check in ``guppy classify`` to ensure that the sqlite database has been properly initialized. * Closed GH-78: Added an --average flag to ``guppy fat``. * Closed GH-81: Removed old code that was deprecated by batteries; changed most code to be using batteries. * Closed GH-82: Merged the ``pick`` branch into dev. * Closed GH-84: Renamed .json to .jplace for new-format placefiles. * Closed GH-85: Added better error messages for potential premasking failures. * Closed GH-86: Dropped support for older versions of the reference package format. * Closed GH-88: Improved handling very small alphas in pplacer, working around a problem with the GSL that wasn't allowing us to invert the CDF for the gamma distribution. * Closed GH-89: Fixed some bugs in the convexify algorithm. * Closed GH-90: Added an error message for if pplacer is invoked with no arguments. * Closed GH-91: Added more documentation to .mli files. * Closed GH-92: Added searching and alignment scripts. * Closed GH-94: Improved the leaf selection criteria in ``rppr voronoi``. * Closed GH-96: Now using colors from colorbrewer2.org for heat. * Closed GH-98: Added a --map-identity flag to pplacer. * Closed GH-99: Added more examples for guppy batchfiles. * Closed GH-101: Added virtual placefiles to guppy batchfiles. * Closed GH-103: Added batteries as a dependency. * Closed GH-104: Added a naive reference implementation of convexify, accessible with a --naive flag. * Closed GH-105: Added parameter substitution to guppy batchfiles. * Closed GH-108: Added more data from jplace files into the taxtable schema; added a way to change the cutoff for best_classifications. * Closed GH-109: Added a ``rppr info`` subcommand. * Closed GH-110: Added a --no-early flag to ``rppr convexify``. * Closed GH-111: Added a script to update reference packages to version 1.1. * Closed GH-112: Improved some of pplacer's error messages. * Closed GH-114: Changed MAP identity in placefiles to be stored flat instead of nested. * Closed GH-115: Updated the documentation to reflect changes to the SQL schema in ``rppr prep_db``. * Closed GH-116: Added --keep-at-most and --keep-factor flags to pplacer. * Closed GH-117: Added the output of ``git describe`` to --version output. * Closed Gh-118: Added a --quiet flag to guppy and rppr. * Closed GH-119: Added a ``rppr reroot`` subcommand. * Closed GH-120: Added a --rank-limit flag to ``rppr convexify``. * Closed GH-122: Renamed ``rppr taxtable`` to ``rppr prep_db``. * Closed GH-124: Rewrote the Newick parser. * Closed GH-125: Added a --rooted flag to ``rppr convexify``. * Closed GH-128: Added informative priors to pplacer integration. * Closed GH-129: Added the ability for ``rppr convexify`` to convexify a tree not in a reference package. * Closed GH-130: Added ``guppy pd``. * Closed GH-131: Changed pplacer to set some defaults with the -p flag. * Closed GH-133: Added edge painting classification by default to pplacer and a corresponding --painted flag to ``rppr ref_tree``. * Re-closed GH-133: Added checks for the case when not all ranks are represented by some sequence in the reference package. * Closed GH-135: Generally improved error messages in pplacer, guppy, and rppr. * Closed GH-138: Removed the --transform flag from everything except ``guppy mft``; removed the --unweighted flag from commands which don't respect it. * Closed GH-139: Added a check to pplacer to ensure all query sequences have at least some overlap with some reference sequence. * Closed GH-140: Allowed pplacer to be run with -t and without -r or -c. * Closed GH-141: Removed ``compare_placements.py``; added ``check_placements.py``; documented the rest of the python scripts. * Closed GH-143: Changed the --leaves argument to ``rppr voronoi`` to specify the number of leaves to keep in the tree instead of the number of leaves to prune. * Closed GH-144: Changed pplacer to explicitly disallow unplaced sequences from being written out; changed ``best_classifications`` and ``multiclass`` views to yield NULL for rows where no placements match all the criteria. * Closed GH-149: Updated the jplace version to 2; changed the Newick parser and emitter to allow for the new format of trees with edge numbers specified in braces instead of brackets. * Closed GH-153: Changed ``guppy mft`` to not squash name lists to mass by default. * Closed GH-155: Changed pplacer to always check for invalid bases when pre-masking sequences. * Closed GH-159: Updated to use the v2 batteries API. * Closed GH-164: Fixed some bugs related to various APIs not knowing how to deal with node labels on non-leaves. * Closed GH-167: Fixed an issue where ``rppr reroot`` wasn't updating the bark of trees correctly. 1.1.alpha08 ----------- * Closed GH-46: Added a --timing flag to pplacer to show where time was spent during placements. * Closed GH-47: Added unit tests for gaussian kr distance. * Closed GH-49: Added a more informative error message to pplacer if reference sequences occur multiple times in a query file. * Closed GH-52: Fixed padding in ``guppy squash``. * Closed GH-58: Improved navigation for the documentation on guppy commands. * Closed GH-59: Improved documentation for guppy commands using sqlite. * Closed GH-60: Improved documentation for ``guppy classify``. * Closed GH-65: Released alpha08. * Closed GH-66: Added a FAQ to the documentation. * Closed GH-68: Changed ``guppy info`` to show multiplicity. * Closed GH-69: Changed ``guppy tog`` to use polytomy instead of a _ delimiter joining sequence names. * Closed GH-70: Added documentation for how to compile pplacer. * Closed GH-73: Added a pre-masking feature to cut out irrelevant columns of the alignment. * Closed GH-74: Improved how pplacer dedupes sequences before a placerun. * Added a script to sort placefiles for easier visual diffs. * Added more informative error messages when the length of the query alignment and reference alignment don't match. * ``guppy edpl`` now calculates the EDPL (expected distance between placement locations) for placements 1.1.alpha07 ----------- * Fixed a serious issue with any command that used a ``--prefix`` flag. 1.1.alpha06 ----------- * Closed GH-20: efficiency of kr_distance evaluated and approved. * Closed GH-44: improved sqlite3 support in guppy. * Closed GH-45: better consistency of output flags across all guppy commands. * Closed GH-48: better error reporting when loading json placefiles. * Closed GH-50: fixed the output of ``guppy classify``. * Closed GH-51: only parsing the first word as a sequence name in a fasta file. * Renamed the ``--normal`` flag for ``guppy kr`` to ``--gaussian`` to avoid confusion with normalization. * Only one shuffle at a time is now stored in memory (big savings, obviously). * Fixed bug that was throwing off ``guppy kr`` shuffling significance estimation. * ``guppy pca`` now defaults to scaling eigenvalues to percent variance; now has a --raw-eval flag to specify otherwise. * Fixed all of the sequence parsers to be tail-recursive, so parsing large files no longer causes segfaults. * Added a ``guppy redup`` command for re-adding duplicate sequences to placefiles generated from deduplicated sequence files. 1.1.alpha05 ----------- * Closed GH-11: options for the tree-generating subcommands are more uniform. * Closed GH-22: added more unit tests for ``guppy kr``. * Closed GH-32: using power iteration rather than full eigendecomposition. Leads to 60x speedup for PCA on demo data. * Closed GH-35: added a remark in the documentation about multiple comparison. * Closed GH-41: added docs for the json placefile format. * Added ``guppy splitify``. Spits out differences of mass across splits. * Changed default behavior of ``guppy kr`` to not normalize, and correspondingly added in a ``--normalize`` command line flag. * Improved documentation. * Moved ``guppy heat`` to ``guppy kr_heat``. * The ``guppy heat`` subcommand now maps an arbitrary vector to a phylogenetic tree contained in a reference package. * Removed redundant ``classic`` subcommand from guppy. * Changed ``guppy round`` to use the new placefile format. * Added support for posterior probabilities in json placefiles. * Removed csv and old-placefile-format generation from pplacer. * Added the ability to run pplacer in multiple processes in parallel with the -j flag. * Removed friend-finding from pplacer, as it was superseded by some of the multiprocessing code. 1.1.alpha03 to 1.1.alpha04 -------------------------- * Closed GH-12: removed Placement.classif, and renamed Placement.contain_classif to Placement.classif. * Closed GH-29: added ``guppy merge`` to merge multiple placefiles. * Closed GH-30: accepting \r, \n, and \r\n as delimiters everywhere in pplacer and guppy. * Closed GH-36: added ``guppy {classic,tog,sing,filter}``. The former three were originally a part of placeviz, and the lattermost filters placefiles to only a specific subset of their placements. * Closed GH-37: added a trailing newline to the end of json files. * Closed GH-38: added this changelog. * Bugfix in ``guppy classify``. From the commit: Previously, a file was being opened and closed for every pquery in every placerun. This resulted in only the last pquery being classified and written out. Now only one file is being opened for each placerun. pplacer-1.1.alpha19/COPYING000066400000000000000000001045131303154601500152740ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . pplacer-1.1.alpha19/Makefile000066400000000000000000000030421303154601500156740ustar00rootroot00000000000000RELEASE=pplacer guppy rppr DEBUG=pplacer.d guppy.d rppr.d DESCRIPT:=pplacer-$(shell uname)-$(shell git describe --tags) all: $(RELEASE) debug: $(DEBUG) # For OPAM OCAML_TOPLEVEL_PATH = $$OCAML_TOPLEVEL_PATH ifneq ($(OCAML_TOPLEVEL_PATH),) TOPLEVEL_FLAGS=-I ${OCAML_TOPLEVEL_PATH} endif $(RELEASE): if [ ! -e bin ]; then mkdir bin; fi make $@.native cp `readlink $@.native` bin/$@ rm $@.native %.native %.byte %.p.native: ocamlbuild $@ clean: rm -rf bin rm -f tests.native ocamlbuild -clean rm -f *.mltop %.d: %.d.byte if [ ! -e bin ]; then mkdir bin; fi cp "$<" "bin/$@" %.top: %.byte find _build -name '*.cmo' -print0 | xargs -0I% basename % .cmo > $*.mltop ocamlbuild $@ rm $*.mltop test: tests.native ./tests.native %.runtop: %.top rlwrap ./$*.top `find _build -name "*.cmi" | xargs -n1 dirname | sort -u | sed -e 's/^/-I /'` $(TOPLEVEL_FLAGS) runcaml: rlwrap ocaml tags: otags `find . -name "*.ml" | grep -v "_build"` docs: gen_docs.native ./gen_docs.native make -C docs html touch docs/_build/html/.nojekyll pplacer-linux.zip: $(RELEASE) rm -rf $(DESCRIPT) mkdir $(DESCRIPT) cp -r bin/* scripts $(DESCRIPT) zip -r pplacer-linux.zip $(DESCRIPT)/* rm -rf $(DESCRIPT) zip: pplacer-linux.zip .latest-upload: pplacer-linux.zip curl --upload-file ./pplacer-linux.zip https://transfer.sh/$(DESCRIPT).zip > .latest-upload upload: .latest-upload curl -X POST --data-urlencode 'payload={"text": "Latest pplacer uploaded to '$(shell cat .latest-upload)'"}' $(SLACK_URL) .PHONY: $(RELEASE) clean runcaml tags test docs zip upload pplacer-1.1.alpha19/README.md000066400000000000000000000013321303154601500155130ustar00rootroot00000000000000# pplacer suite of programs [![wercker status](https://app.wercker.com/status/b3fe580ff3a62d0a69c6da264c03ba81/s/master "wercker status")](https://app.wercker.com/project/bykey/b3fe580ff3a62d0a69c6da264c03ba81) `pplacer` places reads on a phylogenetic tree. `guppy` (Grand Unified Phylogenetic Placement Yanalyzer) yanalyzes them. `rppr` is a helpful tool for working with reference packages. * [project webpage (with compiled binaries)](http://matsen.fhcrc.org/pplacer/) * [documentation](http://matsen.github.com/pplacer/) * [tutorial](http://fhcrc.github.com/microbiome-demo/) * [compilation instructions](http://matsen.github.com/pplacer/compiling.html) `pplacer`, `guppy`, and `rppr` are free software under the GPL v3. pplacer-1.1.alpha19/_tags000066400000000000000000000006671303154601500152660ustar00rootroot00000000000000<{common,pplacer,json,pdprune,cdd,pam}_src>: include : include : include : pkg_oUnit : pkg_oUnit <**/*.ml>: warn_Z, annot <*/*.annot>: precious <**/*.{ml,mli,byte,native,top,p.native,d.byte}>: c_pam, c_cdd, c_pplacer, pkg_batteries, pkg_threads, pkg_unix, pkg_bigarray, pkg_gsl, pkg_csv, pkg_xmlm, pkg_str, pkg_sqlite3, pkg_zip, pkg_mcl pplacer-1.1.alpha19/cdd_src/000077500000000000000000000000001303154601500156365ustar00rootroot00000000000000pplacer-1.1.alpha19/cdd_src/caml_cdd.c000066400000000000000000000022621303154601500175320ustar00rootroot00000000000000#include #include #include #include #include #include #include #define Val_none Val_int(0) value Val_some(value v) { CAMLparam1(v); CAMLlocal1(some); some = caml_alloc_small(1, 0); Field(some, 0) = v; CAMLreturn(some); } #define Some_val(v) Field(v,0) double *extreme_vertices(const double *, const size_t, const size_t, float, float, size_t *); CAMLprim value caml_extreme_vertices(value vertices, value lower_bound, value upper_bound) { CAMLparam3(vertices, lower_bound, upper_bound); double *vert_arr = Data_bigarray_val(vertices); int nrows = (Bigarray_val(vertices)->dim[0]); int ncols = (Bigarray_val(vertices)->dim[1]); size_t res_size; double *res = extreme_vertices(vert_arr, nrows, ncols, Double_val(lower_bound), Double_val(upper_bound), &res_size); if (res == NULL) CAMLreturn(Val_none); else { value res_bigarr = alloc_bigarray_dims(BIGARRAY_FLOAT64 | BIGARRAY_C_LAYOUT, 2, NULL, res_size / 3, 3); memcpy(Data_bigarray_val(res_bigarr), res, sizeof *res * res_size); free(res); CAMLreturn(Val_some(res_bigarr)); } } pplacer-1.1.alpha19/cdd_src/cdd.h000066400000000000000000000327071303154601500165520ustar00rootroot00000000000000/* cdd.h: Header file for cddlib.c written by Komei Fukuda, fukuda@ifor.math.ethz.ch Version 0.94f, February 7, 2008 */ /* cddlib.c : C-Implementation of the double description method for computing all vertices and extreme rays of the polyhedron P= {x : b - A x >= 0}. Please read COPYING (GNU General Public Licence) and the manual cddlibman.tex for detail. */ #ifndef __CDD_H #define __CDD_H #endif /* __CDD_H */ #ifndef __CDDMP_H #include "cddmp.h" #endif /* __CDDMP_H */ #ifndef __CDDTYPES_H #include "cddtypes.h" #endif /* __CDDTYPES_H */ #ifdef GMPRATIONAL #ifndef __CDD_HF #include "cdd_f.h" #endif #endif /* GLOBAL CONSTANTS and STATISTICS VARIABLES (to be set by dd_set_global_constants() */ extern mytype dd_zero; extern mytype dd_one; extern mytype dd_purezero; extern mytype dd_minuszero; extern mytype dd_minusone; extern time_t dd_statStartTime; /* cddlib starting time */ extern long dd_statBApivots; /* basis finding pivots */ extern long dd_statCCpivots; /* criss-cross pivots */ extern long dd_statDS1pivots; /* phase 1 pivots */ extern long dd_statDS2pivots; /* phase 2 pivots */ extern long dd_statACpivots; /* anticycling (cc) pivots */ #ifdef GMPRATIONAL extern long dd_statBSpivots; /* basis status checking pivots */ #endif extern dd_LPSolverType dd_choiceLPSolverDefault; /* Default LP solver Algorithm */ extern dd_LPSolverType dd_choiceRedcheckAlgorithm; /* Redundancy Checking Algorithm */ extern dd_boolean dd_choiceLexicoPivotQ; /* whether to use the lexicographic pivot */ /* to be used to avoid creating temporary spaces for mytype */ #define dd_almostzero 1.0E-7 /* ---------- FUNCTIONS MEANT TO BE PUBLIC ---------- */ #if defined(__cplusplus) extern "C" { #endif /* basic matrix manipulations */ void dd_InitializeArow(dd_colrange,dd_Arow *); void dd_InitializeAmatrix(dd_rowrange,dd_colrange,dd_Amatrix *); void dd_InitializeBmatrix(dd_colrange, dd_Bmatrix *); dd_SetFamilyPtr dd_CreateSetFamily(dd_bigrange,dd_bigrange); void dd_FreeSetFamily(dd_SetFamilyPtr); dd_MatrixPtr dd_CreateMatrix(dd_rowrange,dd_colrange); void dd_FreeAmatrix(dd_rowrange,dd_colrange,dd_Amatrix); void dd_FreeArow(dd_colrange, dd_Arow); void dd_FreeBmatrix(dd_colrange,dd_Bmatrix); void dd_FreeDDMemory(dd_PolyhedraPtr); void dd_FreePolyhedra(dd_PolyhedraPtr); void dd_FreeMatrix(dd_MatrixPtr); void dd_SetToIdentity(dd_colrange, dd_Bmatrix); /* sign recognitions */ dd_boolean dd_Nonnegative(mytype); dd_boolean dd_Nonpositive(mytype); dd_boolean dd_Positive(mytype); dd_boolean dd_Negative(mytype); dd_boolean dd_EqualToZero(mytype); dd_boolean dd_Nonzero(mytype); dd_boolean dd_Equal(mytype,mytype); dd_boolean dd_Larger(mytype,mytype); dd_boolean dd_Smaller(mytype,mytype); void dd_abs(mytype, mytype); void dd_LinearComb(mytype, mytype, mytype, mytype, mytype); void dd_InnerProduct(mytype, dd_colrange, dd_Arow, dd_Arow); /* major cddlib operations */ dd_MatrixPtr dd_CopyInput(dd_PolyhedraPtr); dd_MatrixPtr dd_CopyOutput(dd_PolyhedraPtr); dd_MatrixPtr dd_CopyInequalities(dd_PolyhedraPtr); dd_MatrixPtr dd_CopyGenerators(dd_PolyhedraPtr); dd_SetFamilyPtr dd_CopyIncidence(dd_PolyhedraPtr); dd_SetFamilyPtr dd_CopyAdjacency(dd_PolyhedraPtr); dd_SetFamilyPtr dd_CopyInputIncidence(dd_PolyhedraPtr); dd_SetFamilyPtr dd_CopyInputAdjacency(dd_PolyhedraPtr); dd_boolean dd_DDFile2File(char *ifile, char *ofile, dd_ErrorType *err); dd_boolean dd_DDInputAppend(dd_PolyhedraPtr*, dd_MatrixPtr, dd_ErrorType*); dd_MatrixPtr dd_PolyFile2Matrix(FILE *f, dd_ErrorType *); dd_PolyhedraPtr dd_DDMatrix2Poly(dd_MatrixPtr, dd_ErrorType *); dd_PolyhedraPtr dd_DDMatrix2Poly2(dd_MatrixPtr, dd_RowOrderType, dd_ErrorType *); dd_boolean dd_Redundant(dd_MatrixPtr, dd_rowrange, dd_Arow, dd_ErrorType *); /* 092 */ dd_rowset dd_RedundantRows(dd_MatrixPtr, dd_ErrorType *); /* 092 */ dd_boolean dd_SRedundant(dd_MatrixPtr, dd_rowrange, dd_Arow, dd_ErrorType *); /* 093a */ dd_rowset dd_SRedundantRows(dd_MatrixPtr, dd_ErrorType *); /* 093a */ dd_rowset dd_RedundantRowsViaShooting(dd_MatrixPtr, dd_ErrorType *); /* 092 */ dd_rowrange dd_RayShooting(dd_MatrixPtr, dd_Arow intpt, dd_Arow direction); /* 092 */ /* 092, find the first inequality "hit" by a ray from an intpt. */ dd_boolean dd_ImplicitLinearity(dd_MatrixPtr, dd_rowrange, dd_Arow, dd_ErrorType *); /* 092 */ dd_rowset dd_ImplicitLinearityRows(dd_MatrixPtr, dd_ErrorType *); /* 092 */ int dd_FreeOfImplicitLinearity(dd_MatrixPtr, dd_Arow, dd_rowset *, dd_ErrorType *) ; /* 094 */ dd_boolean dd_MatrixCanonicalizeLinearity(dd_MatrixPtr *, dd_rowset *,dd_rowindex *, dd_ErrorType *); /* 094 */ dd_boolean dd_MatrixCanonicalize(dd_MatrixPtr *, dd_rowset *, dd_rowset *, dd_rowindex *, dd_ErrorType *); /* 094 */ dd_boolean dd_MatrixRedundancyRemove(dd_MatrixPtr *M, dd_rowset *redset,dd_rowindex *newpos, dd_ErrorType *); /* 094 */ dd_boolean dd_FindRelativeInterior(dd_MatrixPtr, dd_rowset *, dd_rowset *, dd_LPSolutionPtr *, dd_ErrorType *); /* 094 */ dd_boolean dd_ExistsRestrictedFace(dd_MatrixPtr, dd_rowset, dd_rowset, dd_ErrorType *); /* 0.94 */ dd_boolean dd_ExistsRestrictedFace2(dd_MatrixPtr, dd_rowset, dd_rowset, dd_LPSolutionPtr *, dd_ErrorType *); /* 0.94 */ dd_SetFamilyPtr dd_Matrix2Adjacency(dd_MatrixPtr, dd_ErrorType *); /* 093 */ dd_SetFamilyPtr dd_Matrix2WeakAdjacency(dd_MatrixPtr, dd_ErrorType *); /* 093a */ long dd_MatrixRank(dd_MatrixPtr, dd_rowset, dd_colset, dd_rowset *, dd_colset *); /* Matrix Basic Operations */ dd_MatrixPtr dd_MatrixCopy(dd_MatrixPtr); /* a new name for dd_CopyMatrix */ dd_MatrixPtr dd_CopyMatrix(dd_MatrixPtr); /* 090c, kept for compatibility */ dd_MatrixPtr dd_MatrixNormalizedCopy(dd_MatrixPtr); /* 094 */ dd_MatrixPtr dd_MatrixNormalizedSortedCopy(dd_MatrixPtr,dd_rowindex*); /* 094 */ dd_MatrixPtr dd_MatrixUniqueCopy(dd_MatrixPtr,dd_rowindex*); /* 094 */ dd_MatrixPtr dd_MatrixNormalizedSortedUniqueCopy(dd_MatrixPtr,dd_rowindex*); /* 094 */ dd_MatrixPtr dd_MatrixSortedUniqueCopy(dd_MatrixPtr,dd_rowindex*); /* 094 */ dd_MatrixPtr dd_MatrixAppend(dd_MatrixPtr, dd_MatrixPtr); /* a name for dd_AppendMatrix */ dd_MatrixPtr dd_AppendMatrix(dd_MatrixPtr, dd_MatrixPtr); /* 090c, kept for compatibility */ int dd_MatrixAppendTo(dd_MatrixPtr*, dd_MatrixPtr); /* 092 */ int dd_Remove(dd_MatrixPtr*, dd_rowrange); /* 092 */ dd_MatrixPtr dd_MatrixSubmatrix(dd_MatrixPtr, dd_rowset delset); /* 092 */ dd_MatrixPtr dd_MatrixSubmatrix2(dd_MatrixPtr, dd_rowset delset,dd_rowindex*); /* 094. It returns new row positions. */ dd_MatrixPtr dd_MatrixSubmatrix2L(dd_MatrixPtr, dd_rowset delset,dd_rowindex*); /* 094. Linearity shifted up. */ int dd_MatrixShiftupLinearity(dd_MatrixPtr *,dd_rowindex *); /* 094 */ int dd_MatrixRowRemove(dd_MatrixPtr *M, dd_rowrange r); /* 092 */ int dd_MatrixRowRemove2(dd_MatrixPtr *M, dd_rowrange r,dd_rowindex*); /* 094*/ int dd_MatrixRowsRemove(dd_MatrixPtr *M, dd_rowset delset); /* 094 */ int dd_MatrixRowsRemove2(dd_MatrixPtr *M, dd_rowset delset,dd_rowindex*); /* 094 */ /* input/output */ void dd_SetInputFile(FILE **f,dd_DataFileType inputfile, dd_ErrorType *); void dd_SetWriteFileName(dd_DataFileType, dd_DataFileType, char, dd_RepresentationType); void dd_WriteAmatrix(FILE *, dd_Amatrix, dd_rowrange, dd_colrange); void dd_WriteArow(FILE *f, dd_Arow a, dd_colrange); void dd_WriteBmatrix(FILE *, dd_colrange, dd_Bmatrix T); void dd_WriteMatrix(FILE *, dd_MatrixPtr); void dd_MatrixIntegerFilter(dd_MatrixPtr); void dd_WriteReal(FILE *, mytype); void dd_WriteNumber(FILE *f, mytype x); /* write a number depending on the arithmetic used. */ void dd_WritePolyFile(FILE *, dd_PolyhedraPtr); void dd_WriteRunningMode(FILE *, dd_PolyhedraPtr); void dd_WriteErrorMessages(FILE *, dd_ErrorType); void dd_WriteSetFamily(FILE *, dd_SetFamilyPtr); void dd_WriteSetFamilyCompressed(FILE *, dd_SetFamilyPtr); void dd_WriteProgramDescription(FILE *); void dd_WriteDDTimes(FILE *, dd_PolyhedraPtr); void dd_WriteTimes(FILE *, time_t, time_t); void dd_WriteIncidence(FILE *, dd_PolyhedraPtr); void dd_WriteAdjacency(FILE *, dd_PolyhedraPtr); void dd_WriteInputAdjacency(FILE *, dd_PolyhedraPtr); void dd_WriteInputIncidence(FILE *, dd_PolyhedraPtr); /* functions and types for LP solving */ dd_LPPtr dd_Matrix2LP(dd_MatrixPtr, dd_ErrorType *); /* Load a matrix to create an LP object. */ dd_LPPtr dd_Matrix2Feasibility(dd_MatrixPtr, dd_ErrorType *); /* Load a matrix to create an LP object for feasibility (obj == 0) .*/ /* 094 */ dd_LPPtr dd_Matrix2Feasibility2(dd_MatrixPtr, dd_rowset, dd_rowset, dd_ErrorType *); /* Load a matrix to create an LP object for feasibility with additional equality and strict inequality constraints. */ /* 094 */ dd_boolean dd_LPSolve(dd_LPPtr,dd_LPSolverType,dd_ErrorType *); dd_boolean dd_LPSolve0(dd_LPPtr,dd_LPSolverType,dd_ErrorType *); void dd_CrissCrossSolve(dd_LPPtr lp,dd_ErrorType *); void dd_DualSimplexSolve(dd_LPPtr lp,dd_ErrorType *); dd_LPPtr dd_MakeLPforInteriorFinding(dd_LPPtr); dd_LPSolutionPtr dd_CopyLPSolution(dd_LPPtr); /* 0.90c */ void dd_WriteLP(FILE *, dd_LPPtr); /* 092 */ dd_LPPtr dd_CreateLPData(dd_LPObjectiveType,dd_NumberType,dd_rowrange,dd_colrange); int dd_LPReverseRow(dd_LPPtr, dd_rowrange); /* reverse the i-th row (1 <= i <= no. of rows) */ int dd_LPReplaceRow(dd_LPPtr, dd_rowrange, dd_Arow); /* replace the i-th row (1 <= i <= no. of rows) */ dd_Arow dd_LPCopyRow(dd_LPPtr, dd_rowrange); /* copy the i-th row (1 <= i <= no. of rows) */ void dd_FreeLPData(dd_LPPtr); void dd_FreeLPSolution(dd_LPSolutionPtr); void dd_WriteLPResult(FILE *, dd_LPPtr, dd_ErrorType); void dd_WriteLPErrorMessages(FILE *, dd_ErrorType); void dd_WriteLPTimes(FILE *, dd_LPPtr); void dd_WriteLPStats(FILE *f); void dd_WriteLPMode(FILE *f); dd_MatrixPtr dd_FourierElimination(dd_MatrixPtr,dd_ErrorType *); dd_MatrixPtr dd_BlockElimination(dd_MatrixPtr, dd_colset, dd_ErrorType *); #if defined(__cplusplus) } #endif /* ---------- FUNCTIONS MEANT TO BE NON-PUBLIC ---------- */ void dd_QuickSort(dd_rowindex, long, long, dd_Amatrix, long); void dd_RandomPermutation(dd_rowindex, long, unsigned int seed); void dd_UniqueRows(dd_rowindex, long, long, dd_Amatrix, long, dd_rowset, long *); dd_boolean dd_DoubleDescription(dd_PolyhedraPtr, dd_ErrorType*); dd_boolean dd_DoubleDescription2(dd_PolyhedraPtr, dd_RowOrderType, dd_ErrorType *); void dd_FreeDDMemory0(dd_ConePtr); void dd_fread_rational_value (FILE *f, mytype value); void dd_sread_rational_value (char *s, mytype value); void dd_AddNewHalfspace1(dd_ConePtr, dd_rowrange); void dd_AddNewHalfspace2(dd_ConePtr, dd_rowrange); void dd_AddRay(dd_ConePtr, mytype *); void dd_AddArtificialRay(dd_ConePtr); void dd_AValue(mytype*,dd_colrange, dd_Amatrix, mytype *, dd_rowrange); void dd_CheckAdjacency(dd_ConePtr, dd_RayPtr*, dd_RayPtr*, dd_boolean *); void dd_CheckEquality(dd_colrange, dd_RayPtr *, dd_RayPtr *, dd_boolean *); void dd_ComputeRowOrderVector(dd_ConePtr); void dd_ConditionalAddEdge(dd_ConePtr,dd_RayPtr, dd_RayPtr, dd_RayPtr); void dd_CopyArow(mytype *, mytype *, dd_colrange); void dd_CopyNormalizedAmatrix(mytype **, mytype **, dd_rowrange, dd_colrange); void dd_CopyNormalizedArow(mytype *, mytype *, dd_colrange); void dd_CopyAmatrix(mytype **, mytype **, dd_rowrange, dd_colrange); void dd_PermuteCopyAmatrix(mytype **, mytype **, dd_rowrange, dd_colrange, dd_rowindex); void dd_PermutePartialCopyAmatrix(mytype **, mytype **, dd_rowrange, dd_colrange, dd_rowindex,dd_rowrange, dd_rowrange); void dd_CopyBmatrix(dd_colrange, dd_Bmatrix T, dd_Bmatrix TCOPY); void dd_CopyRay(mytype *, dd_colrange, dd_RayPtr, dd_RepresentationType, dd_colindex); void dd_CreateInitialEdges(dd_ConePtr); void dd_CreateNewRay(dd_ConePtr, dd_RayPtr, dd_RayPtr, dd_rowrange); void dd_Eliminate(dd_ConePtr, dd_RayPtr*); void dd_EvaluateARay1(dd_rowrange, dd_ConePtr); void dd_EvaluateARay2(dd_rowrange, dd_ConePtr); void dd_FeasibilityIndices(long *, long *, dd_rowrange, dd_ConePtr); void dd_FindBasis(dd_ConePtr, long *rank); void dd_FindInitialRays(dd_ConePtr, dd_boolean *); void dd_ColumnReduce(dd_ConePtr); void dd_GaussianColumnPivot(dd_rowrange, dd_colrange, dd_Amatrix, dd_Bmatrix, dd_rowrange, dd_colrange); dd_boolean dd_LexSmaller(mytype *, mytype *, long); dd_boolean dd_LexLarger(mytype *, mytype *, long); dd_boolean dd_LexEqual(mytype *, mytype *, long); void dd_Normalize(dd_colrange, mytype *); void dd_MatrixIntegerFilter(dd_MatrixPtr); void dd_ProcessCommandLine(FILE*,dd_MatrixPtr, char *); void dd_SelectNextHalfspace(dd_ConePtr, dd_rowset, dd_rowrange *); void dd_SelectPivot2(dd_rowrange,dd_colrange,dd_Amatrix, dd_Bmatrix,dd_RowOrderType,dd_rowindex, dd_rowset,dd_rowrange,dd_rowset, dd_colset,dd_rowrange *,dd_colrange *,dd_boolean *); void dd_SelectPreorderedNext(dd_ConePtr, dd_rowset, dd_rowrange *); void dd_SetInequalitySets(dd_ConePtr); void dd_SnapToInteger(mytype, mytype); void dd_StoreRay1(dd_ConePtr, mytype *, dd_boolean *); void dd_StoreRay2(dd_ConePtr, mytype *, dd_boolean *, dd_boolean *); void dd_TableauEntry(mytype *, dd_rowrange, dd_colrange, dd_Amatrix, dd_Bmatrix T, dd_rowrange, dd_colrange); void dd_UpdateEdges(dd_ConePtr, dd_RayPtr, dd_RayPtr); void dd_UpdateRowOrderVector(dd_ConePtr, dd_rowset PriorityRows); void dd_WriteRay(FILE *, dd_colrange, dd_RayPtr, dd_RepresentationType, dd_colindex); void dd_ZeroIndexSet(dd_rowrange, dd_colrange, dd_Amatrix, mytype *, dd_rowset); /* New functions to handle data loading, NON-PUBLIC */ dd_NumberType dd_GetNumberType(char *); dd_ConePtr dd_ConeDataLoad(dd_PolyhedraPtr); dd_PolyhedraPtr dd_CreatePolyhedraData(dd_rowrange, dd_colrange); dd_boolean dd_InitializeConeData(dd_rowrange, dd_colrange, dd_ConePtr*); dd_boolean dd_AppendMatrix2Poly(dd_PolyhedraPtr*, dd_MatrixPtr); /* end of cddlib.h */ pplacer-1.1.alpha19/cdd_src/cdd.ml000066400000000000000000000013171303154601500167240ustar00rootroot00000000000000module BA = Bigarray module BA2 = BA.Array2 type float_ba2 = (float, BA.float64_elt, BA.c_layout) BA2.t external c_extreme_vertices: float_ba2 -> float -> float -> float_ba2 option = "caml_extreme_vertices" let extreme_vertices lower_bound upper_bound parr = let ba = BA2.create BA.float64 BA.c_layout (Array.length parr) 3 in BA2.fill ba (-1.); Array.iteri (fun i (a, b) -> BA2.unsafe_set ba i 0 a; BA2.unsafe_set ba i 1 b) parr; match c_extreme_vertices ba lower_bound upper_bound with | Some res -> Some (Array.init (BA2.dim1 res) (fun i -> let col = BA2.unsafe_get res i in int_of_float (col 2), col 0, col 1)) | None -> None; pplacer-1.1.alpha19/cdd_src/cddcore.c000066400000000000000000001613761303154601500174230ustar00rootroot00000000000000/* cddcore.c: Core Procedures for cddlib written by Komei Fukuda, fukuda@ifor.math.ethz.ch Version 0.94f, February 7, 2008 */ /* cddlib : C-library of the double description method for computing all vertices and extreme rays of the polyhedron P= {x : b - A x >= 0}. Please read COPYING (GNU General Public Licence) and the manual cddlibman.tex for detail. */ #include "setoper.h" /* set operation library header (Ver. June 1, 2000 or later) */ #include "cdd.h" #include #include #include #include #include void dd_CheckAdjacency(dd_ConePtr cone, dd_RayPtr *RP1, dd_RayPtr *RP2, dd_boolean *adjacent) { dd_RayPtr TempRay; dd_boolean localdebug=dd_FALSE; static dd_rowset Face, Face1; static dd_rowrange last_m=0; if (last_m!=cone->m) { if (last_m>0){ set_free(Face); set_free(Face1); } set_initialize(&Face, cone->m); set_initialize(&Face1, cone->m); last_m=cone->m; } if (dd_debug) localdebug=dd_TRUE; *adjacent = dd_TRUE; set_int(Face1, (*RP1)->ZeroSet, (*RP2)->ZeroSet); set_int(Face, Face1, cone->AddedHalfspaces); if (set_card(Face)< cone->d - 2) { *adjacent = dd_FALSE; if (localdebug) { fprintf(stderr,"non adjacent: set_card(face) %ld < %ld = cone->d.\n", set_card(Face),cone->d); } return; } else if (cone->parent->NondegAssumed) { *adjacent = dd_TRUE; return; } TempRay = cone->FirstRay; while (TempRay != NULL && *adjacent) { if (TempRay != *RP1 && TempRay != *RP2) { set_int(Face1, TempRay->ZeroSet, cone->AddedHalfspaces); if (set_subset(Face, Face1)) *adjacent = dd_FALSE; } TempRay = TempRay->Next; } } void dd_Eliminate(dd_ConePtr cone, dd_RayPtr*Ptr) { /*eliminate the record pointed by Ptr^.Next*/ dd_RayPtr TempPtr; dd_colrange j; TempPtr = (*Ptr)->Next; (*Ptr)->Next = (*Ptr)->Next->Next; if (TempPtr == cone->FirstRay) /*Update the first pointer*/ cone->FirstRay = (*Ptr)->Next; if (TempPtr == cone->LastRay) /*Update the last pointer*/ cone->LastRay = *Ptr; /* Added, Marc Pfetsch 010219 */ for (j=0;j < cone->d;j++) dd_clear(TempPtr->Ray[j]); dd_clear(TempPtr->ARay); free(TempPtr->Ray); /* free the ray vector memory */ set_free(TempPtr->ZeroSet); /* free the ZeroSet memory */ free(TempPtr); /* free the dd_Ray structure memory */ cone->RayCount--; } void dd_SetInequalitySets(dd_ConePtr cone) { dd_rowrange i; set_emptyset(cone->GroundSet); set_emptyset(cone->EqualitySet); set_emptyset(cone->NonequalitySet); for (i = 1; i <= (cone->parent->m); i++){ set_addelem(cone->GroundSet, i); if (cone->parent->EqualityIndex[i]==1) set_addelem(cone->EqualitySet,i); if (cone->parent->EqualityIndex[i]==-1) set_addelem(cone->NonequalitySet,i); } } void dd_AValue(mytype *val, dd_colrange d_size, dd_Amatrix A, mytype *p, dd_rowrange i) { /*return the ith component of the vector A x p */ dd_colrange j; mytype x; dd_init(x); dd_set(*val,dd_purezero); /* Changed by Marc Pfetsch 010219 */ for (j = 0; j < d_size; j++){ dd_mul(x,A[i - 1][j], p[j]); dd_add(*val, *val, x); } dd_clear(x); } void dd_StoreRay1(dd_ConePtr cone, mytype *p, dd_boolean *feasible) { /* Original ray storing routine when RelaxedEnumeration is dd_FALSE */ dd_rowrange i,k,fii=cone->m+1; dd_colrange j; mytype temp; dd_RayPtr RR; dd_boolean localdebug=dd_debug; dd_init(temp); RR=cone->LastRay; *feasible = dd_TRUE; set_initialize(&(RR->ZeroSet),cone->m); for (j = 0; j < cone->d; j++){ dd_set(RR->Ray[j],p[j]); } for (i = 1; i <= cone->m; i++) { k=cone->OrderVector[i]; dd_AValue(&temp, cone->d, cone->A, p, k); if (localdebug) { fprintf(stderr,"dd_StoreRay1: dd_AValue at row %ld =",k); dd_WriteNumber(stderr, temp); fprintf(stderr,"\n"); } if (dd_EqualToZero(temp)) { set_addelem(RR->ZeroSet, k); if (localdebug) { fprintf(stderr,"recognized zero!\n"); } } if (dd_Negative(temp)){ if (localdebug) { fprintf(stderr,"recognized negative!\n"); } *feasible = dd_FALSE; if (fii>cone->m) fii=i; /* the first violating inequality index */ if (localdebug) { fprintf(stderr,"this ray is not feasible, neg comp = %ld\n", fii); dd_WriteNumber(stderr, temp); fprintf(stderr,"\n"); } } } RR->FirstInfeasIndex=fii; RR->feasible = *feasible; dd_clear(temp); } void dd_StoreRay2(dd_ConePtr cone, mytype *p, dd_boolean *feasible, dd_boolean *weaklyfeasible) /* Ray storing routine when RelaxedEnumeration is dd_TRUE. weaklyfeasible is true iff it is feasible with the strict_inequality conditions deleted. */ { dd_RayPtr RR; dd_rowrange i,k,fii=cone->m+1; dd_colrange j; mytype temp; dd_init(temp); RR=cone->LastRay; *feasible = dd_TRUE; *weaklyfeasible = dd_TRUE; set_initialize(&(RR->ZeroSet),cone->m); for (j = 0; j < cone->d; j++){ dd_set(RR->Ray[j],p[j]); } for (i = 1; i <= cone->m; i++) { k=cone->OrderVector[i]; dd_AValue(&temp, cone->d, cone->A, p, k); if (dd_EqualToZero(temp)){ set_addelem(RR->ZeroSet, k); if (cone->parent->EqualityIndex[k]==-1) *feasible=dd_FALSE; /* strict inequality required */ } /* if (temp < -zero){ */ if (dd_Negative(temp)){ *feasible = dd_FALSE; if (fii>cone->m && cone->parent->EqualityIndex[k]>=0) { fii=i; /* the first violating inequality index */ *weaklyfeasible=dd_FALSE; } } } RR->FirstInfeasIndex=fii; RR->feasible = *feasible; dd_clear(temp); } void dd_AddRay(dd_ConePtr cone, mytype *p) { dd_boolean feasible, weaklyfeasible; dd_colrange j; if (cone->FirstRay == NULL) { cone->FirstRay = (dd_RayPtr) malloc(sizeof(dd_RayType)); cone->FirstRay->Ray = (mytype *) calloc(cone->d, sizeof(mytype)); for (j=0; jd; j++) dd_init(cone->FirstRay->Ray[j]); dd_init(cone->FirstRay->ARay); if (dd_debug) fprintf(stderr,"Create the first ray pointer\n"); cone->LastRay = cone->FirstRay; cone->ArtificialRay->Next = cone->FirstRay; } else { cone->LastRay->Next = (dd_RayPtr) malloc(sizeof(dd_RayType)); cone->LastRay->Next->Ray = (mytype *) calloc(cone->d, sizeof(mytype)); for (j=0; jd; j++) dd_init(cone->LastRay->Next->Ray[j]); dd_init(cone->LastRay->Next->ARay); if (dd_debug) fprintf(stderr,"Create a new ray pointer\n"); cone->LastRay = cone->LastRay->Next; } cone->LastRay->Next = NULL; cone->RayCount++; cone->TotalRayCount++; if (dd_debug) { if (cone->TotalRayCount % 100 == 0) { fprintf(stderr,"*Rays (Total, Currently Active, Feasible) =%8ld%8ld%8ld\n", cone->TotalRayCount, cone->RayCount, cone->FeasibleRayCount); } } if (cone->parent->RelaxedEnumeration){ dd_StoreRay2(cone, p, &feasible, &weaklyfeasible); if (weaklyfeasible) (cone->WeaklyFeasibleRayCount)++; } else { dd_StoreRay1(cone, p, &feasible); if (feasible) (cone->WeaklyFeasibleRayCount)++; /* weaklyfeasible is equiv. to feasible in this case. */ } if (!feasible) return; else { (cone->FeasibleRayCount)++; } } void dd_AddArtificialRay(dd_ConePtr cone) { dd_Arow zerovector; dd_colrange j,d1; dd_boolean feasible; if (cone->d<=0) d1=1; else d1=cone->d; dd_InitializeArow(d1, &zerovector); if (cone->ArtificialRay != NULL) { fprintf(stderr,"Warning !!! FirstRay in not nil. Illegal Call\n"); free(zerovector); /* 086 */ return; } cone->ArtificialRay = (dd_RayPtr) malloc(sizeof(dd_RayType)); cone->ArtificialRay->Ray = (mytype *) calloc(d1, sizeof(mytype)); for (j=0; jArtificialRay->Ray[j]); dd_init(cone->ArtificialRay->ARay); if (dd_debug) fprintf(stderr,"Create the artificial ray pointer\n"); cone->LastRay=cone->ArtificialRay; dd_StoreRay1(cone, zerovector, &feasible); /* This stores a vector to the record pointed by cone->LastRay */ cone->ArtificialRay->Next = NULL; for (j = 0; j < d1; j++){ dd_clear(zerovector[j]); } free(zerovector); /* 086 */ } void dd_ConditionalAddEdge(dd_ConePtr cone, dd_RayPtr Ray1, dd_RayPtr Ray2, dd_RayPtr ValidFirstRay) { long it,it_row,fii1,fii2,fmin,fmax; dd_boolean adjacent,lastchance; dd_RayPtr TempRay,Rmin,Rmax; dd_AdjacencyType *NewEdge; dd_boolean localdebug=dd_FALSE; dd_rowset ZSmin, ZSmax; static dd_rowset Face, Face1; static dd_rowrange last_m=0; if (last_m!=cone->m) { if (last_m>0){ set_free(Face); set_free(Face1); } set_initialize(&Face, cone->m); set_initialize(&Face1, cone->m); last_m=cone->m; } fii1=Ray1->FirstInfeasIndex; fii2=Ray2->FirstInfeasIndex; if (fii1ZeroSet; ZSmax = Rmax->ZeroSet; if (localdebug) { fprintf(stderr,"dd_ConditionalAddEdge: FMIN = %ld (row%ld) FMAX=%ld\n", fmin, cone->OrderVector[fmin], fmax); } if (fmin==fmax){ if (localdebug) fprintf(stderr,"dd_ConditionalAddEdge: equal FII value-> No edge added\n"); } else if (set_member(cone->OrderVector[fmin],ZSmax)){ if (localdebug) fprintf(stderr,"dd_ConditionalAddEdge: No strong separation -> No edge added\n"); } else { /* the pair will be separated at the iteration fmin */ lastchance=dd_TRUE; /* flag to check it will be the last chance to store the edge candidate */ set_int(Face1, ZSmax, ZSmin); (cone->count_int)++; if (localdebug){ fprintf(stderr,"Face: "); for (it=1; it<=cone->m; it++) { it_row=cone->OrderVector[it]; if (set_member(it_row, Face1)) fprintf(stderr,"%ld ",it_row); } fprintf(stderr,"\n"); } for (it=cone->Iteration+1; it < fmin && lastchance; it++){ it_row=cone->OrderVector[it]; if (cone->parent->EqualityIndex[it_row]>=0 && set_member(it_row, Face1)){ lastchance=dd_FALSE; (cone->count_int_bad)++; if (localdebug){ fprintf(stderr,"There will be another chance iteration %ld (row %ld) to store the pair\n", it, it_row); } } } if (lastchance){ adjacent = dd_TRUE; (cone->count_int_good)++; /* adjacent checking */ set_int(Face, Face1, cone->AddedHalfspaces); if (localdebug){ fprintf(stderr,"Check adjacency\n"); fprintf(stderr,"AddedHalfspaces: "); set_fwrite(stderr,cone->AddedHalfspaces); fprintf(stderr,"Face: "); for (it=1; it<=cone->m; it++) { it_row=cone->OrderVector[it]; if (set_member(it_row, Face)) fprintf(stderr,"%ld ",it_row); } fprintf(stderr,"\n"); } if (set_card(Face)< cone->d - 2) { adjacent = dd_FALSE; } else if (cone->parent->NondegAssumed) { adjacent = dd_TRUE; } else{ TempRay = ValidFirstRay; /* the first ray for adjacency checking */ while (TempRay != NULL && adjacent) { if (TempRay != Ray1 && TempRay != Ray2) { set_int(Face1, TempRay->ZeroSet, cone->AddedHalfspaces); if (set_subset(Face, Face1)) { if (localdebug) set_fwrite(stderr,Face1); adjacent = dd_FALSE; } } TempRay = TempRay->Next; } } if (adjacent){ if (localdebug) fprintf(stderr,"The pair is adjacent and the pair must be stored for iteration %ld (row%ld)\n", fmin, cone->OrderVector[fmin]); NewEdge=(dd_AdjacencyPtr) malloc(sizeof *NewEdge); NewEdge->Ray1=Rmax; /* save the one remains in iteration fmin in the first */ NewEdge->Ray2=Rmin; /* save the one deleted in iteration fmin in the second */ NewEdge->Next=NULL; (cone->EdgeCount)++; (cone->TotalEdgeCount)++; if (cone->Edges[fmin]==NULL){ cone->Edges[fmin]=NewEdge; if (localdebug) fprintf(stderr,"Create a new edge list of %ld\n", fmin); }else{ NewEdge->Next=cone->Edges[fmin]; cone->Edges[fmin]=NewEdge; } } } } } void dd_CreateInitialEdges(dd_ConePtr cone) { dd_RayPtr Ptr1, Ptr2; dd_rowrange fii1,fii2; long count=0; dd_boolean adj,localdebug=dd_FALSE; cone->Iteration=cone->d; /* CHECK */ if (cone->FirstRay ==NULL || cone->LastRay==NULL){ /* fprintf(stderr,"Warning: dd_ CreateInitialEdges called with NULL pointer(s)\n"); */ goto _L99; } Ptr1=cone->FirstRay; while(Ptr1!=cone->LastRay && Ptr1!=NULL){ fii1=Ptr1->FirstInfeasIndex; Ptr2=Ptr1->Next; while(Ptr2!=NULL){ fii2=Ptr2->FirstInfeasIndex; count++; if (localdebug) fprintf(stderr,"dd_ CreateInitialEdges: edge %ld \n",count); dd_CheckAdjacency(cone, &Ptr1, &Ptr2, &adj); if (fii1!=fii2 && adj) dd_ConditionalAddEdge(cone, Ptr1, Ptr2, cone->FirstRay); Ptr2=Ptr2->Next; } Ptr1=Ptr1->Next; } _L99:; } void dd_UpdateEdges(dd_ConePtr cone, dd_RayPtr RRbegin, dd_RayPtr RRend) /* This procedure must be called after the ray list is sorted by dd_EvaluateARay2 so that FirstInfeasIndex's are monotonically increasing. */ { dd_RayPtr Ptr1, Ptr2begin, Ptr2; dd_rowrange fii1; dd_boolean ptr2found,quit,localdebug=dd_FALSE; long count=0,pos1, pos2; float workleft,prevworkleft=110.0,totalpairs; totalpairs=(cone->ZeroRayCount-1.0)*(cone->ZeroRayCount-2.0)+1.0; Ptr2begin = NULL; if (RRbegin ==NULL || RRend==NULL){ if (1) fprintf(stderr,"Warning: dd_UpdateEdges called with NULL pointer(s)\n"); goto _L99; } Ptr1=RRbegin; pos1=1; do{ ptr2found=dd_FALSE; quit=dd_FALSE; fii1=Ptr1->FirstInfeasIndex; pos2=2; for (Ptr2=Ptr1->Next; !ptr2found && !quit; Ptr2=Ptr2->Next,pos2++){ if (Ptr2->FirstInfeasIndex > fii1){ Ptr2begin=Ptr2; ptr2found=dd_TRUE; } else if (Ptr2==RRend) quit=dd_TRUE; } if (ptr2found){ quit=dd_FALSE; for (Ptr2=Ptr2begin; !quit ; Ptr2=Ptr2->Next){ count++; if (localdebug) fprintf(stderr,"dd_UpdateEdges: edge %ld \n",count); dd_ConditionalAddEdge(cone, Ptr1,Ptr2,RRbegin); if (Ptr2==RRend || Ptr2->Next==NULL) quit=dd_TRUE; } } Ptr1=Ptr1->Next; pos1++; workleft = 100.0 * (cone->ZeroRayCount-pos1) * (cone->ZeroRayCount - pos1-1.0) / totalpairs; if (cone->ZeroRayCount>=500 && dd_debug && pos1%10 ==0 && prevworkleft-workleft>=10 ) { fprintf(stderr,"*Work of iteration %5ld(/%ld): %4ld/%4ld => %4.1f%% left\n", cone->Iteration, cone->m, pos1, cone->ZeroRayCount, workleft); prevworkleft=workleft; } }while(Ptr1!=RRend && Ptr1!=NULL); _L99:; } void dd_FreeDDMemory0(dd_ConePtr cone) { dd_RayPtr Ptr, PrevPtr; long count; dd_colrange j; dd_boolean localdebug=dd_FALSE; /* THIS SHOULD BE REWRITTEN carefully */ PrevPtr=cone->ArtificialRay; if (PrevPtr!=NULL){ count=0; for (Ptr=cone->ArtificialRay->Next; Ptr!=NULL; Ptr=Ptr->Next){ /* Added Marc Pfetsch 2/19/01 */ for (j=0;j < cone->d;j++) dd_clear(PrevPtr->Ray[j]); dd_clear(PrevPtr->ARay); free(PrevPtr->Ray); free(PrevPtr->ZeroSet); free(PrevPtr); count++; PrevPtr=Ptr; }; cone->FirstRay=NULL; /* Added Marc Pfetsch 010219 */ for (j=0;j < cone->d;j++) dd_clear(cone->LastRay->Ray[j]); dd_clear(cone->LastRay->ARay); free(cone->LastRay->Ray); cone->LastRay->Ray = NULL; set_free(cone->LastRay->ZeroSet); cone->LastRay->ZeroSet = NULL; free(cone->LastRay); cone->LastRay = NULL; cone->ArtificialRay=NULL; if (localdebug) fprintf(stderr,"%ld ray storage spaces freed\n",count); } /* must add (by Sato) */ free(cone->Edges); set_free(cone->GroundSet); set_free(cone->EqualitySet); set_free(cone->NonequalitySet); set_free(cone->AddedHalfspaces); set_free(cone->WeaklyAddedHalfspaces); set_free(cone->InitialHalfspaces); free(cone->InitialRayIndex); free(cone->OrderVector); free(cone->newcol); /* Fixed by Shawn Rusaw. Originally it was cone->d instead of cone->d_alloc */ dd_FreeBmatrix(cone->d_alloc,cone->B); dd_FreeBmatrix(cone->d_alloc,cone->Bsave); /* Fixed by Marc Pfetsch 010219*/ dd_FreeAmatrix(cone->m_alloc,cone->d_alloc,cone->A); cone->A = NULL; free(cone); } void dd_FreeDDMemory(dd_PolyhedraPtr poly) { dd_FreeDDMemory0(poly->child); poly->child=NULL; } void dd_FreePolyhedra(dd_PolyhedraPtr poly) { dd_bigrange i; if ((poly)->child != NULL) dd_FreeDDMemory(poly); dd_FreeAmatrix((poly)->m_alloc,poly->d_alloc, poly->A); dd_FreeArow((poly)->d_alloc,(poly)->c); free((poly)->EqualityIndex); if (poly->AincGenerated){ for (i=1; i<=poly->m1; i++){ set_free(poly->Ainc[i-1]); } free(poly->Ainc); set_free(poly->Ared); set_free(poly->Adom); poly->Ainc=NULL; } free(poly); } void dd_Normalize(dd_colrange d_size, mytype *V) { long j; mytype temp,min; dd_boolean nonzerofound=dd_FALSE; if (d_size>0){ dd_init(min); dd_init(temp); dd_abs(min,V[0]); /* set the minmizer to 0 */ if (dd_Positive(min)) nonzerofound=dd_TRUE; for (j = 1; j < d_size; j++) { dd_abs(temp,V[j]); if (dd_Positive(temp)){ if (!nonzerofound || dd_Smaller(temp,min)){ nonzerofound=dd_TRUE; dd_set(min, temp); } } } if (dd_Positive(min)){ for (j = 0; j < d_size; j++) dd_div(V[j], V[j], min); } dd_clear(min); dd_clear(temp); } } void dd_ZeroIndexSet(dd_rowrange m_size, dd_colrange d_size, dd_Amatrix A, mytype *x, dd_rowset ZS) { dd_rowrange i; mytype temp; /* Changed by Marc Pfetsch 010219 */ dd_init(temp); set_emptyset(ZS); for (i = 1; i <= m_size; i++) { dd_AValue(&temp, d_size, A, x, i); if (dd_EqualToZero(temp)) set_addelem(ZS, i); } /* Changed by Marc Pfetsch 010219 */ dd_clear(temp); } void dd_CopyBmatrix(dd_colrange d_size, dd_Bmatrix T, dd_Bmatrix TCOPY) { dd_rowrange i; dd_colrange j; for (i=0; i < d_size; i++) { for (j=0; j < d_size; j++) { dd_set(TCOPY[i][j],T[i][j]); } } } void dd_CopyArow(mytype *acopy, mytype *a, dd_colrange d) { dd_colrange j; for (j = 0; j < d; j++) { dd_set(acopy[j],a[j]); } } void dd_CopyNormalizedArow(mytype *acopy, mytype *a, dd_colrange d) { dd_CopyArow(acopy, a, d); dd_Normalize(d,acopy); } void dd_CopyAmatrix(mytype **Acopy, mytype **A, dd_rowrange m, dd_colrange d) { dd_rowrange i; for (i = 0; i< m; i++) { dd_CopyArow(Acopy[i],A[i],d); } } void dd_CopyNormalizedAmatrix(mytype **Acopy, mytype **A, dd_rowrange m, dd_colrange d) { dd_rowrange i; for (i = 0; i< m; i++) { dd_CopyNormalizedArow(Acopy[i],A[i],d); } } void dd_PermuteCopyAmatrix(mytype **Acopy, mytype **A, dd_rowrange m, dd_colrange d, dd_rowindex roworder) { dd_rowrange i; for (i = 1; i<= m; i++) { dd_CopyArow(Acopy[i-1],A[roworder[i]-1],d); } } void dd_PermutePartialCopyAmatrix(mytype **Acopy, mytype **A, dd_rowrange m, dd_colrange d, dd_rowindex roworder,dd_rowrange p, dd_rowrange q) { /* copy the rows of A whose roworder is positive. roworder[i] is the row index of the copied row. */ dd_rowrange i; for (i = 1; i<= m; i++) { if (roworder[i]>0) dd_CopyArow(Acopy[roworder[i]-1],A[i-1],d); } } void dd_InitializeArow(dd_colrange d,dd_Arow *a) { dd_colrange j; if (d>0) *a=(mytype*) calloc(d,sizeof(mytype)); for (j = 0; j < d; j++) { dd_init((*a)[j]); } } void dd_InitializeAmatrix(dd_rowrange m,dd_colrange d,dd_Amatrix *A) { dd_rowrange i; if (m>0) (*A)=(mytype**) calloc(m,sizeof(mytype*)); for (i = 0; i < m; i++) { dd_InitializeArow(d,&((*A)[i])); } } void dd_FreeAmatrix(dd_rowrange m,dd_colrange d,dd_Amatrix A) { dd_rowrange i; dd_colrange j; for (i = 0; i < m; i++) { for (j = 0; j < d; j++) { dd_clear(A[i][j]); } } if (A!=NULL) { for (i = 0; i < m; i++) { free(A[i]); } free(A); } } void dd_FreeArow(dd_colrange d, dd_Arow a) { dd_colrange j; for (j = 0; j < d; j++) { dd_clear(a[j]); } free(a); } void dd_InitializeBmatrix(dd_colrange d,dd_Bmatrix *B) { dd_colrange i,j; (*B)=(mytype**) calloc(d,sizeof(mytype*)); for (j = 0; j < d; j++) { (*B)[j]=(mytype*) calloc(d,sizeof(mytype)); } for (i = 0; i < d; i++) { for (j = 0; j < d; j++) { dd_init((*B)[i][j]); } } } void dd_FreeBmatrix(dd_colrange d,dd_Bmatrix B) { dd_colrange i,j; for (i = 0; i < d; i++) { for (j = 0; j < d; j++) { dd_clear(B[i][j]); } } if (B!=NULL) { for (j = 0; j < d; j++) { free(B[j]); } free(B); } } dd_SetFamilyPtr dd_CreateSetFamily(dd_bigrange fsize, dd_bigrange ssize) { dd_SetFamilyPtr F; dd_bigrange i,f0,f1,s0,s1; if (fsize<=0) { f0=0; f1=1; /* if fsize<=0, the fsize is set to zero and the created size is one */ } else { f0=fsize; f1=fsize; } if (ssize<=0) { s0=0; s1=1; /* if ssize<=0, the ssize is set to zero and the created size is one */ } else { s0=ssize; s1=ssize; } F=(dd_SetFamilyPtr) malloc (sizeof(dd_SetFamilyType)); F->set=(set_type*) calloc(f1,sizeof(set_type)); for (i=0; iset[i]), s1); } F->famsize=f0; F->setsize=s0; return F; } void dd_FreeSetFamily(dd_SetFamilyPtr F) { dd_bigrange i,f1; if (F!=NULL){ if (F->famsize<=0) f1=1; else f1=F->famsize; /* the smallest created size is one */ for (i=0; iset[i]); } free(F->set); free(F); } } dd_MatrixPtr dd_CreateMatrix(dd_rowrange m_size,dd_colrange d_size) { dd_MatrixPtr M; dd_rowrange m0,m1; dd_colrange d0,d1; if (m_size<=0){ m0=0; m1=1; /* if m_size <=0, the number of rows is set to zero, the actual size is 1 */ } else { m0=m_size; m1=m_size; } if (d_size<=0){ d0=0; d1=1; /* if d_size <=0, the number of cols is set to zero, the actual size is 1 */ } else { d0=d_size; d1=d_size; } M=(dd_MatrixPtr) malloc (sizeof(dd_MatrixType)); dd_InitializeAmatrix(m1,d1,&(M->matrix)); dd_InitializeArow(d1,&(M->rowvec)); M->rowsize=m0; set_initialize(&(M->linset), m1); M->colsize=d0; M->objective=dd_LPnone; M->numbtype=dd_Unknown; M->representation=dd_Unspecified; return M; } void dd_FreeMatrix(dd_MatrixPtr M) { dd_rowrange m1; dd_colrange d1; if (M!=NULL) { if (M->rowsize<=0) m1=1; else m1=M->rowsize; if (M->colsize<=0) d1=1; else d1=M->colsize; if (M!=NULL) { dd_FreeAmatrix(m1,d1,M->matrix); dd_FreeArow(d1,M->rowvec); set_free(M->linset); free(M); } } } void dd_SetToIdentity(dd_colrange d_size, dd_Bmatrix T) { dd_colrange j1, j2; for (j1 = 1; j1 <= d_size; j1++) { for (j2 = 1; j2 <= d_size; j2++) { if (j1 == j2) dd_set(T[j1 - 1][j2 - 1],dd_one); else dd_set(T[j1 - 1][j2 - 1],dd_purezero); } } } void dd_ColumnReduce(dd_ConePtr cone) { dd_colrange j,j1=0; dd_rowrange i; dd_boolean localdebug=dd_FALSE; for (j=1;j<=cone->d;j++) { if (cone->InitialRayIndex[j]>0){ j1=j1+1; if (j1m; i++) dd_set(cone->A[i-1][j1-1],cone->A[i-1][j-1]); cone->newcol[j]=j1; if (localdebug){ fprintf(stderr,"shifting the column %ld to column %ld\n", j, j1); } /* shifting forward */ } } else { cone->newcol[j]=0; if (localdebug) { fprintf(stderr,"a generator (or an equation) of the linearity space: "); for (i=1; i<=cone->d; i++) dd_WriteNumber(stderr, cone->B[i-1][j-1]); fprintf(stderr,"\n"); } } } cone->d=j1; /* update the dimension. cone->d_orig remembers the old. */ dd_CopyBmatrix(cone->d_orig, cone->B, cone->Bsave); /* save the dual basis inverse as Bsave. This matrix contains the linearity space generators. */ cone->ColReduced=dd_TRUE; } long dd_MatrixRank(dd_MatrixPtr M, dd_rowset ignoredrows, dd_colset ignoredcols, dd_rowset *rowbasis, dd_colset *colbasis) { dd_boolean stop, chosen, localdebug=dd_debug; dd_rowset NopivotRow,PriorityRow; dd_colset ColSelected; dd_Bmatrix B; dd_rowindex roworder; dd_rowrange r; dd_colrange s; long rank; rank = 0; stop = dd_FALSE; set_initialize(&ColSelected, M->colsize); set_initialize(&NopivotRow, M->rowsize); set_initialize(rowbasis, M->rowsize); set_initialize(colbasis, M->colsize); set_initialize(&PriorityRow, M->rowsize); set_copy(NopivotRow,ignoredrows); set_copy(ColSelected,ignoredcols); dd_InitializeBmatrix(M->colsize, &B); dd_SetToIdentity(M->colsize, B); roworder=(long *)calloc(M->rowsize+1,sizeof(long)); for (r=0; rrowsize; r++){roworder[r+1]=r+1; } do { /* Find a set of rows for a basis */ dd_SelectPivot2(M->rowsize, M->colsize,M->matrix,B,dd_MinIndex,roworder, PriorityRow,M->rowsize, NopivotRow, ColSelected, &r, &s, &chosen); if (dd_debug && chosen) fprintf(stderr,"Procedure dd_MatrixRank: pivot on (r,s) =(%ld, %ld).\n", r, s); if (chosen) { set_addelem(NopivotRow, r); set_addelem(*rowbasis, r); set_addelem(ColSelected, s); set_addelem(*colbasis, s); rank++; dd_GaussianColumnPivot(M->rowsize, M->colsize, M->matrix, B, r, s); if (localdebug) dd_WriteBmatrix(stderr,M->colsize,B); } else { stop=dd_TRUE; } if (rank==M->colsize) stop = dd_TRUE; } while (!stop); dd_FreeBmatrix(M->colsize,B); free(roworder); set_free(ColSelected); set_free(NopivotRow); set_free(PriorityRow); return rank; } void dd_FindBasis(dd_ConePtr cone, long *rank) { dd_boolean stop, chosen, localdebug=dd_debug; dd_rowset NopivotRow; dd_colset ColSelected; dd_rowrange r; dd_colrange j,s; *rank = 0; stop = dd_FALSE; for (j=0;j<=cone->d;j++) cone->InitialRayIndex[j]=0; set_emptyset(cone->InitialHalfspaces); set_initialize(&ColSelected, cone->d); set_initialize(&NopivotRow, cone->m); set_copy(NopivotRow,cone->NonequalitySet); dd_SetToIdentity(cone->d, cone->B); do { /* Find a set of rows for a basis */ dd_SelectPivot2(cone->m, cone->d,cone->A,cone->B,cone->HalfspaceOrder,cone->OrderVector, cone->EqualitySet,cone->m, NopivotRow, ColSelected, &r, &s, &chosen); if (dd_debug && chosen) fprintf(stderr,"Procedure dd_FindBasis: pivot on (r,s) =(%ld, %ld).\n", r, s); if (chosen) { set_addelem(cone->InitialHalfspaces, r); set_addelem(NopivotRow, r); set_addelem(ColSelected, s); cone->InitialRayIndex[s]=r; /* cone->InitialRayIndex[s] stores the corr. row index */ (*rank)++; dd_GaussianColumnPivot(cone->m, cone->d, cone->A, cone->B, r, s); if (localdebug) dd_WriteBmatrix(stderr,cone->d,cone->B); } else { stop=dd_TRUE; } if (*rank==cone->d) stop = dd_TRUE; } while (!stop); set_free(ColSelected); set_free(NopivotRow); } void dd_FindInitialRays(dd_ConePtr cone, dd_boolean *found) { dd_rowset CandidateRows; dd_rowrange i; long rank; dd_RowOrderType roworder_save=dd_LexMin; *found = dd_FALSE; set_initialize(&CandidateRows, cone->m); if (cone->parent->InitBasisAtBottom==dd_TRUE) { roworder_save=cone->HalfspaceOrder; cone->HalfspaceOrder=dd_MaxIndex; cone->PreOrderedRun=dd_FALSE; } else cone->PreOrderedRun=dd_TRUE; if (dd_debug) dd_WriteBmatrix(stderr, cone->d, cone->B); for (i = 1; i <= cone->m; i++) if (!set_member(i,cone->NonequalitySet)) set_addelem(CandidateRows, i); /*all rows not in NonequalitySet are candidates for initial cone*/ dd_FindBasis(cone, &rank); if (dd_debug) dd_WriteBmatrix(stderr, cone->d, cone->B); if (dd_debug) fprintf(stderr,"dd_FindInitialRays: rank of Amatrix = %ld\n", rank); cone->LinearityDim=cone->d - rank; if (dd_debug) fprintf(stderr,"Linearity Dimension = %ld\n", cone->LinearityDim); if (cone->LinearityDim > 0) { dd_ColumnReduce(cone); dd_FindBasis(cone, &rank); } if (!set_subset(cone->EqualitySet,cone->InitialHalfspaces)) { if (dd_debug) { fprintf(stderr,"Equality set is dependent. Equality Set and an initial basis:\n"); set_fwrite(stderr,cone->EqualitySet); set_fwrite(stderr,cone->InitialHalfspaces); }; } *found = dd_TRUE; set_free(CandidateRows); if (cone->parent->InitBasisAtBottom==dd_TRUE) { cone->HalfspaceOrder=roworder_save; } if (cone->HalfspaceOrder==dd_MaxCutoff|| cone->HalfspaceOrder==dd_MinCutoff|| cone->HalfspaceOrder==dd_MixCutoff){ cone->PreOrderedRun=dd_FALSE; } else cone->PreOrderedRun=dd_TRUE; } void dd_CheckEquality(dd_colrange d_size, dd_RayPtr*RP1, dd_RayPtr*RP2, dd_boolean *equal) { long j; if (dd_debug) fprintf(stderr,"Check equality of two rays\n"); *equal = dd_TRUE; j = 1; while (j <= d_size && *equal) { if (!dd_Equal((*RP1)->Ray[j - 1],(*RP2)->Ray[j - 1])) *equal = dd_FALSE; j++; } if (*equal) fprintf(stderr,"Equal records found !!!!\n"); } void dd_CreateNewRay(dd_ConePtr cone, dd_RayPtr Ptr1, dd_RayPtr Ptr2, dd_rowrange ii) { /*Create a new ray by taking a linear combination of two rays*/ dd_colrange j; mytype a1, a2, v1, v2; static dd_Arow NewRay; static dd_colrange last_d=0; dd_boolean localdebug=dd_debug; dd_init(a1); dd_init(a2); dd_init(v1); dd_init(v2); if (last_d!=cone->d){ if (last_d>0) { for (j=0; jd,sizeof(mytype)); for (j=0; jd; j++) dd_init(NewRay[j]); last_d=cone->d; } dd_AValue(&a1, cone->d, cone->A, Ptr1->Ray, ii); dd_AValue(&a2, cone->d, cone->A, Ptr2->Ray, ii); if (localdebug) { fprintf(stderr,"CreatNewRay: Ray1 ="); dd_WriteArow(stderr, Ptr1->Ray, cone->d); fprintf(stderr,"CreatNewRay: Ray2 ="); dd_WriteArow(stderr, Ptr2->Ray, cone->d); } dd_abs(v1,a1); dd_abs(v2,a2); if (localdebug){ fprintf(stderr,"dd_AValue1 and ABS"); dd_WriteNumber(stderr,a1); dd_WriteNumber(stderr,v1); fprintf(stderr,"\n"); fprintf(stderr,"dd_AValue2 and ABS"); dd_WriteNumber(stderr,a2); dd_WriteNumber(stderr,v2); fprintf(stderr,"\n"); } for (j = 0; j < cone->d; j++){ dd_LinearComb(NewRay[j], Ptr1->Ray[j],v2,Ptr2->Ray[j],v1); } if (localdebug) { fprintf(stderr,"CreatNewRay: New ray ="); dd_WriteArow(stderr, NewRay, cone->d); } dd_Normalize(cone->d, NewRay); if (localdebug) { fprintf(stderr,"CreatNewRay: dd_Normalized ray ="); dd_WriteArow(stderr, NewRay, cone->d); } dd_AddRay(cone, NewRay); dd_clear(a1); dd_clear(a2); dd_clear(v1); dd_clear(v2); } void dd_EvaluateARay1(dd_rowrange i, dd_ConePtr cone) /* Evaluate the ith component of the vector A x RD.Ray and rearrange the linked list so that the infeasible rays with respect to i will be placed consecutively from First */ { dd_colrange j; mytype temp,tnext; dd_RayPtr Ptr, PrevPtr, TempPtr; dd_init(temp); dd_init(tnext); Ptr = cone->FirstRay; PrevPtr = cone->ArtificialRay; if (PrevPtr->Next != Ptr) { fprintf(stderr,"Error. Artificial Ray does not point to FirstRay!!!\n"); } while (Ptr != NULL) { dd_set(temp,dd_purezero); for (j = 0; j < cone->d; j++){ dd_mul(tnext,cone->A[i - 1][j],Ptr->Ray[j]); dd_add(temp,temp,tnext); } dd_set(Ptr->ARay,temp); /* if ( temp <= -zero && Ptr != cone->FirstRay) {*/ if ( dd_Negative(temp) && Ptr != cone->FirstRay) { /* fprintf(stderr,"Moving an infeasible record w.r.t. %ld to FirstRay\n",i); */ if (Ptr==cone->LastRay) cone->LastRay=PrevPtr; TempPtr=Ptr; Ptr = Ptr->Next; PrevPtr->Next = Ptr; cone->ArtificialRay->Next = TempPtr; TempPtr->Next = cone->FirstRay; cone->FirstRay = TempPtr; } else { PrevPtr = Ptr; Ptr = Ptr->Next; } } dd_clear(temp); dd_clear(tnext); } void dd_EvaluateARay2(dd_rowrange i, dd_ConePtr cone) /* Evaluate the ith component of the vector A x RD.Ray and rearrange the linked list so that the infeasible rays with respect to i will be placed consecutively from First. Also for all feasible rays, "positive" rays and "zero" rays will be placed consecutively. */ { dd_colrange j; mytype temp,tnext; dd_RayPtr Ptr, NextPtr; dd_boolean zerofound=dd_FALSE,negfound=dd_FALSE,posfound=dd_FALSE; if (cone==NULL || cone->TotalRayCount<=0) goto _L99; dd_init(temp); dd_init(tnext); cone->PosHead=NULL;cone->ZeroHead=NULL;cone->NegHead=NULL; cone->PosLast=NULL;cone->ZeroLast=NULL;cone->NegLast=NULL; Ptr = cone->FirstRay; while (Ptr != NULL) { NextPtr=Ptr->Next; /* remember the Next record */ Ptr->Next=NULL; /* then clear the Next pointer */ dd_set(temp,dd_purezero); for (j = 0; j < cone->d; j++){ dd_mul(tnext,cone->A[i - 1][j],Ptr->Ray[j]); dd_add(temp,temp,tnext); } dd_set(Ptr->ARay,temp); /* if ( temp < -zero) {*/ if ( dd_Negative(temp)) { if (!negfound){ negfound=dd_TRUE; cone->NegHead=Ptr; cone->NegLast=Ptr; } else{ Ptr->Next=cone->NegHead; cone->NegHead=Ptr; } } /* else if (temp > zero){*/ else if (dd_Positive(temp)){ if (!posfound){ posfound=dd_TRUE; cone->PosHead=Ptr; cone->PosLast=Ptr; } else{ Ptr->Next=cone->PosHead; cone->PosHead=Ptr; } } else { if (!zerofound){ zerofound=dd_TRUE; cone->ZeroHead=Ptr; cone->ZeroLast=Ptr; } else{ Ptr->Next=cone->ZeroHead; cone->ZeroHead=Ptr; } } Ptr=NextPtr; } /* joining three neg, pos and zero lists */ if (negfound){ /* -list nonempty */ cone->FirstRay=cone->NegHead; if (posfound){ /* -list & +list nonempty */ cone->NegLast->Next=cone->PosHead; if (zerofound){ /* -list, +list, 0list all nonempty */ cone->PosLast->Next=cone->ZeroHead; cone->LastRay=cone->ZeroLast; } else{ /* -list, +list nonempty but 0list empty */ cone->LastRay=cone->PosLast; } } else{ /* -list nonempty & +list empty */ if (zerofound){ /* -list,0list nonempty & +list empty */ cone->NegLast->Next=cone->ZeroHead; cone->LastRay=cone->ZeroLast; } else { /* -list nonempty & +list,0list empty */ cone->LastRay=cone->NegLast; } } } else if (posfound){ /* -list empty & +list nonempty */ cone->FirstRay=cone->PosHead; if (zerofound){ /* -list empty & +list,0list nonempty */ cone->PosLast->Next=cone->ZeroHead; cone->LastRay=cone->ZeroLast; } else{ /* -list,0list empty & +list nonempty */ cone->LastRay=cone->PosLast; } } else{ /* -list,+list empty & 0list nonempty */ cone->FirstRay=cone->ZeroHead; cone->LastRay=cone->ZeroLast; } cone->ArtificialRay->Next=cone->FirstRay; cone->LastRay->Next=NULL; dd_clear(temp); dd_clear(tnext); _L99:; } void dd_DeleteNegativeRays(dd_ConePtr cone) /* Eliminate the infeasible rays with respect to i which are supposed to be consecutive from the head of the dd_Ray list, and sort the zero list assumed to be consecutive at the end of the list. */ { dd_rowrange fii,fiitest; mytype temp; dd_RayPtr Ptr, PrevPtr,NextPtr,ZeroPtr1,ZeroPtr0; dd_boolean found, completed, zerofound=dd_FALSE,negfound=dd_FALSE,posfound=dd_FALSE; dd_boolean localdebug=dd_FALSE; dd_init(temp); cone->PosHead=NULL;cone->ZeroHead=NULL;cone->NegHead=NULL; cone->PosLast=NULL;cone->ZeroLast=NULL;cone->NegLast=NULL; /* Delete the infeasible rays */ PrevPtr= cone->ArtificialRay; Ptr = cone->FirstRay; if (PrevPtr->Next != Ptr) fprintf(stderr,"Error at dd_DeleteNegativeRays: ArtificialRay does not point the FirstRay.\n"); completed=dd_FALSE; while (Ptr != NULL && !completed){ /* if ( (Ptr->ARay) < -zero ){ */ if ( dd_Negative(Ptr->ARay)){ dd_Eliminate(cone, &PrevPtr); Ptr=PrevPtr->Next; } else{ completed=dd_TRUE; } } /* Sort the zero rays */ Ptr = cone->FirstRay; cone->ZeroRayCount=0; while (Ptr != NULL) { NextPtr=Ptr->Next; /* remember the Next record */ dd_set(temp,Ptr->ARay); if (localdebug) {fprintf(stderr,"Ptr->ARay :"); dd_WriteNumber(stderr, temp);} /* if ( temp < -zero) {*/ if ( dd_Negative(temp)) { if (!negfound){ fprintf(stderr,"Error: An infeasible ray found after their removal\n"); negfound=dd_TRUE; } } /* else if (temp > zero){*/ else if (dd_Positive(temp)){ if (!posfound){ posfound=dd_TRUE; cone->PosHead=Ptr; cone->PosLast=Ptr; } else{ cone->PosLast=Ptr; } } else { (cone->ZeroRayCount)++; if (!zerofound){ zerofound=dd_TRUE; cone->ZeroHead=Ptr; cone->ZeroLast=Ptr; cone->ZeroLast->Next=NULL; } else{/* Find a right position to store the record sorted w.r.t. FirstInfeasIndex */ fii=Ptr->FirstInfeasIndex; found=dd_FALSE; ZeroPtr1=NULL; for (ZeroPtr0=cone->ZeroHead; !found && ZeroPtr0!=NULL ; ZeroPtr0=ZeroPtr0->Next){ fiitest=ZeroPtr0->FirstInfeasIndex; if (fiitest >= fii){ found=dd_TRUE; } else ZeroPtr1=ZeroPtr0; } /* fprintf(stderr,"insert position found \n %d index %ld\n",found, fiitest); */ if (!found){ /* the new record must be stored at the end of list */ cone->ZeroLast->Next=Ptr; cone->ZeroLast=Ptr; cone->ZeroLast->Next=NULL; } else{ if (ZeroPtr1==NULL){ /* store the new one at the head, and update the head ptr */ /* fprintf(stderr,"Insert at the head\n"); */ Ptr->Next=cone->ZeroHead; cone->ZeroHead=Ptr; } else{ /* store the new one inbetween ZeroPtr1 and 0 */ /* fprintf(stderr,"Insert inbetween\n"); */ Ptr->Next=ZeroPtr1->Next; ZeroPtr1->Next=Ptr; } } /* Ptr->Next=cone->ZeroHead; cone->ZeroHead=Ptr; */ } } Ptr=NextPtr; } /* joining the pos and zero lists */ if (posfound){ /* -list empty & +list nonempty */ cone->FirstRay=cone->PosHead; if (zerofound){ /* +list,0list nonempty */ cone->PosLast->Next=cone->ZeroHead; cone->LastRay=cone->ZeroLast; } else{ /* 0list empty & +list nonempty */ cone->LastRay=cone->PosLast; } } else{ /* +list empty & 0list nonempty */ cone->FirstRay=cone->ZeroHead; cone->LastRay=cone->ZeroLast; } cone->ArtificialRay->Next=cone->FirstRay; cone->LastRay->Next=NULL; dd_clear(temp); } void dd_FeasibilityIndices(long *fnum, long *infnum, dd_rowrange i, dd_ConePtr cone) { /*Evaluate the number of feasible rays and infeasible rays*/ /* w.r.t the hyperplane i*/ dd_colrange j; mytype temp, tnext; dd_RayPtr Ptr; dd_init(temp); dd_init(tnext); *fnum = 0; *infnum = 0; Ptr = cone->FirstRay; while (Ptr != NULL) { dd_set(temp,dd_purezero); for (j = 0; j < cone->d; j++){ dd_mul(tnext, cone->A[i - 1][j],Ptr->Ray[j]); dd_add(temp, temp, tnext); } if (dd_Nonnegative(temp)) (*fnum)++; else (*infnum)++; Ptr = Ptr->Next; } dd_clear(temp); dd_clear(tnext); } dd_boolean dd_LexSmaller(mytype *v1, mytype *v2, long dmax) { /* dmax is the size of vectors v1,v2 */ dd_boolean determined, smaller; dd_colrange j; smaller = dd_FALSE; determined = dd_FALSE; j = 1; do { if (!dd_Equal(v1[j - 1],v2[j - 1])) { /* 086 */ if (dd_Smaller(v1[j - 1],v2[j - 1])) { /*086 */ smaller = dd_TRUE; } determined = dd_TRUE; } else j++; } while (!(determined) && (j <= dmax)); return smaller; } dd_boolean dd_LexLarger(mytype *v1, mytype *v2, long dmax) { return dd_LexSmaller(v2, v1, dmax); } dd_boolean dd_LexEqual(mytype *v1, mytype *v2, long dmax) { /* dmax is the size of vectors v1,v2 */ dd_boolean determined, equal; dd_colrange j; equal = dd_TRUE; determined = dd_FALSE; j = 1; do { if (!dd_Equal(v1[j - 1],v2[j - 1])) { /* 093c */ equal = dd_FALSE; determined = dd_TRUE; } else { j++; } } while (!(determined) && (j <= dmax)); return equal; } void dd_AddNewHalfspace1(dd_ConePtr cone, dd_rowrange hnew) /* This procedure 1 must be used with PreorderedRun=dd_FALSE This procedure is the most elementary implementation of DD and can be used with any type of ordering, including dynamic ordering of rows, e.g. MaxCutoff, MinCutoff. The memory requirement is minimum because it does not store any adjacency among the rays. */ { dd_RayPtr RayPtr0,RayPtr1,RayPtr2,RayPtr2s,RayPtr3; long pos1, pos2; double prevprogress, progress; mytype value1, value2; dd_boolean adj, equal, completed; dd_init(value1); dd_init(value2); dd_EvaluateARay1(hnew, cone); /*Check feasibility of rays w.r.t. hnew and put all infeasible ones consecutively */ RayPtr0 = cone->ArtificialRay; /*Pointer pointing RayPrt1*/ RayPtr1 = cone->FirstRay; /*1st hnew-infeasible ray to scan and compare with feasible rays*/ dd_set(value1,cone->FirstRay->ARay); if (dd_Nonnegative(value1)) { if (cone->RayCount==cone->WeaklyFeasibleRayCount) cone->CompStatus=dd_AllFound; goto _L99; /* Sicne there is no hnew-infeasible ray and nothing to do */ } else { RayPtr2s = RayPtr1->Next;/* RayPtr2s must point the first feasible ray */ pos2=1; while (RayPtr2s!=NULL && dd_Negative(RayPtr2s->ARay)) { RayPtr2s = RayPtr2s->Next; pos2++; } } if (RayPtr2s==NULL) { cone->FirstRay=NULL; cone->ArtificialRay->Next=cone->FirstRay; cone->RayCount=0; cone->CompStatus=dd_AllFound; goto _L99; /* All rays are infeasible, and the computation must stop */ } RayPtr2 = RayPtr2s; /*2nd feasible ray to scan and compare with 1st*/ RayPtr3 = cone->LastRay; /*Last feasible for scanning*/ prevprogress=-10.0; pos1 = 1; completed=dd_FALSE; while ((RayPtr1 != RayPtr2s) && !completed) { dd_set(value1,RayPtr1->ARay); dd_set(value2,RayPtr2->ARay); dd_CheckEquality(cone->d, &RayPtr1, &RayPtr2, &equal); if ((dd_Positive(value1) && dd_Negative(value2)) || (dd_Negative(value1) && dd_Positive(value2))){ dd_CheckAdjacency(cone, &RayPtr1, &RayPtr2, &adj); if (adj) dd_CreateNewRay(cone, RayPtr1, RayPtr2, hnew); } if (RayPtr2 != RayPtr3) { RayPtr2 = RayPtr2->Next; continue; } if (dd_Negative(value1) || equal) { dd_Eliminate(cone, &RayPtr0); RayPtr1 = RayPtr0->Next; RayPtr2 = RayPtr2s; } else { completed=dd_TRUE; } pos1++; progress = 100.0 * ((double)pos1 / pos2) * (2.0 * pos2 - pos1) / pos2; if (progress-prevprogress>=10 && pos1%10==0 && dd_debug) { fprintf(stderr,"*Progress of iteration %5ld(/%ld): %4ld/%4ld => %4.1f%% done\n", cone->Iteration, cone->m, pos1, pos2, progress); prevprogress=progress; } } if (cone->RayCount==cone->WeaklyFeasibleRayCount) cone->CompStatus=dd_AllFound; _L99:; dd_clear(value1); dd_clear(value2); } void dd_AddNewHalfspace2(dd_ConePtr cone, dd_rowrange hnew) /* This procedure must be used under PreOrderedRun mode */ { dd_RayPtr RayPtr0,RayPtr1,RayPtr2; dd_AdjacencyType *EdgePtr, *EdgePtr0; long pos1; dd_rowrange fii1, fii2; dd_boolean localdebug=dd_FALSE; dd_EvaluateARay2(hnew, cone); /* Check feasibility of rays w.r.t. hnew and sort them. ( -rays, +rays, 0rays)*/ if (cone->PosHead==NULL && cone->ZeroHead==NULL) { cone->FirstRay=NULL; cone->ArtificialRay->Next=cone->FirstRay; cone->RayCount=0; cone->CompStatus=dd_AllFound; goto _L99; /* All rays are infeasible, and the computation must stop */ } if (localdebug){ pos1=0; fprintf(stderr,"(pos, FirstInfeasIndex, A Ray)=\n"); for (RayPtr0=cone->FirstRay; RayPtr0!=NULL; RayPtr0=RayPtr0->Next){ pos1++; fprintf(stderr,"(%ld,%ld,",pos1,RayPtr0->FirstInfeasIndex); dd_WriteNumber(stderr,RayPtr0->ARay); fprintf(stderr,") "); } fprintf(stderr,"\n"); } if (cone->ZeroHead==NULL) cone->ZeroHead=cone->LastRay; EdgePtr=cone->Edges[cone->Iteration]; while (EdgePtr!=NULL){ RayPtr1=EdgePtr->Ray1; RayPtr2=EdgePtr->Ray2; fii1=RayPtr1->FirstInfeasIndex; dd_CreateNewRay(cone, RayPtr1, RayPtr2, hnew); fii2=cone->LastRay->FirstInfeasIndex; if (fii1 != fii2) dd_ConditionalAddEdge(cone,RayPtr1,cone->LastRay,cone->PosHead); EdgePtr0=EdgePtr; EdgePtr=EdgePtr->Next; free(EdgePtr0); (cone->EdgeCount)--; } cone->Edges[cone->Iteration]=NULL; dd_DeleteNegativeRays(cone); set_addelem(cone->AddedHalfspaces, hnew); if (cone->Iterationm){ if (cone->ZeroHead!=NULL && cone->ZeroHead!=cone->LastRay){ if (cone->ZeroRayCount>200 && dd_debug) fprintf(stderr,"*New edges being scanned...\n"); dd_UpdateEdges(cone, cone->ZeroHead, cone->LastRay); } } if (cone->RayCount==cone->WeaklyFeasibleRayCount) cone->CompStatus=dd_AllFound; _L99:; } void dd_SelectNextHalfspace0(dd_ConePtr cone, dd_rowset excluded, dd_rowrange *hnext) { /*A natural way to choose the next hyperplane. Simply the largest index*/ long i; dd_boolean determined; i = cone->m; determined = dd_FALSE; do { if (set_member(i, excluded)) i--; else determined = dd_TRUE; } while (!determined && i>=1); if (determined) *hnext = i; else *hnext = 0; } void dd_SelectNextHalfspace1(dd_ConePtr cone, dd_rowset excluded, dd_rowrange *hnext) { /*Natural way to choose the next hyperplane. Simply the least index*/ long i; dd_boolean determined; i = 1; determined = dd_FALSE; do { if (set_member(i, excluded)) i++; else determined = dd_TRUE; } while (!determined && i<=cone->m); if (determined) *hnext = i; else *hnext=0; } void dd_SelectNextHalfspace2(dd_ConePtr cone, dd_rowset excluded, dd_rowrange *hnext) { /*Choose the next hyperplane with maximum infeasibility*/ long i, fea, inf, infmin, fi=0; /*feasibility and infeasibility numbers*/ infmin = cone->RayCount + 1; for (i = 1; i <= cone->m; i++) { if (!set_member(i, excluded)) { dd_FeasibilityIndices(&fea, &inf, i, cone); if (inf < infmin) { infmin = inf; fi = fea; *hnext = i; } } } if (dd_debug) { fprintf(stderr,"*infeasible rays (min) =%5ld, #feas rays =%5ld\n", infmin, fi); } } void dd_SelectNextHalfspace3(dd_ConePtr cone, dd_rowset excluded, dd_rowrange *hnext) { /*Choose the next hyperplane with maximum infeasibility*/ long i, fea, inf, infmax, fi=0; /*feasibility and infeasibility numbers*/ dd_boolean localdebug=dd_debug; infmax = -1; for (i = 1; i <= cone->m; i++) { if (!set_member(i, excluded)) { dd_FeasibilityIndices(&fea, &inf, i, cone); if (inf > infmax) { infmax = inf; fi = fea; *hnext = i; } } } if (localdebug) { fprintf(stderr,"*infeasible rays (max) =%5ld, #feas rays =%5ld\n", infmax, fi); } } void dd_SelectNextHalfspace4(dd_ConePtr cone, dd_rowset excluded, dd_rowrange *hnext) { /*Choose the next hyperplane with the most unbalanced cut*/ long i, fea, inf, max, tmax, fi=0, infi=0; /*feasibility and infeasibility numbers*/ max = -1; for (i = 1; i <= cone->m; i++) { if (!set_member(i, excluded)) { dd_FeasibilityIndices(&fea, &inf, i, cone); if (fea <= inf) tmax = inf; else tmax = fea; if (tmax > max) { max = tmax; fi = fea; infi = inf; *hnext = i; } } } if (!dd_debug) return; if (max == fi) { fprintf(stderr,"*infeasible rays (min) =%5ld, #feas rays =%5ld\n", infi, fi); } else { fprintf(stderr,"*infeasible rays (max) =%5ld, #feas rays =%5ld\n", infi, fi); } } void dd_SelectNextHalfspace5(dd_ConePtr cone, dd_rowset excluded, dd_rowrange *hnext) { /*Choose the next hyperplane which is lexico-min*/ long i, minindex; mytype *v1, *v2; minindex = 0; v1 = NULL; for (i = 1; i <= cone->m; i++) { if (!set_member(i, excluded)) { v2 = cone->A[i - 1]; if (minindex == 0) { minindex = i; v1=v2; } else if (dd_LexSmaller(v2,v1,cone->d)) { minindex = i; v1=v2; } } } *hnext = minindex; } void dd_SelectNextHalfspace6(dd_ConePtr cone, dd_rowset excluded, dd_rowrange *hnext) { /*Choose the next hyperplane which is lexico-max*/ long i, maxindex; mytype *v1, *v2; maxindex = 0; v1 = NULL; for (i = 1; i <= cone->m; i++) { if (!set_member(i, excluded)) { v2= cone->A[i - 1]; if (maxindex == 0) { maxindex = i; v1=v2; } else if (dd_LexLarger(v2, v1, cone->d)) { maxindex = i; v1=v2; } } } *hnext = maxindex; } void dd_UniqueRows(dd_rowindex OV, long p, long r, dd_Amatrix A, long dmax, dd_rowset preferred, long *uniqrows) { /* Select a subset of rows of A (with range [p, q] up to dimension dmax) by removing duplicates. When a row subset preferred is nonempty, those row indices in the set have priority. If two priority rows define the same row vector, one is chosen. For a selected unique row i, OV[i] returns a new position of the unique row i. For other nonuniqu row i, OV[i] returns a negative of the original row j dominating i. Thus the original contents of OV[p..r] will be rewritten. Other components remain the same. *uniqrows returns the number of unique rows. */ long i,iuniq,j; mytype *x; dd_boolean localdebug=dd_FALSE; if (p<=0 || p > r) goto _L99; iuniq=p; j=1; /* the first unique row candidate */ x=A[p-1]; OV[p]=j; /* tentative row index of the candidate */ for (i=p+1;i<=r; i++){ if (!dd_LexEqual(x,A[i-1],dmax)) { /* a new row vector found. */ iuniq=i; j=j+1; OV[i]=j; /* Tentatively register the row i. */ x=A[i-1]; } else { /* rows are equal */ if (set_member(i, preferred) && !set_member(iuniq, preferred)){ OV[iuniq]=-i; /* the row iuniq is dominated by the row i */ iuniq=i; /* the row i is preferred. Change the candidate. */ OV[i]=j; /* the row i is tentatively registered. */ x=A[i-1]; } else { OV[i]=-iuniq; /* the row iuniq is dominated by the row i */ } } } *uniqrows=j; if (localdebug){ printf("The number of unique rows are %ld\n with order vector",*uniqrows); for (i=p;i<=r; i++){ printf(" %ld:%ld ",i,OV[i]); } printf("\n"); } _L99:; } long dd_Partition(dd_rowindex OV, long p, long r, dd_Amatrix A, long dmax) { mytype *x; long i,j,ovi; x=A[OV[p]-1]; i=p-1; j=r+1; while (dd_TRUE){ do{ j--; } while (dd_LexLarger(A[OV[j]-1],x,dmax)); do{ i++; } while (dd_LexSmaller(A[OV[i]-1],x,dmax)); if (i1 ; j--) { r=rand(); u=r/rand_max; xk=(double)(j*u +1); k=(long)xk; if (localdebug) fprintf(stderr,"u=%g, k=%ld, r=%g, randmax= %g\n",u,k,r,rand_max); ovj=OV[j]; OV[j]=OV[k]; OV[k]=ovj; if (localdebug) fprintf(stderr,"row %ld is exchanged with %ld\n",j,k); } } void dd_ComputeRowOrderVector(dd_ConePtr cone) { long i,itemp; cone->OrderVector[0]=0; switch (cone->HalfspaceOrder){ case dd_MaxIndex: for(i=1; i<=cone->m; i++) cone->OrderVector[i]=cone->m-i+1; break; case dd_MinIndex: for(i=1; i<=cone->m; i++) cone->OrderVector[i]=i; break; case dd_LexMin: case dd_MinCutoff: case dd_MixCutoff: case dd_MaxCutoff: for(i=1; i<=cone->m; i++) cone->OrderVector[i]=i; dd_RandomPermutation(cone->OrderVector, cone->m, cone->rseed); dd_QuickSort(cone->OrderVector, 1, cone->m, cone->A, cone->d); break; case dd_LexMax: for(i=1; i<=cone->m; i++) cone->OrderVector[i]=i; dd_RandomPermutation(cone->OrderVector, cone->m, cone->rseed); dd_QuickSort(cone->OrderVector, 1, cone->m, cone->A, cone->d); for(i=1; i<=cone->m/2;i++){ /* just reverse the order */ itemp=cone->OrderVector[i]; cone->OrderVector[i]=cone->OrderVector[cone->m-i+1]; cone->OrderVector[cone->m-i+1]=itemp; } break; case dd_RandomRow: for(i=1; i<=cone->m; i++) cone->OrderVector[i]=i; dd_RandomPermutation(cone->OrderVector, cone->m, cone->rseed); break; } } void dd_UpdateRowOrderVector(dd_ConePtr cone, dd_rowset PriorityRows) /* Update the RowOrder vector to shift selected rows in highest order. */ { dd_rowrange i,j,k,j1=0,oj=0; long rr; dd_boolean found, localdebug=dd_FALSE; if (dd_debug) localdebug=dd_TRUE; found=dd_TRUE; rr=set_card(PriorityRows); if (localdebug) set_fwrite(stderr,PriorityRows); for (i=1; i<=rr; i++){ found=dd_FALSE; for (j=i; j<=cone->m && !found; j++){ oj=cone->OrderVector[j]; if (set_member(oj, PriorityRows)){ found=dd_TRUE; if (localdebug) fprintf(stderr,"%ldth in sorted list (row %ld) is in PriorityRows\n", j, oj); j1=j; } } if (found){ if (j1>i) { /* shift everything lower: ov[i]->cone->ov[i+1]..ov[j1-1]->cone->ov[j1] */ for (k=j1; k>=i; k--) cone->OrderVector[k]=cone->OrderVector[k-1]; cone->OrderVector[i]=oj; if (localdebug){ fprintf(stderr,"OrderVector updated to:\n"); for (j = 1; j <= cone->m; j++) fprintf(stderr," %2ld", cone->OrderVector[j]); fprintf(stderr,"\n"); } } } else { fprintf(stderr,"UpdateRowOrder: Error.\n"); goto _L99; } } _L99:; } void dd_SelectPreorderedNext(dd_ConePtr cone, dd_rowset excluded, dd_rowrange *hh) { dd_rowrange i,k; *hh=0; for (i=1; i<=cone->m && *hh==0; i++){ k=cone->OrderVector[i]; if (!set_member(k, excluded)) *hh=k ; } } void dd_SelectNextHalfspace(dd_ConePtr cone, dd_rowset excluded, dd_rowrange *hh) { if (cone->PreOrderedRun){ if (dd_debug) { fprintf(stderr,"debug dd_SelectNextHalfspace: Use PreorderNext\n"); } dd_SelectPreorderedNext(cone, excluded, hh); } else { if (dd_debug) { fprintf(stderr,"debug dd_SelectNextHalfspace: Use DynamicOrderedNext\n"); } switch (cone->HalfspaceOrder) { case dd_MaxIndex: dd_SelectNextHalfspace0(cone, excluded, hh); break; case dd_MinIndex: dd_SelectNextHalfspace1(cone, excluded, hh); break; case dd_MinCutoff: dd_SelectNextHalfspace2(cone, excluded, hh); break; case dd_MaxCutoff: dd_SelectNextHalfspace3(cone, excluded, hh); break; case dd_MixCutoff: dd_SelectNextHalfspace4(cone, excluded, hh); break; default: dd_SelectNextHalfspace0(cone, excluded, hh); break; } } } dd_boolean dd_Nonnegative(mytype val) { /* if (val>=-dd_zero) return dd_TRUE; */ if (dd_cmp(val,dd_minuszero)>=0) return dd_TRUE; else return dd_FALSE; } dd_boolean dd_Nonpositive(mytype val) { /* if (val<=dd_zero) return dd_TRUE; */ if (dd_cmp(val,dd_zero)<=0) return dd_TRUE; else return dd_FALSE; } dd_boolean dd_Positive(mytype val) { return !dd_Nonpositive(val); } dd_boolean dd_Negative(mytype val) { return !dd_Nonnegative(val); } dd_boolean dd_EqualToZero(mytype val) { return (dd_Nonnegative(val) && dd_Nonpositive(val)); } dd_boolean dd_Nonzero(mytype val) { return (dd_Positive(val) || dd_Negative(val)); } dd_boolean dd_Equal(mytype val1,mytype val2) { return (!dd_Larger(val1,val2) && !dd_Smaller(val1,val2)); } dd_boolean dd_Larger(mytype val1,mytype val2) { mytype temp; dd_boolean answer; dd_init(temp); dd_sub(temp,val1, val2); answer=dd_Positive(temp); dd_clear(temp); return answer; } dd_boolean dd_Smaller(mytype val1,mytype val2) { return dd_Larger(val2,val1); } void dd_abs(mytype absval, mytype val) { if (dd_Negative(val)) dd_neg(absval,val); else dd_set(absval,val); } void dd_LinearComb(mytype lc, mytype v1, mytype c1, mytype v2, mytype c2) /* lc := v1 * c1 + v2 * c2 */ { mytype temp; dd_init(temp); dd_mul(lc,v1,c1); dd_mul(temp,v2,c2); dd_add(lc,lc,temp); dd_clear(temp); } void dd_InnerProduct(mytype prod, dd_colrange d, dd_Arow v1, dd_Arow v2) { mytype temp; dd_colrange j; dd_boolean localdebug=dd_FALSE; dd_init(temp); dd_set_si(prod, 0); for (j = 0; j < d; j++){ dd_mul(temp,v1[j],v2[j]); dd_add(prod,prod,temp); } if (localdebug) { fprintf(stderr,"InnerProduct:\n"); dd_WriteArow(stderr, v1, d); dd_WriteArow(stderr, v2, d); fprintf(stderr,"prod ="); dd_WriteNumber(stderr, prod); fprintf(stderr,"\n"); } dd_clear(temp); } /* end of cddcore.c */ pplacer-1.1.alpha19/cdd_src/cddio.c000066400000000000000000001530631303154601500170740ustar00rootroot00000000000000/* cddio.c: Basic Input and Output Procedures for cddlib written by Komei Fukuda, fukuda@ifor.math.ethz.ch Version 0.94f, February 7, 2008 */ /* cddlib : C-library of the double description method for computing all vertices and extreme rays of the polyhedron P= {x : b - A x >= 0}. Please read COPYING (GNU General Public Licence) and the manual cddlibman.tex for detail. */ #include "setoper.h" /* set operation library header (Ver. June 1, 2000 or later) */ #include "cdd.h" #include #include #include #include #include /* void dd_fread_rational_value (FILE *, mytype *); */ void dd_SetLinearity(dd_MatrixPtr, char *); void dd_SetInputFile(FILE **f,dd_DataFileType inputfile,dd_ErrorType *Error) { int opened=0,stop,quit=0; int i,trial=0; char ch; char *tempname; *Error=dd_NoError; while (!opened && !quit) { fprintf(stderr,"\n>> Input file: "); if(scanf("%s",inputfile)); ch=getchar(); stop=dd_FALSE; for (i=0; i5) { *Error=dd_IFileNotFound; quit=1; } } } } void dd_SetWriteFileName(dd_DataFileType inputfile, dd_DataFileType outfile, char cflag, dd_RepresentationType rep) { char *extension; dd_DataFileType ifilehead=""; int i,dotpos; switch (cflag) { case 'o': switch (rep) { case dd_Generator: extension=".ine"; break; /* output file for ine data */ case dd_Inequality: extension=".ext"; break; /* output file for ext data */ default: extension=".xxx";break; } break; case 'a': /* decide for output adjacence */ if (rep==dd_Inequality) extension=".ead"; /* adjacency file for ext data */ else extension=".iad"; /* adjacency file for ine data */ break; case 'i': /* decide for output incidence */ if (rep==dd_Inequality) extension=".ecd"; /* ext incidence file */ else extension=".icd"; /* ine incidence file */ break; case 'n': /* decide for input incidence */ if (rep==dd_Inequality) extension=".icd"; /* ine incidence file */ else extension=".ecd"; /* ext incidence file */ break; case 'j': /* decide for input adjacency */ if (rep==dd_Inequality) extension=".iad"; /* ine adjacency file */ else extension=".ead"; /* ext adjacency file */ break; case 'l': extension=".ddl";break; /* log file */ case 'd': extension=".dex";break; /* decomposition output */ case 'p': extension="sub.ine";break; /* preprojection sub inequality file */ case 'v': extension=".solved";break; /* verify_input file */ case 's': extension=".lps";break; /* LP solution file */ default: extension=".xxx";break; } dotpos=-1; for (i=0; i< strlen(inputfile); i++){ if (inputfile[i]=='.') dotpos=i; } if (dotpos>1) strncpy(ifilehead, inputfile, dotpos); else strcpy(ifilehead,inputfile); if (strlen(inputfile)<=0) strcpy(ifilehead,"tempcdd"); strcpy(outfile,ifilehead); strcat(outfile,extension); if (strcmp(inputfile, outfile)==0) { strcpy(outfile,inputfile); strcat(outfile,extension); } /* fprintf(stderr,"outfile name = %s\n",outfile); */ } dd_NumberType dd_GetNumberType(char *line) { dd_NumberType nt; if (strncmp(line, "integer", 7)==0) { nt = dd_Integer; } else if (strncmp(line, "rational", 8)==0) { nt = dd_Rational; } else if (strncmp(line, "real", 4)==0) { nt = dd_Real; } else { nt=dd_Unknown; } return nt; } void dd_ProcessCommandLine(FILE *f, dd_MatrixPtr M, char *line) { char newline[dd_linelenmax]; dd_colrange j; mytype value; dd_init(value); if (strncmp(line, "hull", 4)==0) { M->representation = dd_Generator; } if (strncmp(line, "debug", 5)==0) { dd_debug = dd_TRUE; #ifdef GMPRATIONAL ddf_debug = ddf_TRUE; #endif } if (strncmp(line, "partial_enum", 12)==0 || strncmp(line, "equality", 8)==0 || strncmp(line, "linearity", 9)==0 ) { if(fgets(newline,dd_linelenmax,f)); dd_SetLinearity(M,newline); } if (strncmp(line, "maximize", 8)==0 || strncmp(line, "minimize", 8)==0) { if (strncmp(line, "maximize", 8)==0) M->objective=dd_LPmax; else M->objective=dd_LPmin; for (j = 1; j <= M->colsize; j++) { if (M->numbtype==dd_Real) { #if !defined(GMPRATIONAL) double rvalue; if(fscanf(f, "%lf", &rvalue)); dd_set_d(value, rvalue); #endif } else { dd_fread_rational_value (f, value); } dd_set(M->rowvec[j - 1],value); if (dd_debug) {fprintf(stderr,"cost(%5ld) =",j); dd_WriteNumber(stderr,value);} } /*of j*/ } dd_clear(value); } dd_boolean dd_AppendMatrix2Poly(dd_PolyhedraPtr *poly, dd_MatrixPtr M) { dd_boolean success=dd_FALSE; dd_MatrixPtr Mpoly,Mnew=NULL; dd_ErrorType err; if ((*poly)!=NULL && (*poly)->m >=0 && (*poly)->d>=0 && (*poly)->d==M->colsize && M->rowsize>0){ Mpoly=dd_CopyInput(*poly); Mnew=dd_AppendMatrix(Mpoly, M); dd_FreePolyhedra(*poly); *poly=dd_DDMatrix2Poly(Mnew,&err); dd_FreeMatrix(Mpoly); dd_FreeMatrix(Mnew); if (err==dd_NoError) success=dd_TRUE; } return success; } dd_MatrixPtr dd_MatrixCopy(dd_MatrixPtr M) { dd_MatrixPtr Mcopy=NULL; dd_rowrange m; dd_colrange d; m= M->rowsize; d= M->colsize; if (m >=0 && d >=0){ Mcopy=dd_CreateMatrix(m, d); dd_CopyAmatrix(Mcopy->matrix, M->matrix, m, d); dd_CopyArow(Mcopy->rowvec, M->rowvec, d); set_copy(Mcopy->linset,M->linset); Mcopy->numbtype=M->numbtype; Mcopy->representation=M->representation; Mcopy->objective=M->objective; } return Mcopy; } dd_MatrixPtr dd_CopyMatrix(dd_MatrixPtr M) { return dd_MatrixCopy(M); } dd_MatrixPtr dd_MatrixNormalizedCopy(dd_MatrixPtr M) { dd_MatrixPtr Mcopy=NULL; dd_rowrange m; dd_colrange d; m= M->rowsize; d= M->colsize; if (m >=0 && d >=0){ Mcopy=dd_CreateMatrix(m, d); dd_CopyNormalizedAmatrix(Mcopy->matrix, M->matrix, m, d); dd_CopyArow(Mcopy->rowvec, M->rowvec, d); set_copy(Mcopy->linset,M->linset); Mcopy->numbtype=M->numbtype; Mcopy->representation=M->representation; Mcopy->objective=M->objective; } return Mcopy; } dd_MatrixPtr dd_MatrixAppend(dd_MatrixPtr M1, dd_MatrixPtr M2) { dd_MatrixPtr M=NULL; dd_rowrange i, m,m1,m2; dd_colrange j, d,d1,d2; m1=M1->rowsize; d1=M1->colsize; m2=M2->rowsize; d2=M2->colsize; m=m1+m2; d=d1; if (d1>=0 && d1==d2 && m1>=0 && m2>=0){ M=dd_CreateMatrix(m, d); dd_CopyAmatrix(M->matrix, M1->matrix, m1, d); dd_CopyArow(M->rowvec, M1->rowvec, d); for (i=0; ilinset)) set_addelem(M->linset,i+1); } for (i=0; imatrix[m1+i][j],M2->matrix[i][j]); /* append the second matrix */ if (set_member(i+1,M2->linset)) set_addelem(M->linset,m1+i+1); } M->numbtype=M1->numbtype; } return M; } dd_MatrixPtr dd_MatrixNormalizedSortedCopy(dd_MatrixPtr M,dd_rowindex *newpos) /* 094 */ { /* Sort the rows of Amatrix lexicographically, and return a link to this sorted copy. The vector newpos is allocated, where newpos[i] returns the new row index of the original row i (i=1,...,M->rowsize). */ dd_MatrixPtr Mcopy=NULL,Mnorm=NULL; dd_rowrange m,i; dd_colrange d; dd_rowindex roworder; /* if (newpos!=NULL) free(newpos); */ m= M->rowsize; d= M->colsize; roworder=(long *)calloc(m+1,sizeof(long)); *newpos=(long *)calloc(m+1,sizeof(long)); if (m >=0 && d >=0){ Mnorm=dd_MatrixNormalizedCopy(M); Mcopy=dd_CreateMatrix(m, d); for(i=1; i<=m; i++) roworder[i]=i; dd_RandomPermutation(roworder, m, 123); dd_QuickSort(roworder,1,m,Mnorm->matrix,d); dd_PermuteCopyAmatrix(Mcopy->matrix, Mnorm->matrix, m, d, roworder); dd_CopyArow(Mcopy->rowvec, M->rowvec, d); for(i=1; i<=m; i++) { if (set_member(roworder[i],M->linset)) set_addelem(Mcopy->linset, i); (*newpos)[roworder[i]]=i; } Mcopy->numbtype=M->numbtype; Mcopy->representation=M->representation; Mcopy->objective=M->objective; dd_FreeMatrix(Mnorm); } free(roworder); return Mcopy; } dd_MatrixPtr dd_MatrixUniqueCopy(dd_MatrixPtr M,dd_rowindex *newpos) { /* Remove row duplicates, and return a link to this sorted copy. Linearity rows have priority over the other rows. It is better to call this after sorting with dd_MatrixNormalizedSortedCopy. The vector newpos is allocated, where *newpos[i] returns the new row index of the original row i (i=1,...,M->rowsize). *newpos[i] is negative if the original row is dominated by -*newpos[i] and eliminated in the new copy. */ dd_MatrixPtr Mcopy=NULL; dd_rowrange m,i,uniqrows; dd_rowset preferredrows; dd_colrange d; dd_rowindex roworder; /* if (newpos!=NULL) free(newpos); */ m= M->rowsize; d= M->colsize; preferredrows=M->linset; roworder=(long *)calloc(m+1,sizeof(long)); if (m >=0 && d >=0){ for(i=1; i<=m; i++) roworder[i]=i; dd_UniqueRows(roworder, 1, m, M->matrix, d,preferredrows, &uniqrows); Mcopy=dd_CreateMatrix(uniqrows, d); dd_PermutePartialCopyAmatrix(Mcopy->matrix, M->matrix, m, d, roworder,1,m); dd_CopyArow(Mcopy->rowvec, M->rowvec, d); for(i=1; i<=m; i++) { if (roworder[i]>0 && set_member(i,M->linset)) set_addelem(Mcopy->linset, roworder[i]); } Mcopy->numbtype=M->numbtype; Mcopy->representation=M->representation; Mcopy->objective=M->objective; } *newpos=roworder; return Mcopy; } dd_MatrixPtr dd_MatrixNormalizedSortedUniqueCopy(dd_MatrixPtr M,dd_rowindex *newpos) /* 094 */ { /* Sort and remove row duplicates, and return a link to this sorted copy. Linearity rows have priority over the other rows. It is better to call this after sorting with dd_MatrixNormalizedSortedCopy. The vector newpos is allocated, where *newpos[i] returns the new row index of the original row i (i=1,...,M->rowsize). *newpos[i] is negative if the original row is dominated by -*newpos[i] and eliminated in the new copy. */ dd_MatrixPtr M1=NULL,M2=NULL; dd_rowrange m,i; dd_colrange d; dd_rowindex newpos1=NULL,newpos1r=NULL,newpos2=NULL; /* if (newpos!=NULL) free(newpos); */ m= M->rowsize; d= M->colsize; *newpos=(long *)calloc(m+1,sizeof(long)); newpos1r=(long *)calloc(m+1,sizeof(long)); if (m>=0 && d>=0){ M1=dd_MatrixNormalizedSortedCopy(M,&newpos1); for (i=1; i<=m;i++) newpos1r[newpos1[i]]=i; /* reverse of newpos1 */ M2=dd_MatrixUniqueCopy(M1,&newpos2); set_emptyset(M2->linset); for(i=1; i<=m; i++) { if (newpos2[newpos1[i]]>0){ printf("newpos1[%ld]=%ld, newpos2[newpos1[%ld]]=%ld\n",i,newpos1[i], i,newpos2[newpos1[i]]); if (set_member(i,M->linset)) set_addelem(M2->linset, newpos2[newpos1[i]]); (*newpos)[i]=newpos2[newpos1[i]]; } else { (*newpos)[i]=-newpos1r[-newpos2[newpos1[i]]]; } } dd_FreeMatrix(M1);free(newpos1);free(newpos2);free(newpos1r); } return M2; } dd_MatrixPtr dd_MatrixSortedUniqueCopy(dd_MatrixPtr M,dd_rowindex *newpos) /* 094 */ { /* Same as dd_MatrixNormalizedSortedUniqueCopy except that it returns a unnormalized origial data with original ordering. */ dd_MatrixPtr M1=NULL,M2=NULL; dd_rowrange m,i,k,ii; dd_colrange d; dd_rowindex newpos1=NULL,newpos1r=NULL,newpos2=NULL; /* if (newpos!=NULL) free(newpos); */ m= M->rowsize; d= M->colsize; *newpos=(long *)calloc(m+1,sizeof(long)); newpos1r=(long *)calloc(m+1,sizeof(long)); if (m>=0 && d>=0){ M1=dd_MatrixNormalizedSortedCopy(M,&newpos1); for (i=1; i<=m;i++) newpos1r[newpos1[i]]=i; /* reverse of newpos1 */ M2=dd_MatrixUniqueCopy(M1,&newpos2); dd_FreeMatrix(M1); set_emptyset(M2->linset); for(i=1; i<=m; i++) { if (newpos2[newpos1[i]]>0){ if (set_member(i,M->linset)) set_addelem(M2->linset, newpos2[newpos1[i]]); (*newpos)[i]=newpos2[newpos1[i]]; } else { (*newpos)[i]=-newpos1r[-newpos2[newpos1[i]]]; } } ii=0; set_emptyset(M2->linset); for (i = 1; i<=m ; i++) { k=(*newpos)[i]; if (k>0) { ii+=1; (*newpos)[i]=ii; dd_CopyArow(M2->matrix[ii-1],M->matrix[i-1],d); if (set_member(i,M->linset)) set_addelem(M2->linset, ii); } } free(newpos1);free(newpos2);free(newpos1r); } return M2; } dd_MatrixPtr dd_AppendMatrix(dd_MatrixPtr M1, dd_MatrixPtr M2) { return dd_MatrixAppend(M1,M2); } int dd_MatrixAppendTo(dd_MatrixPtr *M1, dd_MatrixPtr M2) { dd_MatrixPtr M=NULL; dd_rowrange i, m,m1,m2; dd_colrange j, d,d1,d2; dd_boolean success=0; m1=(*M1)->rowsize; d1=(*M1)->colsize; m2=M2->rowsize; d2=M2->colsize; m=m1+m2; d=d1; if (d1>=0 && d1==d2 && m1>=0 && m2>=0){ M=dd_CreateMatrix(m, d); dd_CopyAmatrix(M->matrix, (*M1)->matrix, m1, d); dd_CopyArow(M->rowvec, (*M1)->rowvec, d); for (i=0; ilinset)) set_addelem(M->linset,i+1); } for (i=0; imatrix[m1+i][j],M2->matrix[i][j]); /* append the second matrix */ if (set_member(i+1,M2->linset)) set_addelem(M->linset,m1+i+1); } M->numbtype=(*M1)->numbtype; dd_FreeMatrix(*M1); *M1=M; success=1; } return success; } int dd_MatrixRowRemove(dd_MatrixPtr *M, dd_rowrange r) /* 092 */ { dd_rowrange i,m; dd_colrange d; dd_boolean success=0; m=(*M)->rowsize; d=(*M)->colsize; if (r >= 1 && r <=m){ (*M)->rowsize=m-1; dd_FreeArow(d, (*M)->matrix[r-1]); set_delelem((*M)->linset,r); /* slide the row headers */ for (i=r; imatrix[i-1]=(*M)->matrix[i]; if (set_member(i+1, (*M)->linset)){ set_delelem((*M)->linset,i+1); set_addelem((*M)->linset,i); } } success=1; } return success; } int dd_MatrixRowRemove2(dd_MatrixPtr *M, dd_rowrange r, dd_rowindex *newpos) /* 094 */ { dd_rowrange i,m; dd_colrange d; dd_boolean success=0; dd_rowindex roworder; m=(*M)->rowsize; d=(*M)->colsize; if (r >= 1 && r <=m){ roworder=(long *)calloc(m+1,sizeof(long)); (*M)->rowsize=m-1; dd_FreeArow(d, (*M)->matrix[r-1]); set_delelem((*M)->linset,r); /* slide the row headers */ for (i=1; imatrix[i-1]=(*M)->matrix[i]; roworder[i+1]=i; if (set_member(i+1, (*M)->linset)){ set_delelem((*M)->linset,i+1); set_addelem((*M)->linset,i); } } success=1; } return success; } dd_MatrixPtr dd_MatrixSubmatrix(dd_MatrixPtr M, dd_rowset delset) /* 092 */ { dd_MatrixPtr Msub=NULL; dd_rowrange i,isub=1, m,msub; dd_colrange d; m= M->rowsize; d= M->colsize; msub=m; if (m >=0 && d >=0){ for (i=1; i<=m; i++) { if (set_member(i,delset)) msub-=1; } Msub=dd_CreateMatrix(msub, d); for (i=1; i<=m; i++){ if (!set_member(i,delset)){ dd_CopyArow(Msub->matrix[isub-1], M->matrix[i-1], d); if (set_member(i, M->linset)){ set_addelem(Msub->linset,isub); } isub++; } } dd_CopyArow(Msub->rowvec, M->rowvec, d); Msub->numbtype=M->numbtype; Msub->representation=M->representation; Msub->objective=M->objective; } return Msub; } dd_MatrixPtr dd_MatrixSubmatrix2(dd_MatrixPtr M, dd_rowset delset,dd_rowindex *newpos) /* 092 */ { /* returns a pointer to a new matrix which is a submatrix of M with rows in delset removed. *newpos[i] returns the position of the original row i in the new matrix. It is -1 if and only if it is deleted. */ dd_MatrixPtr Msub=NULL; dd_rowrange i,isub=1, m,msub; dd_colrange d; dd_rowindex roworder; m= M->rowsize; d= M->colsize; msub=m; if (m >=0 && d >=0){ roworder=(long *)calloc(m+1,sizeof(long)); for (i=1; i<=m; i++) { if (set_member(i,delset)) msub-=1; } Msub=dd_CreateMatrix(msub, d); for (i=1; i<=m; i++){ if (set_member(i,delset)){ roworder[i]=0; /* zero means the row i is removed */ } else { dd_CopyArow(Msub->matrix[isub-1], M->matrix[i-1], d); if (set_member(i, M->linset)){ set_addelem(Msub->linset,isub); } roworder[i]=isub; isub++; } } *newpos=roworder; dd_CopyArow(Msub->rowvec, M->rowvec, d); Msub->numbtype=M->numbtype; Msub->representation=M->representation; Msub->objective=M->objective; } return Msub; } dd_MatrixPtr dd_MatrixSubmatrix2L(dd_MatrixPtr M, dd_rowset delset,dd_rowindex *newpos) /* 094 */ { /* This is same as dd_MatrixSubmatrix2 except that the linearity rows will be shifted up so that they are at the top of the matrix. */ dd_MatrixPtr Msub=NULL; dd_rowrange i,iL, iI, m,msub; dd_colrange d; dd_rowindex roworder; m= M->rowsize; d= M->colsize; msub=m; if (m >=0 && d >=0){ roworder=(long *)calloc(m+1,sizeof(long)); for (i=1; i<=m; i++) { if (set_member(i,delset)) msub-=1; } Msub=dd_CreateMatrix(msub, d); iL=1; iI=set_card(M->linset)+1; /* starting positions */ for (i=1; i<=m; i++){ if (set_member(i,delset)){ roworder[i]=0; /* zero means the row i is removed */ } else { if (set_member(i,M->linset)){ dd_CopyArow(Msub->matrix[iL-1], M->matrix[i-1], d); set_delelem(Msub->linset,i); set_addelem(Msub->linset,iL); roworder[i]=iL; iL+=1; } else { dd_CopyArow(Msub->matrix[iI-1], M->matrix[i-1], d); roworder[i]=iI; iI+=1; } } } *newpos=roworder; dd_CopyArow(Msub->rowvec, M->rowvec, d); Msub->numbtype=M->numbtype; Msub->representation=M->representation; Msub->objective=M->objective; } return Msub; } int dd_MatrixRowsRemove(dd_MatrixPtr *M, dd_rowset delset) /* 094 */ { dd_MatrixPtr Msub=NULL; int success; Msub=dd_MatrixSubmatrix(*M, delset); dd_FreeMatrix(*M); *M=Msub; success=1; return success; } int dd_MatrixRowsRemove2(dd_MatrixPtr *M, dd_rowset delset,dd_rowindex *newpos) /* 094 */ { dd_MatrixPtr Msub=NULL; int success; Msub=dd_MatrixSubmatrix2(*M, delset,newpos); dd_FreeMatrix(*M); *M=Msub; success=1; return success; } int dd_MatrixShiftupLinearity(dd_MatrixPtr *M,dd_rowindex *newpos) /* 094 */ { dd_MatrixPtr Msub=NULL; int success; dd_rowset delset; set_initialize(&delset,(*M)->rowsize); /* emptyset */ Msub=dd_MatrixSubmatrix2L(*M, delset,newpos); dd_FreeMatrix(*M); *M=Msub; set_free(delset); success=1; return success; } dd_PolyhedraPtr dd_CreatePolyhedraData(dd_rowrange m, dd_colrange d) { dd_rowrange i; dd_PolyhedraPtr poly=NULL; poly=(dd_PolyhedraPtr) malloc (sizeof(dd_PolyhedraType)); poly->child =NULL; /* this links the homogenized cone data */ poly->m =m; poly->d =d; poly->n =-1; /* the size of output is not known */ poly->m_alloc =m+2; /* the allocated row size of matrix A */ poly->d_alloc =d; /* the allocated col size of matrix A */ poly->ldim =0; /* initialize the linearity dimension */ poly->numbtype=dd_Real; dd_InitializeAmatrix(poly->m_alloc,poly->d_alloc,&(poly->A)); dd_InitializeArow(d,&(poly->c)); /* cost vector */ poly->representation =dd_Inequality; poly->homogeneous =dd_FALSE; poly->EqualityIndex=(int *)calloc(m+2, sizeof(int)); /* size increased to m+2 in 092b because it is used by the child cone, This is a bug fix suggested by Thao Dang. */ /* ith component is 1 if it is equality, -1 if it is strict inequality, 0 otherwise. */ for (i = 0; i <= m+1; i++) poly->EqualityIndex[i]=0; poly->IsEmpty = -1; /* initially set to -1, neither TRUE nor FALSE, meaning unknown */ poly->NondegAssumed = dd_FALSE; poly->InitBasisAtBottom = dd_FALSE; poly->RestrictedEnumeration = dd_FALSE; poly->RelaxedEnumeration = dd_FALSE; poly->AincGenerated=dd_FALSE; /* Ainc is a set array to store the input incidence. */ return poly; } dd_boolean dd_InitializeConeData(dd_rowrange m, dd_colrange d, dd_ConePtr *cone) { dd_boolean success=dd_TRUE; dd_colrange j; (*cone)=(dd_ConePtr)calloc(1, sizeof(dd_ConeType)); /* INPUT: A given representation of a cone: inequality */ (*cone)->m=m; (*cone)->d=d; (*cone)->m_alloc=m+2; /* allocated row size of matrix A */ (*cone)->d_alloc=d; /* allocated col size of matrix A, B and Bsave */ (*cone)->numbtype=dd_Real; (*cone)->parent=NULL; /* CONTROL: variables to control computation */ (*cone)->Iteration=0; (*cone)->HalfspaceOrder=dd_LexMin; (*cone)->ArtificialRay=NULL; (*cone)->FirstRay=NULL; (*cone)->LastRay=NULL; /* The second description: Generator */ (*cone)->PosHead=NULL; (*cone)->ZeroHead=NULL; (*cone)->NegHead=NULL; (*cone)->PosLast=NULL; (*cone)->ZeroLast=NULL; (*cone)->NegLast=NULL; (*cone)->RecomputeRowOrder = dd_TRUE; (*cone)->PreOrderedRun = dd_FALSE; set_initialize(&((*cone)->GroundSet),(*cone)->m_alloc); set_initialize(&((*cone)->EqualitySet),(*cone)->m_alloc); set_initialize(&((*cone)->NonequalitySet),(*cone)->m_alloc); set_initialize(&((*cone)->AddedHalfspaces),(*cone)->m_alloc); set_initialize(&((*cone)->WeaklyAddedHalfspaces),(*cone)->m_alloc); set_initialize(&((*cone)->InitialHalfspaces),(*cone)->m_alloc); (*cone)->RayCount=0; (*cone)->FeasibleRayCount=0; (*cone)->WeaklyFeasibleRayCount=0; (*cone)->TotalRayCount=0; (*cone)->ZeroRayCount=0; (*cone)->EdgeCount=0; (*cone)->TotalEdgeCount=0; (*cone)->count_int=0; (*cone)->count_int_good=0; (*cone)->count_int_bad=0; (*cone)->rseed=1; /* random seed for random row permutation */ dd_InitializeBmatrix((*cone)->d_alloc, &((*cone)->B)); dd_InitializeBmatrix((*cone)->d_alloc, &((*cone)->Bsave)); dd_InitializeAmatrix((*cone)->m_alloc,(*cone)->d_alloc,&((*cone)->A)); (*cone)->Edges =(dd_AdjacencyType**) calloc((*cone)->m_alloc,sizeof(dd_AdjacencyType*)); (*cone)->InitialRayIndex=(long*)calloc(d+1,sizeof(long)); (*cone)->OrderVector=(long*)calloc((*cone)->m_alloc+1,sizeof(long)); (*cone)->newcol=(long*)calloc(((*cone)->d)+1,sizeof(long)); for (j=0; j<=(*cone)->d; j++) (*cone)->newcol[j]=j; /* identity map, initially */ (*cone)->LinearityDim = -2; /* -2 if it is not computed */ (*cone)->ColReduced = dd_FALSE; (*cone)->d_orig = d; /* STATES: variables to represent current state. */ /*(*cone)->Error; (*cone)->CompStatus; (*cone)->starttime; (*cone)->endtime; */ return success; } dd_ConePtr dd_ConeDataLoad(dd_PolyhedraPtr poly) { dd_ConePtr cone=NULL; dd_colrange d,j; dd_rowrange m,i; m=poly->m; d=poly->d; if (!(poly->homogeneous) && poly->representation==dd_Inequality){ m=poly->m+1; } poly->m1=m; dd_InitializeConeData(m, d, &cone); cone->representation=poly->representation; /* Points to the original polyhedra data, and reversely */ cone->parent=poly; poly->child=cone; for (i=1; i<=poly->m; i++) for (j=1; j<=cone->d; j++) dd_set(cone->A[i-1][j-1],poly->A[i-1][j-1]); if (poly->representation==dd_Inequality && !(poly->homogeneous)){ dd_set(cone->A[m-1][0],dd_one); for (j=2; j<=d; j++) dd_set(cone->A[m-1][j-1],dd_purezero); } return cone; } void dd_SetLinearity(dd_MatrixPtr M, char *line) { int i=0; dd_rowrange eqsize,var; char *next; const char ct[]=", "; /* allows separators "," and " ". */ next=strtok(line,ct); eqsize=atol(next); while (i < eqsize && (next=strtok(NULL,ct))!=NULL) { var=atol(next); set_addelem(M->linset,var); i++; } if (i!=eqsize) { fprintf(stderr,"* Warning: there are inconsistencies in linearity setting.\n"); } return; } dd_MatrixPtr dd_PolyFile2Matrix (FILE *f, dd_ErrorType *Error) { dd_MatrixPtr M=NULL; dd_rowrange m_input,i; dd_colrange d_input,j; dd_RepresentationType rep=dd_Inequality; mytype value; dd_boolean found=dd_FALSE, linearity=dd_FALSE; char command[dd_linelenmax], comsave[dd_linelenmax], numbtype[dd_wordlenmax]; dd_NumberType NT; #if !defined(GMPRATIONAL) double rvalue; #endif dd_init(value); (*Error)=dd_NoError; while (!found) { if (fscanf(f,"%s",command)==EOF) { (*Error)=dd_ImproperInputFormat; goto _L99; } else { if (strncmp(command, "V-representation", 16)==0) { rep=dd_Generator; } if (strncmp(command, "H-representation", 16)==0){ rep=dd_Inequality; } if (strncmp(command, "partial_enum", 12)==0 || strncmp(command, "equality", 8)==0 || strncmp(command, "linearity", 9)==0 ) { linearity=dd_TRUE; if(fgets(comsave,dd_linelenmax,f)); } if (strncmp(command, "begin", 5)==0) found=dd_TRUE; } } if(fscanf(f, "%ld %ld %s", &m_input, &d_input, numbtype)); fprintf(stderr,"size = %ld x %ld\nNumber Type = %s\n", m_input, d_input, numbtype); NT=dd_GetNumberType(numbtype); if (NT==dd_Unknown) { (*Error)=dd_ImproperInputFormat; goto _L99; } M=dd_CreateMatrix(m_input, d_input); M->representation=rep; M->numbtype=NT; for (i = 1; i <= m_input; i++) { for (j = 1; j <= d_input; j++) { if (NT==dd_Real) { #if defined GMPRATIONAL *Error=dd_NoRealNumberSupport; goto _L99; #else if(fscanf(f, "%lf", &rvalue)); dd_set_d(value, rvalue); #endif } else { dd_fread_rational_value (f, value); } dd_set(M->matrix[i-1][j - 1],value); if (dd_debug) {fprintf(stderr,"a(%3ld,%5ld) = ",i,j); dd_WriteNumber(stderr,value);} } /*of j*/ } /*of i*/ if (fscanf(f,"%s",command)==EOF) { (*Error)=dd_ImproperInputFormat; goto _L99; } else if (strncmp(command, "end", 3)!=0) { if (dd_debug) fprintf(stderr,"'end' missing or illegal extra data: %s\n",command); (*Error)=dd_ImproperInputFormat; goto _L99; } if (linearity) { dd_SetLinearity(M,comsave); } while (!feof(f)) { if(fscanf(f,"%s", command)); dd_ProcessCommandLine(f, M, command); if(fgets(command,dd_linelenmax,f)); /* skip the CR/LF */ } _L99: ; dd_clear(value); /* if (f!=NULL) fclose(f); */ return M; } dd_PolyhedraPtr dd_DDMatrix2Poly(dd_MatrixPtr M, dd_ErrorType *err) { dd_rowrange i; dd_colrange j; dd_PolyhedraPtr poly=NULL; *err=dd_NoError; if (M->rowsize<0 || M->colsize<0){ *err=dd_NegativeMatrixSize; goto _L99; } poly=dd_CreatePolyhedraData(M->rowsize, M->colsize); poly->representation=M->representation; poly->homogeneous=dd_TRUE; for (i = 1; i <= M->rowsize; i++) { if (set_member(i, M->linset)) { poly->EqualityIndex[i]=1; } for (j = 1; j <= M->colsize; j++) { dd_set(poly->A[i-1][j-1], M->matrix[i-1][j-1]); if (j==1 && dd_Nonzero(M->matrix[i-1][j-1])) poly->homogeneous = dd_FALSE; } /*of j*/ } /*of i*/ dd_DoubleDescription(poly,err); _L99: return poly; } dd_PolyhedraPtr dd_DDMatrix2Poly2(dd_MatrixPtr M, dd_RowOrderType horder, dd_ErrorType *err) { dd_rowrange i; dd_colrange j; dd_PolyhedraPtr poly=NULL; *err=dd_NoError; if (M->rowsize<0 || M->colsize<0){ *err=dd_NegativeMatrixSize; goto _L99; } poly=dd_CreatePolyhedraData(M->rowsize, M->colsize); poly->representation=M->representation; poly->homogeneous=dd_TRUE; for (i = 1; i <= M->rowsize; i++) { if (set_member(i, M->linset)) { poly->EqualityIndex[i]=1; } for (j = 1; j <= M->colsize; j++) { dd_set(poly->A[i-1][j-1], M->matrix[i-1][j-1]); if (j==1 && dd_Nonzero(M->matrix[i-1][j-1])) poly->homogeneous = dd_FALSE; } /*of j*/ } /*of i*/ dd_DoubleDescription2(poly, horder, err); _L99: return poly; } void dd_MatrixIntegerFilter(dd_MatrixPtr M) { /* setting an almost integer to the integer. */ dd_rowrange i; dd_colrange j; mytype x; dd_init(x); for (i=0; i< M->rowsize; i++) for (j=0; j< M->colsize; j++){ dd_SnapToInteger(x, M->matrix[i][j]); dd_set(M->matrix[i][j],x); } dd_clear(x); } void dd_CopyRay(mytype *a, dd_colrange d_origsize, dd_RayPtr RR, dd_RepresentationType rep, dd_colindex reducedcol) { long j,j1; mytype b; dd_init(b); for (j = 1; j <= d_origsize; j++){ j1=reducedcol[j]; if (j1>0){ dd_set(a[j-1],RR->Ray[j1-1]); /* the original column j is mapped to j1, and thus copy the corresponding component */ } else { dd_set(a[j-1],dd_purezero); /* original column is redundant and removed for computation */ } } dd_set(b,a[0]); if (rep==dd_Generator && dd_Nonzero(b)){ dd_set(a[0],dd_one); for (j = 2; j <= d_origsize; j++) dd_div(a[j-1],a[j-1],b); /* normalization for generators */ } dd_clear(b); } void dd_WriteRay(FILE *f, dd_colrange d_origsize, dd_RayPtr RR, dd_RepresentationType rep, dd_colindex reducedcol) { dd_colrange j; static dd_colrange d_last=0; static dd_Arow a; if (d_last< d_origsize){ if (d_last>0) free(a); dd_InitializeArow(d_origsize+1, &a); d_last=d_origsize+1; } dd_CopyRay(a, d_origsize, RR, rep, reducedcol); for (j = 0; j < d_origsize; j++) dd_WriteNumber(f, a[j]); fprintf(f, "\n"); } void dd_WriteArow(FILE *f, dd_Arow a, dd_colrange d) { dd_colrange j; for (j = 0; j < d; j++) dd_WriteNumber(f, a[j]); fprintf(f, "\n"); } void dd_WriteAmatrix(FILE *f, dd_Amatrix A, long rowmax, long colmax) { long i,j; if (A==NULL){ fprintf(f, "WriteAmatrix: The requested matrix is empty\n"); goto _L99; } fprintf(f, "begin\n"); #if defined GMPRATIONAL fprintf(f, " %ld %ld rational\n",rowmax, colmax); #else fprintf(f, " %ld %ld real\n",rowmax, colmax); #endif for (i=1; i <= rowmax; i++) { for (j=1; j <= colmax; j++) { dd_WriteNumber(f, A[i-1][j-1]); } fprintf(f,"\n"); } fprintf(f, "end\n"); _L99:; } void dd_WriteBmatrix(FILE *f, dd_colrange d_size, dd_Bmatrix B) { dd_colrange j1, j2; if (B==NULL){ fprintf(f, "WriteBmatrix: The requested matrix is empty\n"); goto _L99; } for (j1 = 0; j1 < d_size; j1++) { for (j2 = 0; j2 < d_size; j2++) { dd_WriteNumber(f, B[j1][j2]); } /*of j2*/ putc('\n', f); } /*of j1*/ putc('\n', f); _L99:; } void dd_WriteSetFamily(FILE *f, dd_SetFamilyPtr F) { dd_bigrange i; if (F==NULL){ fprintf(f, "WriteSetFamily: The requested family is empty\n"); goto _L99; } fprintf(f,"begin\n"); fprintf(f," %ld %ld\n", F->famsize, F->setsize); for (i=0; ifamsize; i++) { fprintf(f, " %ld %ld : ", i+1, set_card(F->set[i])); set_fwrite(f, F->set[i]); } fprintf(f,"end\n"); _L99:; } void dd_WriteSetFamilyCompressed(FILE *f, dd_SetFamilyPtr F) { dd_bigrange i,card; if (F==NULL){ fprintf(f, "WriteSetFamily: The requested family is empty\n"); goto _L99; } fprintf(f,"begin\n"); fprintf(f," %ld %ld\n", F->famsize, F->setsize); for (i=0; ifamsize; i++) { card=set_card(F->set[i]); if (F->setsize - card >= card){ fprintf(f, " %ld %ld : ", i+1, card); set_fwrite(f, F->set[i]); } else { fprintf(f, " %ld %ld : ", i+1, -card); set_fwrite_compl(f, F->set[i]); } } fprintf(f,"end\n"); _L99:; } void dd_WriteMatrix(FILE *f, dd_MatrixPtr M) { dd_rowrange i, linsize; if (M==NULL){ fprintf(f, "WriteMatrix: The requested matrix is empty\n"); goto _L99; } switch (M->representation) { case dd_Inequality: fprintf(f, "H-representation\n"); break; case dd_Generator: fprintf(f, "V-representation\n"); break; case dd_Unspecified: break; } linsize=set_card(M->linset); if (linsize>0) { fprintf(f, "linearity %ld ", linsize); for (i=1; i<=M->rowsize; i++) if (set_member(i, M->linset)) fprintf(f, " %ld", i); fprintf(f, "\n"); } dd_WriteAmatrix(f, M->matrix, M->rowsize, M->colsize); if (M->objective!=dd_LPnone){ if (M->objective==dd_LPmax) fprintf(f, "maximize\n"); else fprintf(f, "minimize\n"); dd_WriteArow(f, M->rowvec, M->colsize); } _L99:; } void dd_WriteLP(FILE *f, dd_LPPtr lp) { if (lp==NULL){ fprintf(f, "WriteLP: The requested lp is empty\n"); goto _L99; } fprintf(f, "H-representation\n"); dd_WriteAmatrix(f, lp->A, (lp->m)-1, lp->d); if (lp->objective!=dd_LPnone){ if (lp->objective==dd_LPmax) fprintf(f, "maximize\n"); else fprintf(f, "minimize\n"); dd_WriteArow(f, lp->A[lp->objrow-1], lp->d); } _L99:; } void dd_SnapToInteger(mytype y, mytype x) { /* this is broken. It does nothing. */ dd_set(y,x); } void dd_WriteReal(FILE *f, mytype x) { long ix1,ix2,ix; double ax; ax=dd_get_d(x); ix1= (long) (fabs(ax) * 10000. + 0.5); ix2= (long) (fabs(ax) + 0.5); ix2= ix2*10000; if ( ix1 == ix2) { if (dd_Positive(x)) { ix = (long)(ax + 0.5); } else { ix = (long)(-ax + 0.5); ix = -ix; } fprintf(f, " %2ld", ix); } else fprintf(f, " % .9E",ax); } void dd_WriteNumber(FILE *f, mytype x) { #if defined GMPRATIONAL fprintf(f," "); mpq_out_str(f, 10, x); #else dd_WriteReal(f, x); #endif } void dd_WriteIncidence(FILE *f, dd_PolyhedraPtr poly) { dd_SetFamilyPtr I; switch (poly->representation) { case dd_Inequality: fprintf(f, "ecd_file: Incidence of generators and inequalities\n"); break; case dd_Generator: fprintf(f, "icd_file: Incidence of inequalities and generators\n"); break; default: break; } I=dd_CopyIncidence(poly); dd_WriteSetFamilyCompressed(f,I); dd_FreeSetFamily(I); } void dd_WriteAdjacency(FILE *f, dd_PolyhedraPtr poly) { dd_SetFamilyPtr A; switch (poly->representation) { case dd_Inequality: fprintf(f, "ead_file: Adjacency of generators\n"); break; case dd_Generator: fprintf(f, "iad_file: Adjacency of inequalities\n"); break; default: break; } A=dd_CopyAdjacency(poly); dd_WriteSetFamilyCompressed(f,A); dd_FreeSetFamily(A); } void dd_ComputeAinc(dd_PolyhedraPtr poly) { /* This generates the input incidence array poly->Ainc, and two sets: poly->Ared, poly->Adom. */ dd_bigrange k; dd_rowrange i,m1; dd_colrange j; dd_boolean redundant; dd_MatrixPtr M=NULL; mytype sum,temp; dd_init(sum); dd_init(temp); if (poly->AincGenerated==dd_TRUE) goto _L99; M=dd_CopyOutput(poly); poly->n=M->rowsize; m1=poly->m1; /* this number is same as poly->m, except when poly is given by nonhomogeneous inequalty: !(poly->homogeneous) && poly->representation==Inequality, it is poly->m+1. See dd_ConeDataLoad. */ poly->Ainc=(set_type*)calloc(m1, sizeof(set_type)); for(i=1; i<=m1; i++) set_initialize(&(poly->Ainc[i-1]),poly->n); set_initialize(&(poly->Ared), m1); set_initialize(&(poly->Adom), m1); for (k=1; k<=poly->n; k++){ for (i=1; i<=poly->m; i++){ dd_set(sum,dd_purezero); for (j=1; j<=poly->d; j++){ dd_mul(temp,poly->A[i-1][j-1],M->matrix[k-1][j-1]); dd_add(sum,sum,temp); } if (dd_EqualToZero(sum)) { set_addelem(poly->Ainc[i-1], k); } } if (!(poly->homogeneous) && poly->representation==dd_Inequality){ if (dd_EqualToZero(M->matrix[k-1][0])) { set_addelem(poly->Ainc[m1-1], k); /* added infinity inequality (1,0,0,...,0) */ } } } for (i=1; i<=m1; i++){ if (set_card(poly->Ainc[i-1])==M->rowsize){ set_addelem(poly->Adom, i); } } for (i=m1; i>=1; i--){ if (set_card(poly->Ainc[i-1])==0){ redundant=dd_TRUE; set_addelem(poly->Ared, i); }else { redundant=dd_FALSE; for (k=1; k<=m1; k++) { if (k!=i && !set_member(k, poly->Ared) && !set_member(k, poly->Adom) && set_subset(poly->Ainc[i-1], poly->Ainc[k-1])){ if (!redundant){ redundant=dd_TRUE; } set_addelem(poly->Ared, i); } } } } dd_FreeMatrix(M); poly->AincGenerated=dd_TRUE; _L99:; dd_clear(sum); dd_clear(temp); } dd_boolean dd_InputAdjacentQ(dd_PolyhedraPtr poly, dd_rowrange i1, dd_rowrange i2) /* Before calling this function, RedundantSet must be a set of row indices whose removal results in a minimal nonredundant system to represent the input polyhedron, DominantSet must be the set of row indices which are active at every extreme points/rays. */ { dd_boolean adj=dd_TRUE; dd_rowrange i; static set_type common; static long lastn=0; if (poly->AincGenerated==dd_FALSE) dd_ComputeAinc(poly); if (lastn!=poly->n){ if (lastn >0) set_free(common); set_initialize(&common, poly->n); lastn=poly->n; } if (set_member(i1, poly->Ared) || set_member(i2, poly->Ared)){ adj=dd_FALSE; goto _L99; } if (set_member(i1, poly->Adom) || set_member(i2, poly->Adom)){ // dominant inequality is considered adjacencent to all others. adj=dd_TRUE; goto _L99; } set_int(common, poly->Ainc[i1-1], poly->Ainc[i2-1]); i=0; while (im1 && adj==dd_TRUE){ i++; if (i!=i1 && i!=i2 && !set_member(i, poly->Ared) && !set_member(i, poly->Adom) && set_subset(common,poly->Ainc[i-1])){ adj=dd_FALSE; } } _L99:; return adj; } void dd_WriteInputIncidence(FILE *f, dd_PolyhedraPtr poly) { dd_SetFamilyPtr I; if (poly->AincGenerated==dd_FALSE) dd_ComputeAinc(poly); switch (poly->representation) { case dd_Inequality: fprintf(f,"icd_file: Incidence of inequalities and generators\n"); break; case dd_Generator: fprintf(f,"ecd_file: Incidence of generators and inequalities\n"); break; default: break; } I=dd_CopyInputIncidence(poly); dd_WriteSetFamilyCompressed(f,I); dd_FreeSetFamily(I); } void dd_WriteInputAdjacency(FILE *f, dd_PolyhedraPtr poly) { dd_SetFamilyPtr A; if (poly->AincGenerated==dd_FALSE){ dd_ComputeAinc(poly); } switch (poly->representation) { case dd_Inequality: fprintf(f, "iad_file: Adjacency of inequalities\n"); break; case dd_Generator: fprintf(f, "ead_file: Adjacency of generators\n"); break; default: break; } A=dd_CopyInputAdjacency(poly); dd_WriteSetFamilyCompressed(f,A); dd_FreeSetFamily(A); } void dd_WriteProgramDescription(FILE *f) { fprintf(f, "* cddlib: a double description library:%s\n", dd_DDVERSION); fprintf(f, "* compiled for %s arithmetic.\n", dd_ARITHMETIC); fprintf(f,"* %s\n",dd_COPYRIGHT); } void dd_WriteTimes(FILE *f, time_t starttime, time_t endtime) { long ptime,ptime_sec,ptime_minu, ptime_hour; /* ptime=difftime(endtime,starttime); This function is ANSI standard, but not available sometime */ ptime=(endtime - starttime); /* This is to replace the line above, but it may not give correct time in seconds */ ptime_hour=ptime/3600; ptime_minu=(ptime-ptime_hour*3600)/60; ptime_sec=ptime%60; fprintf(f,"* Computation started at %s",asctime(localtime(&starttime))); fprintf(f,"* ended at %s",asctime(localtime(&endtime))); fprintf(f,"* Total processor time = %ld seconds\n",ptime); fprintf(f,"* = %ld h %ld m %ld s\n",ptime_hour, ptime_minu, ptime_sec); } void dd_WriteDDTimes(FILE *f, dd_PolyhedraPtr poly) { dd_WriteTimes(f,poly->child->starttime,poly->child->endtime); } void dd_WriteLPTimes(FILE *f, dd_LPPtr lp) { dd_WriteTimes(f,lp->starttime,lp->endtime); } void dd_WriteLPStats(FILE *f) { time_t currenttime; time(¤ttime); fprintf(f, "\n*--- Statistics of pivots ---\n"); #if defined GMPRATIONAL fprintf(f, "* f0 = %ld (float basis finding pivots)\n",ddf_statBApivots); fprintf(f, "* fc = %ld (float CC pivots)\n",ddf_statCCpivots); fprintf(f, "* f1 = %ld (float dual simplex phase I pivots)\n",ddf_statDS1pivots); fprintf(f, "* f2 = %ld (float dual simplex phase II pivots)\n",ddf_statDS2pivots); fprintf(f, "* f3 = %ld (float anticycling CC pivots)\n",ddf_statACpivots); fprintf(f, "* e0 = %ld (exact basis finding pivots)\n",dd_statBApivots); fprintf(f, "* ec = %ld (exact CC pivots)\n",dd_statCCpivots); fprintf(f, "* e1 = %ld (exact dual simplex phase I pivots)\n",dd_statDS1pivots); fprintf(f, "* e2 = %ld (exact dual simplex phase II pivots)\n",dd_statDS2pivots); fprintf(f, "* e3 = %ld (exact anticycling CC pivots)\n",dd_statACpivots); fprintf(f, "* e4 = %ld (exact basis verification pivots)\n",dd_statBSpivots); #else fprintf(f, "f0 = %ld (float basis finding pivots)\n",dd_statBApivots); fprintf(f, "fc = %ld (float CC pivots)\n",dd_statCCpivots); fprintf(f, "f1 = %ld (float dual simplex phase I pivots)\n",dd_statDS1pivots); fprintf(f, "f2 = %ld (float dual simplex phase II pivots)\n",dd_statDS2pivots); fprintf(f, "f3 = %ld (float anticycling CC pivots)\n",dd_statACpivots); #endif dd_WriteLPMode(f); dd_WriteTimes(f,dd_statStartTime, currenttime); } void dd_WriteLPMode(FILE *f) { fprintf(f, "\n* LP solver: "); switch (dd_choiceLPSolverDefault) { case dd_DualSimplex: fprintf(f, "DualSimplex\n"); break; case dd_CrissCross: fprintf(f, "Criss-Cross\n"); break; default: break; } fprintf(f, "* Redundancy cheking solver: "); switch (dd_choiceRedcheckAlgorithm) { case dd_DualSimplex: fprintf(f, "DualSimplex\n"); break; case dd_CrissCross: fprintf(f, "Criss-Cross\n"); break; default: break; } fprintf(f, "* Lexicographic pivot: "); if (dd_choiceLexicoPivotQ) fprintf(f, " on\n"); else fprintf(f, " off\n"); } void dd_WriteRunningMode(FILE *f, dd_PolyhedraPtr poly) { if (poly->child!=NULL){ fprintf(f,"* roworder: "); switch (poly->child->HalfspaceOrder) { case dd_MinIndex: fprintf(f, "minindex\n"); break; case dd_MaxIndex: fprintf(f, "maxindex\n"); break; case dd_MinCutoff: fprintf(f, "mincutoff\n"); break; case dd_MaxCutoff: fprintf(f, "maxcutoff\n"); break; case dd_MixCutoff: fprintf(f, "mixcutoff\n"); break; case dd_LexMin: fprintf(f, "lexmin\n"); break; case dd_LexMax: fprintf(f, "lexmax\n"); break; case dd_RandomRow: fprintf(f, "random %d\n",poly->child->rseed); break; default: break; } } } void dd_WriteCompletionStatus(FILE *f, dd_ConePtr cone) { if (cone->Iterationm && cone->CompStatus==dd_AllFound) { fprintf(f,"*Computation completed at Iteration %4ld.\n", cone->Iteration); } if (cone->CompStatus == dd_RegionEmpty) { fprintf(f,"*Computation completed at Iteration %4ld because the region found empty.\n",cone->Iteration); } } void dd_WritePolyFile(FILE *f, dd_PolyhedraPtr poly) { dd_WriteAmatrix(f,poly->A,poly->m,poly->d); } void dd_WriteErrorMessages(FILE *f, dd_ErrorType Error) { switch (Error) { case dd_DimensionTooLarge: fprintf(f, "*Input Error: Input matrix is too large:\n"); fprintf(f, "*Please increase MMAX and/or NMAX in the source code and recompile.\n"); break; case dd_IFileNotFound: fprintf(f, "*Input Error: Specified input file does not exist.\n"); break; case dd_OFileNotOpen: fprintf(f, "*Output Error: Specified output file cannot be opened.\n"); break; case dd_NegativeMatrixSize: fprintf(f, "*Input Error: Input matrix has a negative size:\n"); fprintf(f, "*Please check rowsize or colsize.\n"); break; case dd_ImproperInputFormat: fprintf(f,"*Input Error: Input format is not correct.\n"); fprintf(f,"*Format:\n"); fprintf(f," begin\n"); fprintf(f," m n NumberType(real, rational or integer)\n"); fprintf(f," b -A\n"); fprintf(f," end\n"); break; case dd_EmptyVrepresentation: fprintf(f, "*Input Error: V-representation is empty:\n"); fprintf(f, "*cddlib does not accept this trivial case for which output can be any inconsistent system.\n"); break; case dd_EmptyHrepresentation: fprintf(f, "*Input Error: H-representation is empty.\n"); break; case dd_EmptyRepresentation: fprintf(f, "*Input Error: Representation is empty.\n"); break; case dd_NoLPObjective: fprintf(f, "*LP Error: No LP objective (max or min) is set.\n"); break; case dd_NoRealNumberSupport: fprintf(f, "*LP Error: The binary (with GMP Rational) does not support Real number input.\n"); fprintf(f, " : Use a binary compiled without -DGMPRATIONAL option.\n"); break; case dd_NotAvailForH: fprintf(f, "*Error: A function is called with H-rep which does not support an H-representation.\n"); break; case dd_NotAvailForV: fprintf(f, "*Error: A function is called with V-rep which does not support an V-representation.\n"); break; case dd_CannotHandleLinearity: fprintf(f, "*Error: The function called cannot handle linearity.\n"); break; case dd_RowIndexOutOfRange: fprintf(f, "*Error: Specified row index is out of range\n"); break; case dd_ColIndexOutOfRange: fprintf(f, "*Error: Specified column index is out of range\n"); break; case dd_LPCycling: fprintf(f, "*Error: Possibly an LP cycling occurs. Use the Criss-Cross method.\n"); break; case dd_NumericallyInconsistent: fprintf(f, "*Error: Numerical inconsistency is found. Use the GMP exact arithmetic.\n"); break; case dd_NoError: fprintf(f,"*No Error found.\n"); break; } } dd_SetFamilyPtr dd_CopyIncidence(dd_PolyhedraPtr poly) { dd_SetFamilyPtr F=NULL; dd_bigrange k; dd_rowrange i; if (poly->child==NULL || poly->child->CompStatus!=dd_AllFound) goto _L99; if (poly->AincGenerated==dd_FALSE) dd_ComputeAinc(poly); F=dd_CreateSetFamily(poly->n, poly->m1); for (i=1; i<=poly->m1; i++) for (k=1; k<=poly->n; k++) if (set_member(k,poly->Ainc[i-1])) set_addelem(F->set[k-1],i); _L99:; return F; } dd_SetFamilyPtr dd_CopyInputIncidence(dd_PolyhedraPtr poly) { dd_rowrange i; dd_SetFamilyPtr F=NULL; if (poly->child==NULL || poly->child->CompStatus!=dd_AllFound) goto _L99; if (poly->AincGenerated==dd_FALSE) dd_ComputeAinc(poly); F=dd_CreateSetFamily(poly->m1, poly->n); for(i=0; i< poly->m1; i++){ set_copy(F->set[i], poly->Ainc[i]); } _L99:; return F; } dd_SetFamilyPtr dd_CopyAdjacency(dd_PolyhedraPtr poly) { dd_RayPtr RayPtr1,RayPtr2; dd_SetFamilyPtr F=NULL; long pos1, pos2; dd_bigrange lstart,k,n; set_type linset,allset; dd_boolean adj; if (poly->n==0 && poly->homogeneous && poly->representation==dd_Inequality){ n=1; /* the origin (the unique vertex) should be output. */ } else n=poly->n; set_initialize(&linset, n); set_initialize(&allset, n); if (poly->child==NULL || poly->child->CompStatus!=dd_AllFound) goto _L99; F=dd_CreateSetFamily(n, n); if (n<=0) goto _L99; poly->child->LastRay->Next=NULL; for (RayPtr1=poly->child->FirstRay, pos1=1;RayPtr1 != NULL; RayPtr1 = RayPtr1->Next, pos1++){ for (RayPtr2=poly->child->FirstRay, pos2=1; RayPtr2 != NULL; RayPtr2 = RayPtr2->Next, pos2++){ if (RayPtr1!=RayPtr2){ dd_CheckAdjacency(poly->child, &RayPtr1, &RayPtr2, &adj); if (adj){ set_addelem(F->set[pos1-1], pos2); } } } } lstart=poly->n - poly->ldim + 1; set_compl(allset,allset); /* allset is set to the ground set. */ for (k=lstart; k<=poly->n; k++){ set_addelem(linset,k); /* linearity set */ set_copy(F->set[k-1],allset); /* linearity generator is adjacent to all */ } for (k=1; kset[k-1],F->set[k-1],linset); /* every generator is adjacent to all linearity generators */ } _L99:; set_free(allset); set_free(linset); return F; } dd_SetFamilyPtr dd_CopyInputAdjacency(dd_PolyhedraPtr poly) { dd_rowrange i,j; dd_SetFamilyPtr F=NULL; if (poly->child==NULL || poly->child->CompStatus!=dd_AllFound) goto _L99; if (poly->AincGenerated==dd_FALSE) dd_ComputeAinc(poly); F=dd_CreateSetFamily(poly->m1, poly->m1); for (i=1; i<=poly->m1; i++){ for (j=1; j<=poly->m1; j++){ if (i!=j && dd_InputAdjacentQ(poly, i, j)) { set_addelem(F->set[i-1],j); } } } _L99:; return F; } dd_MatrixPtr dd_CopyOutput(dd_PolyhedraPtr poly) { dd_RayPtr RayPtr; dd_MatrixPtr M=NULL; dd_rowrange i=0,total; dd_colrange j,j1; mytype b; dd_RepresentationType outputrep=dd_Inequality; dd_boolean outputorigin=dd_FALSE; dd_init(b); total=poly->child->LinearityDim + poly->child->FeasibleRayCount; if (poly->child->d<=0 || poly->child->newcol[1]==0) total=total-1; if (poly->representation==dd_Inequality) outputrep=dd_Generator; if (total==0 && poly->homogeneous && poly->representation==dd_Inequality){ total=1; outputorigin=dd_TRUE; /* the origin (the unique vertex) should be output. */ } if (poly->child==NULL || poly->child->CompStatus!=dd_AllFound) goto _L99; M=dd_CreateMatrix(total, poly->d); RayPtr = poly->child->FirstRay; while (RayPtr != NULL) { if (RayPtr->feasible) { dd_CopyRay(M->matrix[i], poly->d, RayPtr, outputrep, poly->child->newcol); i++; /* 086 */ } RayPtr = RayPtr->Next; } for (j=2; j<=poly->d; j++){ if (poly->child->newcol[j]==0){ /* original column j is dependent on others and removed for the cone */ dd_set(b,poly->child->Bsave[0][j-1]); if (outputrep==dd_Generator && dd_Positive(b)){ dd_set(M->matrix[i][0],dd_one); /* dd_Normalize */ for (j1=1; j1d; j1++) dd_div(M->matrix[i][j1],(poly->child->Bsave[j1][j-1]),b); } else { for (j1=0; j1d; j1++) dd_set(M->matrix[i][j1],poly->child->Bsave[j1][j-1]); } set_addelem(M->linset, i+1); i++; } } if (outputorigin){ /* output the origin for homogeneous H-polyhedron with no rays. */ dd_set(M->matrix[0][0],dd_one); for (j=1; jd; j++){ dd_set(M->matrix[0][j],dd_purezero); } } dd_MatrixIntegerFilter(M); if (poly->representation==dd_Inequality) M->representation=dd_Generator; else M->representation=dd_Inequality; _L99:; dd_clear(b); return M; } dd_MatrixPtr dd_CopyInput(dd_PolyhedraPtr poly) { dd_MatrixPtr M=NULL; dd_rowrange i; M=dd_CreateMatrix(poly->m, poly->d); dd_CopyAmatrix(M->matrix, poly->A, poly->m, poly->d); for (i=1; i<=poly->m; i++) if (poly->EqualityIndex[i]==1) set_addelem(M->linset,i); dd_MatrixIntegerFilter(M); if (poly->representation==dd_Generator) M->representation=dd_Generator; else M->representation=dd_Inequality; return M; } dd_MatrixPtr dd_CopyGenerators(dd_PolyhedraPtr poly) { dd_MatrixPtr M=NULL; if (poly->representation==dd_Generator){ M=dd_CopyInput(poly); } else { M=dd_CopyOutput(poly); } return M; } dd_MatrixPtr dd_CopyInequalities(dd_PolyhedraPtr poly) { dd_MatrixPtr M=NULL; if (poly->representation==dd_Inequality){ M=dd_CopyInput(poly); } else { M=dd_CopyOutput(poly); } return M; } /****************************************************************************************/ /* rational number (a/b) read is taken from Vinci by Benno Bueeler and Andreas Enge */ /****************************************************************************************/ void dd_sread_rational_value (char *s, mytype value) /* reads a rational value from the specified string "s" and assigns it to "value" */ { char *numerator_s=NULL, *denominator_s=NULL, *position; int sign = 1; double numerator, denominator; #if defined GMPRATIONAL mpz_t znum, zden; #else double rvalue; #endif /* determine the sign of the number */ numerator_s = s; if (s [0] == '-') { sign = -1; numerator_s++; } else if (s [0] == '+') numerator_s++; /* look for a sign '/' and eventually split the number in numerator and denominator */ position = strchr (numerator_s, '/'); if (position != NULL) { *position = '\0'; /* terminates the numerator */ denominator_s = position + 1; }; /* determine the floating point values of numerator and denominator */ numerator=atol (numerator_s); if (position != NULL) { denominator=atol (denominator_s); } else denominator = 1; /* fprintf(stderr,"\nrational_read: numerator %f\n",numerator); fprintf(stderr,"rational_read: denominator %f\n",denominator); fprintf(stderr,"rational_read: sign %d\n",sign); */ #if defined GMPRATIONAL mpz_init_set_str(znum,numerator_s,10); if (sign<0) mpz_neg(znum,znum); mpz_init(zden); mpz_set_ui(zden,1); if (denominator_s!=NULL) mpz_init_set_str(zden,denominator_s,10); mpq_set_num(value,znum); mpq_set_den(value,zden); mpq_canonicalize(value); mpz_clear(znum); mpz_clear(zden); /* num=(long)sign * numerator; */ /* den=(unsigned long) denominator; */ /* mpq_set_si(value, num, den); */ #elif defined GMPFLOAT rvalue=sign * numerator/ (signed long) denominator; mpf_set_d(value, rvalue); #else rvalue=sign * numerator/ (signed long) denominator; ddd_set_d(value, rvalue); #endif if (dd_debug) { fprintf(stderr,"rational_read: "); dd_WriteNumber(stderr,value); fprintf(stderr,"\n"); } } void dd_fread_rational_value (FILE *f, mytype value) /* reads a rational value from the specified file "f" and assigns it to "value" */ { char number_s [dd_wordlenmax]; mytype rational_value; dd_init(rational_value); if(fscanf(f, "%s ", number_s)); dd_sread_rational_value (number_s, rational_value); dd_set(value,rational_value); dd_clear(rational_value); } /****************************************************************************************/ /* end of cddio.c */ pplacer-1.1.alpha19/cdd_src/cddlib.c000066400000000000000000000264311303154601500172310ustar00rootroot00000000000000/* cddlib.c: cdd library (library version of cdd) written by Komei Fukuda, fukuda@ifor.math.ethz.ch Version 0.94f, February 7, 2008 Standard ftp site: ftp.ifor.math.ethz.ch, Directory: pub/fukuda/cdd */ /* cdd : C-Implementation of the double description method for computing all vertices and extreme rays of the polyhedron P= {x : b - A x >= 0}. Please read COPYING (GNU General Public Licence) and the manual cddlibman.tex for detail. */ /* This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* The first version C0.21 was created on November 10,1993 with Dave Gillespie's p2c translator from the Pascal program pdd.p written by Komei Fukuda. */ #include "setoper.h" /* set operation library header (Ver. June 1, 2000 or later) */ #include "cdd.h" #include #include #include #include #include /* Global Variables */ dd_boolean dd_debug =dd_FALSE; dd_boolean dd_log =dd_FALSE; /* GLOBAL CONSTANTS and STATICS VARIABLES (to be set by dd_set_global_constants() */ mytype dd_zero; mytype dd_one; mytype dd_purezero; mytype dd_minuszero; mytype dd_minusone; time_t dd_statStartTime; /* cddlib starting time */ long dd_statBApivots; /* basis finding pivots */ long dd_statCCpivots; /* criss-cross pivots */ long dd_statDS1pivots; /* phase 1 pivots */ long dd_statDS2pivots; /* phase 2 pivots */ long dd_statACpivots; /* anticycling (cc) pivots */ #ifdef GMPRATIONAL long dd_statBSpivots; /* basis status checking pivots */ #endif dd_LPSolverType dd_choiceLPSolverDefault; /* Default LP solver Algorithm */ dd_LPSolverType dd_choiceRedcheckAlgorithm; /* Redundancy Checking Algorithm */ dd_boolean dd_choiceLexicoPivotQ; /* whether to use the lexicographic pivot */ /* #include THINK C PROFILER */ /* #include THINK C PROFILER */ void dd_DDInit(dd_ConePtr cone) { cone->Error=dd_NoError; cone->CompStatus=dd_InProgress; cone->RayCount = 0; cone->TotalRayCount = 0; cone->FeasibleRayCount = 0; cone->WeaklyFeasibleRayCount = 0; cone->EdgeCount=0; /* active edge count */ cone->TotalEdgeCount=0; /* active edge count */ dd_SetInequalitySets(cone); dd_ComputeRowOrderVector(cone); cone->RecomputeRowOrder=dd_FALSE; } void dd_DDMain(dd_ConePtr cone) { dd_rowrange hh, itemp, otemp; dd_boolean locallog=dd_log; /* if dd_log=dd_FALSE, no log will be written. */ if (cone->d<=0){ cone->Iteration=cone->m; cone->FeasibleRayCount=0; cone->CompStatus=dd_AllFound; goto _L99; } if (locallog) { fprintf(stderr,"(Initially added rows ) = "); set_fwrite(stderr,cone->InitialHalfspaces); } while (cone->Iteration <= cone->m) { dd_SelectNextHalfspace(cone, cone->WeaklyAddedHalfspaces, &hh); if (set_member(hh,cone->NonequalitySet)){ /* Skip the row hh */ if (dd_debug) { fprintf(stderr,"*The row # %3ld should be inactive and thus skipped.\n", hh); } set_addelem(cone->WeaklyAddedHalfspaces, hh); } else { if (cone->PreOrderedRun) dd_AddNewHalfspace2(cone, hh); else{ dd_AddNewHalfspace1(cone, hh); } set_addelem(cone->AddedHalfspaces, hh); set_addelem(cone->WeaklyAddedHalfspaces, hh); } if (!cone->PreOrderedRun){ for (itemp=1; cone->OrderVector[itemp]!=hh; itemp++); otemp=cone->OrderVector[cone->Iteration]; cone->OrderVector[cone->Iteration]=hh; /* store the dynamic ordering in ordervec */ cone->OrderVector[itemp]=otemp; /* store the dynamic ordering in ordervec */ } if (locallog){ fprintf(stderr,"(Iter, Row, #Total, #Curr, #Feas)= %5ld %5ld %9ld %6ld %6ld\n", cone->Iteration, hh, cone->TotalRayCount, cone->RayCount, cone->FeasibleRayCount); } if (cone->CompStatus==dd_AllFound||cone->CompStatus==dd_RegionEmpty) { set_addelem(cone->AddedHalfspaces, hh); goto _L99; } (cone->Iteration)++; } _L99:; if (cone->d<=0 || cone->newcol[1]==0){ /* fixing the number of output */ cone->parent->n=cone->LinearityDim + cone->FeasibleRayCount -1; cone->parent->ldim=cone->LinearityDim - 1; } else { cone->parent->n=cone->LinearityDim + cone->FeasibleRayCount; cone->parent->ldim=cone->LinearityDim; } } void dd_InitialDataSetup(dd_ConePtr cone) { long j, r; dd_rowset ZSet; static dd_Arow Vector1,Vector2; static dd_colrange last_d=0; if (last_d < cone->d){ if (last_d>0) { for (j=0; jd,sizeof(mytype)); Vector2=(mytype*)calloc(cone->d,sizeof(mytype)); for (j=0; jd; j++){ dd_init(Vector1[j]); dd_init(Vector2[j]); } last_d=cone->d; } cone->RecomputeRowOrder=dd_FALSE; cone->ArtificialRay = NULL; cone->FirstRay = NULL; cone->LastRay = NULL; set_initialize(&ZSet,cone->m); dd_AddArtificialRay(cone); set_copy(cone->AddedHalfspaces, cone->InitialHalfspaces); set_copy(cone->WeaklyAddedHalfspaces, cone->InitialHalfspaces); dd_UpdateRowOrderVector(cone, cone->InitialHalfspaces); for (r = 1; r <= cone->d; r++) { for (j = 0; j < cone->d; j++){ dd_set(Vector1[j], cone->B[j][r-1]); dd_neg(Vector2[j], cone->B[j][r-1]); } dd_Normalize(cone->d, Vector1); dd_Normalize(cone->d, Vector2); dd_ZeroIndexSet(cone->m, cone->d, cone->A, Vector1, ZSet); if (set_subset(cone->EqualitySet, ZSet)){ if (dd_debug) { fprintf(stderr,"add an initial ray with zero set:"); set_fwrite(stderr,ZSet); } dd_AddRay(cone, Vector1); if (cone->InitialRayIndex[r]==0) { dd_AddRay(cone, Vector2); if (dd_debug) { fprintf(stderr,"and add its negative also.\n"); } } } } dd_CreateInitialEdges(cone); cone->Iteration = cone->d + 1; if (cone->Iteration > cone->m) cone->CompStatus=dd_AllFound; /* 0.94b */ set_free(ZSet); } dd_boolean dd_CheckEmptiness(dd_PolyhedraPtr poly, dd_ErrorType *err) { dd_rowset R, S; dd_MatrixPtr M=NULL; dd_boolean answer=dd_FALSE; *err=dd_NoError; if (poly->representation==dd_Inequality){ M=dd_CopyInequalities(poly); set_initialize(&R, M->rowsize); set_initialize(&S, M->rowsize); if (!dd_ExistsRestrictedFace(M, R, S, err)){ poly->child->CompStatus=dd_AllFound; poly->IsEmpty=dd_TRUE; poly->n=0; answer=dd_TRUE; } set_free(R); set_free(S); dd_FreeMatrix(M); } else if (poly->representation==dd_Generator && poly->m<=0){ *err=dd_EmptyVrepresentation; poly->IsEmpty=dd_TRUE; poly->child->CompStatus=dd_AllFound; answer=dd_TRUE; poly->child->Error=*err; } return answer; } dd_boolean dd_DoubleDescription(dd_PolyhedraPtr poly, dd_ErrorType *err) { dd_ConePtr cone=NULL; dd_boolean found=dd_FALSE; *err=dd_NoError; if (poly!=NULL && (poly->child==NULL || poly->child->CompStatus!=dd_AllFound)){ cone=dd_ConeDataLoad(poly); /* create a cone associated with poly by homogenization */ time(&cone->starttime); dd_DDInit(cone); if (poly->representation==dd_Generator && poly->m<=0){ *err=dd_EmptyVrepresentation; cone->Error=*err; goto _L99; } /* Check emptiness of the polyhedron */ dd_CheckEmptiness(poly,err); if (cone->CompStatus!=dd_AllFound){ dd_FindInitialRays(cone, &found); if (found) { dd_InitialDataSetup(cone); if (cone->CompStatus==dd_AllFound) goto _L99; dd_DDMain(cone); if (cone->FeasibleRayCount!=cone->RayCount) *err=dd_NumericallyInconsistent; /* cddlib-093d */ } } time(&cone->endtime); } _L99: ; return found; } dd_boolean dd_DoubleDescription2(dd_PolyhedraPtr poly, dd_RowOrderType horder, dd_ErrorType *err) { dd_ConePtr cone=NULL; dd_boolean found=dd_FALSE; *err=dd_NoError; if (poly!=NULL && (poly->child==NULL || poly->child->CompStatus!=dd_AllFound)){ cone=dd_ConeDataLoad(poly); /* create a cone associated with poly by homogenization */ cone->HalfspaceOrder=horder; /* set the row order */ time(&cone->starttime); dd_DDInit(cone); if (poly->representation==dd_Generator && poly->m<=0){ *err=dd_EmptyVrepresentation; cone->Error=*err; goto _L99; } /* Check emptiness of the polyhedron */ dd_CheckEmptiness(poly,err); if (cone->CompStatus!=dd_AllFound){ dd_FindInitialRays(cone, &found); if (found) { dd_InitialDataSetup(cone); if (cone->CompStatus==dd_AllFound) goto _L99; dd_DDMain(cone); if (cone->FeasibleRayCount!=cone->RayCount) *err=dd_NumericallyInconsistent; /* cddlib-093d */ } } time(&cone->endtime); } _L99: ; return found; } dd_boolean dd_DDInputAppend(dd_PolyhedraPtr *poly, dd_MatrixPtr M, dd_ErrorType *err) { /* This is imcomplete. It simply solves the problem from scratch. */ dd_boolean found; dd_ErrorType error; if ((*poly)->child!=NULL) dd_FreeDDMemory(*poly); dd_AppendMatrix2Poly(poly, M); (*poly)->representation=dd_Inequality; found=dd_DoubleDescription(*poly, &error); *err=error; return found; } dd_boolean dd_DDFile2File(char *ifile, char *ofile, dd_ErrorType *err) { /* The representation conversion from an input file to an outfile. */ /* modified by D. Avis to allow stdin/stdout */ dd_boolean found=dd_TRUE; FILE *reading=NULL,*writing=NULL; dd_PolyhedraPtr poly; dd_MatrixPtr M, A, G; if (strcmp(ifile,"**stdin") == 0 ) reading = stdin; else if ( ( reading = fopen(ifile, "r") )!= NULL) { fprintf(stderr,"input file %s is open\n", ifile); } else{ fprintf(stderr,"The input file %s not found\n",ifile); found=dd_FALSE; *err=dd_IFileNotFound; goto _L99; } if (found){ if (strcmp(ofile,"**stdout") == 0 ) writing = stdout; else if ( (writing = fopen(ofile, "w") ) != NULL){ fprintf(stderr,"output file %s is open\n",ofile); found=dd_TRUE; } else { fprintf(stderr,"The output file %s cannot be opened\n",ofile); found=dd_FALSE; *err=dd_OFileNotOpen; goto _L99; } } M=dd_PolyFile2Matrix(reading, err); if (*err!=dd_NoError){ goto _L99; } poly=dd_DDMatrix2Poly(M, err); /* compute the second representation */ dd_FreeMatrix(M); if (*err==dd_NoError) { dd_WriteRunningMode(writing, poly); A=dd_CopyInequalities(poly); G=dd_CopyGenerators(poly); if (poly->representation==dd_Inequality) { dd_WriteMatrix(writing,G); } else { dd_WriteMatrix(writing,A); } dd_FreePolyhedra(poly); dd_FreeMatrix(A); dd_FreeMatrix(G); } _L99: ; if (*err!=dd_NoError) dd_WriteErrorMessages(stderr,*err); if (reading!=NULL) fclose(reading); if (writing!=NULL) fclose(writing); return found; } /* end of cddlib.c */ pplacer-1.1.alpha19/cdd_src/cddlp.c000066400000000000000000003603411303154601500170770ustar00rootroot00000000000000/* cddlp.c: dual simplex method c-code written by Komei Fukuda, fukuda@ifor.math.ethz.ch Version 0.94f, February 7, 2008 */ /* cddlp.c : C-Implementation of the dual simplex method for solving an LP: max/min A_(m-1).x subject to x in P, where P= {x : A_i.x >= 0, i=0,...,m-2, and x_0=1}, and A_i is the i-th row of an m x n matrix A. Please read COPYING (GNU General Public Licence) and the manual cddlibman.tex for detail. */ #include "setoper.h" /* set operation library header (Ver. May 18, 2000 or later) */ #include "cdd.h" #include #include #include #include #include #if defined GMPRATIONAL #include "cdd_f.h" #endif #define dd_CDDLPVERSION "Version 0.94b (August 25, 2005)" #define dd_FALSE 0 #define dd_TRUE 1 typedef set_type rowset; /* set_type defined in setoper.h */ typedef set_type colset; void dd_CrissCrossSolve(dd_LPPtr lp,dd_ErrorType *); void dd_DualSimplexSolve(dd_LPPtr lp,dd_ErrorType *); void dd_CrissCrossMinimize(dd_LPPtr,dd_ErrorType *); void dd_CrissCrossMaximize(dd_LPPtr,dd_ErrorType *); void dd_DualSimplexMinimize(dd_LPPtr,dd_ErrorType *); void dd_DualSimplexMaximize(dd_LPPtr,dd_ErrorType *); void dd_FindLPBasis(dd_rowrange,dd_colrange,dd_Amatrix,dd_Bmatrix,dd_rowindex,dd_rowset, dd_colindex,dd_rowindex,dd_rowrange,dd_colrange, dd_colrange *,int *,dd_LPStatusType *,long *); void dd_FindDualFeasibleBasis(dd_rowrange,dd_colrange,dd_Amatrix,dd_Bmatrix,dd_rowindex, dd_colindex,long *,dd_rowrange,dd_colrange,dd_boolean, dd_colrange *,dd_ErrorType *,dd_LPStatusType *,long *, long maxpivots); #ifdef GMPRATIONAL void dd_BasisStatus(ddf_LPPtr lpf, dd_LPPtr lp, dd_boolean*); void dd_BasisStatusMinimize(dd_rowrange,dd_colrange, dd_Amatrix,dd_Bmatrix,dd_rowset, dd_rowrange,dd_colrange,ddf_LPStatusType,mytype *,dd_Arow,dd_Arow,dd_rowset,ddf_colindex, ddf_rowrange,ddf_colrange,dd_colrange *,long *, int *, int *); void dd_BasisStatusMaximize(dd_rowrange,dd_colrange,dd_Amatrix,dd_Bmatrix,dd_rowset, dd_rowrange,dd_colrange,ddf_LPStatusType,mytype *,dd_Arow,dd_Arow,dd_rowset,ddf_colindex, ddf_rowrange,ddf_colrange,dd_colrange *,long *, int *, int *); #endif void dd_WriteBmatrix(FILE *f,dd_colrange d_size,dd_Bmatrix T); void dd_SetNumberType(char *line,dd_NumberType *number,dd_ErrorType *Error); void dd_ComputeRowOrderVector2(dd_rowrange m_size,dd_colrange d_size,dd_Amatrix A, dd_rowindex OV,dd_RowOrderType ho,unsigned int rseed); void dd_SelectPreorderedNext2(dd_rowrange m_size,dd_colrange d_size, rowset excluded,dd_rowindex OV,dd_rowrange *hnext); void dd_SetSolutions(dd_rowrange,dd_colrange, dd_Amatrix,dd_Bmatrix,dd_rowrange,dd_colrange,dd_LPStatusType, mytype *,dd_Arow,dd_Arow,dd_rowset,dd_colindex,dd_rowrange,dd_colrange,dd_rowindex); void dd_WriteTableau(FILE *,dd_rowrange,dd_colrange,dd_Amatrix,dd_Bmatrix, dd_colindex,dd_rowindex); void dd_WriteSignTableau(FILE *,dd_rowrange,dd_colrange,dd_Amatrix,dd_Bmatrix, dd_colindex,dd_rowindex); dd_LPSolutionPtr dd_CopyLPSolution(dd_LPPtr lp) { dd_LPSolutionPtr lps; dd_colrange j; long i; lps=(dd_LPSolutionPtr) calloc(1,sizeof(dd_LPSolutionType)); for (i=1; i<=dd_filenamelen; i++) lps->filename[i-1]=lp->filename[i-1]; lps->objective=lp->objective; lps->solver=lp->solver; lps->m=lp->m; lps->d=lp->d; lps->numbtype=lp->numbtype; lps->LPS=lp->LPS; /* the current solution status */ dd_init(lps->optvalue); dd_set(lps->optvalue,lp->optvalue); /* optimal value */ dd_InitializeArow(lp->d+1,&(lps->sol)); dd_InitializeArow(lp->d+1,&(lps->dsol)); lps->nbindex=(long*) calloc((lp->d)+1,sizeof(long)); /* dual solution */ for (j=0; j<=lp->d; j++){ dd_set(lps->sol[j],lp->sol[j]); dd_set(lps->dsol[j],lp->dsol[j]); lps->nbindex[j]=lp->nbindex[j]; } lps->pivots[0]=lp->pivots[0]; lps->pivots[1]=lp->pivots[1]; lps->pivots[2]=lp->pivots[2]; lps->pivots[3]=lp->pivots[3]; lps->pivots[4]=lp->pivots[4]; lps->total_pivots=lp->total_pivots; return lps; } dd_LPPtr dd_CreateLPData(dd_LPObjectiveType obj, dd_NumberType nt,dd_rowrange m,dd_colrange d) { dd_LPType *lp; lp=(dd_LPPtr) calloc(1,sizeof(dd_LPType)); lp->solver=dd_choiceLPSolverDefault; /* set the default lp solver */ lp->d=d; lp->m=m; lp->numbtype=nt; lp->objrow=m; lp->rhscol=1L; lp->objective=dd_LPnone; lp->LPS=dd_LPSundecided; lp->eqnumber=0; /* the number of equalities */ lp->nbindex=(long*) calloc(d+1,sizeof(long)); lp->given_nbindex=(long*) calloc(d+1,sizeof(long)); set_initialize(&(lp->equalityset),m); /* i must be in the set iff i-th row is equality . */ lp->redcheck_extensive=dd_FALSE; /* this is on only for RedundantExtensive */ lp->ired=0; set_initialize(&(lp->redset_extra),m); /* i is in the set if i-th row is newly recognized redundant (during the checking the row ired). */ set_initialize(&(lp->redset_accum),m); /* i is in the set if i-th row is recognized redundant (during the checking the row ired). */ set_initialize(&(lp->posset_extra),m); /* i is in the set if i-th row is recognized non-linearity (during the course of computation). */ lp->lexicopivot=dd_choiceLexicoPivotQ; /* dd_choice... is set in dd_set_global_constants() */ lp->m_alloc=lp->m+2; lp->d_alloc=lp->d+2; lp->objective=obj; dd_InitializeBmatrix(lp->d_alloc,&(lp->B)); dd_InitializeAmatrix(lp->m_alloc,lp->d_alloc,&(lp->A)); dd_InitializeArow(lp->d_alloc,&(lp->sol)); dd_InitializeArow(lp->d_alloc,&(lp->dsol)); dd_init(lp->optvalue); return lp; } dd_LPPtr dd_Matrix2LP(dd_MatrixPtr M, dd_ErrorType *err) { dd_rowrange m, i, irev, linc; dd_colrange d, j; dd_LPType *lp; dd_boolean localdebug=dd_FALSE; *err=dd_NoError; linc=set_card(M->linset); m=M->rowsize+1+linc; /* We represent each equation by two inequalities. This is not the best way but makes the code simple. */ d=M->colsize; if (localdebug) fprintf(stderr,"number of equalities = %ld\n", linc); lp=dd_CreateLPData(M->objective, M->numbtype, m, d); lp->Homogeneous = dd_TRUE; lp->eqnumber=linc; /* this records the number of equations */ irev=M->rowsize; /* the first row of the linc reversed inequalities. */ for (i = 1; i <= M->rowsize; i++) { if (set_member(i, M->linset)) { irev=irev+1; set_addelem(lp->equalityset,i); /* it is equality. */ /* the reversed row irev is not in the equality set. */ for (j = 1; j <= M->colsize; j++) { dd_neg(lp->A[irev-1][j-1],M->matrix[i-1][j-1]); } /*of j*/ if (localdebug) fprintf(stderr,"equality row %ld generates the reverse row %ld.\n",i,irev); } for (j = 1; j <= M->colsize; j++) { dd_set(lp->A[i-1][j-1],M->matrix[i-1][j-1]); if (j==1 && irowsize && dd_Nonzero(M->matrix[i-1][j-1])) lp->Homogeneous = dd_FALSE; } /*of j*/ } /*of i*/ for (j = 1; j <= M->colsize; j++) { dd_set(lp->A[m-1][j-1],M->rowvec[j-1]); /* objective row */ } /*of j*/ return lp; } dd_LPPtr dd_Matrix2Feasibility(dd_MatrixPtr M, dd_ErrorType *err) /* Load a matrix to create an LP object for feasibility. It is essentially the dd_Matrix2LP except that the objject function is set to identically ZERO (maximization). */ /* 094 */ { dd_rowrange m, linc; dd_colrange j; dd_LPType *lp; *err=dd_NoError; linc=set_card(M->linset); m=M->rowsize+1+linc; /* We represent each equation by two inequalities. This is not the best way but makes the code simple. */ lp=dd_Matrix2LP(M, err); lp->objective = dd_LPmax; /* since the objective is zero, this is not important */ for (j = 1; j <= M->colsize; j++) { dd_set(lp->A[m-1][j-1],dd_purezero); /* set the objective to zero. */ } /*of j*/ return lp; } dd_LPPtr dd_Matrix2Feasibility2(dd_MatrixPtr M, dd_rowset R, dd_rowset S, dd_ErrorType *err) /* Load a matrix to create an LP object for feasibility with additional equality and strict inequality constraints given by R and S. There are three types of inequalities: b_r + A_r x = 0 Linearity (Equations) specified by M b_s + A_s x > 0 Strict Inequalities specified by row index set S b_t + A_t x >= 0 The rest inequalities in M Where the linearity is considered here as the union of linearity specified by M and the additional set R. When S contains any linearity rows, those rows are considered linearity (equation). Thus S does not overlide linearity. To find a feasible solution, we set an LP maximize z subject to b_r + A_r x = 0 all r in Linearity b_s + A_s x - z >= 0 for all s in S b_t + A_t x >= 0 for all the rest rows t 1 - z >= 0 to make the LP bounded. Clearly, the feasibility problem has a solution iff the LP has a positive optimal value. The variable z will be the last variable x_{d+1}. */ /* 094 */ { dd_rowrange m, i, irev, linc; dd_colrange d, j; dd_LPType *lp; dd_rowset L; dd_boolean localdebug=dd_FALSE; *err=dd_NoError; set_initialize(&L, M->rowsize); set_uni(L,M->linset,R); linc=set_card(L); m=M->rowsize+1+linc+1; /* We represent each equation by two inequalities. This is not the best way but makes the code simple. */ d=M->colsize+1; if (localdebug) fprintf(stderr,"number of equalities = %ld\n", linc); lp=dd_CreateLPData(dd_LPmax, M->numbtype, m, d); lp->Homogeneous = dd_TRUE; lp->eqnumber=linc; /* this records the number of equations */ irev=M->rowsize; /* the first row of the linc reversed inequalities. */ for (i = 1; i <= M->rowsize; i++) { if (set_member(i, L)) { irev=irev+1; set_addelem(lp->equalityset,i); /* it is equality. */ /* the reversed row irev is not in the equality set. */ for (j = 1; j <= M->colsize; j++) { dd_neg(lp->A[irev-1][j-1],M->matrix[i-1][j-1]); } /*of j*/ if (localdebug) fprintf(stderr,"equality row %ld generates the reverse row %ld.\n",i,irev); } else if (set_member(i, S)) { dd_set(lp->A[i-1][M->colsize],dd_minusone); } for (j = 1; j <= M->colsize; j++) { dd_set(lp->A[i-1][j-1],M->matrix[i-1][j-1]); if (j==1 && irowsize && dd_Nonzero(M->matrix[i-1][j-1])) lp->Homogeneous = dd_FALSE; } /*of j*/ } /*of i*/ for (j = 1; j <= d; j++) { dd_set(lp->A[m-2][j-1],dd_purezero); /* initialize */ } /*of j*/ dd_set(lp->A[m-2][0],dd_one); /* the bounding constraint. */ dd_set(lp->A[m-2][M->colsize],dd_minusone); /* the bounding constraint. */ for (j = 1; j <= d; j++) { dd_set(lp->A[m-1][j-1],dd_purezero); /* initialize */ } /*of j*/ dd_set(lp->A[m-1][M->colsize],dd_one); /* maximize z */ set_free(L); return lp; } void dd_FreeLPData(dd_LPPtr lp) { if ((lp)!=NULL){ dd_clear(lp->optvalue); dd_FreeArow(lp->d_alloc,lp->dsol); dd_FreeArow(lp->d_alloc,lp->sol); dd_FreeBmatrix(lp->d_alloc,lp->B); dd_FreeAmatrix(lp->m_alloc,lp->d_alloc,lp->A); set_free(lp->equalityset); set_free(lp->redset_extra); set_free(lp->redset_accum); set_free(lp->posset_extra); free(lp->nbindex); free(lp->given_nbindex); free(lp); } } void dd_FreeLPSolution(dd_LPSolutionPtr lps) { if (lps!=NULL){ free(lps->nbindex); dd_FreeArow(lps->d+1,lps->dsol); dd_FreeArow(lps->d+1,lps->sol); dd_clear(lps->optvalue); free(lps); } } int dd_LPReverseRow(dd_LPPtr lp, dd_rowrange i) { dd_colrange j; int success=0; if (i>=1 && i<=lp->m){ lp->LPS=dd_LPSundecided; for (j=1; j<=lp->d; j++) { dd_neg(lp->A[i-1][j-1],lp->A[i-1][j-1]); /* negating the i-th constraint of A */ } success=1; } return success; } int dd_LPReplaceRow(dd_LPPtr lp, dd_rowrange i, dd_Arow a) { dd_colrange j; int success=0; if (i>=1 && i<=lp->m){ lp->LPS=dd_LPSundecided; for (j=1; j<=lp->d; j++) { dd_set(lp->A[i-1][j-1],a[j-1]); /* replacing the i-th constraint by a */ } success=1; } return success; } dd_Arow dd_LPCopyRow(dd_LPPtr lp, dd_rowrange i) { dd_colrange j; dd_Arow a; if (i>=1 && i<=lp->m){ dd_InitializeArow(lp->d, &a); for (j=1; j<=lp->d; j++) { dd_set(a[j-1],lp->A[i-1][j-1]); /* copying the i-th row to a */ } } return a; } void dd_SetNumberType(char *line,dd_NumberType *number,dd_ErrorType *Error) { if (strncmp(line,"integer",7)==0) { *number = dd_Integer; return; } else if (strncmp(line,"rational",8)==0) { *number = dd_Rational; return; } else if (strncmp(line,"real",4)==0) { *number = dd_Real; return; } else { *number=dd_Unknown; *Error=dd_ImproperInputFormat; } } void dd_WriteTableau(FILE *f,dd_rowrange m_size,dd_colrange d_size,dd_Amatrix A,dd_Bmatrix T, dd_colindex nbindex,dd_rowindex bflag) /* Write the tableau A.T */ { dd_colrange j; dd_rowrange i; mytype x; dd_init(x); fprintf(f," %ld %ld real\n",m_size,d_size); fprintf(f," |"); for (j=1; j<= d_size; j++) { fprintf(f," %ld",nbindex[j]); } fprintf(f,"\n"); for (j=1; j<= d_size+1; j++) { fprintf(f," ----"); } fprintf(f,"\n"); for (i=1; i<= m_size; i++) { fprintf(f," %3ld(%3ld) |",i,bflag[i]); for (j=1; j<= d_size; j++) { dd_TableauEntry(&x,m_size,d_size,A,T,i,j); dd_WriteNumber(f,x); } fprintf(f,"\n"); } fprintf(f,"end\n"); dd_clear(x); } void dd_WriteSignTableau(FILE *f,dd_rowrange m_size,dd_colrange d_size,dd_Amatrix A,dd_Bmatrix T, dd_colindex nbindex,dd_rowindex bflag) /* Write the sign tableau A.T */ { dd_colrange j; dd_rowrange i; mytype x; dd_init(x); fprintf(f," %ld %ld real\n",m_size,d_size); fprintf(f," |"); for (j=1; j<= d_size; j++) { fprintf(f,"%3ld",nbindex[j]); } fprintf(f,"\n ------- | "); for (j=1; j<= d_size; j++) { fprintf(f,"---"); } fprintf(f,"\n"); for (i=1; i<= m_size; i++) { fprintf(f," %3ld(%3ld) |",i,bflag[i]); for (j=1; j<= d_size; j++) { dd_TableauEntry(&x,m_size,d_size,A,T,i,j); if (dd_Positive(x)) fprintf(f, " +"); else if (dd_Negative(x)) fprintf(f, " -"); else fprintf(f, " 0"); } fprintf(f,"\n"); } fprintf(f,"end\n"); dd_clear(x); } void dd_WriteSignTableau2(FILE *f,dd_rowrange m_size,dd_colrange d_size,dd_Amatrix A,dd_Bmatrix T, dd_colindex nbindex_ref, dd_colindex nbindex,dd_rowindex bflag) /* Write the sign tableau A.T and the reference basis */ { dd_colrange j; dd_rowrange i; mytype x; dd_init(x); fprintf(f," %ld %ld real\n",m_size,d_size); fprintf(f," |"); for (j=1; j<= d_size; j++) fprintf(f,"%3ld",nbindex_ref[j]); fprintf(f,"\n |"); for (j=1; j<= d_size; j++) { fprintf(f,"%3ld",nbindex[j]); } fprintf(f,"\n ------- | "); for (j=1; j<= d_size; j++) { fprintf(f,"---"); } fprintf(f,"\n"); for (i=1; i<= m_size; i++) { fprintf(f," %3ld(%3ld) |",i,bflag[i]); for (j=1; j<= d_size; j++) { dd_TableauEntry(&x,m_size,d_size,A,T,i,j); if (dd_Positive(x)) fprintf(f, " +"); else if (dd_Negative(x)) fprintf(f, " -"); else fprintf(f, " 0"); } fprintf(f,"\n"); } fprintf(f,"end\n"); dd_clear(x); } void dd_GetRedundancyInformation(dd_rowrange m_size,dd_colrange d_size,dd_Amatrix A,dd_Bmatrix T, dd_colindex nbindex,dd_rowindex bflag, dd_rowset redset) /* Some basic variables that are forced to be nonnegative will be output. These are variables whose dictionary row components are all nonnegative. */ { dd_colrange j; dd_rowrange i; mytype x; dd_boolean red=dd_FALSE,localdebug=dd_FALSE; long numbred=0; dd_init(x); for (i=1; i<= m_size; i++) { red=dd_TRUE; for (j=1; j<= d_size; j++) { dd_TableauEntry(&x,m_size,d_size,A,T,i,j); if (red && dd_Negative(x)) red=dd_FALSE; } if (bflag[i]<0 && red) { numbred+=1; set_addelem(redset,i); } } if (localdebug) fprintf(stderr,"\ndd_GetRedundancyInformation: %ld redundant rows over %ld\n",numbred, m_size); dd_clear(x); } void dd_SelectDualSimplexPivot(dd_rowrange m_size,dd_colrange d_size, int Phase1,dd_Amatrix A,dd_Bmatrix T,dd_rowindex OV, dd_colindex nbindex_ref, dd_colindex nbindex,dd_rowindex bflag, dd_rowrange objrow,dd_colrange rhscol, dd_boolean lexicopivot, dd_rowrange *r,dd_colrange *s,int *selected,dd_LPStatusType *lps) { /* selects a dual simplex pivot (*r,*s) if the current basis is dual feasible and not optimal. If not dual feasible, the procedure returns *selected=dd_FALSE and *lps=LPSundecided. If Phase1=dd_TRUE, the RHS column will be considered as the negative of the column of the largest variable (==m_size). For this case, it is assumed that the caller used the auxiliary row (with variable m_size) to make the current dictionary dual feasible before calling this routine so that the nonbasic column for m_size corresponds to the auxiliary variable. */ dd_boolean colselected=dd_FALSE,rowselected=dd_FALSE, dualfeasible=dd_TRUE,localdebug=dd_FALSE; dd_rowrange i,iref; dd_colrange j,k; mytype val,valn, minval,rat,minrat; static dd_Arow rcost; static dd_colrange d_last=0; static dd_colset tieset,stieset; /* store the column indices with tie */ dd_init(val); dd_init(valn); dd_init(minval); dd_init(rat); dd_init(minrat); if (d_last0) { for (j=1; j<=d_last; j++){ dd_clear(rcost[j-1]);} free(rcost); set_free(tieset); set_free(stieset); } rcost=(mytype*) calloc(d_size,sizeof(mytype)); for (j=1; j<=d_size; j++){ dd_init(rcost[j-1]);} set_initialize(&tieset,d_size); set_initialize(&stieset,d_size); } d_last=d_size; *r=0; *s=0; *selected=dd_FALSE; *lps=dd_LPSundecided; for (j=1; j<=d_size; j++){ if (j!=rhscol){ dd_TableauEntry(&(rcost[j-1]),m_size,d_size,A,T,objrow,j); if (dd_Positive(rcost[j-1])) { dualfeasible=dd_FALSE; } } } if (dualfeasible){ while ((*lps==dd_LPSundecided) && (!rowselected) && (!colselected)) { for (i=1; i<=m_size; i++) { if (i!=objrow && bflag[i]==-1) { /* i is a basic variable */ if (Phase1){ dd_TableauEntry(&val, m_size,d_size,A,T,i,bflag[m_size]); dd_neg(val,val); /* for dual Phase I. The RHS (dual objective) is the negative of the auxiliary variable column. */ } else {dd_TableauEntry(&val,m_size,d_size,A,T,i,rhscol);} if (dd_Smaller(val,minval)) { *r=i; dd_set(minval,val); } } } if (dd_Nonnegative(minval)) { *lps=dd_Optimal; } else { rowselected=dd_TRUE; set_emptyset(tieset); for (j=1; j<=d_size; j++){ dd_TableauEntry(&val,m_size,d_size,A,T,*r,j); if (j!=rhscol && dd_Positive(val)) { dd_div(rat,rcost[j-1],val); dd_neg(rat,rat); if (*s==0 || dd_Smaller(rat,minrat)){ dd_set(minrat,rat); *s=j; set_emptyset(tieset); set_addelem(tieset, j); } else if (dd_Equal(rat,minrat)){ set_addelem(tieset,j); } } } if (*s>0) { if (!lexicopivot || set_card(tieset)==1){ colselected=dd_TRUE; *selected=dd_TRUE; } else { /* lexicographic rule with respect to the given reference cobasis. */ if (localdebug) {printf("Tie occurred at:"); set_write(tieset); printf("\n"); dd_WriteTableau(stderr,m_size,d_size,A,T,nbindex,bflag); } *s=0; k=2; /* k runs through the column indices except RHS. */ do { iref=nbindex_ref[k]; /* iref runs though the reference basic indices */ if (iref>0) { j=bflag[iref]; if (j>0) { if (set_member(j,tieset) && set_card(tieset)==1) { *s=j; colselected=dd_TRUE; } else { set_delelem(tieset, j); /* iref is cobasic, and the corresponding col is not the pivot column except it is the last one. */ } } else { *s=0; for (j=1; j<=d_size; j++){ if (set_member(j,tieset)) { dd_TableauEntry(&val,m_size,d_size,A,T,*r,j); dd_TableauEntry(&valn,m_size,d_size,A,T,iref,j); if (j!=rhscol && dd_Positive(val)) { dd_div(rat,valn,val); if (*s==0 || dd_Smaller(rat,minrat)){ dd_set(minrat,rat); *s=j; set_emptyset(stieset); set_addelem(stieset, j); } else if (dd_Equal(rat,minrat)){ set_addelem(stieset,j); } } } } set_copy(tieset,stieset); if (set_card(tieset)==1) colselected=dd_TRUE; } } k+=1; } while (!colselected && k<=d_size); *selected=dd_TRUE; } } else *lps=dd_Inconsistent; } } /* end of while */ } if (localdebug) { if (Phase1) fprintf(stderr,"Phase 1 : select %ld,%ld\n",*r,*s); else fprintf(stderr,"Phase 2 : select %ld,%ld\n",*r,*s); } dd_clear(val); dd_clear(valn); dd_clear(minval); dd_clear(rat); dd_clear(minrat); } void dd_TableauEntry(mytype *x,dd_rowrange m_size, dd_colrange d_size, dd_Amatrix X, dd_Bmatrix T, dd_rowrange r, dd_colrange s) /* Compute the (r,s) entry of X.T */ { dd_colrange j; mytype temp; dd_init(temp); dd_set(*x,dd_purezero); for (j=0; j< d_size; j++) { dd_mul(temp,X[r-1][j], T[j][s-1]); dd_add(*x, *x, temp); } dd_clear(temp); } void dd_SelectPivot2(dd_rowrange m_size,dd_colrange d_size,dd_Amatrix A,dd_Bmatrix T, dd_RowOrderType roworder,dd_rowindex ordervec, rowset equalityset, dd_rowrange rowmax,rowset NopivotRow, colset NopivotCol,dd_rowrange *r,dd_colrange *s, dd_boolean *selected) /* Select a position (*r,*s) in the matrix A.T such that (A.T)[*r][*s] is nonzero The choice is feasible, i.e., not on NopivotRow and NopivotCol, and best with respect to the specified roworder */ { int stop; dd_rowrange i,rtemp; rowset rowexcluded; mytype Xtemp; dd_boolean localdebug=dd_FALSE; stop = dd_FALSE; localdebug=dd_debug; dd_init(Xtemp); set_initialize(&rowexcluded,m_size); set_copy(rowexcluded,NopivotRow); for (i=rowmax+1;i<=m_size;i++) { set_addelem(rowexcluded,i); /* cannot pivot on any row > rmax */ } *selected = dd_FALSE; do { rtemp=0; i=1; while (i<=m_size && rtemp==0) { /* equalityset vars have highest priorities */ if (set_member(i,equalityset) && !set_member(i,rowexcluded)){ if (localdebug) fprintf(stderr,"marked set %ld chosen as a candidate\n",i); rtemp=i; } i++; } if (rtemp==0) dd_SelectPreorderedNext2(m_size,d_size,rowexcluded,ordervec,&rtemp);; if (rtemp>=1) { *r=rtemp; *s=1; while (*s <= d_size && !*selected) { dd_TableauEntry(&Xtemp,m_size,d_size,A,T,*r,*s); if (!set_member(*s,NopivotCol) && dd_Nonzero(Xtemp)) { *selected = dd_TRUE; stop = dd_TRUE; } else { (*s)++; } } if (!*selected) { set_addelem(rowexcluded,rtemp); } } else { *r = 0; *s = 0; stop = dd_TRUE; } } while (!stop); set_free(rowexcluded); dd_clear(Xtemp); } void dd_GaussianColumnPivot(dd_rowrange m_size, dd_colrange d_size, dd_Amatrix X, dd_Bmatrix T, dd_rowrange r, dd_colrange s) /* Update the Transformation matrix T with the pivot operation on (r,s) This procedure performs a implicit pivot operation on the matrix X by updating the dual basis inverse T. */ { dd_colrange j, j1; mytype Xtemp0, Xtemp1, Xtemp; static dd_Arow Rtemp; static dd_colrange last_d=0; dd_init(Xtemp0); dd_init(Xtemp1); dd_init(Xtemp); if (last_d!=d_size){ if (last_d>0) { for (j=1; j<=last_d; j++) dd_clear(Rtemp[j-1]); free(Rtemp); } Rtemp=(mytype*)calloc(d_size,sizeof(mytype)); for (j=1; j<=d_size; j++) dd_init(Rtemp[j-1]); last_d=d_size; } for (j=1; j<=d_size; j++) { dd_TableauEntry(&(Rtemp[j-1]), m_size, d_size, X, T, r,j); } dd_set(Xtemp0,Rtemp[s-1]); for (j = 1; j <= d_size; j++) { if (j != s) { dd_div(Xtemp,Rtemp[j-1],Xtemp0); dd_set(Xtemp1,dd_purezero); for (j1 = 1; j1 <= d_size; j1++){ dd_mul(Xtemp1,Xtemp,T[j1-1][s - 1]); dd_sub(T[j1-1][j-1],T[j1-1][j-1],Xtemp1); /* T[j1-1][j-1] -= T[j1-1][s - 1] * Xtemp / Xtemp0; */ } } } for (j = 1; j <= d_size; j++) dd_div(T[j-1][s - 1],T[j-1][s - 1],Xtemp0); dd_clear(Xtemp0); dd_clear(Xtemp1); dd_clear(Xtemp); } void dd_GaussianColumnPivot2(dd_rowrange m_size,dd_colrange d_size, dd_Amatrix A,dd_Bmatrix T,dd_colindex nbindex,dd_rowindex bflag,dd_rowrange r,dd_colrange s) /* Update the Transformation matrix T with the pivot operation on (r,s) This procedure performs a implicit pivot operation on the matrix A by updating the dual basis inverse T. */ { int localdebug=dd_FALSE; long entering; if (dd_debug) localdebug=dd_debug; dd_GaussianColumnPivot(m_size,d_size,A,T,r,s); entering=nbindex[s]; bflag[r]=s; /* the nonbasic variable r corresponds to column s */ nbindex[s]=r; /* the nonbasic variable on s column is r */ if (entering>0) bflag[entering]=-1; /* original variables have negative index and should not affect the row index */ if (localdebug) { fprintf(stderr,"dd_GaussianColumnPivot2\n"); fprintf(stderr," pivot: (leaving, entering) = (%ld, %ld)\n", r,entering); fprintf(stderr, " bflag[%ld] is set to %ld\n", r, s); } } void dd_ResetTableau(dd_rowrange m_size,dd_colrange d_size,dd_Bmatrix T, dd_colindex nbindex,dd_rowindex bflag,dd_rowrange objrow,dd_colrange rhscol) { dd_rowrange i; dd_colrange j; /* Initialize T and nbindex */ for (j=1; j<=d_size; j++) nbindex[j]=-j; nbindex[rhscol]=0; /* RHS is already in nonbasis and is considered to be associated with the zero-th row of input. */ dd_SetToIdentity(d_size,T); /* Set the bflag according to nbindex */ for (i=1; i<=m_size; i++) bflag[i]=-1; /* all basic variables have index -1 */ bflag[objrow]= 0; /* bflag of the objective variable is 0, different from other basic variables which have -1 */ for (j=1; j<=d_size; j++) if (nbindex[j]>0) bflag[nbindex[j]]=j; /* bflag of a nonbasic variable is its column number */ } void dd_SelectCrissCrossPivot(dd_rowrange m_size,dd_colrange d_size,dd_Amatrix A,dd_Bmatrix T, dd_rowindex bflag,dd_rowrange objrow,dd_colrange rhscol, dd_rowrange *r,dd_colrange *s, int *selected,dd_LPStatusType *lps) { int colselected=dd_FALSE,rowselected=dd_FALSE; dd_rowrange i; mytype val; dd_init(val); *selected=dd_FALSE; *lps=dd_LPSundecided; while ((*lps==dd_LPSundecided) && (!rowselected) && (!colselected)) { for (i=1; i<=m_size; i++) { if (i!=objrow && bflag[i]==-1) { /* i is a basic variable */ dd_TableauEntry(&val,m_size,d_size,A,T,i,rhscol); if (dd_Negative(val)) { rowselected=dd_TRUE; *r=i; break; } } else if (bflag[i] >0) { /* i is nonbasic variable */ dd_TableauEntry(&val,m_size,d_size,A,T,objrow,bflag[i]); if (dd_Positive(val)) { colselected=dd_TRUE; *s=bflag[i]; break; } } } if ((!rowselected) && (!colselected)) { *lps=dd_Optimal; return; } else if (rowselected) { for (i=1; i<=m_size; i++) { if (bflag[i] >0) { /* i is nonbasic variable */ dd_TableauEntry(&val,m_size,d_size,A,T,*r,bflag[i]); if (dd_Positive(val)) { colselected=dd_TRUE; *s=bflag[i]; *selected=dd_TRUE; break; } } } } else if (colselected) { for (i=1; i<=m_size; i++) { if (i!=objrow && bflag[i]==-1) { /* i is a basic variable */ dd_TableauEntry(&val,m_size,d_size,A,T,i,*s); if (dd_Negative(val)) { rowselected=dd_TRUE; *r=i; *selected=dd_TRUE; break; } } } } if (!rowselected) { *lps=dd_DualInconsistent; } else if (!colselected) { *lps=dd_Inconsistent; } } dd_clear(val); } void dd_CrissCrossSolve(dd_LPPtr lp, dd_ErrorType *err) { switch (lp->objective) { case dd_LPmax: dd_CrissCrossMaximize(lp,err); break; case dd_LPmin: dd_CrissCrossMinimize(lp,err); break; case dd_LPnone: *err=dd_NoLPObjective; break; } } void dd_DualSimplexSolve(dd_LPPtr lp, dd_ErrorType *err) { switch (lp->objective) { case dd_LPmax: dd_DualSimplexMaximize(lp,err); break; case dd_LPmin: dd_DualSimplexMinimize(lp,err); break; case dd_LPnone: *err=dd_NoLPObjective; break; } } #ifdef GMPRATIONAL dd_LPStatusType LPSf2LPS(ddf_LPStatusType lpsf) { dd_LPStatusType lps=dd_LPSundecided; switch (lpsf) { case ddf_LPSundecided: lps=dd_LPSundecided; break; case ddf_Optimal: lps=dd_Optimal; break; case ddf_Inconsistent: lps=dd_Inconsistent; break; case ddf_DualInconsistent: lps=dd_DualInconsistent; break; case ddf_StrucInconsistent: lps=dd_StrucInconsistent; break; case ddf_StrucDualInconsistent: lps=dd_StrucDualInconsistent; break; case ddf_Unbounded: lps=dd_Unbounded; break; case ddf_DualUnbounded: lps=dd_DualUnbounded; break; } return lps; } void dd_BasisStatus(ddf_LPPtr lpf, dd_LPPtr lp, dd_boolean *LPScorrect) { int i; dd_colrange se, j; dd_boolean basisfound; switch (lp->objective) { case dd_LPmax: dd_BasisStatusMaximize(lp->m,lp->d,lp->A,lp->B,lp->equalityset,lp->objrow,lp->rhscol, lpf->LPS,&(lp->optvalue),lp->sol,lp->dsol,lp->posset_extra,lpf->nbindex,lpf->re,lpf->se,&se,lp->pivots, &basisfound, LPScorrect); if (*LPScorrect) { /* printf("BasisStatus Check: the current basis is verified with GMP\n"); */ lp->LPS=LPSf2LPS(lpf->LPS); lp->re=lpf->re; lp->se=se; for (j=1; j<=lp->d; j++) lp->nbindex[j]=lpf->nbindex[j]; } for (i=1; i<=5; i++) lp->pivots[i-1]+=lpf->pivots[i-1]; break; case dd_LPmin: dd_BasisStatusMinimize(lp->m,lp->d,lp->A,lp->B,lp->equalityset,lp->objrow,lp->rhscol, lpf->LPS,&(lp->optvalue),lp->sol,lp->dsol,lp->posset_extra,lpf->nbindex,lpf->re,lpf->se,&se,lp->pivots, &basisfound, LPScorrect); if (*LPScorrect) { /* printf("BasisStatus Check: the current basis is verified with GMP\n"); */ lp->LPS=LPSf2LPS(lpf->LPS); lp->re=lpf->re; lp->se=se; for (j=1; j<=lp->d; j++) lp->nbindex[j]=lpf->nbindex[j]; } for (i=1; i<=5; i++) lp->pivots[i-1]+=lpf->pivots[i-1]; break; case dd_LPnone: break; } } #endif void dd_FindLPBasis(dd_rowrange m_size,dd_colrange d_size, dd_Amatrix A, dd_Bmatrix T,dd_rowindex OV,dd_rowset equalityset, dd_colindex nbindex, dd_rowindex bflag,dd_rowrange objrow,dd_colrange rhscol, dd_colrange *cs,int *found,dd_LPStatusType *lps,long *pivot_no) { /* Find a LP basis using Gaussian pivots. If the problem has an LP basis, the procedure returns *found=dd_TRUE,*lps=LPSundecided and an LP basis. If the constraint matrix A (excluding the rhs and objective) is not column independent, there are two cases. If the dependency gives a dual inconsistency, this returns *found=dd_FALSE, *lps=dd_StrucDualInconsistent and the evidence column *s. Otherwise, this returns *found=dd_TRUE, *lps=LPSundecided and an LP basis of size less than d_size. Columns j that do not belong to the basis (i.e. cannot be chosen as pivot because they are all zero) will be indicated in nbindex vector: nbindex[j] will be negative and set to -j. */ int chosen,stop; long pivots_p0=0,rank; colset ColSelected; rowset RowSelected; mytype val; dd_rowrange r; dd_colrange j,s; dd_init(val); *found=dd_FALSE; *cs=0; rank=0; stop=dd_FALSE; *lps=dd_LPSundecided; set_initialize(&RowSelected,m_size); set_initialize(&ColSelected,d_size); set_addelem(RowSelected,objrow); set_addelem(ColSelected,rhscol); stop=dd_FALSE; do { /* Find a LP basis */ dd_SelectPivot2(m_size,d_size,A,T,dd_MinIndex,OV,equalityset, m_size,RowSelected,ColSelected,&r,&s,&chosen); if (chosen) { set_addelem(RowSelected,r); set_addelem(ColSelected,s); dd_GaussianColumnPivot2(m_size,d_size,A,T,nbindex,bflag,r,s); pivots_p0++; rank++; } else { for (j=1;j<=d_size && *lps==dd_LPSundecided; j++) { if (j!=rhscol && nbindex[j]<0){ dd_TableauEntry(&val,m_size,d_size,A,T,objrow,j); if (dd_Nonzero(val)){ /* dual inconsistent */ *lps=dd_StrucDualInconsistent; *cs=j; /* dual inconsistent because the nonzero reduced cost */ } } } if (*lps==dd_LPSundecided) *found=dd_TRUE; /* dependent columns but not dual inconsistent. */ stop=dd_TRUE; } /* printf("d_size=%ld, rank=%ld\n",d_size,rank); */ if (rank==d_size-1) { stop = dd_TRUE; *found=dd_TRUE; } } while (!stop); *pivot_no=pivots_p0; dd_statBApivots+=pivots_p0; set_free(RowSelected); set_free(ColSelected); dd_clear(val); } void dd_FindLPBasis2(dd_rowrange m_size,dd_colrange d_size, dd_Amatrix A, dd_Bmatrix T,dd_rowindex OV,dd_rowset equalityset, dd_colindex nbindex, dd_rowindex bflag,dd_rowrange objrow,dd_colrange rhscol, dd_colrange *cs,int *found,long *pivot_no) { /* Similar to dd_FindLPBasis but it is much simpler. This tries to recompute T for the specified basis given by nbindex. It will return *found=dd_FALSE if the specified basis is not a basis. */ int chosen,stop; long pivots_p0=0,rank; dd_colset ColSelected,DependentCols; dd_rowset RowSelected, NopivotRow; mytype val; dd_boolean localdebug=dd_FALSE; dd_rowrange r,negcount=0; dd_colrange j,s; dd_init(val); *found=dd_FALSE; *cs=0; rank=0; set_initialize(&RowSelected,m_size); set_initialize(&DependentCols,d_size); set_initialize(&ColSelected,d_size); set_initialize(&NopivotRow,m_size); set_addelem(RowSelected,objrow); set_addelem(ColSelected,rhscol); set_compl(NopivotRow, NopivotRow); /* set NopivotRow to be the groundset */ for (j=2; j<=d_size; j++) if (nbindex[j]>0) set_delelem(NopivotRow, nbindex[j]); else if (nbindex[j]<0){ negcount++; set_addelem(DependentCols, -nbindex[j]); set_addelem(ColSelected, -nbindex[j]); } set_uni(RowSelected, RowSelected, NopivotRow); /* RowSelected is the set of rows not allowed to poviot on */ stop=dd_FALSE; do { /* Find a LP basis */ dd_SelectPivot2(m_size,d_size,A,T,dd_MinIndex,OV,equalityset, m_size,RowSelected,ColSelected,&r,&s,&chosen); if (chosen) { set_addelem(RowSelected,r); set_addelem(ColSelected,s); dd_GaussianColumnPivot2(m_size,d_size,A,T,nbindex,bflag,r,s); if (localdebug && m_size <=10){ dd_WriteBmatrix(stderr,d_size,T); dd_WriteTableau(stderr,m_size,d_size,A,T,nbindex,bflag); } pivots_p0++; rank++; } else{ *found=dd_FALSE; /* cannot pivot on any of the spacified positions. */ stop=dd_TRUE; } if (rank==d_size-1-negcount) { if (negcount){ /* Now it tries to pivot on rows that are supposed to be dependent. */ set_diff(ColSelected, ColSelected, DependentCols); dd_SelectPivot2(m_size,d_size,A,T,dd_MinIndex,OV,equalityset, m_size,RowSelected,ColSelected,&r,&s,&chosen); if (chosen) *found=dd_FALSE; /* not supposed to be independent */ else *found=dd_TRUE; if (localdebug){ printf("Try to check the dependent cols:"); set_write(DependentCols); if (chosen) printf("They are not dependent. Can still pivot on (%ld, %ld)\n",r, s); else printf("They are indeed dependent.\n"); } } else { *found=dd_TRUE; } stop = dd_TRUE; } } while (!stop); for (j=1; j<=d_size; j++) if (nbindex[j]>0) bflag[nbindex[j]]=j; *pivot_no=pivots_p0; set_free(RowSelected); set_free(ColSelected); set_free(NopivotRow); set_free(DependentCols); dd_clear(val); } void dd_FindDualFeasibleBasis(dd_rowrange m_size,dd_colrange d_size, dd_Amatrix A,dd_Bmatrix T,dd_rowindex OV, dd_colindex nbindex,dd_rowindex bflag,dd_rowrange objrow,dd_colrange rhscol, dd_boolean lexicopivot, dd_colrange *s,dd_ErrorType *err,dd_LPStatusType *lps,long *pivot_no, long maxpivots) { /* Find a dual feasible basis using Phase I of Dual Simplex method. If the problem is dual feasible, the procedure returns *err=NoError, *lps=LPSundecided and a dual feasible basis. If the problem is dual infeasible, this returns *err=NoError, *lps=DualInconsistent and the evidence column *s. Caution: matrix A must have at least one extra row: the row space A[m_size] must have been allocated. */ dd_boolean phase1,dualfeasible=dd_TRUE; dd_boolean localdebug=dd_FALSE,chosen,stop; dd_LPStatusType LPSphase1; long pivots_p1=0; dd_rowrange i,r_val; dd_colrange j,l,ms=0,s_val,local_m_size; mytype x,val,maxcost,axvalue,maxratio; static dd_colrange d_last=0; static dd_Arow rcost; static dd_colindex nbindex_ref; /* to be used to store the initial feasible basis for lexico rule */ mytype scaling,svalue; /* random scaling mytype value */ mytype minval; if (dd_debug) localdebug=dd_debug; dd_init(x); dd_init(val); dd_init(scaling); dd_init(svalue); dd_init(axvalue); dd_init(maxcost); dd_set(maxcost,dd_minuszero); dd_init(maxratio); dd_set(maxratio,dd_minuszero); if (d_last0) { for (j=1; j<=d_last; j++){ dd_clear(rcost[j-1]);} free(rcost); free(nbindex_ref); } rcost=(mytype*) calloc(d_size,sizeof(mytype)); nbindex_ref=(long*) calloc(d_size+1,sizeof(long)); for (j=1; j<=d_size; j++){ dd_init(rcost[j-1]);} } d_last=d_size; *err=dd_NoError; *lps=dd_LPSundecided; *s=0; local_m_size=m_size+1; /* increase m_size by 1 */ ms=0; /* ms will be the index of column which has the largest reduced cost */ for (j=1; j<=d_size; j++){ if (j!=rhscol){ dd_TableauEntry(&(rcost[j-1]),local_m_size,d_size,A,T,objrow,j); if (dd_Larger(rcost[j-1],maxcost)) {dd_set(maxcost,rcost[j-1]); ms = j;} } } if (dd_Positive(maxcost)) dualfeasible=dd_FALSE; if (!dualfeasible){ for (j=1; j<=d_size; j++){ dd_set(A[local_m_size-1][j-1], dd_purezero); for (l=1; l<=d_size; l++){ if (nbindex[l]>0) { dd_set_si(scaling,l+10); dd_mul(svalue,A[nbindex[l]-1][j-1],scaling); dd_sub(A[local_m_size-1][j-1],A[local_m_size-1][j-1],svalue); /* To make the auxiliary row (0,-11,-12,...,-d-10). It is likely to be better than (0, -1, -1, ..., -1) to avoid a degenerate LP. Version 093c. */ } } } if (localdebug){ fprintf(stderr,"\ndd_FindDualFeasibleBasis: curruent basis is not dual feasible.\n"); fprintf(stderr,"because of the column %ld assoc. with var %ld dual cost =", ms,nbindex[ms]); dd_WriteNumber(stderr, maxcost); if (localdebug) { if (m_size <=100 && d_size <=30){ printf("\ndd_FindDualFeasibleBasis: the starting dictionary.\n"); dd_WriteTableau(stdout,m_size+1,d_size,A,T,nbindex,bflag); } } } ms=0; /* Ratio Test: ms will be now the index of column which has the largest reduced cost over the auxiliary row entry */ for (j=1; j<=d_size; j++){ if ((j!=rhscol) && dd_Positive(rcost[j-1])){ dd_TableauEntry(&axvalue,local_m_size,d_size,A,T,local_m_size,j); if (dd_Nonnegative(axvalue)) { *err=dd_NumericallyInconsistent; /* This should not happen as they are set negative above. Quit the phase I.*/ if (localdebug) fprintf(stderr,"dd_FindDualFeasibleBasis: Numerical Inconsistency detected.\n"); goto _L99; } dd_neg(axvalue,axvalue); dd_div(axvalue,rcost[j-1],axvalue); /* axvalue is the negative of ratio that is to be maximized. */ if (dd_Larger(axvalue,maxratio)) { dd_set(maxratio,axvalue); ms = j; } } } if (ms==0) { *err=dd_NumericallyInconsistent; /* This should not happen. Quit the phase I.*/ if (localdebug) fprintf(stderr,"dd_FindDualFeasibleBasis: Numerical Inconsistency detected.\n"); goto _L99; } /* Pivot on (local_m_size,ms) so that the dual basic solution becomes feasible */ dd_GaussianColumnPivot2(local_m_size,d_size,A,T,nbindex,bflag,local_m_size,ms); pivots_p1=pivots_p1+1; if (localdebug) { printf("\ndd_FindDualFeasibleBasis: Pivot on %ld %ld.\n",local_m_size,ms); } for (j=1; j<=d_size; j++) nbindex_ref[j]=nbindex[j]; /* set the reference basis to be the current feasible basis. */ if (localdebug){ fprintf(stderr, "Store the current feasible basis:"); for (j=1; j<=d_size; j++) fprintf(stderr, " %ld", nbindex_ref[j]); fprintf(stderr, "\n"); if (m_size <=100 && d_size <=30) dd_WriteSignTableau2(stdout,m_size+1,d_size,A,T,nbindex_ref,nbindex,bflag); } phase1=dd_TRUE; stop=dd_FALSE; do { /* Dual Simplex Phase I */ chosen=dd_FALSE; LPSphase1=dd_LPSundecided; if (pivots_p1>maxpivots) { *err=dd_LPCycling; fprintf(stderr,"max number %ld of pivots performed in Phase I. Switch to the anticycling phase.\n", maxpivots); goto _L99; /* failure due to max no. of pivots performed */ } dd_SelectDualSimplexPivot(local_m_size,d_size,phase1,A,T,OV,nbindex_ref,nbindex,bflag, objrow,rhscol,lexicopivot,&r_val,&s_val,&chosen,&LPSphase1); if (!chosen) { /* The current dictionary is terminal. There are two cases: dd_TableauEntry(local_m_size,d_size,A,T,objrow,ms) is negative or zero. The first case implies dual infeasible, and the latter implies dual feasible but local_m_size is still in nonbasis. We must pivot in the auxiliary variable local_m_size. */ dd_TableauEntry(&x,local_m_size,d_size,A,T,objrow,ms); if (dd_Negative(x)){ *err=dd_NoError; *lps=dd_DualInconsistent; *s=ms; } if (localdebug) { fprintf(stderr,"\ndd_FindDualFeasibleBasis: the auxiliary variable was forced to enter the basis (# pivots = %ld).\n",pivots_p1); fprintf(stderr," -- objrow %ld, ms %ld entry: ",objrow,ms); dd_WriteNumber(stderr, x); fprintf(stderr,"\n"); if (dd_Negative(x)){ fprintf(stderr,"->The basis is dual inconsistent. Terminate.\n"); } else { fprintf(stderr,"->The basis is feasible. Go to phase II.\n"); } } dd_init(minval); r_val=0; for (i=1; i<=local_m_size; i++){ if (bflag[i]<0) { /* i is basic and not the objective variable */ dd_TableauEntry(&val,local_m_size,d_size,A,T,i,ms); /* auxiliary column*/ if (dd_Smaller(val, minval)) { r_val=i; dd_set(minval,val); } } } dd_clear(minval); if (r_val==0) { *err=dd_NumericallyInconsistent; /* This should not happen. Quit the phase I.*/ if (localdebug) fprintf(stderr,"dd_FindDualFeasibleBasis: Numerical Inconsistency detected (r_val is 0).\n"); goto _L99; } dd_GaussianColumnPivot2(local_m_size,d_size,A,T,nbindex,bflag,r_val,ms); pivots_p1=pivots_p1+1; if (localdebug) { printf("\ndd_FindDualFeasibleBasis: make the %ld-th pivot on %ld %ld to force the auxiliary variable to enter the basis.\n",pivots_p1,r_val,ms); if (m_size <=100 && d_size <=30) dd_WriteSignTableau2(stdout,m_size+1,d_size,A,T,nbindex_ref,nbindex,bflag); } stop=dd_TRUE; } else { dd_GaussianColumnPivot2(local_m_size,d_size,A,T,nbindex,bflag,r_val,s_val); pivots_p1=pivots_p1+1; if (localdebug) { printf("\ndd_FindDualFeasibleBasis: make a %ld-th pivot on %ld %ld\n",pivots_p1,r_val,s_val); if (m_size <=100 && d_size <=30) dd_WriteSignTableau2(stdout,local_m_size,d_size,A,T,nbindex_ref,nbindex,bflag); } if (bflag[local_m_size]<0) { stop=dd_TRUE; if (localdebug) fprintf(stderr,"\nDualSimplex Phase I: the auxiliary variable entered the basis (# pivots = %ld).\nGo to phase II\n",pivots_p1); } } } while(!stop); } _L99: *pivot_no=pivots_p1; dd_statDS1pivots+=pivots_p1; dd_clear(x); dd_clear(val); dd_clear(maxcost); dd_clear(maxratio); dd_clear(scaling); dd_clear(svalue); dd_clear(axvalue); } void dd_DualSimplexMinimize(dd_LPPtr lp,dd_ErrorType *err) { dd_colrange j; *err=dd_NoError; for (j=1; j<=lp->d; j++) dd_neg(lp->A[lp->objrow-1][j-1],lp->A[lp->objrow-1][j-1]); dd_DualSimplexMaximize(lp,err); dd_neg(lp->optvalue,lp->optvalue); for (j=1; j<=lp->d; j++){ if (lp->LPS!=dd_Inconsistent) { /* Inconsistent certificate stays valid for minimization, 0.94e */ dd_neg(lp->dsol[j-1],lp->dsol[j-1]); } dd_neg(lp->A[lp->objrow-1][j-1],lp->A[lp->objrow-1][j-1]); } } void dd_DualSimplexMaximize(dd_LPPtr lp,dd_ErrorType *err) /* When LP is inconsistent then lp->re returns the evidence row. When LP is dual-inconsistent then lp->se returns the evidence column. */ { int stop,chosen,phase1,found; long pivots_ds=0,pivots_p0=0,pivots_p1=0,pivots_pc=0,maxpivots,maxpivfactor=20; dd_boolean localdebug=dd_FALSE,localdebug1=dd_FALSE; #if !defined GMPRATIONAL long maxccpivots,maxccpivfactor=100; /* criss-cross should not cycle, but with floating-point arithmetics, it happens (very rarely). Jorg Rambau reported such an LP, in August 2003. Thanks Jorg! */ #endif dd_rowrange i,r; dd_colrange j,s; static dd_rowindex bflag; static long mlast=0,nlast=0; static dd_rowindex OrderVector; /* the permutation vector to store a preordered row indeces */ static dd_colindex nbindex_ref; /* to be used to store the initial feasible basis for lexico rule */ double redpercent=0; unsigned int rseed=1; /* *err=dd_NoError; */ if (dd_debug) localdebug=dd_debug; set_emptyset(lp->redset_extra); for (i=0; i<= 4; i++) lp->pivots[i]=0; maxpivots=maxpivfactor*lp->d; /* maximum pivots to be performed before cc pivot is applied. */ #if !defined GMPRATIONAL maxccpivots=maxccpivfactor*lp->d; /* maximum pivots to be performed with emergency cc pivots. */ #endif if (mlast!=lp->m || nlast!=lp->d){ if (mlast>0) { /* called previously with different lp->m */ free(OrderVector); free(bflag); free(nbindex_ref); } OrderVector=(long *)calloc(lp->m+1,sizeof(*OrderVector)); bflag=(long *) calloc(lp->m+2,sizeof(*bflag)); /* one more element for an auxiliary variable */ nbindex_ref=(long*) calloc(lp->d+1,sizeof(long)); mlast=lp->m;nlast=lp->d; } /* Initializing control variables. */ dd_ComputeRowOrderVector2(lp->m,lp->d,lp->A,OrderVector,dd_MinIndex,rseed); lp->re=0; lp->se=0; dd_ResetTableau(lp->m,lp->d,lp->B,lp->nbindex,bflag,lp->objrow,lp->rhscol); dd_FindLPBasis(lp->m,lp->d,lp->A,lp->B,OrderVector,lp->equalityset,lp->nbindex,bflag, lp->objrow,lp->rhscol,&s,&found,&(lp->LPS),&pivots_p0); lp->pivots[0]=pivots_p0; if (!found){ lp->se=s; goto _L99; /* No LP basis is found, and thus Inconsistent. Output the evidence column. */ } dd_FindDualFeasibleBasis(lp->m,lp->d,lp->A,lp->B,OrderVector,lp->nbindex,bflag, lp->objrow,lp->rhscol,lp->lexicopivot,&s, err,&(lp->LPS),&pivots_p1, maxpivots); lp->pivots[1]=pivots_p1; for (j=1; j<=lp->d; j++) nbindex_ref[j]=lp->nbindex[j]; /* set the reference basis to be the current feasible basis. */ if (localdebug){ fprintf(stderr, "dd_DualSimplexMaximize: Store the current feasible basis:"); for (j=1; j<=lp->d; j++) fprintf(stderr, " %ld", nbindex_ref[j]); fprintf(stderr, "\n"); if (lp->m <=100 && lp->d <=30) dd_WriteSignTableau2(stdout,lp->m+1,lp->d,lp->A,lp->B,nbindex_ref,lp->nbindex,bflag); } if (*err==dd_LPCycling || *err==dd_NumericallyInconsistent){ if (localdebug) fprintf(stderr, "Phase I failed and thus switch to the Criss-Cross method\n"); dd_CrissCrossMaximize(lp,err); return; } if (lp->LPS==dd_DualInconsistent){ lp->se=s; goto _L99; /* No dual feasible basis is found, and thus DualInconsistent. Output the evidence column. */ } /* Dual Simplex Method */ stop=dd_FALSE; do { chosen=dd_FALSE; lp->LPS=dd_LPSundecided; phase1=dd_FALSE; if (pivots_dsm,lp->d,phase1,lp->A,lp->B,OrderVector,nbindex_ref,lp->nbindex,bflag, lp->objrow,lp->rhscol,lp->lexicopivot,&r,&s,&chosen,&(lp->LPS)); } if (chosen) { pivots_ds=pivots_ds+1; if (lp->redcheck_extensive) { dd_GetRedundancyInformation(lp->m,lp->d,lp->A,lp->B,lp->nbindex, bflag, lp->redset_extra); set_uni(lp->redset_accum, lp->redset_accum,lp->redset_extra); redpercent=100*(double)set_card(lp->redset_extra)/(double)lp->m; if (localdebug1){ fprintf(stderr,"\ndd_DualSimplexMaximize: Phase II pivot %ld on (%ld, %ld).\n",pivots_ds,r,s); fprintf(stderr," redundancy %f percent: redset size = %ld\n",redpercent,set_card(lp->redset_extra)); } } } if (!chosen && lp->LPS==dd_LPSundecided) { if (localdebug1){ fprintf(stderr,"Warning: an emergency CC pivot in Phase II is performed\n"); /* In principle this should not be executed because we already have dual feasibility attained and dual simplex pivot should have been chosen. This might occur under floating point computation, or the case of cycling. */ if (localdebug && lp->m <=100 && lp->d <=30){ fprintf(stderr,"\ndd_DualSimplexMaximize: The current dictionary.\n"); dd_WriteSignTableau2(stdout,lp->m,lp->d,lp->A,lp->B,nbindex_ref,lp->nbindex,bflag); } } #if !defined GMPRATIONAL if (pivots_pc>maxccpivots) { *err=dd_LPCycling; stop=dd_TRUE; goto _L99; } #endif dd_SelectCrissCrossPivot(lp->m,lp->d,lp->A,lp->B,bflag, lp->objrow,lp->rhscol,&r,&s,&chosen,&(lp->LPS)); if (chosen) pivots_pc=pivots_pc+1; } if (chosen) { dd_GaussianColumnPivot2(lp->m,lp->d,lp->A,lp->B,lp->nbindex,bflag,r,s); if (localdebug && lp->m <=100 && lp->d <=30){ fprintf(stderr,"\ndd_DualSimplexMaximize: The current dictionary.\n"); dd_WriteSignTableau2(stdout,lp->m,lp->d,lp->A,lp->B,nbindex_ref,lp->nbindex,bflag); } } else { switch (lp->LPS){ case dd_Inconsistent: lp->re=r; case dd_DualInconsistent: lp->se=s; default: break; } stop=dd_TRUE; } } while(!stop); _L99: lp->pivots[2]=pivots_ds; lp->pivots[3]=pivots_pc; dd_statDS2pivots+=pivots_ds; dd_statACpivots+=pivots_pc; dd_SetSolutions(lp->m,lp->d,lp->A,lp->B,lp->objrow,lp->rhscol,lp->LPS,&(lp->optvalue),lp->sol,lp->dsol,lp->posset_extra,lp->nbindex,lp->re,lp->se,bflag); } void dd_CrissCrossMinimize(dd_LPPtr lp,dd_ErrorType *err) { dd_colrange j; *err=dd_NoError; for (j=1; j<=lp->d; j++) dd_neg(lp->A[lp->objrow-1][j-1],lp->A[lp->objrow-1][j-1]); dd_CrissCrossMaximize(lp,err); dd_neg(lp->optvalue,lp->optvalue); for (j=1; j<=lp->d; j++){ if (lp->LPS!=dd_Inconsistent) { /* Inconsistent certificate stays valid for minimization, 0.94e */ dd_neg(lp->dsol[j-1],lp->dsol[j-1]); } dd_neg(lp->A[lp->objrow-1][j-1],lp->A[lp->objrow-1][j-1]); } } void dd_CrissCrossMaximize(dd_LPPtr lp,dd_ErrorType *err) /* When LP is inconsistent then lp->re returns the evidence row. When LP is dual-inconsistent then lp->se returns the evidence column. */ { int stop,chosen,found; long pivots0,pivots1; #if !defined GMPRATIONAL long maxpivots,maxpivfactor=1000; /* criss-cross should not cycle, but with floating-point arithmetics, it happens (very rarely). Jorg Rambau reported such an LP, in August 2003. Thanks Jorg! */ #endif dd_rowrange i,r; dd_colrange s; static dd_rowindex bflag; static long mlast=0; static dd_rowindex OrderVector; /* the permutation vector to store a preordered row indeces */ unsigned int rseed=1; dd_colindex nbtemp; *err=dd_NoError; #if !defined GMPRATIONAL maxpivots=maxpivfactor*lp->d; /* maximum pivots to be performed when floating-point arithmetics is used. */ #endif nbtemp=(long *) calloc(lp->d+1,sizeof(long)); for (i=0; i<= 4; i++) lp->pivots[i]=0; if (bflag==NULL || mlast!=lp->m){ if (mlast!=lp->m && mlast>0) { free(bflag); /* called previously with different lp->m */ free(OrderVector); } bflag=(long *) calloc(lp->m+1,sizeof(long)); OrderVector=(long *)calloc(lp->m+1,sizeof(long)); /* initialize only for the first time or when a larger space is needed */ mlast=lp->m; } /* Initializing control variables. */ dd_ComputeRowOrderVector2(lp->m,lp->d,lp->A,OrderVector,dd_MinIndex,rseed); lp->re=0; lp->se=0; pivots1=0; dd_ResetTableau(lp->m,lp->d,lp->B,lp->nbindex,bflag,lp->objrow,lp->rhscol); dd_FindLPBasis(lp->m,lp->d,lp->A,lp->B,OrderVector,lp->equalityset, lp->nbindex,bflag,lp->objrow,lp->rhscol,&s,&found,&(lp->LPS),&pivots0); lp->pivots[0]+=pivots0; if (!found){ lp->se=s; goto _L99; /* No LP basis is found, and thus Inconsistent. Output the evidence column. */ } stop=dd_FALSE; do { /* Criss-Cross Method */ #if !defined GMPRATIONAL if (pivots1>maxpivots) { *err=dd_LPCycling; fprintf(stderr,"max number %ld of pivots performed by the criss-cross method. Most likely due to the floating-point arithmetics error.\n", maxpivots); goto _L99; /* failure due to max no. of pivots performed */ } #endif dd_SelectCrissCrossPivot(lp->m,lp->d,lp->A,lp->B,bflag, lp->objrow,lp->rhscol,&r,&s,&chosen,&(lp->LPS)); if (chosen) { dd_GaussianColumnPivot2(lp->m,lp->d,lp->A,lp->B,lp->nbindex,bflag,r,s); pivots1++; } else { switch (lp->LPS){ case dd_Inconsistent: lp->re=r; case dd_DualInconsistent: lp->se=s; default: break; } stop=dd_TRUE; } } while(!stop); _L99: lp->pivots[1]+=pivots1; dd_statCCpivots+=pivots1; dd_SetSolutions(lp->m,lp->d,lp->A,lp->B, lp->objrow,lp->rhscol,lp->LPS,&(lp->optvalue),lp->sol,lp->dsol,lp->posset_extra,lp->nbindex,lp->re,lp->se,bflag); free(nbtemp); } void dd_SetSolutions(dd_rowrange m_size,dd_colrange d_size, dd_Amatrix A,dd_Bmatrix T, dd_rowrange objrow,dd_colrange rhscol,dd_LPStatusType LPS, mytype *optvalue,dd_Arow sol,dd_Arow dsol,dd_rowset posset, dd_colindex nbindex, dd_rowrange re,dd_colrange se,dd_rowindex bflag) /* Assign the solution vectors to sol,dsol,*optvalue after solving the LP. */ { dd_rowrange i; dd_colrange j; mytype x,sw; int localdebug=dd_FALSE; dd_init(x); dd_init(sw); if (localdebug) fprintf(stderr,"SetSolutions:\n"); switch (LPS){ case dd_Optimal: for (j=1;j<=d_size; j++) { dd_set(sol[j-1],T[j-1][rhscol-1]); dd_TableauEntry(&x,m_size,d_size,A,T,objrow,j); dd_neg(dsol[j-1],x); dd_TableauEntry(optvalue,m_size,d_size,A,T,objrow,rhscol); if (localdebug) {fprintf(stderr,"dsol[%ld]= ",nbindex[j]); dd_WriteNumber(stderr, dsol[j-1]); } } for (i=1; i<=m_size; i++) { if (bflag[i]==-1) { /* i is a basic variable */ dd_TableauEntry(&x,m_size,d_size,A,T,i,rhscol); if (dd_Positive(x)) set_addelem(posset, i); } } break; case dd_Inconsistent: if (localdebug) fprintf(stderr,"SetSolutions: LP is inconsistent.\n"); for (j=1;j<=d_size; j++) { dd_set(sol[j-1],T[j-1][rhscol-1]); dd_TableauEntry(&x,m_size,d_size,A,T,re,j); dd_neg(dsol[j-1],x); if (localdebug) {fprintf(stderr,"dsol[%ld]=",nbindex[j]); dd_WriteNumber(stderr,dsol[j-1]); fprintf(stderr,"\n"); } } break; case dd_DualInconsistent: if (localdebug) printf( "SetSolutions: LP is dual inconsistent.\n"); for (j=1;j<=d_size; j++) { dd_set(sol[j-1],T[j-1][se-1]); dd_TableauEntry(&x,m_size,d_size,A,T,objrow,j); dd_neg(dsol[j-1],x); if (localdebug) {fprintf(stderr,"dsol[%ld]=",nbindex[j]); dd_WriteNumber(stderr,dsol[j-1]); fprintf(stderr,"\n"); } } break; case dd_StrucDualInconsistent: dd_TableauEntry(&x,m_size,d_size,A,T,objrow,se); if (dd_Positive(x)) dd_set(sw,dd_one); else dd_neg(sw,dd_one); for (j=1;j<=d_size; j++) { dd_mul(sol[j-1],sw,T[j-1][se-1]); dd_TableauEntry(&x,m_size,d_size,A,T,objrow,j); dd_neg(dsol[j-1],x); if (localdebug) {fprintf(stderr,"dsol[%ld]= ",nbindex[j]);dd_WriteNumber(stderr,dsol[j-1]);} } if (localdebug) fprintf(stderr,"SetSolutions: LP is dual inconsistent.\n"); break; default:break; } dd_clear(x); dd_clear(sw); } void dd_RandomPermutation2(dd_rowindex OV,long t,unsigned int seed) { long k,j,ovj; double u,xk,r,rand_max=(double) RAND_MAX; int localdebug=dd_FALSE; srand(seed); for (j=t; j>1 ; j--) { r=rand(); u=r/rand_max; xk=(double)(j*u +1); k=(long)xk; if (localdebug) fprintf(stderr,"u=%g, k=%ld, r=%g, randmax= %g\n",u,k,r,rand_max); ovj=OV[j]; OV[j]=OV[k]; OV[k]=ovj; if (localdebug) fprintf(stderr,"row %ld is exchanged with %ld\n",j,k); } } void dd_ComputeRowOrderVector2(dd_rowrange m_size,dd_colrange d_size,dd_Amatrix A, dd_rowindex OV,dd_RowOrderType ho,unsigned int rseed) { long i,itemp; OV[0]=0; switch (ho){ case dd_MaxIndex: for(i=1; i<=m_size; i++) OV[i]=m_size-i+1; break; case dd_LexMin: for(i=1; i<=m_size; i++) OV[i]=i; dd_QuickSort(OV,1,m_size,A,d_size); break; case dd_LexMax: for(i=1; i<=m_size; i++) OV[i]=i; dd_QuickSort(OV,1,m_size,A,d_size); for(i=1; i<=m_size/2;i++){ /* just reverse the order */ itemp=OV[i]; OV[i]=OV[m_size-i+1]; OV[m_size-i+1]=itemp; } break; case dd_RandomRow: for(i=1; i<=m_size; i++) OV[i]=i; if (rseed<=0) rseed=1; dd_RandomPermutation2(OV,m_size,rseed); break; case dd_MinIndex: for(i=1; i<=m_size; i++) OV[i]=i; break; default: for(i=1; i<=m_size; i++) OV[i]=i; break; } } void dd_SelectPreorderedNext2(dd_rowrange m_size,dd_colrange d_size, rowset excluded,dd_rowindex OV,dd_rowrange *hnext) { dd_rowrange i,k; *hnext=0; for (i=1; i<=m_size && *hnext==0; i++){ k=OV[i]; if (!set_member(k,excluded)) *hnext=k ; } } #ifdef GMPRATIONAL ddf_LPObjectiveType Obj2Obj(dd_LPObjectiveType obj) { ddf_LPObjectiveType objf=ddf_LPnone; switch (obj) { case dd_LPnone: objf=ddf_LPnone; break; case dd_LPmax: objf=ddf_LPmax; break; case dd_LPmin: objf=ddf_LPmin; break; } return objf; } ddf_LPPtr dd_LPgmp2LPf(dd_LPPtr lp) { dd_rowrange i; dd_colrange j; ddf_LPType *lpf; double val; dd_boolean localdebug=dd_FALSE; if (localdebug) fprintf(stderr,"Converting a GMP-LP to a float-LP.\n"); lpf=ddf_CreateLPData(Obj2Obj(lp->objective), ddf_Real, lp->m, lp->d); lpf->Homogeneous = lp->Homogeneous; lpf->eqnumber=lp->eqnumber; /* this records the number of equations */ for (i = 1; i <= lp->m; i++) { if (set_member(i, lp->equalityset)) set_addelem(lpf->equalityset,i); /* it is equality. Its reversed row will not be in this set */ for (j = 1; j <= lp->d; j++) { val=mpq_get_d(lp->A[i-1][j-1]); ddf_set_d(lpf->A[i-1][j-1],val); } /*of j*/ } /*of i*/ return lpf; } #endif dd_boolean dd_LPSolve(dd_LPPtr lp,dd_LPSolverType solver,dd_ErrorType *err) /* The current version of dd_LPSolve that solves an LP with floating-arithmetics first and then with the specified arithimetics if it is GMP. When LP is inconsistent then *re returns the evidence row. When LP is dual-inconsistent then *se returns the evidence column. */ { int i; dd_boolean found=dd_FALSE; #ifdef GMPRATIONAL ddf_LPPtr lpf; ddf_ErrorType errf; dd_boolean LPScorrect=dd_FALSE; dd_boolean localdebug=dd_FALSE; if (dd_debug) localdebug=dd_debug; #endif *err=dd_NoError; lp->solver=solver; time(&lp->starttime); #ifndef GMPRATIONAL switch (lp->solver) { case dd_CrissCross: dd_CrissCrossSolve(lp,err); break; case dd_DualSimplex: dd_DualSimplexSolve(lp,err); break; } #else lpf=dd_LPgmp2LPf(lp); switch (lp->solver) { case dd_CrissCross: ddf_CrissCrossSolve(lpf,&errf); /* First, run with double float. */ if (errf==ddf_NoError){ /* 094a: fix for a bug reported by Dima Pasechnik */ dd_BasisStatus(lpf,lp, &LPScorrect); /* Check the basis. */ } else {LPScorrect=dd_FALSE;} if (!LPScorrect) { if (localdebug) printf("BasisStatus: the current basis is NOT verified with GMP. Rerun with GMP.\n"); dd_CrissCrossSolve(lp,err); /* Rerun with GMP if fails. */ } else { if (localdebug) printf("BasisStatus: the current basis is verified with GMP. The LP Solved.\n"); } break; case dd_DualSimplex: ddf_DualSimplexSolve(lpf,&errf); /* First, run with double float. */ if (errf==ddf_NoError){ /* 094a: fix for a bug reported by Dima Pasechnik */ dd_BasisStatus(lpf,lp, &LPScorrect); /* Check the basis. */ } else {LPScorrect=dd_FALSE;} if (!LPScorrect){ if (localdebug) printf("BasisStatus: the current basis is NOT verified with GMP. Rerun with GMP.\n"); dd_DualSimplexSolve(lp,err); /* Rerun with GMP if fails. */ if (localdebug){ printf("*total number pivots = %ld (ph0 = %ld, ph1 = %ld, ph2 = %ld, ph3 = %ld, ph4 = %ld)\n", lp->total_pivots,lp->pivots[0],lp->pivots[1],lp->pivots[2],lp->pivots[3],lp->pivots[4]); ddf_WriteLPResult(stdout, lpf, errf); dd_WriteLP(stdout, lp); } } else { if (localdebug) printf("BasisStatus: the current basis is verified with GMP. The LP Solved.\n"); } break; } ddf_FreeLPData(lpf); #endif time(&lp->endtime); lp->total_pivots=0; for (i=0; i<=4; i++) lp->total_pivots+=lp->pivots[i]; if (*err==dd_NoError) found=dd_TRUE; return found; } dd_boolean dd_LPSolve0(dd_LPPtr lp,dd_LPSolverType solver,dd_ErrorType *err) /* The original version of dd_LPSolve that solves an LP with specified arithimetics. When LP is inconsistent then *re returns the evidence row. When LP is dual-inconsistent then *se returns the evidence column. */ { int i; dd_boolean found=dd_FALSE; *err=dd_NoError; lp->solver=solver; time(&lp->starttime); switch (lp->solver) { case dd_CrissCross: dd_CrissCrossSolve(lp,err); break; case dd_DualSimplex: dd_DualSimplexSolve(lp,err); break; } time(&lp->endtime); lp->total_pivots=0; for (i=0; i<=4; i++) lp->total_pivots+=lp->pivots[i]; if (*err==dd_NoError) found=dd_TRUE; return found; } dd_LPPtr dd_MakeLPforInteriorFinding(dd_LPPtr lp) /* Delete the objective row, add an extra column with -1's to the matrix A, add an extra row with (bceil, 0,...,0,-1), add an objective row with (0,...,0,1), and rows & columns, and change m_size and d_size accordingly, to output new_A. This sets up the LP: maximize x_{d+1} s.t. A x + x_{d+1} <= b x_{d+1} <= bm * bmax, where bm is set to 2 by default, and bmax=max{1, b[1],...,b[m_size]}. Note that the equalitions (linearity) in the input lp will be ignored. */ { dd_rowrange m; dd_colrange d; dd_NumberType numbtype; dd_LPObjectiveType obj; dd_LPType *lpnew; dd_rowrange i; dd_colrange j; mytype bm,bmax,bceil; int localdebug=dd_FALSE; dd_init(bm); dd_init(bmax); dd_init(bceil); dd_add(bm,dd_one,dd_one); dd_set(bmax,dd_one); numbtype=lp->numbtype; m=lp->m+1; d=lp->d+1; obj=dd_LPmax; lpnew=dd_CreateLPData(obj, numbtype, m, d); for (i=1; i<=lp->m; i++) { if (dd_Larger(lp->A[i-1][lp->rhscol-1],bmax)) dd_set(bmax,lp->A[i-1][lp->rhscol-1]); } dd_mul(bceil,bm,bmax); if (localdebug) {fprintf(stderr,"bceil is set to "); dd_WriteNumber(stderr, bceil);} for (i=1; i <= lp->m; i++) { for (j=1; j <= lp->d; j++) { dd_set(lpnew->A[i-1][j-1],lp->A[i-1][j-1]); } } for (i=1;i<=lp->m; i++){ dd_neg(lpnew->A[i-1][lp->d],dd_one); /* new column with all minus one's */ } for (j=1;j<=lp->d;j++){ dd_set(lpnew->A[m-2][j-1],dd_purezero); /* new row (bceil, 0,...,0,-1) */ } dd_set(lpnew->A[m-2][0],bceil); /* new row (bceil, 0,...,0,-1) */ for (j=1;j<= d-1;j++) { dd_set(lpnew->A[m-1][j-1],dd_purezero); /* new obj row with (0,...,0,1) */ } dd_set(lpnew->A[m-1][d-1],dd_one); /* new obj row with (0,...,0,1) */ if (localdebug) dd_WriteAmatrix(stderr, lp->A, lp->m, lp->d); if (localdebug) dd_WriteAmatrix(stderr, lpnew->A, lpnew->m, lpnew->d); dd_clear(bm); dd_clear(bmax); dd_clear(bceil); return lpnew; } void dd_WriteLPResult(FILE *f,dd_LPPtr lp,dd_ErrorType err) { long j; fprintf(f,"* cdd LP solver result\n"); if (err!=dd_NoError) { dd_WriteErrorMessages(f,err); goto _L99; } dd_WriteProgramDescription(f); fprintf(f,"* #constraints = %ld\n",lp->m-1); fprintf(f,"* #variables = %ld\n",lp->d-1); switch (lp->solver) { case dd_DualSimplex: fprintf(f,"* Algorithm: dual simplex algorithm\n");break; case dd_CrissCross: fprintf(f,"* Algorithm: criss-cross method\n");break; } switch (lp->objective) { case dd_LPmax: fprintf(f,"* maximization is chosen\n");break; case dd_LPmin: fprintf(f,"* minimization is chosen\n");break; case dd_LPnone: fprintf(f,"* no objective type (max or min) is chosen\n");break; } if (lp->objective==dd_LPmax||lp->objective==dd_LPmin){ fprintf(f,"* Objective function is\n"); for (j=0; jd; j++){ if (j>0 && dd_Nonnegative(lp->A[lp->objrow-1][j]) ) fprintf(f," +"); if (j>0 && (j % 5) == 0) fprintf(f,"\n"); dd_WriteNumber(f,lp->A[lp->objrow-1][j]); if (j>0) fprintf(f," X[%3ld]",j); } fprintf(f,"\n"); } switch (lp->LPS){ case dd_Optimal: fprintf(f,"* LP status: a dual pair (x,y) of optimal solutions found.\n"); fprintf(f,"begin\n"); fprintf(f," primal_solution\n"); for (j=1; jd; j++) { fprintf(f," %3ld : ",j); dd_WriteNumber(f,lp->sol[j]); fprintf(f,"\n"); } fprintf(f," dual_solution\n"); for (j=1; jd; j++){ if (lp->nbindex[j+1]>0) { fprintf(f," %3ld : ",lp->nbindex[j+1]); dd_WriteNumber(f,lp->dsol[j]); fprintf(f,"\n"); } } fprintf(f," optimal_value : "); dd_WriteNumber(f,lp->optvalue); fprintf(f,"\nend\n"); break; case dd_Inconsistent: fprintf(f,"* LP status: LP is inconsistent.\n"); fprintf(f,"* The positive combination of original inequalities with\n"); fprintf(f,"* the following coefficients will prove the inconsistency.\n"); fprintf(f,"begin\n"); fprintf(f," dual_direction\n"); fprintf(f," %3ld : ",lp->re); dd_WriteNumber(f,dd_one); fprintf(f,"\n"); for (j=1; jd; j++){ if (lp->nbindex[j+1]>0) { fprintf(f," %3ld : ",lp->nbindex[j+1]); dd_WriteNumber(f,lp->dsol[j]); fprintf(f,"\n"); } } fprintf(f,"end\n"); break; case dd_DualInconsistent: case dd_StrucDualInconsistent: fprintf(f,"* LP status: LP is dual inconsistent.\n"); fprintf(f,"* The linear combination of columns with\n"); fprintf(f,"* the following coefficients will prove the dual inconsistency.\n"); fprintf(f,"* (It is also an unbounded direction for the primal LP.)\n"); fprintf(f,"begin\n"); fprintf(f," primal_direction\n"); for (j=1; jd; j++) { fprintf(f," %3ld : ",j); dd_WriteNumber(f,lp->sol[j]); fprintf(f,"\n"); } fprintf(f,"end\n"); break; default: break; } fprintf(f,"* number of pivot operations = %ld (ph0 = %ld, ph1 = %ld, ph2 = %ld, ph3 = %ld, ph4 = %ld)\n",lp->total_pivots,lp->pivots[0],lp->pivots[1],lp->pivots[2],lp->pivots[3],lp->pivots[4]); dd_WriteLPTimes(f, lp); _L99:; } dd_LPPtr dd_CreateLP_H_ImplicitLinearity(dd_MatrixPtr M) { dd_rowrange m, i, irev, linc; dd_colrange d, j; dd_LPPtr lp; dd_boolean localdebug=dd_FALSE; linc=set_card(M->linset); m=M->rowsize+1+linc+1; /* We represent each equation by two inequalities. This is not the best way but makes the code simple. */ d=M->colsize+1; lp=dd_CreateLPData(M->objective, M->numbtype, m, d); lp->Homogeneous = dd_TRUE; lp->objective = dd_LPmax; lp->eqnumber=linc; /* this records the number of equations */ lp->redcheck_extensive=dd_FALSE; /* this is default */ irev=M->rowsize; /* the first row of the linc reversed inequalities. */ for (i = 1; i <= M->rowsize; i++) { if (set_member(i, M->linset)) { irev=irev+1; set_addelem(lp->equalityset,i); /* it is equality. */ /* the reversed row irev is not in the equality set. */ for (j = 1; j <= M->colsize; j++) { dd_neg(lp->A[irev-1][j-1],M->matrix[i-1][j-1]); } /*of j*/ } else { dd_set(lp->A[i-1][d-1],dd_minusone); /* b_I + A_I x - 1 z >= 0 (z=x_d) */ } for (j = 1; j <= M->colsize; j++) { dd_set(lp->A[i-1][j-1],M->matrix[i-1][j-1]); if (j==1 && irowsize && dd_Nonzero(M->matrix[i-1][j-1])) lp->Homogeneous = dd_FALSE; } /*of j*/ } /*of i*/ dd_set(lp->A[m-2][0],dd_one); dd_set(lp->A[m-2][d-1],dd_minusone); /* make the LP bounded. */ dd_set(lp->A[m-1][d-1],dd_one); /* objective is to maximize z. */ if (localdebug) { fprintf(stderr,"dd_CreateLP_H_ImplicitLinearity: an new lp is\n"); dd_WriteLP(stderr,lp); } return lp; } dd_LPPtr dd_CreateLP_V_ImplicitLinearity(dd_MatrixPtr M) { dd_rowrange m, i, irev, linc; dd_colrange d, j; dd_LPPtr lp; dd_boolean localdebug=dd_FALSE; linc=set_card(M->linset); m=M->rowsize+1+linc+1; /* We represent each equation by two inequalities. This is not the best way but makes the code simple. */ d=(M->colsize)+2; /* Two more columns. This is different from the H-reprentation case */ /* The below must be modified for V-representation!!! */ lp=dd_CreateLPData(M->objective, M->numbtype, m, d); lp->Homogeneous = dd_FALSE; lp->objective = dd_LPmax; lp->eqnumber=linc; /* this records the number of equations */ lp->redcheck_extensive=dd_FALSE; /* this is default */ irev=M->rowsize; /* the first row of the linc reversed inequalities. */ for (i = 1; i <= M->rowsize; i++) { dd_set(lp->A[i-1][0],dd_purezero); /* It is almost completely degerate LP */ if (set_member(i, M->linset)) { irev=irev+1; set_addelem(lp->equalityset,i); /* it is equality. */ /* the reversed row irev is not in the equality set. */ for (j = 2; j <= (M->colsize)+1; j++) { dd_neg(lp->A[irev-1][j-1],M->matrix[i-1][j-2]); } /*of j*/ if (localdebug) fprintf(stderr,"equality row %ld generates the reverse row %ld.\n",i,irev); } else { dd_set(lp->A[i-1][d-1],dd_minusone); /* b_I x_0 + A_I x - 1 z >= 0 (z=x_d) */ } for (j = 2; j <= (M->colsize)+1; j++) { dd_set(lp->A[i-1][j-1],M->matrix[i-1][j-2]); } /*of j*/ } /*of i*/ dd_set(lp->A[m-2][0],dd_one); dd_set(lp->A[m-2][d-1],dd_minusone); /* make the LP bounded. */ dd_set(lp->A[m-1][d-1],dd_one); /* objective is to maximize z. */ if (localdebug) { fprintf(stderr,"dd_CreateLP_V_ImplicitLinearity: an new lp is\n"); dd_WriteLP(stderr,lp); } return lp; } dd_LPPtr dd_CreateLP_H_Redundancy(dd_MatrixPtr M, dd_rowrange itest) { dd_rowrange m, i, irev, linc; dd_colrange d, j; dd_LPPtr lp; dd_boolean localdebug=dd_FALSE; linc=set_card(M->linset); m=M->rowsize+1+linc; /* We represent each equation by two inequalities. This is not the best way but makes the code simple. */ d=M->colsize; lp=dd_CreateLPData(M->objective, M->numbtype, m, d); lp->Homogeneous = dd_TRUE; lp->objective = dd_LPmin; lp->eqnumber=linc; /* this records the number of equations */ lp->redcheck_extensive=dd_FALSE; /* this is default */ irev=M->rowsize; /* the first row of the linc reversed inequalities. */ for (i = 1; i <= M->rowsize; i++) { if (set_member(i, M->linset)) { irev=irev+1; set_addelem(lp->equalityset,i); /* it is equality. */ /* the reversed row irev is not in the equality set. */ for (j = 1; j <= M->colsize; j++) { dd_neg(lp->A[irev-1][j-1],M->matrix[i-1][j-1]); } /*of j*/ if (localdebug) fprintf(stderr,"equality row %ld generates the reverse row %ld.\n",i,irev); } for (j = 1; j <= M->colsize; j++) { dd_set(lp->A[i-1][j-1],M->matrix[i-1][j-1]); if (j==1 && irowsize && dd_Nonzero(M->matrix[i-1][j-1])) lp->Homogeneous = dd_FALSE; } /*of j*/ } /*of i*/ for (j = 1; j <= M->colsize; j++) { dd_set(lp->A[m-1][j-1],M->matrix[itest-1][j-1]); /* objective is to violate the inequality in question. */ } /*of j*/ dd_add(lp->A[itest-1][0],lp->A[itest-1][0],dd_one); /* relax the original inequality by one */ return lp; } dd_LPPtr dd_CreateLP_V_Redundancy(dd_MatrixPtr M, dd_rowrange itest) { dd_rowrange m, i, irev, linc; dd_colrange d, j; dd_LPPtr lp; dd_boolean localdebug=dd_FALSE; linc=set_card(M->linset); m=M->rowsize+1+linc; /* We represent each equation by two inequalities. This is not the best way but makes the code simple. */ d=(M->colsize)+1; /* One more column. This is different from the H-reprentation case */ /* The below must be modified for V-representation!!! */ lp=dd_CreateLPData(M->objective, M->numbtype, m, d); lp->Homogeneous = dd_FALSE; lp->objective = dd_LPmin; lp->eqnumber=linc; /* this records the number of equations */ lp->redcheck_extensive=dd_FALSE; /* this is default */ irev=M->rowsize; /* the first row of the linc reversed inequalities. */ for (i = 1; i <= M->rowsize; i++) { if (i==itest){ dd_set(lp->A[i-1][0],dd_one); /* this is to make the LP bounded, ie. the min >= -1 */ } else { dd_set(lp->A[i-1][0],dd_purezero); /* It is almost completely degerate LP */ } if (set_member(i, M->linset)) { irev=irev+1; set_addelem(lp->equalityset,i); /* it is equality. */ /* the reversed row irev is not in the equality set. */ for (j = 2; j <= (M->colsize)+1; j++) { dd_neg(lp->A[irev-1][j-1],M->matrix[i-1][j-2]); } /*of j*/ if (localdebug) fprintf(stderr,"equality row %ld generates the reverse row %ld.\n",i,irev); } for (j = 2; j <= (M->colsize)+1; j++) { dd_set(lp->A[i-1][j-1],M->matrix[i-1][j-2]); } /*of j*/ } /*of i*/ for (j = 2; j <= (M->colsize)+1; j++) { dd_set(lp->A[m-1][j-1],M->matrix[itest-1][j-2]); /* objective is to violate the inequality in question. */ } /*of j*/ dd_set(lp->A[m-1][0],dd_purezero); /* the constant term for the objective is zero */ if (localdebug) dd_WriteLP(stdout, lp); return lp; } dd_LPPtr dd_CreateLP_V_SRedundancy(dd_MatrixPtr M, dd_rowrange itest) { /* V-representation (=boundary problem) g* = maximize 1^T b_{I-itest} x_0 + 1^T A_{I-itest} (the sum of slacks) subject to b_itest x_0 + A_itest x = 0 (the point has to lie on the boundary) b_{I-itest} x_0 + A_{I-itest} x >= 0 (all nonlinearity generators in one side) 1^T b_{I-itest} x_0 + 1^T A_{I-itest} x <= 1 (to make an LP bounded) b_L x_0 + A_L x = 0. (linearity generators) The redundant row is strongly redundant if and only if g* is zero. */ dd_rowrange m, i, irev, linc; dd_colrange d, j; dd_LPPtr lp; dd_boolean localdebug=dd_FALSE; linc=set_card(M->linset); m=M->rowsize+1+linc+2; /* We represent each equation by two inequalities. This is not the best way but makes the code simple. Two extra constraints are for the first equation and the bouding inequality. */ d=(M->colsize)+1; /* One more column. This is different from the H-reprentation case */ /* The below must be modified for V-representation!!! */ lp=dd_CreateLPData(M->objective, M->numbtype, m, d); lp->Homogeneous = dd_FALSE; lp->objective = dd_LPmax; lp->eqnumber=linc; /* this records the number of equations */ irev=M->rowsize; /* the first row of the linc reversed inequalities. */ for (i = 1; i <= M->rowsize; i++) { if (i==itest){ dd_set(lp->A[i-1][0],dd_purezero); /* this is a half of the boundary constraint. */ } else { dd_set(lp->A[i-1][0],dd_purezero); /* It is almost completely degerate LP */ } if (set_member(i, M->linset) || i==itest) { irev=irev+1; set_addelem(lp->equalityset,i); /* it is equality. */ /* the reversed row irev is not in the equality set. */ for (j = 2; j <= (M->colsize)+1; j++) { dd_neg(lp->A[irev-1][j-1],M->matrix[i-1][j-2]); } /*of j*/ if (localdebug) fprintf(stderr,"equality row %ld generates the reverse row %ld.\n",i,irev); } for (j = 2; j <= (M->colsize)+1; j++) { dd_set(lp->A[i-1][j-1],M->matrix[i-1][j-2]); dd_add(lp->A[m-1][j-1],lp->A[m-1][j-1],lp->A[i-1][j-1]); /* the objective is the sum of all ineqalities */ } /*of j*/ } /*of i*/ for (j = 2; j <= (M->colsize)+1; j++) { dd_neg(lp->A[m-2][j-1],lp->A[m-1][j-1]); /* to make an LP bounded. */ } /*of j*/ dd_set(lp->A[m-2][0],dd_one); /* the constant term for the bounding constraint is 1 */ if (localdebug) dd_WriteLP(stdout, lp); return lp; } dd_boolean dd_Redundant(dd_MatrixPtr M, dd_rowrange itest, dd_Arow certificate, dd_ErrorType *error) /* 092 */ { /* Checks whether the row itest is redundant for the representation. All linearity rows are not checked and considered NONredundant. This code works for both H- and V-representations. A certificate is given in the case of non-redundancy, showing a solution x violating only the itest inequality for H-representation, a hyperplane RHS and normal (x_0, x) that separates the itest from the rest. More explicitly, the LP to be setup is H-representation f* = minimize b_itest + A_itest x subject to b_itest + 1 + A_itest x >= 0 (relaxed inequality to make an LP bounded) b_{I-itest} + A_{I-itest} x >= 0 (all inequalities except for itest) b_L + A_L x = 0. (linearity) V-representation (=separation problem) f* = minimize b_itest x_0 + A_itest x subject to b_itest x_0 + A_itest x >= -1 (to make an LP bounded) b_{I-itest} x_0 + A_{I-itest} x >= 0 (all nonlinearity generators except for itest in one side) b_L x_0 + A_L x = 0. (linearity generators) Here, the input matrix is considered as (b, A), i.e. b corresponds to the first column of input and the row indices of input is partitioned into I and L where L is the set of linearity. In both cases, the itest data is nonredundant if and only if the optimal value f* is negative. The certificate has dimension one more for V-representation case. */ dd_colrange j; dd_LPPtr lp; dd_LPSolutionPtr lps; dd_ErrorType err=dd_NoError; dd_boolean answer=dd_FALSE,localdebug=dd_FALSE; *error=dd_NoError; if (set_member(itest, M->linset)){ if (localdebug) printf("The %ld th row is linearity and redundancy checking is skipped.\n",itest); goto _L99; } /* Create an LP data for redundancy checking */ if (M->representation==dd_Generator){ lp=dd_CreateLP_V_Redundancy(M, itest); } else { lp=dd_CreateLP_H_Redundancy(M, itest); } dd_LPSolve(lp,dd_choiceRedcheckAlgorithm,&err); if (err!=dd_NoError){ *error=err; goto _L999; } else { lps=dd_CopyLPSolution(lp); for (j=0; jd; j++) { dd_set(certificate[j], lps->sol[j]); } if (dd_Negative(lps->optvalue)){ answer=dd_FALSE; if (localdebug) fprintf(stderr,"==> %ld th row is nonredundant.\n",itest); } else { answer=dd_TRUE; if (localdebug) fprintf(stderr,"==> %ld th row is redundant.\n",itest); } dd_FreeLPSolution(lps); } _L999: dd_FreeLPData(lp); _L99: return answer; } dd_boolean dd_RedundantExtensive(dd_MatrixPtr M, dd_rowrange itest, dd_Arow certificate, dd_rowset *redset,dd_ErrorType *error) /* 094 */ { /* This uses the same LP construction as dd_Reduandant. But, while it is checking the redundancy of itest, it also tries to find some other variable that are redundant (i.e. forced to be nonnegative). This is expensive as it used the complete tableau information at each DualSimplex pivot. The redset must be initialized before this function is called. */ dd_colrange j; dd_LPPtr lp; dd_LPSolutionPtr lps; dd_ErrorType err=dd_NoError; dd_boolean answer=dd_FALSE,localdebug=dd_FALSE; *error=dd_NoError; if (set_member(itest, M->linset)){ if (localdebug) printf("The %ld th row is linearity and redundancy checking is skipped.\n",itest); goto _L99; } /* Create an LP data for redundancy checking */ if (M->representation==dd_Generator){ lp=dd_CreateLP_V_Redundancy(M, itest); } else { lp=dd_CreateLP_H_Redundancy(M, itest); } lp->redcheck_extensive=dd_TRUE; dd_LPSolve0(lp,dd_DualSimplex,&err); if (err!=dd_NoError){ *error=err; goto _L999; } else { set_copy(*redset,lp->redset_extra); set_delelem(*redset, itest); /* itest row might be redundant in the lp but this has nothing to do with its redundancy in the original system M. Thus we must delete it. */ if (localdebug){ fprintf(stderr, "dd_RedundantExtensive: checking for %ld, extra redset with cardinality %ld (%ld)\n",itest,set_card(*redset),set_card(lp->redset_extra)); set_fwrite(stderr, *redset); fprintf(stderr, "\n"); } lps=dd_CopyLPSolution(lp); for (j=0; jd; j++) { dd_set(certificate[j], lps->sol[j]); } if (dd_Negative(lps->optvalue)){ answer=dd_FALSE; if (localdebug) fprintf(stderr,"==> %ld th row is nonredundant.\n",itest); } else { answer=dd_TRUE; if (localdebug) fprintf(stderr,"==> %ld th row is redundant.\n",itest); } dd_FreeLPSolution(lps); } _L999: dd_FreeLPData(lp); _L99: return answer; } dd_rowset dd_RedundantRows(dd_MatrixPtr M, dd_ErrorType *error) /* 092 */ { dd_rowrange i,m; dd_colrange d; dd_rowset redset; dd_MatrixPtr Mcopy; dd_Arow cvec; /* certificate */ dd_boolean localdebug=dd_FALSE; m=M->rowsize; if (M->representation==dd_Generator){ d=(M->colsize)+1; } else { d=M->colsize; } Mcopy=dd_MatrixCopy(M); dd_InitializeArow(d,&cvec); set_initialize(&redset, m); for (i=m; i>=1; i--) { if (dd_Redundant(Mcopy, i, cvec, error)) { if (localdebug) printf("dd_RedundantRows: the row %ld is redundant.\n", i); set_addelem(redset, i); dd_MatrixRowRemove(&Mcopy, i); } else { if (localdebug) printf("dd_RedundantRows: the row %ld is essential.\n", i); } if (*error!=dd_NoError) goto _L99; } _L99: dd_FreeMatrix(Mcopy); dd_FreeArow(d, cvec); return redset; } dd_boolean dd_MatrixRedundancyRemove(dd_MatrixPtr *M, dd_rowset *redset,dd_rowindex *newpos, dd_ErrorType *error) /* 094 */ { /* It returns the set of all redundant rows. This should be called after all implicit linearity are recognized with dd_MatrixCanonicalizeLinearity. */ dd_rowrange i,k,m,m1; dd_colrange d; dd_rowset redset1; dd_rowindex newpos1; dd_MatrixPtr M1=NULL; dd_Arow cvec; /* certificate */ dd_boolean success=dd_FALSE, localdebug=dd_FALSE; m=(*M)->rowsize; set_initialize(redset, m); M1=dd_MatrixSortedUniqueCopy(*M,newpos); for (i=1; i<=m; i++){ if ((*newpos)[i]<=0) set_addelem(*redset,i); if (localdebug) printf(" %ld:%ld",i,(*newpos)[i]); } if (localdebug) printf("\n"); if ((*M)->representation==dd_Generator){ d=((*M)->colsize)+1; } else { d=(*M)->colsize; } m1=M1->rowsize; if (localdebug){ fprintf(stderr,"dd_MatrixRedundancyRemove: By sorting, %ld rows have been removed. The remaining has %ld rows.\n",m-m1,m1); /* dd_WriteMatrix(stdout,M1); */ } dd_InitializeArow(d,&cvec); set_initialize(&redset1, M1->rowsize); k=1; do { if (dd_RedundantExtensive(M1, k, cvec, &redset1,error)) { set_addelem(redset1, k); dd_MatrixRowsRemove2(&M1,redset1,&newpos1); for (i=1; i<=m; i++){ if ((*newpos)[i]>0){ if (set_member((*newpos)[i],redset1)){ set_addelem(*redset,i); (*newpos)[i]=0; /* now the original row i is recognized redundant and removed from M1 */ } else { (*newpos)[i]=newpos1[(*newpos)[i]]; /* update the new pos vector */ } } } set_free(redset1); set_initialize(&redset1, M1->rowsize); if (localdebug) { printf("dd_MatrixRedundancyRemove: the row %ld is redundant. The new matrix has %ld rows.\n", k, M1->rowsize); /* dd_WriteMatrix(stderr, M1); */ } free(newpos1); } else { if (set_card(redset1)>0) { dd_MatrixRowsRemove2(&M1,redset1,&newpos1); for (i=1; i<=m; i++){ if ((*newpos)[i]>0){ if (set_member((*newpos)[i],redset1)){ set_addelem(*redset,i); (*newpos)[i]=0; /* now the original row i is recognized redundant and removed from M1 */ } else { (*newpos)[i]=newpos1[(*newpos)[i]]; /* update the new pos vector */ } } } set_free(redset1); set_initialize(&redset1, M1->rowsize); free(newpos1); } if (localdebug) { printf("dd_MatrixRedundancyRemove: the row %ld is essential. The new matrix has %ld rows.\n", k, M1->rowsize); /* dd_WriteMatrix(stderr, M1); */ } k=k+1; } if (*error!=dd_NoError) goto _L99; } while (k<=M1->rowsize); if (localdebug) dd_WriteMatrix(stderr, M1); success=dd_TRUE; _L99: dd_FreeMatrix(*M); *M=M1; dd_FreeArow(d, cvec); set_free(redset1); return success; } dd_boolean dd_SRedundant(dd_MatrixPtr M, dd_rowrange itest, dd_Arow certificate, dd_ErrorType *error) /* 093a */ { /* Checks whether the row itest is strongly redundant for the representation. A row is strongly redundant in H-representation if every point in the polyhedron satisfies it with strict inequality. A row is strongly redundant in V-representation if this point is in the interior of the polyhedron. All linearity rows are not checked and considered NOT strongly redundant. This code works for both H- and V-representations. A certificate is given in the case of non-redundancy, showing a solution x violating only the itest inequality for H-representation, a hyperplane RHS and normal (x_0, x) that separates the itest from the rest. More explicitly, the LP to be setup is H-representation f* = minimize b_itest + A_itest x subject to b_itest + 1 + A_itest x >= 0 (relaxed inequality to make an LP bounded) b_{I-itest} + A_{I-itest} x >= 0 (all inequalities except for itest) b_L + A_L x = 0. (linearity) V-representation (=separation problem) f* = minimize b_itest x_0 + A_itest x subject to b_itest x_0 + A_itest x >= -1 (to make an LP bounded) b_{I-itest} x_0 + A_{I-itest} x >= 0 (all nonlinearity generators except for itest in one side) b_L x_0 + A_L x = 0. (linearity generators) Here, the input matrix is considered as (b, A), i.e. b corresponds to the first column of input and the row indices of input is partitioned into I and L where L is the set of linearity. In H-representation, the itest data is strongly redundant if and only if the optimal value f* is positive. In V-representation, the itest data is redundant if and only if the optimal value f* is zero (as the LP is homogeneous and the optimal value is always non-positive). To recognize strong redundancy, one can set up a second LP V-representation (=boundary problem) g* = maximize 1^T b_{I-itest} x_0 + 1^T A_{I-itest} (the sum of slacks) subject to b_itest x_0 + A_itest x = 0 (the point has to lie on the boundary) b_{I-itest} x_0 + A_{I-itest} x >= 0 (all nonlinearity generators in one side) 1^T b_{I-itest} x_0 + 1^T A_{I-itest} x <= 1 (to make an LP bounded) b_L x_0 + A_L x = 0. (linearity generators) The redundant row is strongly redundant if and only if g* is zero. The certificate has dimension one more for V-representation case. */ dd_colrange j; dd_LPPtr lp; dd_LPSolutionPtr lps; dd_ErrorType err=dd_NoError; dd_boolean answer=dd_FALSE,localdebug=dd_FALSE; *error=dd_NoError; if (set_member(itest, M->linset)){ if (localdebug) printf("The %ld th row is linearity and strong redundancy checking is skipped.\n",itest); goto _L99; } /* Create an LP data for redundancy checking */ if (M->representation==dd_Generator){ lp=dd_CreateLP_V_Redundancy(M, itest); } else { lp=dd_CreateLP_H_Redundancy(M, itest); } dd_LPSolve(lp,dd_choiceRedcheckAlgorithm,&err); if (err!=dd_NoError){ *error=err; goto _L999; } else { lps=dd_CopyLPSolution(lp); for (j=0; jd; j++) { dd_set(certificate[j], lps->sol[j]); } if (localdebug){ printf("Optimum value:"); dd_WriteNumber(stdout, lps->optvalue); printf("\n"); } if (M->representation==dd_Inequality){ if (dd_Positive(lps->optvalue)){ answer=dd_TRUE; if (localdebug) fprintf(stderr,"==> %ld th inequality is strongly redundant.\n",itest); } else { answer=dd_FALSE; if (localdebug) fprintf(stderr,"==> %ld th inequality is not strongly redundant.\n",itest); } } else { if (dd_Negative(lps->optvalue)){ answer=dd_FALSE; if (localdebug) fprintf(stderr,"==> %ld th point is not strongly redundant.\n",itest); } else { /* for V-representation, we have to solve another LP */ dd_FreeLPData(lp); dd_FreeLPSolution(lps); lp=dd_CreateLP_V_SRedundancy(M, itest); dd_LPSolve(lp,dd_DualSimplex,&err); lps=dd_CopyLPSolution(lp); if (localdebug) dd_WriteLPResult(stdout,lp,err); if (dd_Positive(lps->optvalue)){ answer=dd_FALSE; if (localdebug) fprintf(stderr,"==> %ld th point is not strongly redundant.\n",itest); } else { answer=dd_TRUE; if (localdebug) fprintf(stderr,"==> %ld th point is strongly redundant.\n",itest); } } } dd_FreeLPSolution(lps); } _L999: dd_FreeLPData(lp); _L99: return answer; } dd_rowset dd_SRedundantRows(dd_MatrixPtr M, dd_ErrorType *error) /* 093a */ { dd_rowrange i,m; dd_colrange d; dd_rowset redset; dd_MatrixPtr Mcopy; dd_Arow cvec; /* certificate */ dd_boolean localdebug=dd_FALSE; m=M->rowsize; if (M->representation==dd_Generator){ d=(M->colsize)+1; } else { d=M->colsize; } Mcopy=dd_MatrixCopy(M); dd_InitializeArow(d,&cvec); set_initialize(&redset, m); for (i=m; i>=1; i--) { if (dd_SRedundant(Mcopy, i, cvec, error)) { if (localdebug) printf("dd_SRedundantRows: the row %ld is strongly redundant.\n", i); set_addelem(redset, i); dd_MatrixRowRemove(&Mcopy, i); } else { if (localdebug) printf("dd_SRedundantRows: the row %ld is not strongly redundant.\n", i); } if (*error!=dd_NoError) goto _L99; } _L99: dd_FreeMatrix(Mcopy); dd_FreeArow(d, cvec); return redset; } dd_rowset dd_RedundantRowsViaShooting(dd_MatrixPtr M, dd_ErrorType *error) /* 092 */ { /* For H-representation only and not quite reliable, especially when floating-point arithmetic is used. Use the ordinary (slower) method dd_RedundantRows. */ dd_rowrange i,m, ired, irow=0; dd_colrange j,k,d; dd_rowset redset; dd_rowindex rowflag; /* ith comp is negative if the ith inequality (i-1 st row) is redundant. zero if it is not decided. k > 0 if it is nonredundant and assigned to the (k-1)th row of M1. */ dd_MatrixPtr M1; dd_Arow shootdir, cvec=NULL; dd_LPPtr lp0, lp; dd_LPSolutionPtr lps; dd_ErrorType err; dd_LPSolverType solver=dd_DualSimplex; dd_boolean localdebug=dd_FALSE; m=M->rowsize; d=M->colsize; M1=dd_CreateMatrix(m,d); M1->rowsize=0; /* cheat the rowsize so that smaller matrix can be stored */ set_initialize(&redset, m); dd_InitializeArow(d, &shootdir); dd_InitializeArow(d, &cvec); rowflag=(long *)calloc(m+1, sizeof(long)); /* First find some (likely) nonredundant inequalities by Interior Point Find. */ lp0=dd_Matrix2LP(M, &err); lp=dd_MakeLPforInteriorFinding(lp0); dd_FreeLPData(lp0); dd_LPSolve(lp, solver, &err); /* Solve the LP */ lps=dd_CopyLPSolution(lp); if (dd_Positive(lps->optvalue)){ /* An interior point is found. Use rayshooting to find some nonredundant inequalities. */ for (j=1; jsol, shootdir); if (localdebug) printf("nonredundant row %3ld found by shooting.\n", ired); if (ired>0 && rowflag[ired]<=0) { irow++; rowflag[ired]=irow; for (k=1; k<=d; k++) dd_set(M1->matrix[irow-1][k-1], M->matrix[ired-1][k-1]); } dd_neg(shootdir[j], dd_one); /* negative of the j-th unit vector */ ired=dd_RayShooting(M, lps->sol, shootdir); if (localdebug) printf("nonredundant row %3ld found by shooting.\n", ired); if (ired>0 && rowflag[ired]<=0) { irow++; rowflag[ired]=irow; for (k=1; k<=d; k++) dd_set(M1->matrix[irow-1][k-1], M->matrix[ired-1][k-1]); } } M1->rowsize=irow; if (localdebug) { printf("The initial nonredundant set is:"); for (i=1; i<=m; i++) if (rowflag[i]>0) printf(" %ld", i); printf("\n"); } i=1; while(i<=m){ if (rowflag[i]==0){ /* the ith inequality is not yet checked */ if (localdebug) fprintf(stderr, "Checking redundancy of %ld th inequality\n", i); irow++; M1->rowsize=irow; for (k=1; k<=d; k++) dd_set(M1->matrix[irow-1][k-1], M->matrix[i-1][k-1]); if (!dd_Redundant(M1, irow, cvec, &err)){ for (k=1; k<=d; k++) dd_sub(shootdir[k-1], cvec[k-1], lps->sol[k-1]); ired=dd_RayShooting(M, lps->sol, shootdir); rowflag[ired]=irow; for (k=1; k<=d; k++) dd_set(M1->matrix[irow-1][k-1], M->matrix[ired-1][k-1]); if (localdebug) { fprintf(stderr, "The %ld th inequality is nonredundant for the subsystem\n", i); fprintf(stderr, "The nonredundancy of %ld th inequality is found by shooting.\n", ired); } } else { if (localdebug) fprintf(stderr, "The %ld th inequality is redundant for the subsystem and thus for the whole.\n", i); rowflag[i]=-1; set_addelem(redset, i); i++; } } else { i++; } } /* endwhile */ } else { /* No interior point is found. Apply the standard LP technique. */ redset=dd_RedundantRows(M, error); } dd_FreeLPData(lp); dd_FreeLPSolution(lps); M1->rowsize=m; M1->colsize=d; /* recover the original sizes */ dd_FreeMatrix(M1); dd_FreeArow(d, shootdir); dd_FreeArow(d, cvec); free(rowflag); return redset; } dd_SetFamilyPtr dd_Matrix2Adjacency(dd_MatrixPtr M, dd_ErrorType *error) /* 093 */ { /* This is to generate the (facet) graph of a polyheron (H) V-represented by M using LPs. Since it does not use the representation conversion, it should work for a large scale problem. */ dd_rowrange i,m; dd_colrange d; dd_rowset redset; dd_MatrixPtr Mcopy; dd_SetFamilyPtr F=NULL; m=M->rowsize; d=M->colsize; if (m<=0 ||d<=0) { *error=dd_EmptyRepresentation; goto _L999; } Mcopy=dd_MatrixCopy(M); F=dd_CreateSetFamily(m, m); for (i=1; i<=m; i++) { if (!set_member(i, M->linset)){ set_addelem(Mcopy->linset, i); redset=dd_RedundantRows(Mcopy, error); /* redset should contain all nonadjacent ones */ set_uni(redset, redset, Mcopy->linset); /* all linearity elements should be nonadjacent */ set_compl(F->set[i-1], redset); /* set the adjacency list of vertex i */ set_delelem(Mcopy->linset, i); set_free(redset); if (*error!=dd_NoError) goto _L99; } } _L99: dd_FreeMatrix(Mcopy); _L999: return F; } dd_SetFamilyPtr dd_Matrix2WeakAdjacency(dd_MatrixPtr M, dd_ErrorType *error) /* 093a */ { /* This is to generate the weak-adjacency (facet) graph of a polyheron (H) V-represented by M using LPs. Since it does not use the representation conversion, it should work for a large scale problem. */ dd_rowrange i,m; dd_colrange d; dd_rowset redset; dd_MatrixPtr Mcopy; dd_SetFamilyPtr F=NULL; m=M->rowsize; d=M->colsize; if (m<=0 ||d<=0) { *error=dd_EmptyRepresentation; goto _L999; } Mcopy=dd_MatrixCopy(M); F=dd_CreateSetFamily(m, m); for (i=1; i<=m; i++) { if (!set_member(i, M->linset)){ set_addelem(Mcopy->linset, i); redset=dd_SRedundantRows(Mcopy, error); /* redset should contain all weakly nonadjacent ones */ set_uni(redset, redset, Mcopy->linset); /* all linearity elements should be nonadjacent */ set_compl(F->set[i-1], redset); /* set the adjacency list of vertex i */ set_delelem(Mcopy->linset, i); set_free(redset); if (*error!=dd_NoError) goto _L99; } } _L99: dd_FreeMatrix(Mcopy); _L999: return F; } dd_boolean dd_ImplicitLinearity(dd_MatrixPtr M, dd_rowrange itest, dd_Arow certificate, dd_ErrorType *error) /* 092 */ { /* Checks whether the row itest is implicit linearity for the representation. All linearity rows are not checked and considered non implicit linearity (dd_FALSE). This code works for both H- and V-representations. A certificate is given in the case of dd_FALSE, showing a feasible solution x satisfying the itest strict inequality for H-representation, a hyperplane RHS and normal (x_0, x) that separates the itest from the rest. More explicitly, the LP to be setup is the same thing as redundancy case but with maximization: H-representation f* = maximize b_itest + A_itest x subject to b_itest + 1 + A_itest x >= 0 (relaxed inequality. This is not necessary but kept for simplicity of the code) b_{I-itest} + A_{I-itest} x >= 0 (all inequalities except for itest) b_L + A_L x = 0. (linearity) V-representation (=separation problem) f* = maximize b_itest x_0 + A_itest x subject to b_itest x_0 + A_itest x >= -1 (again, this is not necessary but kept for simplicity.) b_{I-itest} x_0 + A_{I-itest} x >= 0 (all nonlinearity generators except for itest in one side) b_L x_0 + A_L x = 0. (linearity generators) Here, the input matrix is considered as (b, A), i.e. b corresponds to the first column of input and the row indices of input is partitioned into I and L where L is the set of linearity. In both cases, the itest data is implicit linearity if and only if the optimal value f* is nonpositive. The certificate has dimension one more for V-representation case. */ dd_colrange j; dd_LPPtr lp; dd_LPSolutionPtr lps; dd_ErrorType err=dd_NoError; dd_boolean answer=dd_FALSE,localdebug=dd_FALSE; *error=dd_NoError; if (set_member(itest, M->linset)){ if (localdebug) printf("The %ld th row is linearity and redundancy checking is skipped.\n",itest); goto _L99; } /* Create an LP data for redundancy checking */ if (M->representation==dd_Generator){ lp=dd_CreateLP_V_Redundancy(M, itest); } else { lp=dd_CreateLP_H_Redundancy(M, itest); } lp->objective = dd_LPmax; /* the lp->objective is set by CreateLP* to LPmin */ dd_LPSolve(lp,dd_choiceRedcheckAlgorithm,&err); if (err!=dd_NoError){ *error=err; goto _L999; } else { lps=dd_CopyLPSolution(lp); for (j=0; jd; j++) { dd_set(certificate[j], lps->sol[j]); } if (lps->LPS==dd_Optimal && dd_EqualToZero(lps->optvalue)){ answer=dd_TRUE; if (localdebug) fprintf(stderr,"==> %ld th data is an implicit linearity.\n",itest); } else { answer=dd_FALSE; if (localdebug) fprintf(stderr,"==> %ld th data is not an implicit linearity.\n",itest); } dd_FreeLPSolution(lps); } _L999: dd_FreeLPData(lp); _L99: return answer; } int dd_FreeOfImplicitLinearity(dd_MatrixPtr M, dd_Arow certificate, dd_rowset *imp_linrows, dd_ErrorType *error) /* 092 */ { /* Checks whether the matrix M constains any implicit linearity at all. It returns 1 if it is free of any implicit linearity. This means that the present linearity rows define the linearity correctly. It returns nonpositive values otherwise. H-representation f* = maximize z subject to b_I + A_I x - 1 z >= 0 b_L + A_L x = 0 (linearity) z <= 1. V-representation (=separation problem) f* = maximize z subject to b_I x_0 + A_I x - 1 z >= 0 (all nonlinearity generators in one side) b_L x_0 + A_L x = 0 (linearity generators) z <= 1. Here, the input matrix is considered as (b, A), i.e. b corresponds to the first column of input and the row indices of input is partitioned into I and L where L is the set of linearity. In both cases, any implicit linearity exists if and only if the optimal value f* is nonpositive. The certificate has dimension one more for V-representation case. */ dd_LPPtr lp; dd_rowrange i,m; dd_colrange j,d1; dd_ErrorType err=dd_NoError; dd_Arow cvec; /* certificate for implicit linearity */ int answer=0,localdebug=dd_FALSE; *error=dd_NoError; /* Create an LP data for redundancy checking */ if (M->representation==dd_Generator){ lp=dd_CreateLP_V_ImplicitLinearity(M); } else { lp=dd_CreateLP_H_ImplicitLinearity(M); } dd_LPSolve(lp,dd_choiceRedcheckAlgorithm,&err); if (err!=dd_NoError){ *error=err; goto _L999; } else { for (j=0; jd; j++) { dd_set(certificate[j], lp->sol[j]); } if (localdebug) dd_WriteLPResult(stderr,lp,err); /* *posset contains a set of row indices that are recognized as nonlinearity. */ if (localdebug) { fprintf(stderr,"==> The following variables are not implicit linearity:\n"); set_fwrite(stderr, lp->posset_extra); fprintf(stderr,"\n"); } if (M->representation==dd_Generator){ d1=(M->colsize)+1; } else { d1=M->colsize; } m=M->rowsize; dd_InitializeArow(d1,&cvec); set_initialize(imp_linrows,m); if (lp->LPS==dd_Optimal){ if (dd_Positive(lp->optvalue)){ answer=1; if (localdebug) fprintf(stderr,"==> The matrix has no implicit linearity.\n"); } else if (dd_Negative(lp->optvalue)) { answer=-1; if (localdebug) fprintf(stderr,"==> The matrix defines the trivial system.\n"); } else { answer=0; if (localdebug) fprintf(stderr,"==> The matrix has some implicit linearity.\n"); } } else { answer=-2; if (localdebug) fprintf(stderr,"==> The LP fails.\n"); } if (answer==0){ /* List the implicit linearity rows */ for (i=m; i>=1; i--) { if (!set_member(i,lp->posset_extra)) { if (dd_ImplicitLinearity(M, i, cvec, error)) { set_addelem(*imp_linrows, i); if (localdebug) { fprintf(stderr," row %ld is implicit linearity\n",i); fprintf(stderr,"\n"); } } if (*error!=dd_NoError) goto _L999; } } } /* end of if (answer==0) */ if (answer==-1) { for (i=m; i>=1; i--) set_addelem(*imp_linrows, i); } /* all rows are considered implicit linearity */ dd_FreeArow(d1,cvec); } _L999: dd_FreeLPData(lp); return answer; } dd_rowset dd_ImplicitLinearityRows(dd_MatrixPtr M, dd_ErrorType *error) /* 092 */ { dd_colrange d; dd_rowset imp_linset; dd_Arow cvec; /* certificate */ int foi; dd_boolean localdebug=dd_FALSE; if (M->representation==dd_Generator){ d=(M->colsize)+2; } else { d=M->colsize+1; } dd_InitializeArow(d,&cvec); if (localdebug) fprintf(stdout, "\ndd_ImplicitLinearityRows: Check whether the system contains any implicit linearity.\n"); foi=dd_FreeOfImplicitLinearity(M, cvec, &imp_linset, error); if (localdebug){ switch (foi) { case 1: fprintf(stdout, " It is free of implicit linearity.\n"); break; case 0: fprintf(stdout, " It is not free of implicit linearity.\n"); break; case -1: fprintf(stdout, " The input system is trivial (i.e. the empty H-polytope or the V-rep of the whole space.\n"); break; default: fprintf(stdout, " The LP was not solved correctly.\n"); break; } } if (localdebug){ fprintf(stderr, " Implicit linearity rows are:\n"); set_fwrite(stderr,imp_linset); fprintf(stderr, "\n"); } dd_FreeArow(d, cvec); return imp_linset; } dd_boolean dd_MatrixCanonicalizeLinearity(dd_MatrixPtr *M, dd_rowset *impl_linset,dd_rowindex *newpos, dd_ErrorType *error) /* 094 */ { /* This is to recongnize all implicit linearities, and put all linearities at the top of the matrix. All implicit linearities will be returned by *impl_linset. */ dd_rowset linrows,ignoredrows,basisrows; dd_colset ignoredcols,basiscols; dd_rowrange i,k,m; dd_rowindex newpos1; dd_boolean success=dd_FALSE; linrows=dd_ImplicitLinearityRows(*M, error); if (*error!=dd_NoError) goto _L99; m=(*M)->rowsize; set_uni((*M)->linset, (*M)->linset, linrows); /* add the implicit linrows to the explicit linearity rows */ /* To remove redundancy of the linearity part, we need to compute a basis of the linearity part. */ set_initialize(&ignoredrows, (*M)->rowsize); set_initialize(&ignoredcols, (*M)->colsize); set_compl(ignoredrows, (*M)->linset); dd_MatrixRank(*M,ignoredrows,ignoredcols,&basisrows,&basiscols); set_diff(ignoredrows, (*M)->linset, basisrows); dd_MatrixRowsRemove2(M,ignoredrows,newpos); dd_MatrixShiftupLinearity(M,&newpos1); for (i=1; i<=m; i++){ k=(*newpos)[i]; if (k>0) { (*newpos)[i]=newpos1[k]; } } *impl_linset=linrows; success=dd_TRUE; free(newpos1); set_free(basisrows); set_free(basiscols); set_free(ignoredrows); set_free(ignoredcols); _L99: return success; } dd_boolean dd_MatrixCanonicalize(dd_MatrixPtr *M, dd_rowset *impl_linset, dd_rowset *redset, dd_rowindex *newpos, dd_ErrorType *error) /* 094 */ { /* This is to find a canonical representation of a matrix *M by recognizing all implicit linearities and all redundancies. All implicit linearities will be returned by *impl_linset and redundancies will be returned by *redset. */ dd_rowrange i,k,m; dd_rowindex newpos1,revpos; dd_rowset redset1; dd_boolean success=dd_TRUE; m=(*M)->rowsize; set_initialize(redset, m); revpos=(long *)calloc(m+1,sizeof(long)); success=dd_MatrixCanonicalizeLinearity(M, impl_linset, newpos, error); if (!success) goto _L99; for (i=1; i<=m; i++){ k=(*newpos)[i]; if (k>0) revpos[k]=i; /* inverse of *newpos[] */ } success=dd_MatrixRedundancyRemove(M, &redset1, &newpos1, error); /* 094 */ if (!success) goto _L99; for (i=1; i<=m; i++){ k=(*newpos)[i]; if (k>0) { (*newpos)[i]=newpos1[k]; if (newpos1[k]<0) (*newpos)[i]=-revpos[-newpos1[k]]; /* update the certificate of its duplicate removal. */ if (set_member(k,redset1)) set_addelem(*redset, i); } } _L99: set_free(redset1); free(newpos1); free(revpos); return success; } dd_boolean dd_ExistsRestrictedFace(dd_MatrixPtr M, dd_rowset R, dd_rowset S, dd_ErrorType *err) /* 0.94 */ { /* This function checkes if there is a point that satifies all the constraints of the matrix M (interpreted as an H-representation) with additional equality contraints specified by R and additional strict inequality constraints specified by S. The set S is supposed to be disjoint from both R and M->linset. When it is not, the set S will be considered as S\(R U M->linset). */ dd_boolean answer=dd_FALSE; dd_LPPtr lp=NULL; /* printf("\n--- ERF ---\n"); printf("R = "); set_write(R); printf("S = "); set_write(S); */ lp=dd_Matrix2Feasibility2(M, R, S, err); if (*err!=dd_NoError) goto _L99; /* Solve the LP by cdd LP solver. */ dd_LPSolve(lp, dd_DualSimplex, err); /* Solve the LP */ if (*err!=dd_NoError) goto _L99; if (lp->LPS==dd_Optimal && dd_Positive(lp->optvalue)) { answer=dd_TRUE; } dd_FreeLPData(lp); _L99: return answer; } dd_boolean dd_ExistsRestrictedFace2(dd_MatrixPtr M, dd_rowset R, dd_rowset S, dd_LPSolutionPtr *lps, dd_ErrorType *err) /* 0.94 */ { /* This function checkes if there is a point that satifies all the constraints of the matrix M (interpreted as an H-representation) with additional equality contraints specified by R and additional strict inequality constraints specified by S. The set S is supposed to be disjoint from both R and M->linset. When it is not, the set S will be considered as S\(R U M->linset). This function returns a certificate of the answer in terms of the associated LP solutions. */ dd_boolean answer=dd_FALSE; dd_LPPtr lp=NULL; /* printf("\n--- ERF ---\n"); printf("R = "); set_write(R); printf("S = "); set_write(S); */ lp=dd_Matrix2Feasibility2(M, R, S, err); if (*err!=dd_NoError) goto _L99; /* Solve the LP by cdd LP solver. */ dd_LPSolve(lp, dd_DualSimplex, err); /* Solve the LP */ if (*err!=dd_NoError) goto _L99; if (lp->LPS==dd_Optimal && dd_Positive(lp->optvalue)) { answer=dd_TRUE; } (*lps)=dd_CopyLPSolution(lp); dd_FreeLPData(lp); _L99: return answer; } dd_boolean dd_FindRelativeInterior(dd_MatrixPtr M, dd_rowset *ImL, dd_rowset *Lbasis, dd_LPSolutionPtr *lps, dd_ErrorType *err) /* 0.94 */ { /* This function computes a point in the relative interior of the H-polyhedron given by M. Even the representation is V-representation, it simply interprete M as H-representation. lps returns the result of solving an LP whose solution is a relative interior point. ImL returns all row indices of M that are implicit linearities, i.e. their inqualities are satisfied by equality by all points in the polyhedron. Lbasis returns a row basis of the submatrix of M consisting of all linearities and implicit linearities. This means that the dimension of the polyhedron is M->colsize - set_card(Lbasis) -1. */ dd_rowset S; dd_colset T, Lbasiscols; dd_boolean success=dd_FALSE; dd_rowrange i; *ImL=dd_ImplicitLinearityRows(M, err); if (*err!=dd_NoError) goto _L99; set_initialize(&S, M->rowsize); /* the empty set */ for (i=1; i <=M->rowsize; i++) { if (!set_member(i, M->linset) && !set_member(i, *ImL)){ set_addelem(S, i); /* all nonlinearity rows go to S */ } } if (dd_ExistsRestrictedFace2(M, *ImL, S, lps, err)){ /* printf("a relative interior point found\n"); */ success=dd_TRUE; } set_initialize(&T, M->colsize); /* empty set */ dd_MatrixRank(M,S,T,Lbasis,&Lbasiscols); /* the rank of the linearity submatrix of M. */ set_free(S); set_free(T); set_free(Lbasiscols); _L99: return success; } dd_rowrange dd_RayShooting(dd_MatrixPtr M, dd_Arow p, dd_Arow r) { /* 092, find the first inequality "hit" by a ray from an intpt. */ dd_rowrange imin=-1,i,m; dd_colrange j, d; dd_Arow vecmin, vec; mytype min,t1,t2,alpha, t1min; dd_boolean started=dd_FALSE; dd_boolean localdebug=dd_FALSE; m=M->rowsize; d=M->colsize; if (!dd_Equal(dd_one, p[0])){ fprintf(stderr, "Warning: RayShooting is called with a point with first coordinate not 1.\n"); dd_set(p[0],dd_one); } if (!dd_EqualToZero(r[0])){ fprintf(stderr, "Warning: RayShooting is called with a direction with first coordinate not 0.\n"); dd_set(r[0],dd_purezero); } dd_init(alpha); dd_init(min); dd_init(t1); dd_init(t2); dd_init(t1min); dd_InitializeArow(d,&vecmin); dd_InitializeArow(d,&vec); for (i=1; i<=m; i++){ dd_InnerProduct(t1, d, M->matrix[i-1], p); if (dd_Positive(t1)) { dd_InnerProduct(t2, d, M->matrix[i-1], r); dd_div(alpha, t2, t1); if (!started){ imin=i; dd_set(min, alpha); dd_set(t1min, t1); /* store the denominator. */ started=dd_TRUE; if (localdebug) { fprintf(stderr," Level 1: imin = %ld and min = ", imin); dd_WriteNumber(stderr, min); fprintf(stderr,"\n"); } } else { if (dd_Smaller(alpha, min)){ imin=i; dd_set(min, alpha); dd_set(t1min, t1); /* store the denominator. */ if (localdebug) { fprintf(stderr," Level 2: imin = %ld and min = ", imin); dd_WriteNumber(stderr, min); fprintf(stderr,"\n"); } } else { if (dd_Equal(alpha, min)) { /* tie break */ for (j=1; j<= d; j++){ dd_div(vecmin[j-1], M->matrix[imin-1][j-1], t1min); dd_div(vec[j-1], M->matrix[i-1][j-1], t1); } if (dd_LexSmaller(vec,vecmin, d)){ imin=i; dd_set(min, alpha); dd_set(t1min, t1); /* store the denominator. */ if (localdebug) { fprintf(stderr," Level 3: imin = %ld and min = ", imin); dd_WriteNumber(stderr, min); fprintf(stderr,"\n"); } } } } } } } dd_clear(alpha); dd_clear(min); dd_clear(t1); dd_clear(t2); dd_clear(t1min); dd_FreeArow(d, vecmin); dd_FreeArow(d, vec); return imin; } #ifdef GMPRATIONAL void dd_BasisStatusMaximize(dd_rowrange m_size,dd_colrange d_size, dd_Amatrix A,dd_Bmatrix T,dd_rowset equalityset, dd_rowrange objrow,dd_colrange rhscol,ddf_LPStatusType LPS, mytype *optvalue,dd_Arow sol,dd_Arow dsol,dd_rowset posset, ddf_colindex nbindex, ddf_rowrange re,ddf_colrange se, dd_colrange *nse, long *pivots, int *found, int *LPScorrect) /* This is just to check whether the status LPS of the basis given by nbindex with extra certificates se or re is correct. It is done by recomputing the basis inverse matrix T. It does not solve the LP when the status *LPS is undecided. Thus the input is m_size, d_size, A, equalityset, LPS, nbindex, re and se. Other values will be recomputed from scratch. The main purpose of the function is to verify the correctness of the result of floating point computation with the GMP rational arithmetics. */ { long pivots0,pivots1,fbasisrank; dd_rowrange i,is; dd_colrange s,senew,j; static dd_rowindex bflag; static long mlast=0; static dd_rowindex OrderVector; /* the permutation vector to store a preordered row indices */ unsigned int rseed=1; mytype val; dd_colindex nbtemp; dd_LPStatusType ddlps; dd_boolean localdebug=dd_FALSE; if (dd_debug) localdebug=dd_debug; if (localdebug){ printf("\nEvaluating dd_BasisStatusMaximize:\n"); } dd_init(val); nbtemp=(long *) calloc(d_size+1,sizeof(long)); for (i=0; i<= 4; i++) pivots[i]=0; if (bflag==NULL || mlast!=m_size){ if (mlast!=m_size && mlast>0) { free(bflag); /* called previously with different m_size */ free(OrderVector); } bflag=(long *) calloc(m_size+1,sizeof(long)); OrderVector=(long *)calloc(m_size+1,sizeof(long)); /* initialize only for the first time or when a larger space is needed */ mlast=m_size; } /* Initializing control variables. */ dd_ComputeRowOrderVector2(m_size,d_size,A,OrderVector,dd_MinIndex,rseed); pivots1=0; dd_ResetTableau(m_size,d_size,T,nbtemp,bflag,objrow,rhscol); if (localdebug){ printf("\nnbindex:"); for (j=1; j<=d_size; j++) printf(" %ld", nbindex[j]); printf("\n"); printf("re = %ld, se=%ld\n", re, se); } is=nbindex[se]; if (localdebug) printf("se=%ld, is=%ld\n", se, is); fbasisrank=d_size-1; for (j=1; j<=d_size; j++){ if (nbindex[j]<0) fbasisrank=fbasisrank-1; /* fbasisrank=the basis rank computed by floating-point */ } if (fbasisrank0) { /* i is nonbasic variable */ dd_TableauEntry(&val,m_size,d_size,A,T,objrow,bflag[i]); if (dd_Positive(val)) { if (localdebug) printf("Reduced cost entry for %ld is positive\n", i); *LPScorrect=dd_FALSE; break; } } }; break; case dd_Inconsistent: for (j=1; j<=d_size; j++){ dd_TableauEntry(&val,m_size,d_size,A,T,re,j); if (j==rhscol){ if (dd_Nonnegative(val)){ if (localdebug) printf("RHS entry for %ld is nonnegative\n", re); *LPScorrect=dd_FALSE; break; } } else if (dd_Positive(val)){ if (localdebug) printf("the row entry for(%ld, %ld) is positive\n", re, j); *LPScorrect=dd_FALSE; break; } }; break; case dd_DualInconsistent: for (i=1; i<=m_size; i++){ dd_TableauEntry(&val,m_size,d_size,A,T,i,bflag[is]); if (i==objrow){ if (dd_Nonpositive(val)){ if (localdebug) printf("Reduced cost entry for %ld is nonpositive\n", bflag[is]); *LPScorrect=dd_FALSE; break; } } else if (dd_Negative(val)){ if (localdebug) printf("the column entry for(%ld, %ld) is positive\n", i, bflag[is]); *LPScorrect=dd_FALSE; break; } }; break; ; default: break; } ddlps=LPSf2LPS(LPS); dd_SetSolutions(m_size,d_size,A,T, objrow,rhscol,ddlps,optvalue,sol,dsol,posset,nbindex,re,senew,bflag); *nse=senew; _L99: dd_clear(val); free(nbtemp); } void dd_BasisStatusMinimize(dd_rowrange m_size,dd_colrange d_size, dd_Amatrix A,dd_Bmatrix T,dd_rowset equalityset, dd_rowrange objrow,dd_colrange rhscol,ddf_LPStatusType LPS, mytype *optvalue,dd_Arow sol,dd_Arow dsol, dd_rowset posset, ddf_colindex nbindex, ddf_rowrange re,ddf_colrange se,dd_colrange *nse,long *pivots, int *found, int *LPScorrect) { dd_colrange j; for (j=1; j<=d_size; j++) dd_neg(A[objrow-1][j-1],A[objrow-1][j-1]); dd_BasisStatusMaximize(m_size,d_size,A,T,equalityset, objrow,rhscol, LPS,optvalue,sol,dsol,posset,nbindex,re,se,nse,pivots,found,LPScorrect); dd_neg(*optvalue,*optvalue); for (j=1; j<=d_size; j++){ if (LPS!=dd_Inconsistent) { /* Inconsistent certificate stays valid for minimization, 0.94e */ dd_neg(dsol[j-1],dsol[j-1]); } dd_neg(A[objrow-1][j-1],A[objrow-1][j-1]); } } #endif /* end of cddlp.c */ pplacer-1.1.alpha19/cdd_src/cddmp.c000066400000000000000000000101621303154601500170710ustar00rootroot00000000000000/* cddmp.c (cddlib arithmetic operations using gmp) Copyright: Komei Fukuda 2000, fukuda@ifor.math.ethz.ch Version 0.94f, February 7, 2008 */ /* This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "setoper.h" /* set operation library header (Ver. March 16,1995 or later) */ #include "cdd.h" void dd_set_global_constants() { dd_init(dd_zero); dd_init(dd_minuszero); dd_init(dd_one); dd_init(dd_minusone); dd_init(dd_purezero); time(&dd_statStartTime); /* cddlib starting time */ dd_statBApivots=0; /* basis finding pivots */ dd_statCCpivots=0; /* criss-cross pivots */ dd_statDS1pivots=0; /* phase 1 pivots */ dd_statDS2pivots=0; /* phase 2 pivots */ dd_statACpivots=0; /* anticycling (cc) pivots */ dd_choiceLPSolverDefault=dd_DualSimplex; /* Default LP solver Algorithm */ dd_choiceRedcheckAlgorithm=dd_DualSimplex; /* Redundancy Checking Algorithm */ dd_choiceLexicoPivotQ=dd_TRUE; /* whether to use the lexicographic pivot */ #if defined GMPRATIONAL dd_statBSpivots=0; /* basis status checking pivots */ mpq_set_ui(dd_zero,0U,1U); mpq_set_ui(dd_purezero,0U,1U); mpq_set_ui(dd_one,1U,1U); mpq_set_si(dd_minusone,-1L,1U); ddf_set_global_constants(); #elif defined GMPFLOAT mpf_set_d(dd_zero,dd_almostzero); mpf_set_ui(dd_purezero,0U); mpf_set_ui(dd_one,1U); mpf_set_si(dd_minusone,-1L,1U); #else dd_zero[0]= dd_almostzero; /*real zero */ dd_purezero[0]= 0.0; dd_one[0]= 1L; dd_minusone[0]= -1L; #endif dd_neg(dd_minuszero,dd_zero); } void dd_free_global_constants() { dd_clear(dd_zero); dd_clear(dd_minuszero); dd_clear(dd_one); dd_clear(dd_minusone); dd_clear(dd_purezero); time(&dd_statStartTime); /* cddlib starting time */ dd_statBApivots=0; /* basis finding pivots */ dd_statCCpivots=0; /* criss-cross pivots */ dd_statDS1pivots=0; /* phase 1 pivots */ dd_statDS2pivots=0; /* phase 2 pivots */ dd_statACpivots=0; /* anticycling (cc) pivots */ dd_choiceLPSolverDefault=dd_DualSimplex; /* Default LP solver Algorithm */ dd_choiceRedcheckAlgorithm=dd_DualSimplex; /* Redundancy Checking Algorithm */ dd_choiceLexicoPivotQ=dd_TRUE; /* whether to use the lexicographic pivot */ #if defined GMPRATIONAL dd_statBSpivots=0; /* basis status checking pivots */ ddf_free_global_constants(); #endif } #if defined GMPRATIONAL void ddd_mpq_set_si(mytype a,signed long b) { mpz_t nz, dz; mpz_init(nz); mpz_init(dz); mpz_set_si(nz, b); mpz_set_ui(dz, 1U); mpq_set_num(a, nz); mpq_set_den(a, dz); mpz_clear(nz); mpz_clear(dz); } #endif #if defined dd_CDOUBLE void ddd_init(mytype a) { a[0]=0L; } void ddd_clear(mytype a) { /* a[0]=0L; */ } void ddd_set(mytype a,mytype b) { a[0]=b[0]; } void ddd_set_d(mytype a,double b) { a[0]=b; } void ddd_set_si(mytype a,signed long b) { a[0]=(double)b; } void ddd_set_si2(mytype a,signed long b, unsigned long c) { a[0]=(double)b/(double)c; } void ddd_add(mytype a,mytype b,mytype c) { a[0]=b[0]+c[0]; } void ddd_sub(mytype a,mytype b,mytype c) { a[0]=b[0]-c[0]; } void ddd_mul(mytype a,mytype b,mytype c) { a[0]=b[0]*c[0]; } void ddd_div(mytype a,mytype b,mytype c) { a[0]=b[0]/c[0]; } void ddd_neg(mytype a,mytype b) { a[0]=-b[0]; } void ddd_inv(mytype a,mytype b) { a[0]=1/b[0]; } int ddd_cmp(mytype a,mytype b) { if (a[0]-b[0]>0) return 1; else if (a[0]-b[0]>=0) return 0; else return -1; } int ddd_sgn(mytype a) { if (a[0]>0) return 1; else if (a[0]>=0) return 0; else return -1; } double ddd_get_d(mytype a) { return a[0]; } #endif /* end of cddmp.h */ pplacer-1.1.alpha19/cdd_src/cddmp.h000066400000000000000000000111251303154601500170760ustar00rootroot00000000000000/* cddmp.h (cddlib arithmetic operations using gmp) Copyright: Komei Fukuda 2000, fukuda@ifor.math.ethz.ch Version 0.94f, February 7, 2008 */ /* This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef __CDDMP_H #define __CDDMP_H #endif /* __CDDMP_H */ /**********************************/ /* MACROS */ /* dependent on mp implementation */ /**********************************/ #if defined GMPRATIONAL #include "gmp.h" #define dd_ARITHMETIC "GMP rational" #define dd_init(a) mpq_init(a) #define dd_clear(a) mpq_clear(a) #define dd_set(a, b) mpq_set(a,b) #define dd_set_si(a, b) ddd_mpq_set_si(a,b) /* defined in cddgmp.c */ #define dd_set_si2(a, b, c) mpq_set_si(a,b,c) /* gmp 3.1 or higher */ #define dd_add(a, b, c) mpq_add(a,b,c) #define dd_sub(a, b, c) mpq_sub(a,b,c) #define dd_mul(a, b, c) mpq_mul(a,b,c) #define dd_div(a, b, c) mpq_div(a,b,c) #define dd_neg(a, b) mpq_neg(a,b) #define dd_inv(a, b) mpq_inv(a,b) #define dd_cmp(a, b) mpq_cmp(a,b) /* returns pos if a>b, 0 if a=b, negative if ab, 0 if a=b, negative if ab, 0 if a=b, negative if a= 0}. Please read COPYING (GNU General Public Licence) and the manual cddlibman.tex for detail. */ #include "setoper.h" /* set operation library header (Ver. June 1, 2000 or later) */ #include "cdd.h" #include #include #include #include #include dd_MatrixPtr dd_BlockElimination(dd_MatrixPtr M, dd_colset delset, dd_ErrorType *error) /* Eliminate the variables (columns) delset by the Block Elimination with dd_DoubleDescription algorithm. Given (where y is to be eliminated): c1 + A1 x + B1 y >= 0 c2 + A2 x + B2 y = 0 1. First construct the dual system: z1^T B1 + z2^T B2 = 0, z1 >= 0. 2. Compute the generators of the dual. 3. Then take the linear combination of the original system with each generator. 4. Remove redundant inequalies. */ { dd_MatrixPtr Mdual=NULL, Mproj=NULL, Gdual=NULL; dd_rowrange i,h,m,mproj,mdual,linsize; dd_colrange j,k,d,dproj,ddual,delsize; dd_colindex delindex; mytype temp,prod; dd_PolyhedraPtr dualpoly; dd_ErrorType err=dd_NoError; dd_boolean localdebug=dd_FALSE; *error=dd_NoError; m= M->rowsize; d= M->colsize; delindex=(long*)calloc(d+1,sizeof(long)); dd_init(temp); dd_init(prod); k=0; delsize=0; for (j=1; j<=d; j++){ if (set_member(j, delset)){ k++; delsize++; delindex[k]=j; /* stores the kth deletion column index */ } } if (localdebug) dd_WriteMatrix(stdout, M); linsize=set_card(M->linset); ddual=m+1; mdual=delsize + m - linsize; /* #equalitions + dimension of z1 */ /* setup the dual matrix */ Mdual=dd_CreateMatrix(mdual, ddual); Mdual->representation=dd_Inequality; for (i = 1; i <= delsize; i++){ set_addelem(Mdual->linset,i); /* equality */ for (j = 1; j <= m; j++) { dd_set(Mdual->matrix[i-1][j], M->matrix[j-1][delindex[i]-1]); } } k=0; for (i = 1; i <= m; i++){ if (!set_member(i, M->linset)){ /* set nonnegativity for the dual variable associated with each non-linearity inequality. */ k++; dd_set(Mdual->matrix[delsize+k-1][i], dd_one); } } /* 2. Compute the generators of the dual system. */ dualpoly=dd_DDMatrix2Poly(Mdual, &err); Gdual=dd_CopyGenerators(dualpoly); /* 3. Take the linear combination of the original system with each generator. */ dproj=d-delsize; mproj=Gdual->rowsize; Mproj=dd_CreateMatrix(mproj, dproj); Mproj->representation=dd_Inequality; set_copy(Mproj->linset, Gdual->linset); for (i=1; i<=mproj; i++){ k=0; for (j=1; j<=d; j++){ if (!set_member(j, delset)){ k++; /* new index of the variable x_j */ dd_set(prod, dd_purezero); for (h = 1; h <= m; h++){ dd_mul(temp,M->matrix[h-1][j-1],Gdual->matrix[i-1][h]); dd_add(prod,prod,temp); } dd_set(Mproj->matrix[i-1][k-1],prod); } } } if (localdebug) printf("Size of the projection system: %ld x %ld\n", mproj, dproj); dd_FreePolyhedra(dualpoly); free(delindex); dd_clear(temp); dd_clear(prod); dd_FreeMatrix(Mdual); dd_FreeMatrix(Gdual); return Mproj; } dd_MatrixPtr dd_FourierElimination(dd_MatrixPtr M,dd_ErrorType *error) /* Eliminate the last variable (column) from the given H-matrix using the standard Fourier Elimination. */ { dd_MatrixPtr Mnew=NULL; dd_rowrange i,inew,ip,in,iz,m,mpos=0,mneg=0,mzero=0,mnew; dd_colrange j,d,dnew; dd_rowindex posrowindex, negrowindex,zerorowindex; mytype temp1,temp2; dd_boolean localdebug=dd_FALSE; *error=dd_NoError; m= M->rowsize; d= M->colsize; if (d<=1){ *error=dd_ColIndexOutOfRange; if (localdebug) { printf("The number of column is too small: %ld for Fourier's Elimination.\n",d); } goto _L99; } if (M->representation==dd_Generator){ *error=dd_NotAvailForV; if (localdebug) { printf("Fourier's Elimination cannot be applied to a V-polyhedron.\n"); } goto _L99; } if (set_card(M->linset)>0){ *error=dd_CannotHandleLinearity; if (localdebug) { printf("The Fourier Elimination function does not handle equality in this version.\n"); } goto _L99; } /* Create temporary spaces to be removed at the end of this function */ posrowindex=(long*)calloc(m+1,sizeof(long)); negrowindex=(long*)calloc(m+1,sizeof(long)); zerorowindex=(long*)calloc(m+1,sizeof(long)); dd_init(temp1); dd_init(temp2); for (i = 1; i <= m; i++) { if (dd_Positive(M->matrix[i-1][d-1])){ mpos++; posrowindex[mpos]=i; } else if (dd_Negative(M->matrix[i-1][d-1])) { mneg++; negrowindex[mneg]=i; } else { mzero++; zerorowindex[mzero]=i; } } /*of i*/ if (localdebug) { dd_WriteMatrix(stdout, M); printf("No of (+ - 0) rows = (%ld, %ld, %ld)\n", mpos,mneg, mzero); } /* The present code generates so many redundant inequalities and thus is quite useless, except for very small examples */ mnew=mzero+mpos*mneg; /* the total number of rows after elimination */ dnew=d-1; Mnew=dd_CreateMatrix(mnew, dnew); dd_CopyArow(Mnew->rowvec, M->rowvec, dnew); /* set_copy(Mnew->linset,M->linset); */ Mnew->numbtype=M->numbtype; Mnew->representation=M->representation; Mnew->objective=M->objective; /* Copy the inequalities independent of x_d to the top of the new matrix. */ for (iz = 1; iz <= mzero; iz++){ for (j = 1; j <= dnew; j++) { dd_set(Mnew->matrix[iz-1][j-1], M->matrix[zerorowindex[iz]-1][j-1]); } } /* Create the new inequalities by combining x_d positive and negative ones. */ inew=mzero; /* the index of the last x_d zero inequality */ for (ip = 1; ip <= mpos; ip++){ for (in = 1; in <= mneg; in++){ inew++; dd_neg(temp1, M->matrix[negrowindex[in]-1][d-1]); for (j = 1; j <= dnew; j++) { dd_LinearComb(temp2,M->matrix[posrowindex[ip]-1][j-1],temp1,\ M->matrix[negrowindex[in]-1][j-1],\ M->matrix[posrowindex[ip]-1][d-1]); dd_set(Mnew->matrix[inew-1][j-1],temp2); } dd_Normalize(dnew,Mnew->matrix[inew-1]); } } free(posrowindex); free(negrowindex); free(zerorowindex); dd_clear(temp1); dd_clear(temp2); _L99: return Mnew; } /* end of cddproj.c */ pplacer-1.1.alpha19/cdd_src/cddtypes.h000066400000000000000000000254171303154601500176370ustar00rootroot00000000000000/* cddtypes.h: Header file for cddlib.c written by Komei Fukuda, fukuda@ifor.math.ethz.ch Version 0.94f, February 7, 2008 */ /* cddlib.c : C-Implementation of the double description method for computing all vertices and extreme rays of the polyhedron P= {x : b - A x >= 0}. Please read COPYING (GNU General Public Licence) and the manual cddlibman.tex for detail. */ #ifndef __CDDTYPES_H #define __CDDTYPES_H #endif /* __CDDTYPES_H */ #define dd_COPYRIGHT "Copyright (C) 1996, Komei Fukuda, fukuda@ifor.math.ethz.ch" #define dd_DDVERSION "Version 0.94f (February 7, 2008)" #include #define dd_wordlenmax 1024 #define dd_linelenmax 4096 #define dd_datawidth 10 #define dd_filenamelen 255 #define dd_FALSE 0 #define dd_TRUE 1 typedef int dd_boolean; typedef long dd_rowrange; typedef long dd_colrange; typedef long dd_bigrange; typedef set_type dd_rowset; typedef set_type dd_colset; typedef long *dd_rowindex; typedef int *dd_rowflag; typedef long *dd_colindex; typedef mytype **dd_Amatrix; typedef mytype *dd_Arow; typedef set_type *dd_SetVector; typedef mytype **dd_Bmatrix; typedef set_type *dd_Aincidence; /* typedef char dd_FilenameType[dd_filenamelen]; deleted 000505*/ typedef char dd_DataFileType[dd_filenamelen]; typedef char dd_LineType[dd_linelenmax]; typedef char dd_WordType[dd_wordlenmax]; typedef struct dd_raydata *dd_RayPtr; typedef struct dd_raydata { mytype *Ray; dd_rowset ZeroSet; dd_rowrange FirstInfeasIndex; /* the first inequality the ray violates */ dd_boolean feasible; /* flag to store the feasibility */ mytype ARay; /* temporary area to store some row of A*Ray */ dd_RayPtr Next; } dd_RayType; typedef struct dd_adjacencydata *dd_AdjacencyPtr; typedef struct dd_adjacencydata { dd_RayPtr Ray1, Ray2; dd_AdjacencyPtr Next; } dd_AdjacencyType; typedef enum { dd_Combinatorial, dd_Algebraic } dd_AdjacencyTestType; typedef enum { dd_MaxIndex, dd_MinIndex, dd_MinCutoff, dd_MaxCutoff, dd_MixCutoff, dd_LexMin, dd_LexMax, dd_RandomRow } dd_RowOrderType; typedef enum { dd_Unknown=0, dd_Real, dd_Rational, dd_Integer } dd_NumberType; typedef enum { dd_Unspecified=0, dd_Inequality, dd_Generator } dd_RepresentationType; typedef enum { dd_IneToGen, dd_GenToIne, dd_LPMax, dd_LPMin, dd_InteriorFind } dd_ConversionType; typedef enum { dd_IncOff=0, dd_IncCardinality, dd_IncSet } dd_IncidenceOutputType; typedef enum { dd_AdjOff=0, dd_AdjacencyList, dd_AdjacencyDegree } dd_AdjacencyOutputType; typedef enum { dd_Auto, dd_SemiAuto, dd_Manual } dd_FileInputModeType; /* Auto if a input filename is specified by command arguments */ typedef enum { dd_DimensionTooLarge, dd_ImproperInputFormat, dd_NegativeMatrixSize, dd_EmptyVrepresentation, dd_EmptyHrepresentation, dd_EmptyRepresentation, dd_IFileNotFound, dd_OFileNotOpen, dd_NoLPObjective, dd_NoRealNumberSupport, dd_NotAvailForH, dd_NotAvailForV, dd_CannotHandleLinearity, dd_RowIndexOutOfRange, dd_ColIndexOutOfRange, dd_LPCycling, dd_NumericallyInconsistent, dd_NoError } dd_ErrorType; typedef enum { dd_InProgress, dd_AllFound, dd_RegionEmpty } dd_CompStatusType; /* --- LP types ---- */ typedef enum { dd_LPnone=0, dd_LPmax, dd_LPmin } dd_LPObjectiveType; typedef enum { dd_CrissCross, dd_DualSimplex } dd_LPSolverType; typedef enum { dd_LPSundecided, dd_Optimal, dd_Inconsistent, dd_DualInconsistent, dd_StrucInconsistent, dd_StrucDualInconsistent, dd_Unbounded, dd_DualUnbounded } dd_LPStatusType; typedef struct dd_lpsolution *dd_LPSolutionPtr; typedef struct dd_lpsolution { dd_DataFileType filename; dd_LPObjectiveType objective; dd_LPSolverType solver; dd_rowrange m; dd_colrange d; dd_NumberType numbtype; dd_LPStatusType LPS; /* the current solution status */ mytype optvalue; /* optimal value */ dd_Arow sol; /* primal solution */ dd_Arow dsol; /* dual solution */ dd_colindex nbindex; /* current basis represented by nonbasic indices */ dd_rowrange re; /* row index as a certificate in the case of inconsistency */ dd_colrange se; /* col index as a certificate in the case of dual inconsistency */ long pivots[5]; /* pivots[0]=setup (to find a basis), pivots[1]=PhaseI or Criss-Cross, pivots[2]=Phase II, pivots[3]=Anticycling, pivots[4]=GMP postopt. */ long total_pivots; } dd_LPSolutionType; typedef struct dd_lpdata *dd_LPPtr; typedef struct dd_lpdata { dd_DataFileType filename; dd_LPObjectiveType objective; dd_LPSolverType solver; dd_boolean Homogeneous; /* The first column except for the obj row is all zeros. */ dd_rowrange m; dd_colrange d; dd_Amatrix A; dd_Bmatrix B; dd_rowrange objrow; dd_colrange rhscol; dd_NumberType numbtype; dd_rowrange eqnumber; /* the number of equalities */ dd_rowset equalityset; dd_boolean redcheck_extensive; /* Apply the extensive redundancy check. */ dd_rowrange ired; /* the row index for the redundancy checking */ dd_rowset redset_extra; /* a set of rows that are newly recognized redundan by the extensive search. */ dd_rowset redset_accum; /* the accumulated set of rows that are recognized redundant */ dd_rowset posset_extra; /* a set of rows that are recognized non-linearity */ dd_boolean lexicopivot; /* flag to use the lexicogrphic pivot rule (symbolic perturbation). */ dd_LPStatusType LPS; /* the current solution status */ dd_rowrange m_alloc; /* the allocated row size of matrix A */ dd_colrange d_alloc; /* the allocated col size of matrix A */ mytype optvalue; /* optimal value */ dd_Arow sol; /* primal solution */ dd_Arow dsol; /* dual solution */ dd_colindex nbindex; /* current basis represented by nonbasic indices */ dd_rowrange re; /* row index as a certificate in the case of inconsistency */ dd_colrange se; /* col index as a certificate in the case of dual inconsistency */ long pivots[5]; /* pivots[0]=setup (to find a basis), pivots[1]=PhaseI or Criss-Cross, pivots[2]=Phase II, pivots[3]=Anticycling, pivots[4]=GMP postopt. */ long total_pivots; int use_given_basis; /* switch to indicate the use of the given basis */ dd_colindex given_nbindex; /* given basis represented by nonbasic indices */ time_t starttime; time_t endtime; } dd_LPType; /*---- end of LP Types ----- */ typedef struct dd_matrixdata *dd_MatrixPtr; typedef struct dd_matrixdata { dd_rowrange rowsize; dd_rowset linset; /* a subset of rows of linearity (ie, generators of linearity space for V-representation, and equations for H-representation. */ dd_colrange colsize; dd_RepresentationType representation; dd_NumberType numbtype; dd_Amatrix matrix; dd_LPObjectiveType objective; dd_Arow rowvec; } dd_MatrixType; typedef struct dd_setfamily *dd_SetFamilyPtr; typedef struct dd_setfamily { dd_bigrange famsize; dd_bigrange setsize; dd_SetVector set; } dd_SetFamilyType; typedef struct dd_nodedata *dd_NodePtr; typedef struct dd_nodedata {dd_bigrange key; dd_NodePtr next;} dd_NodeType; typedef struct dd_graphdata *dd_GraphPtr; typedef struct dd_graphdata { dd_bigrange vsize; dd_NodePtr *adjlist; /* should be initialized to have vsize components */ } dd_GraphType; typedef struct dd_polyhedradata *dd_PolyhedraPtr; typedef struct dd_conedata *dd_ConePtr; typedef struct dd_polyhedradata { dd_RepresentationType representation; /* given representation */ dd_boolean homogeneous; dd_colrange d; dd_rowrange m; dd_Amatrix A; /* Inequality System: m times d matrix */ dd_NumberType numbtype; dd_ConePtr child; /* pointing to the homogenized cone data */ dd_rowrange m_alloc; /* allocated row size of matrix A */ dd_colrange d_alloc; /* allocated col size of matrix A */ dd_Arow c; /* cost vector */ dd_rowflag EqualityIndex; /* ith component is 1 if it is equality, -1 if it is strict inequality, 0 otherwise. */ dd_boolean IsEmpty; /* This is to tell whether the set is empty or not */ dd_boolean NondegAssumed; dd_boolean InitBasisAtBottom; dd_boolean RestrictedEnumeration; dd_boolean RelaxedEnumeration; dd_rowrange m1; /* = m or m+1 (when representation=Inequality && !homogeneous) This data is written after dd_ConeDataLoad is called. This determines the size of Ainc. */ dd_boolean AincGenerated; /* Indicates whether Ainc, Ared, Adom are all computed. All the variables below are valid only when this is TRUE */ dd_colrange ldim; /* linearity dimension */ dd_bigrange n; /* the size of output = total number of rays in the computed cone + linearity dimension */ dd_Aincidence Ainc; /* incidence of input and output */ dd_rowset Ared; /* redundant set of rows whose removal results in a minimal system */ dd_rowset Adom; /* dominant set of rows (those containing all rays). */ } dd_PolyhedraType; typedef struct dd_conedata { dd_RepresentationType representation; dd_rowrange m; dd_colrange d; dd_Amatrix A; dd_NumberType numbtype; dd_PolyhedraPtr parent; /* pointing to the original polyhedra data */ dd_rowrange m_alloc; /* allocated row size of matrix A */ dd_colrange d_alloc; /* allocated col size of matrix A */ /* CONTROL: variables to control computation */ dd_rowrange Iteration; dd_RowOrderType HalfspaceOrder; dd_RayPtr FirstRay, LastRay, ArtificialRay; /* The second description: Generator */ dd_RayPtr PosHead, ZeroHead, NegHead, PosLast, ZeroLast, NegLast; dd_AdjacencyType **Edges; /* adjacency relation storage for iteration k */ unsigned int rseed; /* random seed for random row permutation */ dd_boolean ColReduced; /* flag to indicate that a column basis is computed and reduced */ dd_bigrange LinearityDim; /* the dimension of the linearity space (when input is H), and the size of a minimal system of equations to determine the space (when V). */ dd_colrange d_orig; /* the size d of the original matrix A */ dd_colindex newcol; /* the size d of the original matrix A */ dd_colindex InitialRayIndex; /* InitialRayIndex[s] (s>=1) stores the corr. row index */ dd_rowindex OrderVector; dd_boolean RecomputeRowOrder; dd_boolean PreOrderedRun; dd_rowset GroundSet, EqualitySet, NonequalitySet, AddedHalfspaces, WeaklyAddedHalfspaces, InitialHalfspaces; long RayCount, FeasibleRayCount, WeaklyFeasibleRayCount, TotalRayCount, ZeroRayCount; long EdgeCount, TotalEdgeCount; long count_int,count_int_good,count_int_bad; /* no. of intersection operations */ dd_Bmatrix B; dd_Bmatrix Bsave; /* a copy of the dual basis inverse used to reduce the matrix A */ /* STATES: variables to represent current state. */ dd_ErrorType Error; dd_CompStatusType CompStatus; /* Computation Status */ time_t starttime, endtime; } dd_ConeType; /* Global Variables */ extern dd_boolean dd_debug; extern dd_boolean dd_log; /* end of cddtypes.h */ pplacer-1.1.alpha19/cdd_src/libcdd.clib000066400000000000000000000001301303154601500177040ustar00rootroot00000000000000cddcore.o cddio.o cddlib.o cddlp.o cddmp.o cddproj.o setoper.o pplacer_cdd.o caml_cdd.o pplacer-1.1.alpha19/cdd_src/pplacer_cdd.c000066400000000000000000000244721303154601500202530ustar00rootroot00000000000000/* cddlib-based solution pruning for `rppr voronoi` */ #include "setoper.h" #include "cdd.h" #include #include #include #include #include #define EPS 1e-7 #ifdef PPLACER_CDD_TEST /* Debugging functions */ static void dd_PrintMatrix(dd_Amatrix m, dd_rowrange rows, dd_colrange cols) { dd_rowrange i; dd_colrange j; for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { printf("%e\t", *m[i][j]); } printf("\n"); } } void dd_PrintMatrixPtr(dd_MatrixPtr m) { dd_PrintMatrix(m->matrix, m->rowsize, m->colsize); } #endif /* * Create a dd_MatrixPtr, filled with values from init_vals. * length of init_vals must be rows*cols in row-major order * * This function adds a constraint: x > 0 * * Caller must free returned matrix. */ static dd_MatrixPtr init_ineq_doubles(const double *init_vals, const size_t rows, const size_t cols, const float lower_bound, const float upper_bound) { /* Only 3-column inputs supported */ assert(cols == 3); dd_MatrixPtr m = dd_CreateMatrix(rows + 2, cols); dd_rowrange i; dd_colrange j; /* Fill values */ for (i = 0; i < rows; i++) { for (j = 0; j < m->colsize; j++) { dd_set_d(m->matrix[i][j], init_vals[m->colsize * i + j]); } } /* Add a row constraining solution space x >= lower_bound */ dd_set_d(m->matrix[rows][0], -lower_bound); /* intercept */ dd_set_d(m->matrix[rows][1], 1); /* coef of x */ dd_set_d(m->matrix[rows][2], 0); /* coef of y */ /* Add a row constraining solution space x <= upper_bound */ dd_set_d(m->matrix[rows + 1][0], upper_bound); /* intercept */ dd_set_d(m->matrix[rows + 1][1], -1); /* coef of x */ dd_set_d(m->matrix[rows + 1][2], 0); /* coef of y */ /* Mark the representation as inequalities */ m->representation = dd_Inequality; /* Input types = reals */ m->numbtype = dd_Real; return m; } static int is_vertex(const mytype i) { /* Vertices are 1, rays 0 */ return *i > dd_almostzero; } /* Count the vertices in a matrix of external points */ static size_t count_vertices(const dd_MatrixPtr generators) { dd_rowrange i; int vertex_count = 0; for (i = 0; i < generators->rowsize; i++) { /* Check if row is vertex (first column 0) */ if (is_vertex(generators->matrix[i][0])) vertex_count++; } return vertex_count; } /* Returns first item in s. s must be non-empty. */ static long set_first(const set_type s) { long elem; for (elem = 1; elem <= s[0]; elem++) { if (set_member(elem, s)) { return elem; } } assert(0); /* empty set */ } /* * Functions for sorting generators. * * All assume a matrix with at least 2 columns. */ typedef struct { size_t index; dd_Arow row; } SortRow; /* * Comparison function for qsort. Sorts by first column (desc), then second * (asc). */ static int generator_row_cmp(const void *a, const void *b) { const SortRow *ia = (const SortRow *) a; const SortRow *ib = (const SortRow *) b; double da, db; da = *(ia->row[0]); db = *(ib->row[0]); /* Compare first column - sort descending */ if (db - da < 0.0) return -1; /* da > db */ if (db - da > 0.0) return 1; /* da < db */ /* Sort by second column - ascending */ da = *(ia->row[1]); db = *(ib->row[1]); if (da - db < 0.0) return -1; if (da - db > 0.0) return 1; /* Tie */ return 0; } /* * Returns ordered indices of rows in m, ordered first by m col 0 (desc), then * col 1 (asc) * This gives vertices before rays, ordered by point on x axis. */ static size_t *sort_generators(dd_MatrixPtr m) { dd_rowrange i; /* Create SortRows for performing ordering */ SortRow *rows = (SortRow *) malloc(sizeof(SortRow) * m->rowsize); for (i = 0; i < m->rowsize; i++) { rows[i].index = i; rows[i].row = m->matrix[i]; } /* Sort */ qsort(rows, m->rowsize, sizeof(SortRow), generator_row_cmp); /* Extract sorted indices */ size_t *result = (size_t *) malloc(sizeof(size_t) * m->rowsize); for (i = 0; i < m->rowsize; i++) result[i] = rows[i].index; free(rows); return result; } /* * Parse the generator output. Find the generators which are vertices * (non-rays) add their corresponding inequalities to an output set. * * Returns a matrix where each row contains the x-coordinate of the vertex, * y-coordinate of the vertex, and 0-based index of the inequality which bounds * the polytope to the right of the vertex. output_size is set to the total * length of the ouptut. */ static double *list_extreme_vertices(const dd_MatrixPtr generators, const dd_SetFamilyPtr incidence, const size_t nrows, long lower_bound_index, /*OUT*/ size_t * output_size) { assert(generators->rowsize > 0); assert(generators->colsize > 2); set_type cur_vert_set, next_vert_set, s; dd_rowrange i; long elem; size_t out_row = 0, r; size_t vertex_count = count_vertices(generators); /* Last vertex intersects with upper bound - not output */ *output_size = 3 * (vertex_count - 1); double *output = (double *) malloc(sizeof(double) * (*output_size)); /* Sorted indices into generators */ size_t *indices = sort_generators(generators); assert(*output_size > 0); /* Loop over vertices in generators, extracting solutions * * For vertices 0..n_vertices-2, find the inequality incident to the vertex * also incident in the next vertex. */ for (i = 0; i < vertex_count - 1; i++) { r = indices[i]; assert(is_vertex(generators->matrix[r][0])); assert(is_vertex(generators->matrix[indices[i + 1]][0])); assert(out_row < vertex_count - 1); cur_vert_set = incidence->set[r]; next_vert_set = incidence->set[indices[i + 1]]; /* Sets should be same size */ assert(cur_vert_set[0] == next_vert_set[0]); set_initialize(&s, cur_vert_set[0]); set_int(s, cur_vert_set, next_vert_set); /* Remove added index for first item */ /*if (!i)*/ /*set_delelem(s, lower_bound_index);*/ /* Set may have > 1 solution if ~identical slopes and intercepts due to * rounding. */ /*assert(set_card(s) == 1); */ /* Only one item in the set */ elem = set_first(s); set_free(s); /* Fill output row */ int base = out_row * 3; output[base] = *generators->matrix[r][1]; /* x */ output[base + 1] = *generators->matrix[r][2]; /* y */ output[base + 2] = (double) (elem - 1); /* ineq index, converted to 0-base */ out_row++; } free(indices); return output; } /* * Find the extreme vertices between lower_bound and upper_bound of the convex * hull of ineqs. * * ineqs: row-major order matrix of total length nrow*ncols * nrows: Number of rows in matrix * ncols: Number of columns in matrix * lower_bound: lower bound of solution space on x-axis * upper_bound: upper bound of solution space on y-axis * output size: Set to size of result * * Returns array representing 3 by (output_size/3) matrix, where each row is: * x_i, y_i, l_i * Where x_i, y_i are the coordinates of the vertex, and l_i is the index of * the input inequality that constrains the solution space *to the right* of * vertex i. */ double *extreme_vertices(const double *ineqs, const size_t nrows, const size_t ncols, float lower_bound, float upper_bound, /*OUT*/ size_t * output_size) { /* Preconditions */ assert(ineqs != NULL); assert(ncols == 3); assert(output_size != NULL); /* Check for approx equal lower and upper bound */ if (abs(lower_bound - upper_bound) < EPS) return NULL; assert(lower_bound <= upper_bound); /* * Initialize library * TODO: Do we want to do this on every call? */ dd_set_global_constants(); dd_ErrorType err; dd_MatrixPtr generators; dd_MatrixPtr m = init_ineq_doubles(ineqs, nrows, ncols, lower_bound, upper_bound); dd_SetFamilyPtr incidence; /* Outputs */ dd_PolyhedraPtr poly = dd_DDMatrix2Poly(m, &err); if (err != dd_NoError) { return NULL; } /* Get generators */ generators = dd_CopyGenerators(poly); /* Get incidence */ incidence = dd_CopyIncidence(poly); double *result = list_extreme_vertices(generators, incidence, nrows, m->rowsize - 1, output_size); dd_FreeMatrix(m); dd_FreeMatrix(generators); dd_FreePolyhedra(poly); dd_FreeSetFamily(incidence); dd_free_global_constants(); return result; } #ifdef PPLACER_CDD_TEST /* * Helper function to generate a matrix from init_vals */ static dd_MatrixPtr init_matrix(const double *init_vals, int rows, int cols) { dd_MatrixPtr m = dd_CreateMatrix(rows, cols); dd_rowrange i; dd_colrange j; /* Fill values */ for (i = 0; i < m->rowsize; i++) { for (j = 0; j < m->colsize; j++) { dd_set_d(m->matrix[i][j], init_vals[m->colsize * i + j]); } } return m; } static void test_sort_generators() { const double input[] = { 1.0, 1.0, 2.0, 1.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0, 0.2, 1.0, 1.0, 2.0, 3.0 }; const int rows = 5; const int cols = 3; dd_MatrixPtr m = init_matrix(input, rows, cols); size_t *sorted_indices = sort_generators(m); dd_FreeMatrix(m); size_t expected[] = { 1, 0, 4, 2, 3 }; int i; for (i = 0; i < rows; i++) { assert(sorted_indices[i] == expected[i]); } free(sorted_indices); } /* Test data */ const double INPUT_MATRIX[] = { 0.0, 2.0, -1.0, 1.0, 1.0, -1.0, 2.0, 0.5, -1.0, 15.0, 1.0, -1.0, 16.0, 1.0, -1.0, 17.0, 1.0, -1.0 }; const int ROWS = 6; const int COLS = 3; /* Run a simple test */ int main(int argc, char *argv[]) { /* Init cdd */ size_t result_size; double *result = extreme_vertices(INPUT_MATRIX, ROWS, COLS, 0.0, 10.0, &result_size); assert(result_size == 9); assert(abs(result[0]) < EPS); assert(abs(result[1]) < EPS); assert(abs(result[2]) < EPS); assert(result[3] == 1.0); assert(result[4] == 2.0); assert(result[5] == 1.0); assert(result[6] == 2.0); assert(result[7] == 3.0); assert(result[8] == 2.0); test_sort_generators(); free(result); printf("OK\n"); return 0; } #endif pplacer-1.1.alpha19/cdd_src/setoper.c000066400000000000000000000146631303154601500174750ustar00rootroot00000000000000/* setoper.c: * A set operation library * created by Komei Fukuda, Nov.14, 1993 * modified on December 5, 1994 (set_card function replaced with a better code by David Bremner) * last modified on June 1, 2000 (set_fwrite_compl(), set_groundsize added. set_compl fixed.) */ #include "setoper.h" #include #define SETBITS (sizeof(long) * CHAR_BIT) /* (Number of chars in a long) * (number of bits in a char) */ /* Definitions for optimized set_card function by David Bremner bremner@cs.mcgill.ca */ /* Caution!!! Bremner's technique depends on the assumption that CHAR_BIT == 8. */ #define LUTBLOCKS(set) (((set[0]-1)/SETBITS+1)*(sizeof(long)/sizeof(set_card_lut_t))) static unsigned char set_card_lut[]={ 0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5, 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6, 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6, 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6, 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8}; /* End of Definitions for optimized set_card */ unsigned long set_blocks(long len) { long blocks=1L; if (len>0) blocks=((long)len-1)/SETBITS+2; return blocks; } void set_initialize(set_type *setp, long length) /* Make a set with a given bit lengths */ { long i,forlim1,len; if (length<=0) len=1;else len=length; /* if negative length is requested, it generates the shortest length */ forlim1=set_blocks(len); *setp=(unsigned long *) calloc(forlim1, sizeof i); (*setp)[0]=(unsigned long) len; /* size of the ground set */ for (i=1; i=1;i--) { e1=e2=set[i]; for (j=SETBITS-1;j>=0;j--) { e1=(e1>>j); printf("%1ld",e1); e1=e2-(e1<=1;i--) { e1=e2=set[i]; for (j=SETBITS-1;j>=0;j--) { e1=(e1>>j); fprintf(f,"%1ld",e1); e1=e2-(e1< #include typedef unsigned long *set_type; /* set type definition */ typedef unsigned char set_card_lut_t; #if defined(__cplusplus) extern "C" { #endif unsigned long set_blocks(long len); void set_initialize(set_type *setp,long len); void set_free(set_type set); void set_emptyset(set_type set); void set_copy(set_type setcopy,set_type set); void set_addelem(set_type set, long elem); void set_delelem(set_type set, long elem); void set_int(set_type set,set_type set1,set_type set2); void set_uni(set_type set,set_type set1,set_type set2); void set_diff(set_type set,set_type set1,set_type set2); void set_compl(set_type set,set_type set1); int set_subset(set_type set1,set_type set2); int set_member(long elem, set_type set); long set_card(set_type set); long set_groundsize(set_type set); /* output the size of the ground set */ void set_write(set_type set); void set_fwrite(FILE *f,set_type set); void set_fwrite_compl(FILE *f,set_type set); /* write the complement */ void set_binwrite(set_type set); void set_fbinwrite(FILE *f,set_type set); #if defined(__cplusplus) } #endif /* End of File: setoper.h */ pplacer-1.1.alpha19/common_src/000077500000000000000000000000001303154601500163745ustar00rootroot00000000000000pplacer-1.1.alpha19/common_src/algMap.ml000066400000000000000000000013711303154601500201310ustar00rootroot00000000000000(* A map equipped with algebraic operations. * * not super-high performance because of map and boxing. * *) module AlgMap (N: Number.NUMBER) (M: MapsSets.M) = struct include M let soft_find k m = try find k m with | Not_found -> N.zero (* sets k to (soft value of k) op v *) let soft_op_add op k v m = add k (op (soft_find k m) v) m let add_by = soft_op_add (N.add) let sub_by = soft_op_add (N.sub) let mul_by = soft_op_add (N.mul) let div_by = soft_op_add (N.div) let max_by = soft_op_add (N.max) let pow_by = soft_op_add (N.pow) end module AlgMapB = AlgMap (Number.B) module AlgMapZ = AlgMap (Number.Z) module AlgMapR = AlgMap (Number.R) module IntAlgMapR = AlgMapR (MapsSets.IntMap) pplacer-1.1.alpha19/common_src/alignment.ml000066400000000000000000000162671303154601500207200ustar00rootroot00000000000000exception Unknown_format of string open Ppatteries (* NOTE: zero is the beginning of the alignment! *) (* NOTE: strings have maximum length of 16777211 (on stoke) *) (* alignments are arrays of (name, seq)'s. better than hashtables because * numbers are useful *) type t = (string * string) array type seq_type = Nucleotide_seq | Protein_seq let nstates_of_seq_type = function | Nucleotide_seq -> 4 | Protein_seq -> 20 let seq_type_to_str = function | Nucleotide_seq -> "nucleotide" | Protein_seq -> "protein" (* ***** utils ***** *) (* string_break: break str in to chunks of length chunk_len *) let string_break str chunk_len = let rec aux next_str = let next_len = String.length next_str in if next_len <= chunk_len then [ next_str ] (* terminate *) else ( String.sub next_str 0 chunk_len ) :: ( aux ( String.sub next_str chunk_len ( next_len - chunk_len ) ) ) in aux str (* ***** basics ***** *) let get_name align i = fst (align.(i)) let get_seq align i = snd (align.(i)) let iteri = Array.iteri let get_name_arr align = Array.map fst align let forget_names align = Array.map snd align let same_lengths_unnamed align = if align = [||] then true else ( let lengths = Array.map String.length align in Array.fold_left ( fun same_so_far len -> same_so_far && ( len = lengths.(0) ) ) true lengths ) let same_lengths align = same_lengths_unnamed ( forget_names align ) let n_seqs align = Array.length align let length align = if n_seqs align = 0 then 0 else if same_lengths align then String.length (get_seq align 0) else failwith "length: not all same length" let pair_uppercase (name, seq) = (name, String.uppercase seq) let uppercase aln = Array.map pair_uppercase aln let list_of_any_file fname = let has_suffix suffix = MaybeZipped.check_suffix fname suffix in if has_suffix ".fasta" || has_suffix ".fa" then Fasta.of_file fname else if has_suffix ".sth" || has_suffix ".sto" then Stockholm.of_file fname else failwith ("unfamiliar suffix on " ^ fname) let uppercase_list l = List.map pair_uppercase l let upper_list_of_any_file fname = uppercase_list (list_of_any_file fname) let aln_of_any_file fname = Array.of_list (list_of_any_file fname) let upper_aln_of_any_file fname = uppercase (aln_of_any_file fname) let to_map_by_name aln = Array.fold_right (fun (name, seq) m -> if StringMap.mem name m then failwith ("name "^name^" duplicated in alignment!"); StringMap.add name seq m) aln StringMap.empty (* alternate, for wrapped fasta List.iter (fun line -> Printf.fprintf ch "%s\n" line) (string_break seq 60); *) let write_fasta_line ch (name, seq) = Printf.fprintf ch ">%s\n" name; Printf.fprintf ch "%s\n" seq let to_fasta align fname = let ch = open_out fname in Array.iter (write_fasta_line ch) align; close_out ch let to_phylip align fname = let ch = open_out fname in Printf.fprintf ch "%d %d\n" (n_seqs align) (length align); Array.iter ( fun (name, seq) -> Printf.fprintf ch "%s %s\n" (StringFuns.left_pad 14 ' ' name) seq; ) align; close_out ch let stack align1 align2 = let a = Array.append align1 align2 in if same_lengths a then a else failwith "stack: alignment not rectangular!" (* string_mask: mask is a bool array whose ith elt tells if we should include * that char into the output *) let string_mask mask str = assert(Array.length mask = String.length str); StringFuns.of_char_array ( Array.filteri (fun i _ -> mask.(i)) (StringFuns.to_char_array str)) (* mask_align : mask the alignment *) let mask_align mask align = Array.map (fun (name, seq) -> (name, string_mask mask seq)) align (* XXX *) let check_for_repeats name_arr = let _ = Array.fold_left (fun s name -> if StringSet.mem name s then failwith("repeated taxon name in alignment: "^name) else StringSet.add name s) StringSet.empty name_arr in () (* check to make sure that each site contains a nucleotide type symbol *) let is_nuc_align aln = try Array.iter (fun (_,seq) -> String.iter (fun nuc -> let _ = CharMap.find nuc Nuc_models.nuc_map in ()) seq) aln; true with | Not_found -> false (* make_aln_index_map: make a map which maps from the node number to the row * number of the alignment. *) let make_aln_index_map taxon_map aln_name_arr = let n_tree = IntMap.cardinal taxon_map and n_aln = Array.length aln_name_arr in if n_tree <> n_aln then failwith (Printf.sprintf "tree has %d taxa, and ref align has %d." n_tree n_aln); check_for_repeats aln_name_arr; IntMap.map (fun tax_name -> match ArrayFuns.find_all_indices tax_name aln_name_arr with | [idx] -> idx | [] -> failwith ("taxon not found in alignment: '"^tax_name^"'") | _ -> failwith ("taxon in alignment repeatedly: '"^tax_name^"'")) taxon_map (* a like_aln is just the corresponding array of likelihood vectors *) let like_aln_of_align seq_type align = let like_fun = match seq_type with | Nucleotide_seq -> Nuc_models.lv_of_nuc | Protein_seq -> Prot_models.lv_of_aa in Array.map (fun (_, seq) -> Array.map like_fun (StringFuns.to_char_array seq)) align (* getting empirical frequencies from alignments *) let emper_freq nstates like_map align = let no_missing_normed = CharMap.remove '-' ( CharMap.remove '?' ( (* we don't remove 'X'... *) CharMap.map ( fun like_vect -> Linear_utils.alloc_l1_normalize like_vect) like_map)) in let total = Gsl_vector.create ~init:0. nstates in Array.iter ( fun (name, seq) -> String.iter ( fun base -> if base <> '-' && base <> '?' then if CharMap.mem base no_missing_normed then Gsl_vector.add total (CharMap.find base no_missing_normed) else failwith (Printf.sprintf "'%c' not a known base in %s!" base name) ) seq ) align; Linear_utils.l1_normalize total; if !verbosity > 1 then Format.fprintf Format.std_formatter "emper freqs: %a@." Linear_utils.ppr_gsl_vector total; let a = Gsl_vector.to_array total in if Array.exists (fun x -> x < 1e-10) a then dprintf "\nWarning: zero-indexed state %d is zero in empirical frequency.\n\n" (Array.findi (fun x -> x < 1e-10) a); total let identity s1 s2 = let s1' = StringFuns.to_char_array s1 and s2' = StringFuns.to_char_array s2 in let num, denom = ArrayFuns.fold_left2 (fun (num, denom) c1 c2 -> if c1 = '-' || c2 = '-' then num, denom else num + (if c1 = c2 then 1 else 0), succ denom) (0, 0) s1' s2' in (if denom = 0 then 0. else (float_of_int num) /. (float_of_int denom)), denom let informative = function '?' | '-' -> false | _ -> true let ungap = String.filter informative let span s = let first = ref None and last = ref None in String.iteri (fun i c -> if informative c then begin if Option.is_none !first then first := Some i; last := Some i end) s; match !first, !last with | Some f, Some l -> f, l | _, _ -> failwith "sequence contains no informative characters" pplacer-1.1.alpha19/common_src/batchfile.ml000066400000000000000000000042021303154601500206450ustar00rootroot00000000000000open Ppatteries let batchfile_regexp = Str.regexp begin String.concat "\\|" [ (* whitespace (ignored) *) "[ \t]+"; (* a newline (group 1) *) "\\(\r\\|\n\\|\r\n\\)"; (* a bare string (group 2) *) "\\([^\" \t\r\n#]+\\)"; (* a quoted string (group 3; group 4 should be non-matching) *) "\"\\(\\(\"\"\\|[^\"]\\)*\\)\""; (* comments (ignored) *) "#.*"; ] end type token = | String of string | Newline | EOF let token_of_match s = match Sparse.first_match [1; 2; 3] s with | 1, _ -> Newline | 2, s | 3, s -> String s | _, _ -> invalid_arg "token_of_match" let tokenize_batchfile = Sparse.tokenize_string batchfile_regexp token_of_match ~eof_token:EOF let quote_regexp = Str.regexp "\"\"" let parse tokens = let _, sll = Enum.fold (fun (sl, sll) -> function | String s -> let s = Str.global_replace quote_regexp "\"" s in s :: sl, sll | Newline | EOF -> if sl = [] then sl, sll else [], (List.rev sl) :: sll) ([], []) tokens in List.rev sll let of_string, of_file = Sparse.gen_parsers tokenize_batchfile parse let placeholder_regexp = Str.regexp begin String.concat "\\|" [ (* an escaped brace (group 1) *) "\\({{\\|}}\\)"; (* an identifier to substitute (group 2) *) "{\\([a-zA-Z0-9_-]+\\)}"; ] end let substitute_placeholders m s = let substitute s = match Sparse.first_match [1; 2] s with | 1, "{{" -> "{" | 1, "}}" -> "}" | 2, identifier -> begin try StringMap.find identifier m with Not_found -> failwith ("unspecified batchfile substitution: " ^ identifier) end | _, _ -> invalid_arg "substitute" in Str.global_substitute placeholder_regexp substitute s let argument_regexp = Str.regexp "^\\([a-zA-Z0-9_-]+\\)=\\(.*\\)$" let split_arguments l = List.fold_left (fun accum s -> if not (Str.string_match argument_regexp s 0) then failwith ("malformed batchfile argument: " ^ s); StringMap.add (Str.matched_group 1 s) (Str.matched_group 2 s) accum) StringMap.empty l pplacer-1.1.alpha19/common_src/delayed.ml000066400000000000000000000003401303154601500203320ustar00rootroot00000000000000open Ppatteries type 'a t = 'a option ref let create () = ref None let init v = ref (Some v) let of_option = ref let reify v f = match !v with | Some v' -> v' | None -> let v' = f () in v := Some v'; v' pplacer-1.1.alpha19/common_src/file_parsing.ml000066400000000000000000000051231303154601500213710ustar00rootroot00000000000000let empty_line_rex = Str.regexp "^[ \t]*$" let comment_rex = Str.regexp "^[ \t]*#.*" let filter_not some_rex string_list = List.filter (fun line -> not (Str.string_match some_rex line 0)) string_list let filter_empty_lines = filter_not empty_line_rex let filter_comments = filter_not comment_rex (* *** reading *** *) let string_list_of_file fname = let ch = open_in fname in let rec get_line accu = match begin try Some (input_line ch) with | End_of_file -> None end with | Some line -> get_line (line :: accu) | None -> close_in ch; List.rev accu in get_line [] (* read lines (at least one) until we hit a line which matches the given rex. if * the end of the file is reached, then raise End_of_file if no lines have * accumulated. otherwise return those lines *) let read_lines_until ch rex = let rec get_line accu = try let line = input_line ch in if accu <> [] && Str.string_match rex line 0 then begin seek_in ch ((pos_in ch)-(String.length line)-1); List.rev accu end else get_line (line::accu) with End_of_file -> if accu = [] then raise End_of_file else List.rev accu in get_line [] (* partition_list: * splits up a list based on a predicate that signals the start of the list # partition_list (fun x -> x = 2) [1;3;2;4;5;2;2;4];; - : int list list = [[1; 3]; [2; 4; 5]; [2]; [2; 4]] *) let partition_list predicate start_l = let rec aux sublist_list current_sublist = function | x::l -> if predicate x then aux (current_sublist::sublist_list) [x] l else aux sublist_list (x::current_sublist) l | [] -> current_sublist::sublist_list in match start_l with | x::l -> List.rev (List.map List.rev (aux [] [x] l)) | [] -> [[]] (* find_beginning: # find_beginning (fun x -> x = 2) [1;3;2;4;5;2;2;4];; - : int * int list = (2, [4; 5; 2; 2; 4]) *) let rec find_beginning predicate = function | x::l -> if predicate x then (x,l) else find_beginning predicate l | [] -> raise Not_found (* separate_first_satisfactory: # separate_first_satisfactory (fun x -> x = 2) [1;3;2;4;5;2;2;4];; - : int list * int list = ([], [1; 3; 2; 4; 5; 2; 2; 4]) # separate_first_satisfactory (fun x -> x = 2) [2;2;3;2;4;5;2;2;4];; - : int list * int list = ([2; 2], [3; 2; 4; 5; 2; 2; 4]) *) let rec separate_first_satisfactory predicate start_l = let rec aux satisfactory = function | x::l as rest -> if predicate x then aux (x::satisfactory) l else (List.rev satisfactory, rest) | [] -> (List.rev satisfactory, []) in aux [] start_l pplacer-1.1.alpha19/common_src/linear_utils.ml000066400000000000000000000122441303154601500214230ustar00rootroot00000000000000(* Some nicer ways to make and use Gsl_vectors and Gsl_matrices. * * look at http://www.gnu.org/software/gsl/manual/html_node/GSL-BLAS-Interface.html and http://oandrieu.nerim.net/ocaml/gsl/doc/Gsl_blas.html * * Reminder: the Gsl_matrix is made with c_layout. *) let tolerance = 1e-12 open Bigarray open Ppatteries (* *** Vector operations *** *) let vec_init n f = let v = Gsl_vector.create n in for i=0 to n-1 do Array1.unsafe_set v i (f i) done; v let vec_fold_left f start v = let x = ref start and n = Gsl_vector.length v in for i=0 to n-1 do x := f !x (Array1.unsafe_get v i) done; !x let vec_map f v = vec_init (Gsl_vector.length v) (fun i -> f (Array1.unsafe_get v i)) let vec_iter f a = let n = Gsl_vector.length a in for i=0 to n-1 do f (Array1.unsafe_get a i) done let vec_iteri f a = let n = Gsl_vector.length a in for i=0 to n-1 do f i (Array1.unsafe_get a i) done let vec_iter2 f a b = let n = Gsl_vector.length a in assert(n = Gsl_vector.length b); for i=0 to n-1 do f (Array1.unsafe_get a i) (Array1.unsafe_get b i) done let vec_map2_into f ~dst a b = let n = Gsl_vector.length dst in assert(n = Gsl_vector.length a); assert(n = Gsl_vector.length b); for i=0 to n-1 do Array1.unsafe_set dst i (f (Array1.unsafe_get a i) (Array1.unsafe_get b i)) done (* If all of the entries of v satisfy pred. *) let vec_predicate pred v = vec_fold_left (fun so_far x -> so_far && pred x) true v (* Maximum element after applying f. *) let vec_fmax_index f v = assert(0 <> Gsl_vector.length v); let max_val = ref (f v.{0}) and max_ind = ref 0 in vec_iteri (fun i x -> let fx = f x in if fx > !max_val then begin max_val := fx; max_ind := i; end) v; !max_ind (* norms and normalizing *) let lp_norm p v = assert(p > 0.); let x = ref 0. in for i=0 to (Gsl_vector.length v)-1 do x := !x +. (v.{i} ** p) done; !x ** (1. /. p) let l1_norm v = lp_norm 1. v let l2_norm v = lp_norm 2. v (* normalize in place *) let gen_normalize norm_fun v = Gsl_vector.scale v (1. /. (norm_fun v)) let l1_normalize v = gen_normalize l1_norm v let l2_normalize v = gen_normalize l2_norm v let alloc_gen_normalize norm_fun v = let normed = Gsl_vector.copy v in Gsl_vector.scale normed (1. /. (norm_fun normed)); normed let alloc_l1_normalize v = alloc_gen_normalize l1_norm v let alloc_l2_normalize v = alloc_gen_normalize l2_norm v (* *** Matrix operations *** *) let mat_init n_rows n_cols f = let m = Gsl_matrix.create n_rows n_cols in for i=0 to n_rows-1 do let row = Array2.slice_left m i in for j=0 to n_cols-1 do Array1.unsafe_set row j (f i j) done; done; m let mat_map f m = let (rows, cols) = Gsl_matrix.dims m in mat_init rows cols (fun i j -> f m.{i,j}) let diag v = let n = Gsl_vector.length v in let m = Gsl_matrix.create ~init:0. n n in for i=0 to n-1 do m.{i,i} <- v.{i} done; m (* information about vectors and matrices *) let assert_symmetric m = let n, cols = Gsl_matrix.dims m in assert(n = cols); for i=0 to n-1 do for j=i to n-1 do if (abs_float(m.{i,j} -. m.{j,i}) > tolerance) then failwith ( Printf.sprintf "matrix not symmetric: %f vs %f" m.{i,j} m.{j,i}) done done let alloc_transpose m = let mt = Gsl_matrix.copy m in Gsl_matrix.transpose_in_place mt; mt let mat_dim_asserting_square m = let n = Array2.dim1 m in assert(n = Array2.dim2 m); n let qform m v = let n = Gsl_vector.length v in assert(n = Array2.dim1 m && n = Array2.dim2 m); let x = ref 0. in for i=0 to n-1 do let vi = Array1.unsafe_get v i and mi = Array2.slice_left m i in for j=0 to n-1 do x := (!x) +. vi *. (Array1.unsafe_get v j) *. (Array1.unsafe_get mi j) done; done; !x let trace m = let n = Array2.dim1 m in assert(n = (Array2.dim2 m)); let x = ref 0. in for i=0 to n-1 do x := (!x) +. (Array2.unsafe_get m i i) done; !x let mat_vec_mul dest a v = Gsl_blas.gemv Gsl_blas.NoTrans ~alpha:1. ~a:a ~x:v ~beta:0. ~y:dest let alloc_mat_vec_mul a v = let (rows, midA) = Gsl_matrix.dims a and midV = Gsl_vector.length v in assert(midA = midV); let w = Gsl_vector.create rows in mat_vec_mul w a v; w let mat_mat_mul dest a b = Gsl_blas.gemm ~ta:Gsl_blas.NoTrans ~tb:Gsl_blas.NoTrans ~alpha:1. ~a:a ~b:b ~beta:0. ~c:dest let alloc_mat_mat_mul a b = let (rows, midA) = Gsl_matrix.dims a and (midB, cols) = Gsl_matrix.dims b in assert(midA = midB); let m = Gsl_matrix.create rows cols in mat_mat_mul m a b; m (* gives a matrix such that the columns are the eigenvectors. *) let symm_eigs m = assert_symmetric m; Gsl_eigen.symmv (`M(m)) (* pretty printers *) let ppr_gsl_vector ff y = Legacy.Format.fprintf ff "@[{"; Ppr.ppr_list_inners Legacy.Format.pp_print_float ff ( Array.to_list (Gsl_vector.to_array y)); Legacy.Format.fprintf ff "}@]" let ppr_gsl_matrix ff m = let nrows, _ = Gsl_matrix.dims m in Legacy.Format.fprintf ff "@[{"; for i=0 to nrows-1 do ppr_gsl_vector ff (Gsl_matrix.row m i); if i < nrows-1 then Legacy.Format.fprintf ff ";@ " done; Legacy.Format.fprintf ff "}@]" pplacer-1.1.alpha19/common_src/mapsSets.ml000066400000000000000000000132101303154601500205220ustar00rootroot00000000000000open Batteries open Ppr module OrderedFloat = struct type t = float let compare = Pervasives.compare end module OrderedInt = struct type t = int let compare a b = a - b end module OrderedChar = struct type t = char let compare = Char.compare end module OrderedString = struct type t = string let compare = String.compare end module type PPRABLE = sig type t val ppr: Format.formatter -> t -> unit end (* general things we might want to do with maps *) module type M = sig include Map.S val get: key -> 'a -> 'a t -> 'a val opt_add: key -> 'a option -> 'a t -> 'a t val opt_find: key -> 'a t -> 'a option val opt_extract: key -> 'a t -> 'a option * 'a t val check_add: key -> 'a -> 'a t -> 'a t val union: 'a t -> 'a t -> 'a t val of_pairlist: (key * 'a) list -> 'a t val add_listly: key -> 'a -> 'a list t -> 'a list t val of_f_list_listly: key_f:('a -> key) -> val_f:('a -> 'b) -> 'a list -> 'b list t val of_pairlist_listly: (key * 'a) list -> 'a list t val keylist: 'a t -> key list val to_pairs: 'a t -> (key * 'a) list val merge_counts: int t list -> int t val histogram_of_enum: key Enum.t -> int t val ppr_gen: (Format.formatter -> 'a -> unit) -> Format.formatter -> 'a t -> unit val ppr_string: Format.formatter -> string t -> unit val ppr_int: Format.formatter -> int t -> unit val ppr_float: Format.formatter -> float t -> unit val ppr_char: Format.formatter -> char t -> unit val ppr_bool: Format.formatter -> bool t -> unit end module BetterMap (OM: Map.S) (PBLE: PPRABLE with type t = OM.key) : (M with type key = OM.key) = struct include OM let get k default map = try find k map with | Not_found -> default let opt_add k optX map = match optX with | Some x -> add k x map | None -> map let opt_find k m = if mem k m then Some (find k m) else None let opt_extract k m = try let v, m' = extract k m in Some v, m' with Not_found -> None, m (* if x is a key of m, make sure that it is bound to y. * otherwise, add (x,y) as a kv-pair to m *) let check_add x y m = if mem x m then if y = find x m then m else failwith "check_add" else add x y m let union m1 m2 = fold ( fun k v m -> add k v m ) m1 m2 (* of_pairlist : given key, value pairs *) let rec of_pairlist = function | (k,v)::l -> add k v (of_pairlist l) | [] -> empty (* listly means add values as a list associated with a key *) let add_listly k v m = if mem k m then add k (v::(find k m)) m else add k [v] m (* the two given functions take the elements of the list into keys and values * for the map. these are then collected into a map from the key to the list of * all values associated with that key. * *) let of_f_list_listly ~key_f ~val_f pre_f_list = let rec aux m = function | x::l -> aux (add_listly (key_f x) (val_f x) m) l | [] -> m in aux empty (List.rev pre_f_list) (* the above rev's things *) (* collect key,value pairs into a map from the key to the list of all values * associated with that key. *) let of_pairlist_listly l = of_f_list_listly ~key_f:fst ~val_f:snd l let keylist m = keys m |> List.of_enum let to_pairs m = enum m |> List.of_enum let merge_counts ml = List.fold_left (fun accum m -> fold (fun k v m -> let cur_v = try find k m with | Not_found -> 0 in add k (cur_v + v) m) m accum) empty ml let histogram_of_enum e = Enum.fold (fun accum v -> add v (get v 0 accum + 1) accum) empty e let ppr_gen ppr_val ff m = Format.fprintf ff "@[["; ppr_list_inners ( fun ff (k, v) -> Format.fprintf ff "%a -> " PBLE.ppr k; ppr_val ff v; ) ff (to_pairs m); Format.fprintf ff "]@]" (* Below: for ppr-ing maps with these value types. *) let ppr_string = ppr_gen Format.pp_print_string let ppr_int = ppr_gen Format.pp_print_int let ppr_float = ppr_gen Format.pp_print_float let ppr_char = ppr_gen Format.pp_print_char let ppr_bool = ppr_gen Format.pp_print_bool end module PprFloat = struct type t = float let ppr = Format.pp_print_float end module PprInt = struct type t = int let ppr = Format.pp_print_int end module PprChar = struct type t = char let ppr = Format.pp_print_char end module PprString = struct type t = string let ppr = Format.pp_print_string end module FloatMap = BetterMap (Map.Make(OrderedFloat)) (PprFloat) module IntMap = BetterMap (Map.Make(OrderedInt)) (PprInt) module CharMap = BetterMap (Map.Make(OrderedChar)) (PprChar) module StringMap = BetterMap (Map.Make(OrderedString)) (PprString) (* general things we might want to do with sets *) module type S = sig include Set.S val of_list: elt list -> t val ppr: Format.formatter -> t -> unit end module BetterSet (OS: Set.S) (PBLE: PPRABLE with type t = OS.elt) : (S with type elt = OS.elt) = struct include OS let of_list l = List.fold_left (flip add) empty l let ppr ff s = Format.fprintf ff "@[{"; ppr_list_inners ( fun ff x -> Format.fprintf ff "%a" PBLE.ppr x; ) ff (elements s); Format.fprintf ff "}@]" end module FloatSet = BetterSet (Set.Make(OrderedFloat)) (PprFloat) module IntSet = BetterSet (Set.Make(OrderedInt)) (PprInt) module CharSet = BetterSet (Set.Make(OrderedChar)) (PprChar) module StringSet = BetterSet (Set.Make(OrderedString)) (PprString) pplacer-1.1.alpha19/common_src/number.ml000066400000000000000000000060641303154601500202240ustar00rootroot00000000000000(* NOTE: this version of number.ml differs from that in base, with the 0/0 as described below *) module type NUMBER = sig type t val zero: t val one: t val of_int: int -> t val to_int: t -> int val of_float: float -> t val succ: t -> t val neg: t -> t val abs: t -> t val inv: t -> t val exp: t -> t val log: t -> t val add: t -> t -> t val sub: t -> t -> t val mul: t -> t -> t val div: t -> t -> t val max: t -> t -> t val pow: t -> t -> t val indic: t -> t -> t (* indicator function *) val compare: t -> t -> int val to_string: t -> string val of_string: string -> t end module B = struct type t = bool let of_int x = (x mod 2) = 1 let to_int x = if x then 1 else 0 let of_float x = of_int (int_of_float x) let to_float x = float_of_int (to_int x) let neg x = x let add x y = if x && y then false else x || y let sub = add let mul = ( && ) let div _ _ = false (* the fun stops here *) let max = ( || ) let pow x y = if y then x else true let indic = ( = ) let compare = Pervasives.compare let succ = not let abs x = x let inv _ = false let exp _ = true let log _ = false let zero = false let one = true let to_string x = if x then "1" else "0" let of_string s = of_int (int_of_string s) end (* NOTE: we define 0/0 = 0 *) module Z = struct type t = int let of_int x = x let to_int x = x let of_float x = int_of_float x let neg x = -x let add = (+) let sub = (-) let mul = ( * ) let div x y = if x = 0 then 0 else x/y let max = max let pow x y = if y = 0 then 1 else if y < 0 then 0 else let rec aux n = if n = 0 then 1 else x * (aux (n-1)) in aux y let indic x y = if x = y then 1 else 0 let compare = Pervasives.compare let succ = (+) 1 let abs = abs let conv_float_fun f = (fun x -> int_of_float (f (float_of_int x) )) let inv = conv_float_fun (fun x -> 1./.x) let exp = conv_float_fun exp let log = conv_float_fun log let zero = 0 let one = 1 let to_string x = Printf.sprintf "%d" x let of_string = int_of_string end (* below: a bit of care needs to be taken in order to have infinites and nan not * get converted into ok numbers by indic or div. * *) let is_bad x = let c = classify_float x in (c = FP_infinite) || (c = FP_nan) let is_ok x = not (is_bad x) let ucheck f x = if is_bad x then nan else f x let bcheck f x y = if is_bad x || is_bad y then nan else f x y (* NOTE: we define 0/0 = 0 *) module R = struct type t = float let of_int x = float_of_int x let to_int x = int_of_float x let of_float x = x let neg x = -.x let add = (+.) let sub = (-.) let mul = ( *. ) let div = bcheck (fun x y -> if x = 0. then 0. else x/.y) let max = bcheck max let pow = bcheck ( ** ) let indic = bcheck (fun x y -> if x = y then 1. else 0.) let compare = Pervasives.compare let succ = (+.) 1. let abs = abs_float let inv = ucheck (fun x -> 1. /. x) let exp = ucheck exp let log = ucheck log let zero = 0. let one = 1. let to_string x = Printf.sprintf "%g" x let of_string = float_of_string end pplacer-1.1.alpha19/common_src/power_iteration.ml000066400000000000000000000050131303154601500221370ustar00rootroot00000000000000(* Implements power iteration to get the absolute value of the largest * eigenvalue (in absolute value) of a symmetric matrix. * * http://en.wikipedia.org/wiki/Power_iteration *) open Linear_utils open Bigarray type eig = { v: Gsl_vector.vector; l: float; } let scale_by_l2 v = Gsl_vector.scale v (1. /. (Gsl_blas.nrm2 v)) let big_entry_ratio v1 v2 = let i = vec_fmax_index abs_float v2 in v1.{i} /. v2.{i} (* this function returns true if the l-infinity difference between (v * w[i]/v[i]) and w * is less than some tolerance, where i is the index of the maximal entry of v. * *) let stop_time tol v w = let pseudo_eval = big_entry_ratio w v in try vec_iter2 (fun vi wi -> if abs_float (wi -. (pseudo_eval *. vi)) > tol then raise Exit) v w; true with | Exit -> false (* Find the top eigenvalue of a symmetric matrix by power iteration. *) let top_eig m tol max_iter = let (rows, cols) = Gsl_matrix.dims m in assert(rows = cols); let v = Gsl_vector.create ~init:1. rows in let scratch = Gsl_vector.copy v in let mat_vec_mul ~a = Gsl_blas.symv Gsl_blas.Upper ~alpha:1. ~a ~beta:0. in let mul_and_scale x dst = mat_vec_mul ~a:m ~x ~y:dst; scale_by_l2 dst in let rec aux iter_n = if iter_n < max_iter then begin (* we do a back-and-forth to preserve the roles of scratch and v *) mul_and_scale v scratch; mul_and_scale scratch v; if not (stop_time tol scratch v) then aux (iter_n+1) end else failwith "top_eig: exceeded maximum number of iterations" in aux 0; mat_vec_mul ~a:m ~x:v ~y:scratch; {v; l = big_entry_ratio scratch v} (* Calculates the outer product (scalar v v^T) and puts it in m. *) let outer_product ?(scalar=1.) m v = let len = Gsl_vector.length v in let (n_rows, n_cols) = Gsl_matrix.dims m in assert(n_rows = len && n_cols = len); for i=0 to len-1 do let row = Array2.slice_left m i in Array1.blit v row; (* copy v to row *) Gsl_vector.scale row (scalar *. v.{i}); done;; let projector_of_eig m eig = outer_product ~scalar:eig.l m eig.v (* Make an array of the top n eigs. *) let top_eigs m tol max_iter n_eigs = let m' = Gsl_matrix.copy m in let proj = Gsl_matrix.copy m in let rec aux n_left accu = if n_left <= 0 then accu else let eig = top_eig m' tol max_iter in projector_of_eig proj eig; (* Subtract the projector from m'. *) Gsl_matrix.sub m' proj; aux (n_left - 1) (eig::accu) in Array.of_list (List.rev (aux n_eigs [])) pplacer-1.1.alpha19/common_src/ppatteries.ml000066400000000000000000000550321303154601500211130ustar00rootroot00000000000000(** A common base for code in pplacer. This module is designed to be opened. Opening it includes Batteries, MapsSets, and some generally useful functions. *) include MapsSets include AlgMap include Batteries let round x = int_of_float (floor (x +. 0.5)) (* # int_pow 10. 3;; - : float = 1000. # int_pow 10. 0;; - : float = 1. *) let int_pow x n = assert(n >= 0); let rec aux accu i = if i=0 then accu else aux (x*.accu) (i-1) in aux 1. n let string_of_fpclass = function | FP_normal -> "FP_normal" | FP_subnormal -> "FP_subnormal" | FP_zero -> "FP_zero" | FP_infinite -> "FP_infinite" | FP_nan -> "FP_nan" let date_time_str () = let the_time = Unix.localtime (Unix.time ()) in Printf.sprintf "%02d/%02d/%d %02d:%02d:%02d" (the_time.Unix.tm_mon+1) the_time.Unix.tm_mday (the_time.Unix.tm_year+1900) the_time.Unix.tm_hour the_time.Unix.tm_min the_time.Unix.tm_sec let safe_chop_extension s = try Filename.chop_extension s with | Invalid_argument _ -> s let safe_chop_suffix name suff = if Filename.check_suffix name suff then Filename.chop_suffix name suff else name exception Different of int let raise_if_different cmp x1 x2 = let c = cmp x1 x2 in if c <> 0 then raise (Different c) let rec find_zero_pad_width n = assert(n>=0); if n <= 9 then 1 else 1+(find_zero_pad_width (n/10)) let maybe_map_cons f = function | None -> identity | Some x -> f x |> List.cons let maybe_cons o l = maybe_map_cons identity o l let to_csv_out ch = (ch :> unit; output: string -> int -> int -> int>) let csv_out_channel ch = new IO.out_channel ch |> to_csv_out let to_csv_in ch = object method input a b c = try ch#input a b c with IO.No_more_input -> raise End_of_file method close_in = ch#close_in end let csv_in_channel ch = new IO.in_channel ch |> to_csv_in (*let first = Tuple.Tuple2.map1*) (*let second = Tuple.Tuple2.map2*) let some x = Some x let on f g a b = g (f a) (f b) let comparing f a b = compare (f a) (f b) let swap (a, b) = b, a let junction pred f g a = if pred a then f a else g a let fold_both f g a (x, y) = f a x, g a y (* Replaced by '%>' in batteries 2.0 final. * Maintained to preserve operator precedence in existing code *) let (|-) f g x = g (f x) let (|--) f g a b = g (f a b) let (|~) = (%) let (||-) f g a = f a || g a let (||--) f g a b = f a b || g a b let ( &&& ) f g = fun x -> (f x, g x) (* removed in batteries 2.0 final *) let (&&-) f g a = f a && g a let (&&--) f g a b = f a b && g a b let approx_equal ?(epsilon = 1e-5) f1 f2 = abs_float (f1 -. f2) < epsilon let (=~) = approx_equal let approx_compare ?epsilon f1 f2 = if approx_equal ?epsilon f1 f2 then 0 else compare f1 f2 let (<~>) = approx_compare (* find the median of a sorted list. returns the left item if there are an even * number of items in the list. *) let median l = let rec aux = function | e :: _, ([_] | [_; _]) -> e | _ :: tl1, _ :: _ :: tl2 -> aux (tl1, tl2) | _, _ -> invalid_arg "median" in aux (l, l) let verbosity = ref 1 let dfprintf ?(l = 1) ?(flush = true) ch fmt = if !verbosity >= l then begin finally (if flush then flush_all else identity) (Printf.fprintf ch fmt) end else Printf.ifprintf IO.stdnull fmt let dprintf ?l ?flush = dfprintf ?l ?flush stdout let deprintf ?l ?flush = dfprintf ?l ?flush stderr let dfprint ?l ?flush ch s = dfprintf ?l ?flush ch "%s" s let dprint ?l ?flush = dfprint ?l ?flush stdout let deprint ?l ?flush = dfprint ?l ?flush stderr let align_with_space = List.map (Tuple3.map3 ((^) " ")) %> Arg.align let progress_displayer ?(update_interval = 0.3) fmt total = let shown = ref 0 and last_length = ref 0 and last_time = ref 0. in if Unix.isatty Unix.stdout then begin fun name -> incr shown; let shown = !shown and time = Unix.gettimeofday () in if time -. !last_time > update_interval || shown = total then begin let msg = Printf.sprintf fmt name shown total in let msg_len = String.length msg in let padding = String.make (!last_length - msg_len |> max 0) ' ' in dprintf "%s%s\r" msg padding; last_length := msg_len; last_time := time; end; if shown = total then dprint "\n"; end else begin fun name -> incr shown; Printf.sprintf fmt name !shown total |> dprintf "%s\n"; end let get_dir_contents ?pred dir_name = let dirh = Unix.opendir dir_name in Enum.from (fun () -> try Unix.readdir dirh with End_of_file -> raise Enum.No_more_elements) |> Enum.suffix_action (fun () -> Unix.closedir dirh) |> Option.map_default Enum.filter identity pred |> Enum.map (Printf.sprintf "%s/%s" dir_name) (* * 'a list MapsSets.IntMap.t list -> 'a list MapsSets.IntMap.t = * combine all the maps into a single one, with k bound to the concatenated set * of bindings for k in map_list. *) let combine_list_intmaps l = (IntMap.fold (fun k -> IntMap.add_listly k |> flip |> List.fold_left |> flip) |> flip List.fold_left IntMap.empty) l (* ll_normalized_prob : * ll_list is a list of log likelihoods. this function gives the normalized * probabilities, i.e. exponentiate then our_like / (sum other_likes) * have to do it this way to avoid underflow problems. * *) let ll_normalized_prob ll_list = List.map (fun log_like -> 1. /. (List.fold_left ( +. ) 0. (List.map (fun other_ll -> exp (other_ll -. log_like)) ll_list))) ll_list (* Functions here mimic BatFile and Filename, * but support decompression of gzipped files (ending in .gz). * All Filename like functions operate on filenames with a .gz extension * dropped, so chop_extension "test.fasta.gz" == "test" *) module MaybeZipped = struct let is_gzipped name = Filename.check_suffix name ".gz" let drop_gz name = if is_gzipped name then Filename.chop_extension name else name let check_suffix name suffix = Filename.check_suffix (drop_gz name) suffix let chop_suffix name suffix = Filename.chop_suffix (drop_gz name) suffix let chop_extension name = Filename.chop_extension (drop_gz name) (* Mostly duplicates above. *) let safe_chop_extension s = let s = drop_gz s in try chop_extension (drop_gz s) with | Invalid_argument _ -> s let safe_chop_suffix name suff = let name = drop_gz name in if check_suffix name suff then chop_suffix name suff else name let open_in name = if is_gzipped name then let in_chan = Gzip.open_in name in IO.create_in ~read:(fun () -> try Gzip.input_char in_chan with End_of_file -> raise BatIO.No_more_input) ~input:(fun buf pos len -> try Gzip.input in_chan buf pos len with End_of_file -> raise BatIO.No_more_input) ~close:(fun () -> Gzip.close_in in_chan) else File.open_in name let lines_of name = open_in name |> IO.lines_of let open_out name = if is_gzipped name then let out_chan = Gzip.open_out name in (* Gzip.output doesn't return the number of characters written, * hence the Buffer wrapping *) IO.create_out ~write:(Gzip.output_char out_chan) ~output:(fun s p l -> let buf = Buffer.create l in Buffer.add_substring buf s p l; Gzip.output out_chan (Buffer.contents buf) 0 (Buffer.length buf); Buffer.length buf) ~close:(fun () -> Gzip.close_out out_chan) (* Gzip.flush disposes of the Gzip stream and prevents further writes - * we don't want that, so no action here. *) ~flush:(fun () -> ()) else File.open_out name end (* parsing *) module Sparse = struct open Lexing let update_fref file fref = match !fref with | None -> fref := Some file | Some _ -> () let format_fref ?(prep = "of") fref = Option.map_default (Printf.sprintf " %s %s" prep) "" !fref let location_of_position p = p.pos_lnum, p.pos_cnum - p.pos_bol exception Parse_error of string * (int * int) * (int * int) * string option ref let parse_error_of_positions ?file s p1 p2 = Parse_error (s, location_of_position p1, location_of_position p2, ref file) let () = Printexc.register_printer (function | Parse_error (msg, (l1, c1), (l2, c2), file) -> Some (Printf.sprintf "%s between line %d character %d and line %d character %d%s" msg l1 c1 l2 c2 (format_fref file)) | _ -> None) let incr_lineno lexbuf = let pos = lexbuf.lex_curr_p in lexbuf.lex_curr_p <- { pos with pos_lnum = pos.pos_lnum + 1; pos_bol = pos.pos_cnum; } let parse_error ?file tok msg = raise (parse_error_of_positions ?file msg (Parsing.rhs_start_pos tok) (Parsing.rhs_end_pos tok)) let try_map f x tok msg = try f x with _ -> parse_error tok msg exception Tokenizer_error of int * int * string option ref exception Syntax_error of string * string option ref let syntax_error msg = raise (Syntax_error (msg, ref None)) let () = Printexc.register_printer (function | Tokenizer_error (line, col, file) -> Some (Printf.sprintf "syntax error at line %d character %d%s" line col (format_fref file)) | Syntax_error (msg, file) -> Some (Printf.sprintf "syntax error%s: %s" (format_fref ~prep:"in" file) msg) | _ -> None) let rec first_match groups s = match groups with | g :: rest -> begin try g, Str.matched_group g s with | Not_found -> first_match rest s end | [] -> raise Not_found let pos s ch = let rec aux pos line = try let pos' = String.index_from s pos '\n' in if pos' >= ch then line, ch - pos else aux (succ pos') (succ line) with | Not_found -> line, ch - pos in aux 0 1 let tokenize_string regexp to_token ?eof_token s = let rec aux en accum = if String.length s = en then accum else if Str.string_match regexp s en then let accum = try (to_token s) :: accum with | Not_found -> accum in aux (Str.match_end ()) accum else let line, col = pos s en in raise (Tokenizer_error (line, col, ref None)) in aux 0 [] |> maybe_cons eof_token |> List.rev |> List.enum let file_parse_wrap file f x = try f x with | Tokenizer_error (_, _, fref) | Syntax_error (_, fref) | Parse_error (_, _, _, fref) as e -> update_fref file fref; raise e let wrap_of_fname_opt = function | None -> identity | Some fname -> file_parse_wrap fname let gen_parsers tokenize parse = let of_string ?fname s = wrap_of_fname_opt fname (tokenize %> parse) s and of_file fname = file_parse_wrap fname (MaybeZipped.lines_of %> Enum.map tokenize %> Enum.flatten %> parse) fname in of_string, of_file end module ArrayFuns = struct (* find the first element of an array satisfying a predicate *) let first f a = let n = Array.length a in let rec aux i = if i >= n then invalid_arg "array_first: no first!" else if f (Array.unsafe_get a i) then i else aux (i+1) in aux 0 (* find the last element of an array satisfying a predicate *) let last f a = let rec aux i = if i < 0 then invalid_arg "array_last: no last!" else if f (Array.unsafe_get a i) then i else aux (i-1) in aux ((Array.length a)-1) (* find the first instance of x in a *) let opt_find a to_find = let len = Array.length a in let rec aux pos = if pos >= len then None else if a.(pos) = to_find then Some pos else aux (pos+1) in aux 0 let find a to_find = match opt_find a to_find with | Some x -> x | None -> raise Not_found let find_all_indices item arr = let found = ref [] in Array.iteri ( fun i x -> if item = x then found := i::(!found) ) arr; List.rev !found let map2 f a b = let l = Array.length a in if l <> Array.length b then invalid_arg "map2: unequal length arrays"; if l = 0 then [||] else begin let r = Array.create l (f (Array.unsafe_get a 0) (Array.unsafe_get b 0)) in for i = 1 to l - 1 do Array.unsafe_set r i (f (Array.unsafe_get a i) (Array.unsafe_get b i)) done; r end let iter2 f a b = let l = Array.length a in if l <> Array.length b then invalid_arg "iter2: unequal length arrays"; for i = 0 to l - 1 do f (Array.unsafe_get a i) (Array.unsafe_get b i) done let iter3 f a b c = let l = Array.length a in if l <> Array.length b || l <> Array.length c then invalid_arg "iter3: unequal length arrays"; for i = 0 to l - 1 do f (Array.unsafe_get a i) (Array.unsafe_get b i) (Array.unsafe_get c i) done let iteri2 f a b = let l = Array.length a in if l <> Array.length b then invalid_arg "iteri2: unequal length arrays"; for i = 0 to l - 1 do f i (Array.unsafe_get a i) (Array.unsafe_get b i) done let iteri3 f a b c = let l = Array.length a in if l <> Array.length b || l <> Array.length c then invalid_arg "iteri3: unequal length arrays"; for i = 0 to l - 1 do f i (Array.unsafe_get a i) (Array.unsafe_get b i) (Array.unsafe_get c i) done let fold_left2 f x a b = let l = Array.length a in if l <> Array.length b then invalid_arg "fold_left2: unequal length arrays"; let r = ref x in for i = 0 to l - 1 do r := f !r (Array.unsafe_get a i) (Array.unsafe_get b i) done; !r let fold_left3 f x a b c = let l = Array.length a in if l <> Array.length b || l <> Array.length c then invalid_arg "fold_left3: unequal length arrays"; let r = ref x in for i = 0 to l - 1 do r := f !r (Array.unsafe_get a i) (Array.unsafe_get b i) (Array.unsafe_get c i) done; !r let fold_left4 f x a b c d = let l = Array.length a in if l <> Array.length b || l <> Array.length c || l <> Array.length d then invalid_arg "fold_left4: unequal length arrays"; let r = ref x in for i = 0 to l - 1 do r := f !r (Array.unsafe_get a i) (Array.unsafe_get b i) (Array.unsafe_get c i) (Array.unsafe_get d i) done; !r let to_string entry_to_string a = "["^( String.concat "; " ( List.map entry_to_string ( Array.to_list a)))^"]" end module ListFuns = struct (* pull_each_out : # pull_each_out [1;2;3];; - : (int * int list) list = [(1, [2; 3]); (2, [1; 3]); (3, [1; 2])] *) let pull_each_out init_list = let rec aux all_pairs start = function | x::l -> aux ((x, List.rev_append start l)::all_pairs) (x::start) l | [] -> all_pairs in List.rev (aux [] [] init_list) (* from a Pascal Cuoq post on stack overflow *) let rec sublist begini endi l = match l with | [] -> failwith "sublist" | h :: t -> let tail = if endi=0 then [] else sublist (begini-1) (endi-1) t in if begini>0 then tail else h :: tail let rec iter3 f l1 l2 l3 = match (l1, l2, l3) with | ([], [], []) -> () | (a1::l1, a2::l2, a3::l3) -> f a1 a2 a3; iter3 f l1 l2 l3 | (_, _, _) -> invalid_arg "ListFuns.iter3" let rec map3 f l1 l2 l3 = match (l1, l2, l3) with ([], [], []) -> [] | (a1::l1, a2::l2, a3::l3) -> let r = f a1 a2 a3 in r :: map3 f l1 l2 l3 | (_, _, _) -> invalid_arg "ListFuns.map3" let rec fold_left3 f accu l1 l2 l3 = match (l1, l2, l3) with | ([], [], []) -> accu | (a1::l1, a2::l2, a3::l3) -> fold_left3 f (f accu a1 a2 a3) l1 l2 l3 | (_, _, _) -> invalid_arg "ListFuns.fold_left3" let partitioni p l = let rec part i yes no = function | [] -> (List.rev yes, List.rev no) | x :: l -> if p i x then part (i+1) (x :: yes) no l else part (i+1) yes (x :: no) l in part 0 [] [] l let rec remove_last = function | [] -> [] | [_] -> [] | h::t -> h::(remove_last t) let all_same = function | [] -> true | first::rest -> let rec aux = function | x::l -> (first = x) && (aux l) | [] -> true in aux rest (* multifilter: filter according to a list of criteria # let divbyk k x = x mod k = 0;; val divbyk : int -> int -> bool = # let x = multifilter [divbyk 2; divbyk 3] [1;2;3;4;5;6;7;8];; val x : int list list = [[2; 4; 6; 8]; [3; 6]] *) let multifilter f_list = let rec aux accu = function | [] -> List.map List.rev accu | x::l -> aux (List.map2 (fun f category -> if f x then x::category else category) f_list accu) l in aux (List.map (fun _ -> []) f_list) (* iter over all ordered pairs in a list. # let print_pair = Printf.printf "(%d,%d) ";; val print_pair : int -> int -> unit = # list_iter_over_pairs_of_single print_pair [1;2;3;4];; (1,2) (1,3) (1,4) (2,3) (2,4) (3,4) - : unit = () *) let rec list_iter_over_pairs_of_single f = function | x::l -> List.iter (fun y -> f x y) l; list_iter_over_pairs_of_single f l | [] -> () let list_pairs_of_single l = let rec aux accum = function | x :: l -> aux (List.rev_append (List.map (fun y -> x, y) l) accum) l | [] -> accum in aux [] l (* iter over pairs from two lists. # list_iter_over_pairs_of_two print_pair [1;3] [4;5];; (1,4) (1,5) (3,4) (3,5) - : unit = () *) let list_iter_over_pairs_of_two f l1 l2 = List.iter (fun x -> List.iter (f x) l2) l1 (* # let divbyk k x = x mod k = 0;; val divbyk : int -> int -> bool = # let x = find_multiple_matches [divbyk 2; divbyk 3] [1;2;3;4;5;6;7;8];; val x : int list = [6] *) let find_multiple_matches f_list = let rec aux accu = function | [] -> List.rev accu | x::l -> if (List.fold_left (fun accu f -> accu+(if f x then 1 else 0)) 0 f_list) > 1 then aux (x::accu) l else aux accu l in aux [] end module MatrixFuns = struct let assert_rectangular m = if m <> [||] then begin let n_cols = Array.length m.(0) in for i=1 to (Array.length m)-1 do assert(n_cols = Array.length m.(i)) done end let n_rows m = Array.length m let n_cols m = if m = [||] then 0 else Array.length m.(0) let map f m = Array.map (Array.map f) m let mapij f m = Array.mapi (fun i row -> Array.mapi (fun j x -> f i j x) row) m let iterij f m = Array.iteri (fun i row -> Array.iteri (fun j x -> f i j x) row) m let init n_rows n_cols f = Array.init n_rows (fun i -> Array.init n_cols (f i)) end module StringFuns = struct let of_char_array a = Array.enum a |> String.of_enum let to_char_array s = String.enum s |> Array.of_enum let left_pad pad_width c s = assert(pad_width >= 0); let len = String.length s in let new_s = String.make (len+pad_width) c in String.blit s 0 new_s pad_width len; new_s end module EnumFuns = struct let n_cartesian_product ll = if List.is_empty ll then invalid_arg "n_cartesian_product: list-list empty"; if List.exists List.is_empty ll then invalid_arg "n_cartesian_procuct: some list empty"; let pool = List.enum ll |> Enum.map Array.of_list |> Array.of_enum in let n = Array.length pool in let indices = Array.make n 0 and lengths = Array.map (Array.length %> (+) (-1)) pool in let rec update_indices = function | i when indices.(i) <> lengths.(i) -> indices.(i) <- indices.(i) + 1 | 0 -> raise Enum.No_more_elements | i -> indices.(i) <- 0; update_indices (i - 1) in let is_first = ref true in let next () = if !is_first then is_first := false else update_indices (n - 1); Array.map2 Array.get pool indices |> Array.to_list in Enum.from next let combinations l r = if r < 0 then invalid_arg "r must be non-negative"; let pool = Array.of_list l and indices = Array.init r identity in let n = Array.length pool in let rec next_i = function | i when indices.(i) <> i + n - r -> i | 0 -> raise Enum.No_more_elements | i -> next_i (i - 1) in let is_first = ref true in let next () = if !is_first then is_first := false else begin let i = next_i (r - 1) in indices.(i) <- indices.(i) + 1; for j = i + 1 to r - 1 do indices.(j) <- indices.(j - 1) + 1 done end; Array.to_list indices |> List.map (Array.get pool) in if n < r then Enum.empty () else Enum.from next let powerset l = 1 -- List.length l |> Enum.map (combinations l) |> Enum.flatten end let exn_wrap f = Printexc.pass f () let () = Gsl_error.init (); Printexc.register_printer (function | Unix.Unix_error (errno, fn, param) -> let op = if param = "" then "" else Printf.sprintf " on %S" param in Some (Printf.sprintf "error %S from %s%s" (Unix.error_message errno) fn op) | _ -> None) let memory_stats_ch = match begin try Some (Sys.getenv "PPLACER_MEMORY_STATS") with Not_found -> None end with | None -> None | Some statsfile -> let ch = Legacy.open_out_gen [Open_append; Open_creat; Open_trunc] 0o600 statsfile in let write = Csv.to_channel ch |> Csv.output_record in let word_in_bytes = Sys.word_size / 8 in let start = Unix.gettimeofday () in let last_top = ref None in write ["time"; "pid"; "top_heap_bytes"]; let check_stats () = let stats = Gc.quick_stat () in match !last_top with | Some top when stats.Gc.top_heap_words <= top -> () | _ -> write [Printf.sprintf "%f" (Unix.gettimeofday () -. start); string_of_int (Unix.getpid ()); string_of_int (stats.Gc.top_heap_words * word_in_bytes)]; Legacy.flush ch; last_top := Some stats.Gc.top_heap_words in let _ = Gc.create_alarm check_stats in at_exit check_stats; Some ch pplacer-1.1.alpha19/common_src/ppr.ml000066400000000000000000000050451303154601500175330ustar00rootroot00000000000000(* ppr generalized nonsense *) open Batteries (* ppr_list_inners : assume that we have opened a box *) let rec xppr_list_inners val_to_string ff = function | [] -> () | [x] -> Format.fprintf ff "%s" (val_to_string x) | x::l -> Format.fprintf ff "%s;@ " (val_to_string x); xppr_list_inners val_to_string ff l (* ppr_list_inners : assume that we have opened a box *) let rec ppr_gen_list_inners sepstr ppr_val ff = function | [] -> () | [x] -> ppr_val ff x | x::l -> Format.fprintf ff "%a%s@," ppr_val x sepstr; ppr_gen_list_inners sepstr ppr_val ff l (* %a appears to take two arguments (not put in parens), first a function which * takes ff and 'a, then something of type 'a *) let ppr_list_inners ppr_val ff l = ppr_gen_list_inners "; " ppr_val ff l let ppr_list ppr_val ff l = Format.fprintf ff "@[[%a]@]" (ppr_list_inners ppr_val) l let ppr_array ppr_val ff a = Format.fprintf ff "@[[|%a|]@]" (ppr_list_inners ppr_val) (Array.to_list a) let ppr_opt ppr_val ff = function | Some x -> Format.fprintf ff "Some %a" ppr_val x | None -> Format.fprintf ff "None" let ppr_gfloat ff x = Format.fprintf ff "%g" x let ppr_bool_list ff l = ppr_list Format.pp_print_bool ff l let ppr_int_list ff l = ppr_list Format.pp_print_int ff l let ppr_float_list ff l = ppr_list Format.pp_print_float ff l let ppr_string_list ff l = ppr_list Format.pp_print_string ff l let ppr_bool_array ff a = ppr_array Format.pp_print_bool ff a let ppr_bool_array_array ff a = ppr_array ppr_bool_array ff a let ppr_int_array ff a = ppr_array Format.pp_print_int ff a let ppr_int_array_array ff a = ppr_array ppr_int_array ff a let ppr_float_array ff a = ppr_array Format.pp_print_float ff a let ppr_float_array_array ff a = ppr_array ppr_float_array ff a let ppr_string_array ff a = ppr_array Format.pp_print_string ff a let print_of_ppr ppr_fun x = ppr_fun Format.std_formatter x; Format.pp_print_newline Format.std_formatter () let print_bool_list l = print_of_ppr ppr_bool_list l let print_bool_array a = print_of_ppr ppr_bool_array a let print_bool_array_array a = print_of_ppr ppr_bool_array_array a let print_int_list l = print_of_ppr ppr_int_list l let print_int_array a = print_of_ppr ppr_int_array a let print_int_array_array a = print_of_ppr ppr_int_array_array a let print_float_list l = print_of_ppr ppr_float_list l let print_float_array a = print_of_ppr ppr_float_array a let print_float_array_array a = print_of_ppr ppr_float_array_array a let print_string_list l = print_of_ppr ppr_string_list l let print_string_array a = print_of_ppr ppr_string_array a pplacer-1.1.alpha19/common_src/sql.ml000066400000000000000000000007721303154601500175330ustar00rootroot00000000000000open Sqlite3 module D = Sqlite3.Data let check ?(allowed = [Rc.OK]) db retcode = if not (List.mem retcode allowed) then raise (Error (errmsg db)) let check_exec db ?cb ?allowed s = check ?allowed db (exec ?cb db s) let bind_arr ?allowed db st arr = Array.iteri (fun e x -> check ?allowed db (bind st (e + 1) x)) arr let bind_step_reset db st params = bind_arr db st params; check ~allowed:[Rc.DONE] db (step st); check db (reset st) let close db = let _ = db_close db in () pplacer-1.1.alpha19/common_src/subcommand.ml000066400000000000000000000155701303154601500210660ustar00rootroot00000000000000(* A specl is a specification list, which gets passed to Arg.parse_argv or * wrap_parse_argv. It specifies the options and the actions which are assocated * with those options. *) open Ppatteries let option_rex = Str.regexp "-.*" (* print the commands available through cmd_map *) let print_avail_cmds prg_name (display_map, longest) = print_endline "Here is a list of commands available using this interface:"; List.iter (fun (name, map) -> Printf.printf " %s\n" name; StringMap.iter (fun k v -> Printf.printf " %-*s %s\n" longest k (v ())#desc) map; Printf.printf "\n" ) display_map; Printf.printf "To get more help about a given command, type %s COMMAND --help\n" prg_name; () (* given an argl, process a subcommand *) let process_cmd prg_name display_map cmd_map argl = let print_need_cmd_error () = Printf.printf "please specify a %s command, e.g. %s COMMAND [...]\n" prg_name prg_name; print_avail_cmds prg_name display_map; exit 1 in match argl with | s::_ -> if StringMap.mem s cmd_map then ((StringMap.find s cmd_map) ())#run argl else if Str.string_match option_rex s 0 then print_need_cmd_error () else begin print_endline ("Unknown "^prg_name^" command: "^s); print_avail_cmds prg_name display_map; exit 1 end | [] -> print_need_cmd_error () (* externally facing *) (* this takes an argument list, a specification list, and a usage string, does * the relevant parsing, and then spits out a list of anonymous arguments (those * not associated with command line flags. Note that one of the purposes here is * to mutate the prefs that are in specl, so this needs to get run first before * actually using any prefs. * *) let wrap_parse_argv argl specl usage = let anonymous = ref [] in try Arg.parse_argv ~current:(ref 0) (* start from beginning *) (Array.of_list argl) specl (fun s -> anonymous := s::!anonymous) usage; List.rev !anonymous with | Arg.Bad s -> print_string s; exit 1 | Arg.Help s -> print_string s; exit 0 (* Makes a specification with a default value. spec_with_default "--gray-level" (fun o -> Arg.Set_int o) prefs.gray_level "Specify the amount of gray to mix into the color scheme. Default is %d."; * *) let spec_with_default symbol setfun p help = (symbol, setfun p, Printf.sprintf help !p) (* given a (string, f) list, make a map of it *) let cmd_map_of_list l = let longest = ref 0 in let display_map = List.map (fun (name, l) -> longest := max (String.length name) !longest; name, List.fold_right (fun (k, v) -> longest := max (String.length k) !longest; StringMap.add k v) l StringMap.empty) l in (display_map, !longest), List.fold_left (fun m1 (_, m2) -> StringMap.fold StringMap.add m1 m2) StringMap.empty display_map (* intended to be the inner loop of a function *) let rec inner_loop ~prg_name ~version (display_map, cmd_map) = let process = process_cmd prg_name display_map cmd_map and args = ref [] and batchfile = ref None in let rec help_fun () = print_avail_cmds prg_name display_map; Printf.sprintf "\nAdditional flags for %s:" prg_name |> Arg.usage_string (align_with_space argl) |> print_string; exit 1 (* calling align_with_space here is illegal with a `let rec`. *) and argl = [ "--version", Arg.Unit (fun () -> print_endline version; exit 0), "Print version and exit"; "--cmds", Arg.Unit (fun () -> print_avail_cmds prg_name display_map; exit 0), "Print a list of the available commands."; "--batch", Arg.String (fun fname -> batchfile := Some (Batchfile.of_file fname)), "Run the provided batch file of guppy commands"; "--quiet", Arg.Unit (fun () -> verbosity := 0), "Don't write messages to stdout (unless explicitly requested)."; "--help", Arg.Unit help_fun, "Display this list of options and subcommands"; "-help", Arg.Unit help_fun, "Display this list of options and subcommands"; ] in Arg.parse (align_with_space argl) (* Sys.argv and Arg.current are used here so that /this/ invocation of Arg.parse won't try to parse the flags that are destined for the subcommand. *) (fun _ -> let nargs = Array.length (Sys.argv) in for i = !Arg.current to (nargs - 1) do args := Sys.argv.(i) :: !args done; Arg.current := nargs) (Printf.sprintf "Type %s --cmds to see the list of available commands." prg_name); match !batchfile with | None -> process (List.rev !args) | Some argll -> let substitutions = Batchfile.split_arguments !args in let argll' = List.map (List.map (Batchfile.substitute_placeholders substitutions)) argll in List.iter process argll' (* the new stuff *) exception No_default of string * string type 'a described = | Needs_argument of string * string | Formatted of 'a * ('a -> string, unit, string) format | Plain of 'a * string type 'a flag = { value: 'a option ref; opt: string; described: 'a described; } let flag opt described = {value = ref None; opt; described} (* fv is short for flag value. It fetches the value. *) let fv ?default f = match !(f.value) with | Some x -> x | None -> let x = begin match f.described, default with | Formatted (x, _), _ | Plain (x, _), _ | Needs_argument _, Some x -> x | Needs_argument (name, _), _ -> raise (No_default (name, f.opt)) end in f.value := Some x; x let fvo f = try Some (fv f) with | No_default _ -> None let desc_of_flag f = match f.described with | Needs_argument (_, s) -> s | Formatted (v, fmt) -> Printf.sprintf fmt v | Plain (_, s) -> s let some_flag func f = f.opt, func f, desc_of_flag f let string_flag = some_flag (fun f -> Arg.String (fun x -> f.value := Some x)) let int_flag = some_flag (fun f -> Arg.Int (fun x -> f.value := Some x)) let float_flag = some_flag (fun f -> Arg.Float (fun x -> f.value := Some x)) let toggle_flag = some_flag (fun f -> Arg.Unit (fun () -> f.value := Some (not (fv f)))) let string_list_flag = some_flag (fun f -> Arg.String (fun x -> f.value := Some (x :: fv ~default:[] f))) let delimited_list_flag ?(delimiter = ",") f = some_flag (fun f -> Arg.String (fun x -> f.value := Some (fv ~default:[] f @ String.nsplit x delimiter))) f class virtual subcommand () = object (self) method virtual desc: string method virtual usage: string method virtual specl: (string * Arg.spec * string) list method virtual action: string list -> unit method run argl = let argl = wrap_parse_argv argl (align_with_space self#specl) self#usage in try self#action argl with | No_default (name, opt) -> Printf.printf "no option provided for %s flag (%s)\n" name opt; exit 1 end pplacer-1.1.alpha19/common_src/uptri.ml000066400000000000000000000100461303154601500200720ustar00rootroot00000000000000open Ppatteries (* a module for STRICTLY uppper tri matrices *) (* some utils *) let n_entries_of_dim dim = dim * (dim-1) / 2 (* dim_of_nentries : * convert the number of entries into the number of dimensions. note that zero * entries is a 1x1, one is a 2x2, etc. *) let dim_of_n_entries n_entries = let rec aux dim_sofar left = if left = 0 then dim_sofar else if left < 0 then invalid_arg "dim_of_nentries : not a dimension" else aux (dim_sofar+1) (left-dim_sofar-1) in (* one plus to add in the diagonal *) 1+(aux 0 n_entries) (* pair_to_int : * convert a pair representing the 0-indexed coordinates of a matrix entry to * the zero-indexed number in their sequence, i.e. * 0 1 2 3 * * 4 5 6 * * * 7 8 * * * * 9 * * * * * *) let pair_to_int dim i j = j-1 + i*(2*dim-i-3)/2 let rec int_to_pair dim k = let rec aux curr_i start_j curr_k = assert(start_j < dim); assert(0 <= curr_i && curr_i < dim); assert(curr_k >= 0); if start_j+curr_k < dim then (curr_i, start_j+curr_k) else aux (curr_i+1) (start_j+1) (curr_k-(dim-start_j)) in (* below: 0 1 so we start at (0,1) *) aux 0 1 k (* interface *) type 'a uptri = {dim: int; data: 'a array} let get_dim u = u.dim let get_data u = u.data let dims_ok u i j = 0 <= i && i < u.dim && i < j && j < u.dim let assert_dims_ok u i j = if not (dims_ok u i j) then invalid_arg (Printf.sprintf "uptri : dims %d %d in %d not OK" i j u.dim) let create d x = {dim = d; data = Array.create (n_entries_of_dim d) x} let size u = u.dim let get u i j = assert_dims_ok u i j; u.data.(pair_to_int u.dim i j) let set u i j x = assert_dims_ok u i j; u.data.(pair_to_int u.dim i j) <- x let unsafe_get u i j = Array.unsafe_get u.data (pair_to_int u.dim i j) let unsafe_set u i j x = Array.unsafe_set u.data (pair_to_int u.dim i j) x let to_array u = Array.copy u.data let of_array a = {dim = dim_of_n_entries (Array.length a); data = a} let row u i = Array.init (u.dim-i-1) (fun j -> get u i (j+1+i)) let fold_left f s u = Array.fold_left f s u.data let map f u = {u with data = Array.map f u.data} let iter f u = Array.iter f u.data let copy u = {u with data = Array.copy u.data} let iterij f u = Array.iteri (fun k x -> let (i,j) = int_to_pair u.dim k in f i j x) u.data let compare u1 u2 = if u1.dim <> u2.dim then invalid_arg "Uptri.compare : differing dimensions"; compare u1.data u2.data let init d f = {dim = d; data = Array.init (n_entries_of_dim d) ( fun k -> let (i,j) = int_to_pair d k in f i j)} let apply_pairwise f u1 u2 = if u1.dim <> u2.dim then invalid_arg "Uptri.apply_pairwise : differing dimensions"; {u1 with data = ArrayFuns.map2 f u1.data u2.data} let number dim = init dim (fun i j -> j+dim*i) (* get as if it was an everything-but-diagonal matrix *) let get_loose u i j = if i=j then invalid_arg "get_loose : on diagonal" else if i < j then get u i j else get u j i (* set as if it was an everything-but-diagonal matrix *) let set_loose u i j x = if i=j then invalid_arg "set_loose : on diagonal" else if i < j then set u i j x else set u j i x let pair_to_int_loose dim i j = if i=j then invalid_arg "pair_to_int_loose : on diagonal" else if i < j then pair_to_int dim i j else pair_to_int dim j i let to_matrix diag_f u = MatrixFuns.init u.dim u.dim (fun i j -> if i = j then diag_f i else get_loose u i j) (* pprs *) let ppr_uptri print_val ff u = Ppr.ppr_array (Ppr.ppr_array print_val) ff ( Array.init (u.dim-1) (fun i -> row u i)) (* let ppr_uptri print_val ff u = Ppr.ppr_array print_val ff u.data *) let ppr_int_uptri ff u = ppr_uptri Format.pp_print_int ff u let print_int_uptri u = Ppr.print_of_ppr ppr_int_uptri u let ppr_float_uptri ff u = ppr_uptri Ppr.ppr_gfloat ff u let print_float_uptri u = Ppr.print_of_ppr ppr_float_uptri u (* print as a lower triangular matrix to a channel (nicer to look at) *) let ppr_lowtri ff ppr u = let d = get_dim u in for i=1 to d-1 do for j=0 to i-1 do Format.fprintf ff "%a\t" ppr (get_loose u i j); done; Format.fprintf ff "@\n"; done pplacer-1.1.alpha19/docs/000077500000000000000000000000001303154601500151655ustar00rootroot00000000000000pplacer-1.1.alpha19/docs/Makefile000066400000000000000000000107621303154601500166330ustar00rootroot00000000000000# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = _build # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " singlehtml to make a single large HTML file" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " devhelp to make HTML files and a Devhelp project" @echo " epub to make an epub" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " latexpdf to make LaTeX files and run them through pdflatex" @echo " text to make text files" @echo " man to make manual pages" @echo " changes to make an overview of all changed/added/deprecated items" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" clean: -rm -rf $(BUILDDIR)/* html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." singlehtml: $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml @echo @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/pplacer.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/pplacer.qhc" devhelp: $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp @echo @echo "Build finished." @echo "To view the help file:" @echo "# mkdir -p $$HOME/.local/share/devhelp/pplacer" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/pplacer" @echo "# devhelp" epub: $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub @echo @echo "Build finished. The epub file is in $(BUILDDIR)/epub." latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make' in that directory to run these through (pdf)latex" \ "(use \`make latexpdf' here to do that automatically)." latexpdf: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through pdflatex..." make -C $(BUILDDIR)/latex all-pdf @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." text: $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text @echo @echo "Build finished. The text files are in $(BUILDDIR)/text." man: $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man @echo @echo "Build finished. The manual pages are in $(BUILDDIR)/man." changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." pplacer-1.1.alpha19/docs/_build/000077500000000000000000000000001303154601500164235ustar00rootroot00000000000000pplacer-1.1.alpha19/docs/_build/html/000077500000000000000000000000001303154601500173675ustar00rootroot00000000000000pplacer-1.1.alpha19/docs/_static/000077500000000000000000000000001303154601500166135ustar00rootroot00000000000000pplacer-1.1.alpha19/docs/_static/edpl_formula.png000066400000000000000000000260311303154601500217740ustar00rootroot00000000000000‰PNG  IHDRèÄ•Çm5sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î< IDATxœíw˜œUù†ïgS( ½w ‚ôŽŠ€(Jü(B¤(5ô:J¨¢YP!ˆ ¢( ДРMi‚ ½¥<¿?Þ3ÙÙ>»;³3;{îëškvÎ÷ï;3;ïœö¾Ï+Ûd2õ„¤­aÀ-¶?ªv{zCCµÉT€ßoIºQÒWªÝ ž¢Üƒfê I¯‹”ŠN®w?úÒç4SWHZ‘0ÎW€ÅÃÓßë¿—´«¤~ñÝïÌdºÁréùYÛoؾA {_V®‘´UušX:Ù@3õÆ‚éùíBíÏlOVöþ¬ Ü*é’û¾™¥‘ 4So ô­Ölϰ}9°2p,ð.°=1ìm’´xß5³4²fê…ÒóÛ`ûÛç+³€€i’ÆIVùf–F6ÐL½ÑaÚÛoÙ> X¸ŽØ;=ø§¤o×ÂBRÕÉ”™áéù½R+Øžf{`à~` à§ÄÐw»ò7±t²fê!éyzw+Úžb{#`4ð°p“¤›%­QÆ6–L6ÐL½Ñc-`ûZbØ{1—ý2ð¨¤Ë%-Öû&–N6ÐL½14=÷Ø@aöÖÌÄBÒÒõöž‘t¨¤A½je‰dÍÔ½îA‹±ýŽí£IÃ]`>àBÂÑaãrÜ£3²fê²h´´=°3ð°p¤Ë$-RÎ{“ 4So ô³J\Üöï‰ùé™ÄÀ¾Ä°÷ JlËdÍÔéA‹±ý‘í ¿Þ›€K%­_Î{eÍÔ7жŸµ½-° ðo"bæ>I“$-ØyíÒÈš©7úÌ@ ؾX8˜Œž•´¿$uZ¹ ²fê>7PÛÚ>ø"p+áü`ФUzzÝl ™z£*ZÀö3¶¿Lx#½ lH89Ý“E¤l ™z£,Ž ½%y#­4sçw'Ň’Éš©7*ºÍÒl`û;ÀvDoº1á€ÿíR¯‘ 4SoTuˆÛ¶ÿBx"ý˜ ø©¤cK©› 4SoÔœØ~×ö>ÀA©èlI'vU/h¦Þ˜•žkî»-i`Çôò-àÏ]Õ©¹7‘Éô’BÏ9¤Ó³úIÛOóÑÿ[Ø~¤«zÙ@3õFM¨¤y%ý ø#°$p7°‘í”R?h¦Þ¨Mr)ORŸà#m¿Pê5W¨m™Lµ¨ºJZ8øF*ºØÇö³Ý½VîA3õFÁ@‡vzV4TÒñÀS„qþ8Ø´'Æ ¹ÍÔ…>íA%}¸X‰HÚtpŒí7{sÝl ™z£O‡¸’–&†³»¤¢ÇƒmO)Çõó7Soô‰J’¼ž&Œó=à0`r'ä4STÜ@SV´K€/¤¢+£m¿^î{eÍÔ3PIK绦¢©À!¶ï,÷½ ä!n¦Þ(»JšSÒqÄpvWà`,°f%rš©?ʶ͒äJöΖIÅ×GÚ~µ·×/…l ™z£,=¨¤- EùµRÑß Ãüko®Û]ò7SoôÊ@%5Jú#ðWÂ8_!\õÖêkã„܃fêOÓóÝ©”²kO Œqð>p0ÑöÇema7Èš©7ÞIÏ ”rrʦ=8šHà;ƒ¡oûŠ´°dÍÔo§ç…:;)e'Û—è5—HÅ×ÇÚ~¦rÍëÙ@3õF—*é+„ÊÞj©èA`¬í»+ܶn“‰2õÆ[é¹MêI[Kºøaœ/»Ö¢qBîA3õG¡]¸P é«ÀI„ˆ4DØiÀmW]ž³3d»ÚmÈdÊFæz‹P0쬙¿EDž\bûÝê´°{dÍÔ’^–-*úáCû#ÛT§U=#q3uERÏ[–Ø.™LÌ7[ͽÌÞ{ÐLÝ i0á’· pœísªÜ¤^“Wq3õÄ„q>\På¶”…܃fêIóÓˆýÏ]RRÝ~OîA3õÂ)„qÞU/Æ ¹ÍÔ)çæTbÑs]ÛV¹Ie#h¦_ © ,äF¿V(?~üfÀÁ¯½öÚV÷ÜsÏÂO?ýô/f̘±wõZY~ò6K¦æÑT ¸XMSµ´ýö„ ŽÎXb‰%5jÓ§O_¼ª ­yšéì ¬üxÿÚk¯dû âl3dÈ­Çÿ¹*´¯bdÍÔ4šª¹H=%p¢=ýÉ'Ÿ\‡f 8O‚ø>½ÃkIH:[Òù’–tޤ“%}·Ríï-yˆ›©uŽ–%ôgµýª¤%[kàÆN®µ«í#“+àÀ¶§KºWÒõ¶ÿ]öÖ÷’܃fjMÕbÀ±éåQnŒÍqãÆÍxâ‰'¦µSå¦qãÆ=ß¹i’–N±]¬_´Sy[_rš©e&ó7¸Ñw %-'iýÇ{ŒwÞùîáÇ–ô£X`rG²ýp©¤€'mÿ+]k`màç}'=$o³djMU#‘ˆÈÀjnl–!‘t5! }µíÝ[Tl=¸ ¸‰1“/os]é Áö¡éõvÀMÀƶï«ÐÛé1yˆÛ #’h1’†§aQ¦où>¡®7©•qnLç'ÀqíÔ;l×ÁuGÅjð›÷÷¾Éå'qÛrð0BÒÓ„ÒÛÜ’Þµ}au›60ÐT}ø ‘1ìÔÙåñ£y~z9ÑöK-*6^8*½:ŸV¤Ú/Ƥyo{»F‡’Ù@‹´uñÞÖö-’†/JºØö¬j¶±ÞÑT5ŠîgºÑÿ-:ü-`}àu⇴5gs×0fr{=âfÀ?“qîì[‹CÛÙ@[2‚XÊ߸Ãö-©|ÉôX“XîÏTŽ}ˆ^î%`öˆEÒ\4å‰m”šF¯ìEW·7ô…ÞÞjûIKÚþuY[^Ch„ÚžYíÆT›Â/©¤‘ÀmE‡6Oϯµ®“)šªaÀééå nô'E‡ÇÎ éå[s à"ÆL~±ƒ[Œ$zYŠ“¥´‚#€ €'lÿ¹Ço¢Ì‰v–ô¢¤‹%m“†t™‘Ä0·ÀæÀ‹¶³V–£ 釀ٽ[rH(ì‡ÑfšÑ4z` ÂðŒö.,i#¢gþ´Ã;ؾÛö€ÓÚq€¨Ý Xø.ðàŸ’”Ô­üõ€¤•ˆ¸Â‹ŠG2™ ¡©Z’è%¡È)!q±X÷{»y?€¦Ñƒ j€ñŒ™ÜF­OÒçˆÙ±Àjéu1+¦ÏÒ,ÏYu sÐ/¥ç˧äÕ'Iú>ÐÔ_E—zÀHâsYxEÒþ„ÎÍUlÓ@à4ÂçÆfiIk{Ÿ=lkÆ©èŸ~ÜÞ…m¿œÝÑm•î5ÑËУwPD| Ýþ\¶?“´p2a¬oôKk]è··HºŠ˜kšXÑmÎÎsôÊ¡©ZƒX|› 4ºÑÿœ},”à7γ=¶EŦÑó2'‹;2fò ½j‡t"pS­|/Bú2Ú¦øl Ü›ŽxÝú¼zz¯›wr\Õnc½=x‚[xó¶ú¬¿‘¾woó·©;iÔYž4Êž4êö2üßwVK/[íϤðh 9‡E!§ÅllÿÅö&ÀW I‰À5’î—´iù+ªKš.H;^%’6OÃýƒÚTÌôMÕöÀÖDÚÀ ³Ë¥¡„7À8Ûï´¨Ø4zYàp€¢HÚ™˜Ö­&é bÈ\èÛdûOÀÄxÿub9únI¿K_ê~Ozã€]SzºÙؾxZ…æÕ%šªA4áéntq'qÑ!< Lj§úYÀœÀ•Œ™ÜÛ!ér„-|XŒÚëLsš¶6=h1Ž9ØOÒíhbEl'àk’& O߬dc+ÌL`"±Ÿ6ØyÎÙì¬Jd»¸P(iàÄôò¨6ÿ‹¦Ñë»ùWNèm#l׬†nÍ™ˆÿWJÛÚ>Xø)±ÐtkwBòøèwØ~ÎöC¶¶]“ŽÓõ„¦jš‡´Ç¹±Åâã`>bÁ¦=§‚SÂDÆL~¹²-­. @a¯³[Û(¶_³}áþv0/±_õ¬¤}$åH™Lg, ÜïFÏŽã”ÔHlsÌ ½¹eÓèˆmÁÿÐÉÖI½Ð@D“LïìÄŽ°ý„íÂDÿ1BžâràQI[—¥•™ºBSµ pDzÙÚ'R3³Ÿjq¤iôšNaÌä~•©¬'ôÚ@ Øþ+°±©ü2±¨t‹¤É’–îU+kI Ãúå%-Zíöôs Q'׺ÑS …)3Ù6ÄŠî¸vêDü¦?ëƒvV²(€íY¶¬DLÞß'‚gŸ’tt?÷ñ]’Hew 1JÈôMÕ:„ŒægE¤Ìd祗§Ùn¹hÙ4z~"½ÀXÆL‹xe5ж?¶}±l} 0œš<–"Eú¶ÿn{JzÔÌ2|?¤°Às‰],ðu ñ}™FÑŠn';73frÍD›TšŠhÛ¯ÚÞ˜Ÿ>M,©ß.éW’–(÷ý2µ¦jGÂiýmšÃÊ iëOM/ǺYm/h½<ð=`Íõ‚š7ÞËn Òüô‹Àñ„#À·€§%ž†6™:GSUurš]¼­w2Ñ;ÞnûúvªŸEì6\ƘÉÿ¨lKk‹Šö ÅØžnûl"Áêo‰m™óGêÑm0Ó†‰µ‰iÀ …)3Ùw‰ÞñÈ6µšFoHˆ„}Hò€b0ÍÚ'Q*=Òo&¹Ã‹‰žõ.I¿Ž±ýF_´£4UãCªv[ê€yÓóqnl1„ý>ñü™íÇÚ©WX8:—1“_¯dk‘b­hÚÛ–´p 1ôÝ›s: øq¸Ú}˜ŸšÔ{ë—<íÆæäº’¶v>NjsvÓè]€WhPˆÌ>8Èv»¯o„´F¨G˜‡A¹í5s1Ó+ûýÂËäiö(±_~BZõo¦iôPà)Âa~_ÆL¾¢ï[;T­-Æö À)PüRBZñQI§ºU‘º<çÜs†}üñÇ7nÜ;]Ÿé&ûÆùíhØóÒ„wÚ/ú°]5…ˆœÿGˆ÷Výƒ4áîµ_*ºèMŸí«6œ~úéËÏœ9s,!ã8¸jРAçžtÒIÿì¢j¦R>”¡]»Ù¾¦Å M£$“¶bÌäÛÚ\d€Ðg«¸¥bû]Ûß&”Å_6î—ÔgBN3gμ8˜ÇöÜÀþ3gÎl“ç#ÓcŽ'ŒsJã N&ŒóÆlœCÜŠïƒö„¢E¤Ÿî‚·HšL…Û¹ä’KÎsÀlŸR³Ãl²Â +\ûüóÏw7›é’y€Ñ„ÂmŽ6^ÞΠ}‘°Å`š¥7kaÕ´¶ß•t¡ô>œØÖy­Þ1×\seëc»TòÞˆ÷wl?ØæˆÙ1x’1“Ÿîó–Õƒ‰_ªÂß5EÒŠ™DH[ÜMô¦5Ð^xAŸ~úé„9æ˜cáâòéÓ§¿?mÚ´hþ¼2=c.­oI»Ù¾ºÅÑA3›˜5h,ðšF¯>Ð<‡Z3˜f…šÑÚI¾™{¤¢ 5Á>Ñæ0a¶/¡ysýÃ!C†óÉ'ŸTeªÞô¡a{NJ=ßüÝÿº—hÚõbðQ„‹ß×:¸Ì€ æ9]M„‚I*(îAl` |½¯Œà”SNùå°aÖLêú‡Î9çœK7.gùø)ð`YÚs~ä3w¯òÓQ_js|! ‰˜cû'Ukˆ´,±öTt°_Ú#ÍÔ’¶n%|lWrQ2#šv=|pc&o\…&Öƒ©ršôO$–Öç&N~è¤"\ Ö?ò¡ÆfM$Ä«2½Á!L÷)slð·ó×|"ÂIÒõ„«ßÙÄ^|_s~؈I£vä;×¶åR÷TÕ@Ó¯è%4 ÿšY¬z1áu ùLoI‹âCõÙ1´”ÉKìwï™’#?4ûȘ>¢iôàR¤3¹vôŒ* ňˆ& íH¿Vù›Fz·‰Ä¶ „Ïå!¶oï‹û—ÊFGÜ¿¶T3‹gýÙë]¼?tÆg+ÜuÑ—fë''µþ±À}¶[eÇo1˜%y ø<ö~|çÚç,"àL³£­Ãr¹oÁÙ‡‚PóóñÀm¢è3uņGJÈ µ4¡ÕáŸ9X—¡{Ÿ >>þÖ 4P‹v 4;*”Õ@% ’ô=àBfñ#B™muÛ·”ó^™þÁ Á3O":„=6>ò¾Õ å)œ°0ì=VÒR-*޹öfÌmÀ‚àcúª½µ@EzPI_#~/"¶)~¬jûL×yàLÇÜ{îÆÏ!š€†Y4´XïH „¿'¶ÚÚ¦thhHº:œ¦ov¨)iI§¦‘Û’Æ&‡“¹ËøVúŒ²¨¤µ%ÝüØ|øªím¿ÔÛëgú?ƒfN <ľºÁ‘¶öKŒèö´~‹#\ýâ7ÀܨáÚAÒÊ„:àó„0ÝÀÄè­­¤J? ,*iÙ4Ï|˜øPþG|Ø«¦Ü¢™ ÷~ã7$„ÀZô”¶Ÿ.$v.Pë°¢œÌÀÚŸI»¬ØÎå¿ \EhI}dûÛ3Õ†o–÷ô ½2PIóI:›æyætbsÛçÙþ´l-ÍÔ ƒÏ<ÏèMá7:êþ¯·:|:ð¨¿{‹#M~ûr`0tF;—¾Ìö q쫊Ê7–jcðý€b/bë£$$ I @Ó€c Q᫉m“£l—”k430¹çœMÞoð¬Ól©ñ³c’±ýÍÃѳÛ̇ >ø¼ ?½fñ!ÛïHš“ÈgѡͿWÓu´§42ü –RAÒ7ˆh“‹€…»€ lïžÛ3¥òþüóN"抾w+?\~ "¼–ä£î;oÉ…c§Ÿ~úòÓ§O®¡¡¡xÞ8}ðàÁËŸx≯t|MÝI(pœL¤“8š[ì°N-S<Ä]¨ø€¤Õ$ýx’0Έ üçmÿ(g¦·Ø8¹bë„ }  `ÁÌ™3¿ÓÊ8†Ì˜1『®W4ÿÜ‹ÐØ2ðµþjœ iRþ>0LÒ¢’Ö‘táh°¡Áó`EÛ'ÛÍêà™Lo¹â7· yн„Z¯îvU1ÿü¯ígmÿ5=¦H!i#IÛ§ä~Aaõ¬†üib>ú àS"Vóó¶Ç´‰xÏdʄѱ€%¾Úø' Æó»öΕÔnyb[àvê, lû>¦mµ¥` w§ç€W‰ŒRËÛþžíW¥e™ÃרÖqÀÏŸ·jÁt­4g̘áiÓ¦]ÙÞ5Ò¶ßÊÀœ’ouø„g„§Òð²5¾ÂÈ6’ÖvníûE™úcüøñ‹K:ÀöNS¦LYrÊ”)‹ðÁãmŸÚÝk¥í–oÃàÓl¿ÝE•š@Ù3ýI›Br+÷$TQÒB„8Á¶o,o +CC×§d2ÕÇöÄ0unàœîÔM¾â‹Ú~‹ðx»°M¬Ù@3ý‰£‰ÅËÝ»™Lk+`dú{Qà¹2·«bdÍô’ûÞtíÒ1WHÚžXÅm½ˆT³ä9h¦_Ñ*·è^¶Û]Õ­ršéW$G™Ó˶Ñ.uF6ÐLärB!r)"ܱnÉCÜL¿$É¸Þ |Ll»Ô¥CMîA«Œ¤•$uèžiÛw×ùF»µíÒŸèw=¨¤}€} ‡§wÒ¡…€[€l¿Ó~í¾AR#UqKg¿ì’>O|¹v«µXEI+¿"V=·°ýH•›ÔIËiCæ6N¾¶uE¿3PIG ‹d<“—ÈUÀ,Û_©R»rw÷gŸØn£(—R\ ì“6ÐkIëïeZ•K•tpð °a½¹©ö×!î¦ÀÅ_šô%ÿ#°]Ê5Z Ž®îO‚i?N´XñIÉS«Æ™Ø˜ÒSã”4·¤µËܦ֜ ¼¬O×ÕýÎ@Óæôf„_fkv"û|Á -÷Ï™î½}*þˆØTÑêô]Wm?Õw-웽É8÷u`Ý2µ¥]Zm»œ%iX%ï××ô;¾HœÝQ\(é‹„^Ò¸* s¾IDm@$û˜¿AHÊs­üA%­(iïÔëÌ)i§6âÍ‘·N/-i/I‹tç (ØPÒž’æ¾Dï t Úÿ!-7WŸyÝm» ®vzÀHBâ I‹1¬›ưJAÍ­+R7o—'‡%ªH¬E(|Éö­©ì(àFÛ¯Ýw-àÍ$Ò\(JÎ_ ü—]Ò–¶Û¦Bhù^vû'£ž ü¸JÒwm?ÓUã“\ÈUÄÊèÝÀωÒ‡Kxï±’íg{Q¿$lÏJ1 wc%ýÔö¿*}ß¾ ¿èãDOU ñªÊ['|›P4ìŠK:¥„^ùlB ù‡i~:0 Ø¥Õy‡?nU¶±`´:áØÝhû½äjzíå*iÉÆ¶‘ô]`ÛHz Ý¿=‘çÖ\%•ïFè¹ÎcûƒNî¹&¡Uü°v¡Ç”ôbU{Ç.Ú¼!±êüùBÏ.éFÂ@»úq@‘¬už•u‰¤¼7•Ín²ý!@Òçˆm—9MlOé´B? ¿ÍAW§ùgâ5`+IËôi‹ŠH_ÔçØ>¿Ø8kO'€íÇÓŸ#i«ˆþrgÆ™ê?¬¼Wdœ „Ñ”²µ'±hU0ÎAtoþ9ˆ0ŠâdžÀ#í”W,ý‚íóÓËîD»Ô,ýmˆ;’ }¼c{ï†Ú)’vJÙ+}‡Ø ér›AÒF„A^$M_ô-Ýœu- °¸þrÀ’4 ¸‘®ws 턶ƽ1ô/¥þšÄü­ÀÚ„!="iþ®?Ò|ïŠâ2I»Û¾¨„{—›3}ˆ¬½ˆ¹x¿¥?è­çƒ’¶"£¾W¢^ïïèÀPZñI‰Æ¹ñ¥8°UÛ$B£ Œ 2Œ·ÇHà©Bïš vyb~Z #[‹^oÜjû¶ê¾Ü_ôzwà^Û3$œPb€Èª¼Ù:åÂö’N.#¶]®«Ôº/è*i ØøqòÂÈ ³-p p”íKJ¹^2º×»<±t&¤ë]%é-Â(7– zÁËÐñÃH`QI#€·€‹Ýmÿ+ WG+Âm†»’†¤û½þ^ø0* óÖVþ\¼¢\Äï‰I£I¹]%mAû£•®I˹¯¹‚XŒ[‡p9¹Šméýb‘HÒ´¿â:ðǽ·ƒ/^ÅI‹B‡Ø>/mÝìA¬OŽ·ýFѹ?~ÛÞâEZ5=X Ülû’æ¶$¶l(Þž)ª»1ad[ÛŸWÚ~7mÁü‘š¼ Øª=E;I[CÝ'ˆ¹ç‘D¤ÈÅÝÝW–ôc`b_l±tÒ†M‰í¢Oˆ¬{ý2t¿0Ðz!E­¼mûºVå˽î Ç$ý8¶=XËö¨vŽýØÛöÛ’~ØÐ޲ÃlR,ëQDxV ˆùçÌ®ŸBÿ&8†#RTK1ר®v¯º`z~ Åß^”Úº/p¢` í*úÛþ$-Œ­\D õ÷ž•t†B/¸ÏÈZ(-M¸VèänŒ-ñ#i)޽ð¡±Û½]o>¿ö³ýI‰m(fۭźk…v{ÐÖØ~ËöaÄX!‹Ú À4I§²Š“ ´6 LM¾¯—ž<÷HZ[ÒÅi1©³úC%m—”#bDç•´A*ÓAÝÛ€9$­ÎN,0­ ¼ÛÝ7’ÚY CÙŽ˜?=ÿ¯”“mO³½ 1ª¸ˆ}ý!ð„¤NåLËAÞ­ÒçBKg]àvÛo¦_éE‰í€³lOm§î$=\¼¸Ëög’Ž'žîô0°§í§Û¹Æ b5ø%Û¥}ÙÕÿoòÃZn’ðµÝèÏL\ÿ¸¢kí ±}EÏ>Ê"i&ñ .e¬ú»Bâ+¤¢»±¶,_+›É‹DµÁHàò4œ½5‘¶K^íb+tàG"¦Ö¸¥½ÔùWÚ»@ú¢^_ôú)à© Ž|p]ámèd¤%ÚxÝtªã[-Òþfàž'Qñ7’®&ÄȾÜŸäUŽq™3}ç!n•‘´*¡‡ûP/±--%3g“b!—%BÍöti9ffóÀÄõžÅ g¹a­ŽsÍ÷q ŸVÛïöôËß IϽZ¬²=Ýö…ÄÞó÷Óõvž’tLRV, yˆ[E$­ÌCÌ÷±ÝfÞ'éJÚâ&gô­ˆ-Ž¿ÚžØÁ}†¾SM¥½j“>‡÷lÏSÆë.G { ÂdOÿË^ïùfítd %Ô; h²ýqÒ.úíñid?@ÒÄêíÿl/ØÕù=¸þÄÒ*©è×Äü´Ç‹fyˆÛ?JKG€RY”æŒokóÃLaèÙ£Œm]‘zÌ5ˆ°¶ …þ§%ÑÓm™ÜƒÖ0iqgObuöB »d¥wE ÀUyÌ·mßQb½A„Lȶ„põ„n¶{N`åî´µ/H[@/ŽKWø^ˉœ þÐÿ †½wwë:Ù@3!é5`_ÛîAÝSˆayEz«žÔ^^´½|Ýs[b5}ÅTôK¿÷?¥ÔÏCÜL»$礪‰øÔž0…£«% Ó„>ûѰýÂùþd"•Æ^À3’¾—F*’ 4Ó›»‹Ü¤páÀ_K”e›¥»ØþÔöé„Ûà Ä”ã"àaEÚÊÉZHšGÒÞ’–O¯7’ôR~aÓù«JÚKÒ’†IÚE‘u»»íøœ¤}Ö6£×)J§Ö$;+ºHÔ)``G`b¨½&áÎ9Q‘$« Ù@kƒ“{?(Ò?,Fü» ù’´áà>¡¤0žQ%éàR ép"—Éà ٔÞîã­Øõ)}JU ´€í‰Þt-s$Þ¶7µU|N 'F9 ؼèØ4"2¤³úû+µG2s¥ò ?ÜRÚ°±Ê8$½Þ’ÎÝ‹÷5x®ÚŸo«6mLdc»·Úm)jÓĪ“±~ŸðÆvîAk€áÀ$`Sà1ÛwÂl¥‚åéZòäoßÙMIN ©|M`Ý®†ÉiKä,àgn^q]xÐöG=yC‰¥)Qž©‰´ÇVÔz„hÙ,"Ä𺑠´ÚØ~Í‘äw$-¶7%þ?­à[×,í—nF[E†gݵ_ìæ„¬JkE…;Ú=»t6!FµDÍ(Ìöí=™èáß¾üIÒðl µÃHÚ**¼BäíŠÕ‰/ßßZÕ¿¹„ºk €ÅÒ*# E…á¥.TµÃæt!×R ß÷®d`ªÅÓéðE`D6Ð@ÒÂ@#ðHz-‹ç—¶Ñ?x¼Ð[*,ÍCHyvÅkÄpvVª»¡:0…È[ÚÓïȺDM-Qø,ËmR.Ú#¡W€Ílÿ=ǃÖ›QÛHº 8‘èM//±þH`©äÊö ðà›¶ß,¡î#SˆÔJ„ÿèËÀÐas ž÷ƒ‹vž@Ó¨¶A73fòU-JBÕá.Ûï•Øþ¾¢æ 4m¯œI¨`ˆ1íà$“ ´6Iø¾~H¬ÆþÝö 0Û§sSÂ=í¾Ö‹æŸ{~ŸC€Ãl?Œ®‘X!þÛ‘´ý_Eöí‰Uĉ°©ƒ®Üwý{€ßt‘–t$-å>!:Ž/é÷-íIàAÙ‘´!ñ_‰æÜSmZ8'hm0gû·Å…É8—"†Š$­gû¢VuW'ÒDüÕáVVÌBð/’þ.i[Û¯µ¾yúµ¾¸¨¨ÙàšvÝyþÖuf3cV‹4 ’y]cŽò‰‚QU{Ðövðš÷q{²)ÕÞèB„j°H;Çötó~Ùýíœsps×^X(ýý$°t¼Ÿ+-ªý¹vжՈýÆTéþ"ö­ßHíøŒØâš³£:y‘¨Š$E…_óÏ ÓÞçll_i» Î¾­’þ$E…ï+J:²õõm? Ì-ip®+,¼,éPâG¤ÚêñQµ9¨¤5ˆÀƒËˆå¿_´}¼;“6­ö¯Z~”ôË;Ñ3Í׃º „WÑåÀ‚lã—KªýYuÑÆDÏÕgN„cü…D2d+´»–Z?÷ 5NŠÄ?0=º•«3ÍYgÙ~€FïW&"i%b%úðJ\¿ŒôiªHÁø4‘JÂDnÒ/ؾ¦Ôkd­}$”Í rˆv‡#%x¥r®woÚ>É=LöÛ‡ô‰Jj”tœ½815YÓöXwSY1¯âÖ0i?q—ô€Ò<ƒŠù°NšÛÞKÛdFeÁvI*í5@E·Y’jà©ÄÂÝ`àuB=áÊÎêuzÍ4NÎdêEâ£w÷m—5 ’¤]‰!ìRÄžæ O°n§Ï(&÷ ™DÙ÷A%mBŒT6LES€ƒ]¦}à<Í $Ê6•´¢¤ëˆ­“ ‰½Íý€MËeœ‡¸™†¤Y„Ã@ƒ{ðåO §‹wC!°ó³»»T yˆ›hL'‰†Ð ñ°Ø~ác<±mup²+è’‡¸™F¡—›¯Ó³ öž!ò¯Ìܬm{ßJ'dÍ < ™µ»ÌÍ’bc&ö3—%t›¾b{›rÎ3;#hf Q0Ð…::!ɘþÈ>¾6‘1|ÂÙ Û*û½!ÏA3{ÐÞw"aŒƒˆ|8çç¹wj=&hf ñVzžÝƒ&¡î〽‰¤™„Òâ8—˜C¥RdÍ 4^LÏ«HZøð-¦á`ç¸Fç}ÐÌ€"ek=ü”fÃ|©ï[Õ1Ù@3 Ióÿ#æ˜Ï‘B¸Y°+I6ÐÌ€CÒ¾ÀʼnšæÿŠ™?#_é½IEND®B`‚pplacer-1.1.alpha19/docs/_static/edpl_tree.png000066400000000000000000000052571303154601500212750ustar00rootroot00000000000000‰PNG  IHDRé¶<ïªÁsBIT|dˆ pHYsâ€æŒtEXtSoftwarewww.inkscape.org›î< ,IDATxœíÝ_ŒeÇñïsöO·”þ¡@Û…—®UDˆE„hj$1bˆ‘&\¨1š †oL¸@®LÃ… J¢‰ &à\ˆB"$$Æ`%b n©@»n»m—íöìy¼Z×ålÏŸ9ïsf~Ÿd“yŸÝî/óο÷5wGZ3³ ÀWÜýáÔµHµÔRÐGF€O¦.BªG! N! N! n°È›Ù€™"Ûè¡àÕÔEHõR`ÆÝo*¸ž0³-À©ëêQwW$8…´3ëÍl8uR- iû¦€S"ÕRô9ii¸{¸7uR=:’ЧЧЧЧЧЧЧЧ‡*`ÌlË xÕáp“G n>àþ»ž&mQH+ ÃË|æ@£Ç%IÒ ðìÞ‡ºß’ºé\©Bz‰Ùð»°5uÑ eGKéS¥ é}uß³ðàµÔ…HwJRˆ8™rx7u-‘Ôà¥8–ºéN©Bê0iBfö0}šUns÷Ù^Õ#1)¤iM»û·R!±©»+œB*œB*œÎI `fß®æ[¬ªß¿´¤?’b\ |ÏÝß>ÝJfö`oÊ‘~¦î®Hp ©Hp ©Hp:'MÌÌM]C—r÷'RQ iBzÚHÚ¡î®Hp ©Hp ©Hp ©Hp ©Hp ©Hp ©HpºO*¹7ÛÞ€§íôC¬˜ÁÁÿíþ£"Û‰B!•Ü8¬1êA; ÝN ©äépÏ>Í´ž+“ЧЧЧЧ GÖ°Ùõtwµø©y÷£yדŠB*‘ýØÒá6G€+=ù—“†º»Ù\Û´Fµï(¤ÙêÔD Jdg¦. …T"ëæï³t×YJ÷I©¼ <Ôá6 `²€Z’QH%²×çÝšºˆÔÔÝ N! NÝÝ zÆlË{¿_ƒóŸ„3:Ýî³ó°véò.öUF i5moÀã–]dÉÍ0t^ët;‡G >¾tùzõô…´’ ÎF€5yî·¬…]lº8wéÂ5pÚù]óbfS|{—»¿Ñ‹vÛ¥VÃF ~dVu±Ù:àÍ¥ ë½ëîNEž—G!­(˾ÞÏy·5ïb»'Ÿn’ý;ã\®Ò rØOö†ÉïóÜïŒî…—˜uôæÊ¹Y×ûCF6u¸¯Nèî!þžRH+Èàhþyµû“yî÷V³Ï×à>‡/w²ÝqØÐly ¾T‡¿åS]sÀ¾"ÛX)…TrSƒÏ^;¯“í>ï5[Þ€· fs)n¯ü1B…TrÓ€ëâ}Î+—¹ˆõ®ûÖ•WÕš™=Ø‹vº¥ûP’·áN7hTh ënèHZRÛÌVÕ³‹¸òÔŠf~Õáv_¦Ýål…ïPNi(¤%5›]i–¡ŸÃ·Á y·¹ÛýðëN·{Ãìš¼k)uwKʳ'¦—~L„éÇàXÒcYof—¦.b9:’–”Á‹ÜojöÙ³ÏNÀöûz]TPîþÕÔ5œŽŽ¤"Á)¤"Á)¤"Á šÙíÀ§S""Í ºû½EíÜôƒÈŠ©»+œB*œî“Jãÿ1{e%;0XåpãGÜ_Ê«¨(R‰ ¬_É †Ý ÝžB*É‚/ž½Â7a€18žOE±(¤’Üåî'èn”ÁJÐ…#‘àŠ>’Ö{y¯tÖ®‚{ÕžH/Rwÿz‘û_ÊÌ.š…¦o~ˆô+“JK›Ì.[ÈF™ï¹A˜|Ç}wж£PH¥¥ø‰Áe)Ú®Ã_«R´…B*-ÕÀV'j»òô;v¬èAYI¥¥l28”¢mÏžS¨4…TZ2ø3pW¢¶gR´‰B*í˜rß“ºˆªRH+¨Ÿ0صÙìûí¬opÎf³ï¸o+º6ù°²…t¸*ÀÜ£t7OgKf¶¸¹Õþמæuƒ#À0ÖAÓÖ••*¤î~¸:uf¶‹§ZèÀµÀÜ}‹–}Óà-‡:mN"ìÙü.Mç•â•*¤ÒžðÊ0ÜÐîú pWî?Ël¬¸ª õÃîoÙF?RH+è°û ðL»ëŸmö‡û{pSý}àÂâ›é/ i0f6 üŒe&Ö%;ßýeï*` ¸¸í¼Úƒ6úŽBÏfà/هfv7Åï6epÈáÍ¢Ûñ.æ6­…TZ„ëgWƒ UÓä¦RiéílÞQIDØ‹§#i1v÷˜Y7ƒkmžÏ¹éc iÜýà‘n¶5³íÀuùV$ýLÝ]‘àR‘àR‘àtN*§l5»Ó`§ÃüÉesî•,5…TN1¸Ö`‹Bê%_¥Ÿ(¤²Øó xÀaïɦ§€’SHe±£{÷¹ÿ=u!ò?ºp$œB*œB*œÎI+`ÔlK;ë­†µ 8{Ôl`Ò½òƒRG¡–ܨÙð2‹n«,§g.À-ÀåÀþ‚K“6)¤åwòÿø¼V+~0Fèá¥ËÇÍž6G&Ü?—cmÒ…´üµÀV+Z¶^³ë#4ÉÌjU§–ßð[à¶V+Âð§9xcÉGOßE6$¡VÃü¤ûr£ž2n6gpdÒ}iëml/ÅÐ-‘àt$•ÅÎ~5n6·hYlêCID!•Åæ øÿ‰{ëhÐê¤R9eÂýNàÎ¥ËÇÓÏRWi:' N! NÝÝò4³k0°);¯\‰Ñq³ç€É ÷y'íSHKÊÝoÏžÝ}`…»[\J6£›ô˜B*íø6Ù³»ï(…TZšp×-˜„táH$8…T$8…T$8…T$8…T$8…´‚¶™]1nöÔuH{Ò jdó½ìH]‡´G÷I+¨ûj°.uÒIE‚SHE‚Sw·äΛ…[Í^8¹¬ë þ˜².iŸBZrGÁk°Þ`ý¢Å«É†I‘> –Ü~8>_X²øSµ6F´—Ò’swö,^v¡Ùà¬4I§táH$8…´‚²‘n7{ö£fz¨!8…´‚à0\i°5q9Ò‚ÎI+h^nðìߘBZA¯¹ÏϤ®CÚ£î®Hp ©Hp ©Hp ©Hp ©Hp ©HpºÓ¦;Ìì½Ô…HOìQHûÏýè –*™UHûŒ»ÏûS×!½£sR‘àR‘àR‘àR‘àR‘àR‘àt &žiàz3»(çýîr÷=­W“hþ )ØôíJ²8IEND®B`‚pplacer-1.1.alpha19/docs/changelog.rst000066400000000000000000000000751303154601500176500ustar00rootroot00000000000000:tocdepth: 1 Changelog ========= .. include:: ../CHANGELOG pplacer-1.1.alpha19/docs/compiling.rst000066400000000000000000000046741303154601500177130ustar00rootroot00000000000000:tocdepth: 1 Compiling ``pplacer`` from source ================================= .. important:: We provide binaries on the `main pplacer site`_ and encourage their use. However, for those who want to be on the bleeding edge of development, here are instructions and scripts for setting up a compilation environment. Compiling ``pplacer`` requires a number of libraries and tools to be installed: * make * OPAM (:ref:`see below `) * `OCaml 3.12.1 or 4.01.0 `_ (installed via your package manager, compiling from source, or :ref:`OPAM`) * patch * m4 * gawk * `GNU Scientific Library (GSL)`_ (on Linux, the static library ``libgsl.a`` is required) * `libsqlite3 `_ (on Linux, the static library ``libsqlite3.a`` is required) * zlib (on Linux, the static library ``libz.a`` is required) On Debian/Ubuntu 12.04, everything but OPAM can be installed with: .. code-block:: bash apt-get install -y \ camlp4-extra \ gawk \ libgsl0-dev \ libsqlite3-dev \ libz-dev \ m4 \ make \ ocaml \ patch .. _OPAM: OPAM ^^^^ ``pplacer`` uses the `OPAM package manager`_ for installing OCaml dependencies. OPAM can also manage different versions of the OCaml compiler - ``pplacer`` is tested against version 3.12.1. See the the `official instructions `_ for installation details. Once OPAM is installed, it needs to be configured: .. code-block:: bash # Install version 3.12.1 of the OCaml compiler version if it's not active command -v ocamlc && ( ocamlc -version | grep -q 3.12.1 ) || opam switch install 3.12.1 opam init opam repo add pplacer-deps http://matsen.github.com/pplacer-opam-repository opam update pplacer-deps eval `opam config env` Building ``pplacer`` ^^^^^^^^^^^^^^^^^^^^ Once the dependencies above are installed, navigate to the checkout of ``pplacer``, and use OPAM to install the OCaml modules used by ``pplacer``: .. code-block:: bash cd /path/to/pplacer # Install required OCaml packages cat opam-requirements.txt | xargs opam install -y Finally, build ``pplacer``, ``guppy`` and ``rppr`` with:: make Now the binaries should be in the ``bin/`` directory. Put them in your path and you are ready to go! .. _GNU Scientific Library (GSL): http://www.gnu.org/s/gsl/ .. _main pplacer site: http://matsen.fhcrc.org/pplacer/ .. _OPAM package manager: http://opam.ocaml.org pplacer-1.1.alpha19/docs/conf.py000066400000000000000000000166221303154601500164730ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # pplacer documentation build configuration file, created by # sphinx-quickstart on Tue Feb 22 17:54:29 2011. # # 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. import os import re # 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. #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.pngmath'] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The suffix of source filenames. source_suffix = '.rst' # The encoding of source files. #source_encoding = 'utf-8-sig' # The master toctree document. master_doc = 'index' # General information about the project. project = u'pplacer' copyright = u'2011-2014, Matsen Group' # 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 = '1.1' def get_version(default=version): """ parse version """ version_file = '../common_src/version.ml' version_pattern = r'^let version = "(.*)"$' r = re.compile(version_pattern) if not os.path.exists(version_file): return default with open(version_file) as fp: for line in fp: m = r.match(line) if m: return m.group(1) raise ValueError("Couldn't find version in {0}".format(version_file)) # The full version, including alpha/beta/rc tags. release = get_version() # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. #language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: #today = '' # Else, today_fmt is used as the format for a strftime call. #today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns = ['_build','details'] # The reST default role (used for this markup: `text`) to use for all documents. #default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. #add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). #add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. #show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # A list of ignored prefixes for module index sorting. #modindex_common_prefix = [] # -- 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 = 'sphinxdoc' # 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 themes here, relative to this directory. #html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". #html_title = None # A shorter title for the navigation bar. Default is the same as html_title. #html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. #html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. #html_favicon = None # 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'] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. #html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. #html_use_smartypants = True # Custom sidebar templates, maps document names to template names. #html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. #html_additional_pages = {} # If false, no module index is generated. #html_domain_indices = True # If false, no index is generated. #html_use_index = True # If true, the index is split into individual pages for each letter. #html_split_index = False # If true, links to the reST sources are added to the pages. #html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. #html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. #html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. #html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). #html_file_suffix = None # Output file base name for HTML help builder. htmlhelp_basename = 'pplacerdoc' # -- Options for LaTeX output -------------------------------------------------- # The paper size ('letter' or 'a4'). #latex_paper_size = 'letter' # The font size ('10pt', '11pt' or '12pt'). #latex_font_size = '10pt' # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass [howto/manual]). latex_documents = [ ('index', 'pplacer.tex', u'pplacer Documentation', u'Erick Matsen, Aaron Gallagher and Noah Hoffman', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. #latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. #latex_use_parts = False # If true, show page references after internal links. #latex_show_pagerefs = False # If true, show URL addresses after external links. #latex_show_urls = False # Additional stuff for the LaTeX preamble. #latex_preamble = '' # Documents to append as an appendix to all manuals. #latex_appendices = [] # If false, no module index is generated. #latex_domain_indices = True # -- Options for manual page output -------------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ ('index', 'pplacer', u'pplacer Documentation', [u'Erick Matsen, Aaron Gallagher and Noah Hoffman'], 1) ] pplacer-1.1.alpha19/docs/details/000077500000000000000000000000001303154601500166125ustar00rootroot00000000000000pplacer-1.1.alpha19/docs/details/guppy.rst000066400000000000000000000222731303154601500205160ustar00rootroot00000000000000===== guppy ===== :Authors: Erick Matsen and Aaron Gallagher :Title: guppy :Version: 1.1 :License: GPL v3 :Date: September 2011 |guppy| is a tool for working with, visualizing, and comparing collections of phylogenetic placements, such as those made by pplacer_ or RAxML's EPA. "GUPPY" is an acronym: Grand Unified Phylogenetic Placement Yanalyzer. .. contents:: :depth: 3 :class: new Introduction ============ To use the statistical comparison features of |guppy|, it's a good idea to have a basic understanding of what the Kantorovich-Rubinstein (KR, a.k.a. earth-mover's distance) is doing, and how the edge PCA and squash clustering algorithms work. There is a gentle introduction in `Matsen and Evans`_, and a more full treatment in `Evans and Matsen`_. Here's a table to demonstrate the relation of |guppy| concepts to ones which may be more familiar to the reader: ======================== ============= familiar concept guppy concept ======================== ============= weighted UniFrac |KR| distance (kr_) UPGMA using UniFrac "squash" clustering (squash_) PCA using UniFrac Edge PCA (pca_) OTU alpha diversity Abundance-weighted phylogenetic diversity measures (fpd_) ======================== ============= This table does not show equivalences, but rather a list of hints for further exploration. For example, the KR distance is really a generalization of weighted UniFrac, and edge PCA is a type of PCA that takes advantage of the special structure of phylogenetic placement data. The heat tree (kr_heat_) and barycenter (bary_) have no analogs in previous types of phylogenetic microbial analysis. Usage ===== |guppy| does lots of different things-- it makes heat trees, makes matrices of Kantorovich-Rubinstein distances, does edge PCA, etc. Each of these have their own options. Rather than make a suite of little programs, we have opted for an interface analogous to git and svn: namely, a collection of different actions wrapped up into a single interface. There are two ways to access the commands-- through the command line interface, and through the batch mode. A list of these programs is below, and can always be found using ``guppy --cmds``. Command line interface ---------------------- The general way to invoke |guppy| is ``guppy COMMAND [options] placefile[s]`` where COMMAND is one of the |guppy| commands. For example:: guppy heat --gray-black coastal.jplace DCM.jplace These programs are listed with more detail below, and can always be found using ``guppy --cmds`` . |guppy| can also be invoked as ``guppy --quiet COMMAND [...]``, which prevents the specified command from writing to stdout unless explicitly requested. Batch mode ---------- It's easy to run lots of commands at once with batch mode. However, unlike running the equivalent set of commands on the command line, *placefiles are only loaded once per batch file run*. |guppy| will load a given file the first time it is used in a command. Batch files are files with one guppy command per line, specified exactly as would be written in a shell, except without the leading ``guppy``. Arguments can be enclosed in double quotes to preserve whitespace, and double quotes within quoted strings are quoted by doubling (e.g. ``"spam ""and"" eggs"``). Globbing (e.g. ``*.jplace``) is not allowed. Comments are also allowed in batch files; everything on a line after a ``#`` is ignored. An example batch file:: # Whole-line comment. pca -o pca -c some.refpkg src/a.jplace src/b.jplace squash -c some.refpkg -o squash_out src/a.jplace src/b.jplace classify -c some.refpkg some.jplace # inline comment If this was saved as ``example.batch``, it would be invoked from guppy as:: guppy --batch example.batch Advanced features ^^^^^^^^^^^^^^^^^ Batch files also have two unique features: virtual placefiles, and parameter substitution. Within a batch file, if a placefile is saved to or loaded from a path beginning with a ``@``, the data will be stored in memory instead of written to disk. For example:: merge -o @merged.jplace src/a.jplace src/b.jplace info @merged.jplace will effectively run ``guppy info`` on the placefile resulting from merging the two arguments, but without ever writing that merged file to disk. Additionally, parameters can be passed in from the command line to the batch file. On the command line, parameters are specified as additional arguments to guppy in ``key=value`` format. In the batch file, substitutions are done from identifiers in ``{key}`` format. For example, when a batch file containing :: info {k1} {k2} is invoked with :: guppy --batch example.batch k1=1.jplace k2=2.jplace the impact will be the same as running :: guppy 1.jplace 2.jplace Braces can also be quoted by doubling (e.g. ``{{foo}}`` will become ``{foo}``). Pqueries versus placements -------------------------- One of the key features of pplacer is that it is able to express uncertainty concerning placement in a reasonable manner. Specifically, if there is uncertainty in a given read's optimal placement, it returns a collection of placements that are weighted according to likelihood weight or posterior probability. This feature requires a bit of additional wording. We will use "pquery" to denote a "placed query (sequence)", i.e. the collection of weighted placements for a sequence. "Placement," on the other hand, signifies a single location on a tree along with its optimal pendant branch length. About multiplicities -------------------- pplacer and guppy support "multiplicities," i.e. multiple reads being treated as one. For example, if some reads are identical, they can be treated as a group. Doing so makes guppy operations *much* faster. By default, they are used "as is" for guppy calculations-- a single placement with multiplicity four is the same as four reads placed individually. However, if one would like to decrease the impact of multiplicities on downstream analysis (e.g. if PCR artifacts are suspected) one can use the ``--transform`` option of ``mft`` to choose a transform for the multiplicies before use. Doing so will convert your placements into labeled masses. .. _split-placefiles: 'Split' placefiles ------------------ It's often convenient to split up place files in all sorts of ways, but it's nice not to have to duplicate the information in the placefiles multiple times. For that reason, we have introduced "split" placefiles. The syntax for these is ``my.jplace:my.csv``, where the CSV file maps from query sequence names to the split placefile name. For example, say ``my.csv`` was like:: "read1","a" "read2","b" and ``my.jplace`` has placements for read1 and read2. Then ``my.jplace:my.csv`` would act like a list of two placefiles named a and b, with read1 and read2, respectively. Not every placement name in the place file needs to appear in the CSV file, so you can use this for subsetting. BIOM files ---------- Any command which expects a placefile (in both guppy and rppr) can also be given a `BIOM file`_. As BIOM files (unlike placefiles) do not contain a tree, it must be passed at the same time, with a colon delimiting the two paths. For example, to run ``guppy info`` on ``my.biom`` with a tree ``my.tre``, the invocation would be ``guppy info my.tre:my.biom``. Trees must be in the Newick format. As the BIOM format describes counts at leaves, the placements generated by parsing a BIOM file will all have zero distal branch length and zero pendant branch length. BIOM files will also automatically be split by sample. If a BIOM file has columns ``Sample1`` and ``Sample2``, that file will be interpreted as two placefiles, named respectively ``Sample1`` and ``Sample2``. phyloXML viewing notes ---------------------- |guppy| makes fattened and annotated trees to visualize the results of various analyses. We have chosen to use phyloXML as the format for these trees, as it has width and color tags for edges; if you see .xml files coming out of a guppy analysis that's what they are for. We like looking at these trees using the tree viewer archaeopteryx_. If you open archaeopteryx with the default settings, you will see *nothing interesting*: simply the reference tree. You need to click on the "Colorize Branches" and "Use branch-width" check boxes. If you don't see those check boxes, then use `this configuration file`_ (if you are going to copy and paste it click on "raw" first). List of subcommands =================== The following table provides links to more in-depth documentation for each guppy subcommand: .. command-table .. toctree:: :glob: :hidden: guppy_* .. |guppy| replace:: ``guppy`` .. |pplacer| replace:: ``pplacer`` .. |KR| replace:: Kantorovich-Rubinstein .. _kr: guppy_kr.html .. _fpd: guppy_fpd.html .. _squash: guppy_squash.html .. _pca: guppy_pca.html .. _kr_heat: guppy_kr_heat.html .. _bary: guppy_bary.html .. _pplacer: http://matsen.fhcrc.org/pplacer .. _this configuration file: https://github.com/fhcrc/microbiome-demo/blob/master/bin/_aptx_configuration_file .. _phyloxml: http://phyloxml.org/ .. _archaeopteryx: https://sites.google.com/site/cmzmasek/home/software/archaeopteryx .. _Evans and Matsen: http://arxiv.org/abs/1005.1699 .. _Matsen and Evans: http://arxiv.org/abs/1107.5095 .. _BIOM file: http://biom-format.org/ .. vim:set ai fo+=n fo-=l ft=rst: pplacer-1.1.alpha19/docs/details/guppy_adcl.rst000066400000000000000000000005651303154601500215010ustar00rootroot00000000000000This subcommand spits out a three column CSV file such as:: GLKT0ZE02ICPDW,0.243279,1 GLKT0ZE02GLVHA,0.243157,3 GLKT0ZE02HFAHN,0.242753,1 GLKT0ZE02GI5BZ,0.032986,1 GLKT0ZE02F6DFD,0.023905,2 where the first column is placement name, second column is distance to closest leaf, and third column is multiplicity. Pqueries are sorted by distance to leaf. pplacer-1.1.alpha19/docs/details/guppy_bary.rst000066400000000000000000000005611303154601500215270ustar00rootroot00000000000000Calculate the center of mass of the placement distribution and write it out to a phyloXML file for viewing. When several place files are given, calculate the barycenter for each, and mark them on the same tree. Because phyloxml isn't actually designed to show points on the tree, the phyloXML is a kluge for the time being-- using "speciation" and "duplication" tags. pplacer-1.1.alpha19/docs/details/guppy_classify.rst000066400000000000000000000116641303154601500224150ustar00rootroot00000000000000This subcommand outputs the classifications made by pplacer in a database. *The classifications made by the current implementation of pplacer are done with a simple, root-dependent algorithm. We are currently working on improved algorithms.* For best results, first taxonomically root the tree in your reference package (so that the root of the tree corresponds to the "deepest" evolutionary event according to the taxonomy). This can be done automatically the `taxit reroot` command in taxtastic. (Note that as of 27 May 2011, this requires the dev version of biopython available on github.) The classifications are simply done by containment. Say clade *A* of the reference tree is the smallest such that contains a given placement. The most specific classification for that read will be the lowest common ancestor of the taxonomic classifications for the leaves of *A*. If the desired classification is more specific than that, then we get a disconnect between the desired and the actual classification. For example, if we try to classify at the species level and the clade LCA is a genus, then we will get a genus name. If there is uncertainty in read placement, then there is uncertainty in classification. Classifiers =========== ``guppy classify`` has a variety of classifiers. .. glossary:: pplacer Takes placefiles as input and classifies using the method described above. When refining classifications for the ``multiclass`` table, first, all of the classifications with a likelihood of less than the value of ``--multiclass-cutoff`` are discarded. Next, if the value for ``--bayes-cutoff`` is nonzero, ranks below the most specific rank with bayes factor evidence greater than or equal to that cutoff are discarded. Otherwise, the likelihoods of remaining classifications are summed per-rank, and ranks with a likelihood sum of less than ``--cutoff`` are discarded. nbc Takes sequences via the ``--nbc-sequences`` flag and classifies them with a naive bayes classifier. The input sequences must be an alignment by default, either aligned to the reference sequences or include an alignment of the reference sequences (in the same manner pplacer does). If the ``--no-pre-mask`` flag is specified, the input sequences may be unaligned, and must not also contain reference sequences. When refining classifications for the ``multiclass`` table, for each rank, the best classification with a bootstrap above the value of ``--bootstrap-cutoff`` is selected. Ranks with no such classifications are discarded. rdp Takes the output of Mothur's `classify.seqs`_ via the ``--rdp-results`` flag and inserts the classifications into the database. This should be the ``.taxonomy`` file. Refinement for ``multiclass`` is done the same as for :term:`nbc`. blast Takes the output of BLAST_ via the ``--blast-results`` flag and inserts the classifications into the database. The output must be in outfmt 6. Refinement for ``multiclass`` is done the same as for :term:`nbc`. hybrid Still in flux. Sqlite ====== ``guppy classify`` writes its output into a sqlite3 database. The argument to the ``--sqlite`` flag is the sqlite3 database into which the results should be put. This database must have first been intialized using :ref:`rppr prep_db `. The following tables are populated by ``guppy classify``: * ``runs`` -- describes each separate invocation of ``guppy classify``; exactly one row will be added for each invocation. * ``placements`` -- describes groups of sequences. Each row will represent one or more sequences and indicate which classifier was used. * ``placement_names`` -- indicates which sequences are in this group of sequences and where each sequence came from. * ``placement_classifications`` -- indicates tax_id and likelihood for the :term:`pplacer` and :term:`hybrid` classifiers. * ``placement_evidence`` -- indicates bayes factor evidence for the :term:`pplacer` and :term:`hybrid` classifiers. * ``placement_position`` -- indicates placement position for the :term:`pplacer` and :term:`hybrid` classifiers. * ``placement_median_identities`` -- indicates sequence median percent identity for the :term:`pplacer` and :term:`hybrid` classifiers when run with the ``--tax-median-identity-from`` flag. * ``placement_nbc`` -- indicates tax_id and bootstrap value for the :term:`nbc`, :term:`rdp`, :term:`blast`, and :term:`hybrid` classifiers. * ``multiclass`` -- indicates the best classification and rank of classification from any classifier for a given sequence name and desired rank of classification. There might be multiple classifications for a particular sequence and desired rank, but only when using the :term:`pplacer` or :term:`hybrid` classifiers. .. _classify.seqs: http://www.mothur.org/wiki/Classify.seqs .. _BLAST: http://www.ncbi.nlm.nih.gov/books/NBK1763/ pplacer-1.1.alpha19/docs/details/guppy_compress.rst000066400000000000000000000021601303154601500224220ustar00rootroot00000000000000A cutoff *c* is specified via a command line flag. The `compress` command merges pairs of pqueries that have KR distance between them less than *c*. To compress the pqueries: * divide the pqueries into sets via :doc:`guppy_islands` or :doc:`guppy_mcl` * for each pquery set, calculate all of the pairwise distances between the pqueries for that island and put them in a matrix * build a graph such that the nodes are pqueries, and there is an edge between them if their distance is less than *c* * merge pqueries according to this graph as described below. Each original pquery (=node) will get merged into one of the the selected pqueries. This will happen as follows. Maintain a set of unmerged pqueries, and a set of pairs *(w, d(w))*, where *w* is a selected pquery and *d(w)* is the degree of *w* in the graph. * find the *(w, d(w))* pair with the greatest d(w) and remove it from the set * find all of the unmerged pqueries that are adjacent to *w* in the graph, and merge their mass into *w*. Remove *w* and all of the adjacent pqueries from the unmerged pquery set. * repeat! Stop when the unmerged pquery set is empty. pplacer-1.1.alpha19/docs/details/guppy_distmat.rst000066400000000000000000000032741303154601500222430ustar00rootroot00000000000000This subcommand provides distances calculated as the sum of branch lengths between all pairs of edges in a reference tree. The format of the output is a lower-triangular matrix of pairwise distances, in which margins correspond to edge numbers. Each distance is prefixed by either an S ("serial") or a P ("parallel"). Definition of these terms, as well as the procedure for calculating the distance from an arbitrary placement on the tree to any edge is as follows. A placement on an edge looks like this:: proximal | | d_p | |---- x | | d_d | | distal d\ :sub:`p` is the distance from the placement `x` to the proximal side of the edge, and d\ :sub:`d` the distance to the distal side. If the distance from `x` to a leaf `y` is an S-distance Q, then the path from `x` to `y` will go through the distal side of the edge and we will need to add d\ :sub:`d` to Q to get the distance from `x` to `y`. If the distance from `x` to a leaf `y` is a P-distance Q, then the path from `x` to `y` will go through the proximal side of the edge, and we will need to subtract d\ :sub:`d` from Q to get the distance from `x` to `y`. In either case, we always need to add the length of the pendant edge, which is the second column. To review, say the values of the two leftmost columns are a and b for a given placement `x`, and that it is on an edge `i`. We are interested in the distance of `x` to a leaf `y`, which is on edge `j`. We look at the distance matrix, entry (`i`, `j`), and say it is an S-distance Q. Then our distance is Q+a+b. If it is a P-distance Q, then the distance is Q-a+b. The distances between leaves should always be P-distances, and there we need no trickery. pplacer-1.1.alpha19/docs/details/guppy_edpl.rst000066400000000000000000000030261303154601500215150ustar00rootroot00000000000000 The expected distance between placement locations (EDPL) is a means of understanding the uncertainty of a placement using pplacer. The motivation for using such a metric comes from when there are a number of closely-related sequences present in the reference alignment. In this case, there may be considerable uncertainty about which edge is best as measured by posterior probability or likelihood weight ratio. However, the actual uncertainty as to the best region of the tree for that query sequence may be quite small. For instance, we may have a number of very similar subspecies of a given species in the alignment, and although it may not be possible to be sure to match a given query to a subspecies, one might be quite sure that it is one of them. The EDPL metric is one way of resolving this problem by considering the distances between the possible placements for a given query. It works as follows. Say the query bounces around to the different placement positions according to their posterior probability; i.e. the query lands with location one with probability :math:`p_1`, location two with probability :math:`p_2`, and so on. Then the EDPL value is simply the expected distance it will travel in one of those bounces (if you don't like probabilistic language, it's simply the average distance it will travel per bounce when allowed to bounce between the placements for a long time with their assigned probabilities). Here's an example, with three hypothetical locations for a given query sequence: .. image:: ../_static/edpl_formula.png pplacer-1.1.alpha19/docs/details/guppy_entropy.rst000066400000000000000000000010051303154601500222640ustar00rootroot00000000000000With :math:`\ell_e` as the branch length of an edge snippet and :math:`p_e` as the total mass on one side of the snippet, calculate phylogenetic entropy as described in `Allen, Kon, and Bar-Yam`_: .. math:: - \sum_e \ell_e \, p_e \log p_e and quadratic entropy as described in `Warwick and Clarke`_: .. math:: \sum_e \ell_e \, p_e ( 1 - p_e ). .. _Allen, Kon, and Bar-Yam: http://www.people.fas.harvard.edu/~ballen/NewPhylogenetic.pdf .. _Warwick and Clarke: http://www.int-res.com/articles/meps/129/m129p301.pdf pplacer-1.1.alpha19/docs/details/guppy_epca.rst000066400000000000000000000033551303154601500215060ustar00rootroot00000000000000Perform `edge principal components`_ analysis ("edge PCA"). Edge PCA takes the special structure of phylogenetic placement data into account. Consequently, it is possible to visualize_ the principal component eigenvectors, and it can find consistent differences between samples which may not be so far apart in the tree. Running this command produces the following files for a run with out prefix set to ``out``: out.trans The top eigenvalues (first column) then their corresponding eigenvectors. out.proj The samples projected into principal coordinate space. out.xml The eigenvectors visualized as fattened and colored trees. The ``--som`` flag triggers a Support Overlap Minimization (SOM) rotation of the principal components. Setting this value to ``n`` triggers a rotation of the first n principal component vectors such that the overlap in support (non-zero vector entries) between the vectors is minimized. This can make the projections easier to interpret from a biological perspective, but care should be taken not to rotate noise into more meaningful components (a good rule of thumb is not to rotate vectors with less than 10% of the variance). Acceptable values are 0 (no rotation; the default), 2 or 3. Looking at the output from the non-rotated principal components can help you determine what is most appropriate here. If 2 or 3 are specified, the follows files will also be output: out.som The rotated eigenvectors and corresponding variance values. out.som.xml The rotated vectors visualized as fattened and colored trees. See the :doc:`guppy_splitify` documentation for information about the ``--kappa`` flag. .. _visualize: http://matsen.fhcrc.org/pplacer/demo/pca.html .. _edge principal components: http://arxiv.org/abs/1107.5095 pplacer-1.1.alpha19/docs/details/guppy_fat.rst000066400000000000000000000012541303154601500213440ustar00rootroot00000000000000Given a list of place files, ``--average`` normalizes the mass in each, then takes the average of those masses to make an appropriately averaged fat tree for those place files. Expected Distance between Placement Locations (EDPL) values can be visualized on the tree by specifying a maximum value for the scale via the ``--edpl`` flag. The scale is represented by 0 EDPL being white, going to red for the maximum value. When EDPL is above the specified maximum, the branch is colored yellow. When there are multiple placements on a given edge, their EDPL values are combined using a weighted average, where the weights are the values of the ML weight ratio or posterior probability. pplacer-1.1.alpha19/docs/details/guppy_filter.rst000066400000000000000000000032111303154601500220520ustar00rootroot00000000000000This subcommand will filter pqueries in one or more placefiles. Placements can be filtered either by name or by tax_id. By default, all pqueries present in any input file will be present in the output file. In this case, adding :option:`-Er` or :option:`-Ex` flags will cause pqueries to be excluded from the output if they match any of the provided regexps or tax_ids. Adding :option:`-Ir` or :option:`-Ix` flags will re-add any pqueries which would have otherwise been excluded. If the options :option:`-Vr` or :option:`-Vx` are provided, the default will instead be to exclude all pqueries, unless (respectively) :option:`-Ir` or :option:`-Ix` are provided to include (respectively) specific placement names or tax_ids. In this case, adding :option:`-Er` or :option:`-Ex` flags will exclude pqueries which would have otherwise been included. Whether or not :option:`-Vr` or :option:`-Vx` have been provided, a placement will be included or excluded if *any* (as opposed to *all*) of the provided inclusions or exclusions match. When using the :option:`-Ix` or :option:`-Ex` options, it is required to also pass the :option:`-c` option to provide a reference package for looking up taxonomic data. The `--cutoff`` flag also controls whether :option:`-Ix` or :option:`-Ex` will match for a particular placement: neither flag will match unless the likelihood that the placement matches that tax_id is greater than the value provided for the `--cutoff` flag. Since pqueries can have multiple names, the :option:`-Ir` and :option:`-Er` flags will filter the names a placement has. If a placement has had all of its names filtered out, it won't be present in the output. pplacer-1.1.alpha19/docs/details/guppy_fpd.rst000066400000000000000000000026031303154601500213420ustar00rootroot00000000000000By default, ``guppy fpd`` outputs a matrix containing in each row: the placefile name, the phylogenetic entropy (``phylo_entropy``, `Allen 2009`_), the quadratic entropy (``quadratic``, `Rao 1982`_, `Warwick and Clark 1995`_) phylogenetic diversity (``unrooted_pd``, `Faith 1992`_), phylogenetic diversity which only requires distal mass (``rooted_pd``, this is as oppposed to ``pd`` requiring both distal and proximal mass), and a new diversity metric generalizing PD to incorporate abundance: balance-weighted phylogenetic diversity (``bwpd``). When passed a ``--theta`` flag and a comma-delimited list of values for ``theta``, a one-parameter family of functions is used to calculate a diversity measure that scales the incorporation of abundance from traditional phylogenetic diversity (at theta = 0.0) to abundance-weighted phylogenetic diversity (at theta = 1.0). A column labeled ``bwpd_[theta]`` is added to the output for each. When passed a ``--chao-d`` flag and a comma-delimited list of values for ``q``, the ``qD(T)`` measure of `Chao 2010`_ is added to the output for each value of ``q``. .. _`Chao 2010`: http://dx.doi.org/10.1098/rstb.2010.0272 .. _`Rao 1982`: http://dx.doi.org/10.1016/0040-5809(82)90004-1 .. _`Faith 1992`: http://dx.doi.org/10.1016/0006-3207(92)91201-3 .. _`Warwick and Clark 1995`: http://dx.doi.org/10.3354/meps129301 .. _`Allen 2009`: http://dx.doi.org/10.1086/600101 pplacer-1.1.alpha19/docs/details/guppy_heat.rst000066400000000000000000000004601303154601500215110ustar00rootroot00000000000000Makes For example, given a tree like so:: ((A:2{0},B:9{1}):7{2},C:5{3},D:1{4}):0{5}; and a CSV line:: "test",0,3,0,0,-6,1 this command run with a total width of 300 will put width 90 in red on the edge leading to B, width 180 in blue on the edge leading to D, and width 30 in red on the root edge. pplacer-1.1.alpha19/docs/details/guppy_indep_c.rst000066400000000000000000000020321303154601500221660ustar00rootroot00000000000000This is an implementation of the "independent contrasts" method of `(Felsenstein, 1985)`_. Assume we have the following pair of placements on a simple tree:: {"tree": "((A:2{0},B:9{1}):7{2},C:5{3},D:1{4}):0{5};", "placements": [{"p": [[0, -1309.83, 1, 1, 10]], "n": ["read1"]}, {"p": [[1, -1309.83, 1, 2, 10]], "n": ["read2"]} ], "version": 3, "metadata": {}, "fields": ["edge_num", "likelihood", "like_weight_ratio", "distal_length", "pendant_length" ] } And that ``ic.csv`` is a (possibly partial) list of tip values as follows:: A,3 B,0 D,1 Then, a run of ``indep_c`` will give you the maximum likelihood values of values at the tips assuming that the value changes by Brownian motion:: rhino2 ~/ic » guppy indep_c --leaf-values ic.csv ex.jplace sequence x read1 2.60377 read2 0.490566 Note that :doc:`guppy_mft` has the ``--leaf-values`` option to divide the placement weights by these inferred values. .. _(Felsenstein, 1985): http://www.jstor.org/discover/10.2307/2461605 pplacer-1.1.alpha19/docs/details/guppy_islands.rst000066400000000000000000000005371303154601500222320ustar00rootroot00000000000000Say that two pqueries overlap if there is an edge such that the two pqueries both put mass on that edge. Define the overlap graph to be the graph with nodes being pqueries and edges signifying overlap. Call the connected components of the overlap graph *islands*. That is, islands are maximal sets of pqueries with no edge-mass overlap between sets. pplacer-1.1.alpha19/docs/details/guppy_kr.rst000066400000000000000000000040121303154601500212010ustar00rootroot00000000000000 ``kr`` calculates the Kantorovich-Rubinstein distance between collections of placements (given by their place files) by its closed form formula .. math:: Z(P,Q) = \int_T \left| P(\tau(y)) - Q(\tau(y)) \right| \, \lambda(dy). This is a generalization of the UniFrac distance (UniFrac can only place mass at leaves and cannot accomodate uncertainty). There is a further generalization to an :math:`L^p` Zolotarev-type version: for :math:`0 < p < \infty` we have the distances .. math:: Z_p(P,Q) = \left[\int_T \left| P(\tau(y)) - Q(\tau(y)) \right|^p \, \lambda(dy)\right]^{\frac{1}{p} \wedge 1} which can be used to vary the impact of mass relative to transport. A larger :math:`p` increases the impact of differences of mass, while a smaller :math:`p` emphasizes distance traveled. Note that the significance p-values calculated by ``-s`` or ``--gaussian`` are not corrected for multiple comparison. The assessment of significance is tricky for metagenomic sampling. The randomization test (that seems to be very commonly used in association with UniFrac and that is implemented here with the ``-s`` flag) does not have wonderful properties when in the setting of incomplete sampling with non-independent observations. This is commonly the case for metagenomic sampling. Imagine, for example, that we have a random observation process on the tree equipped with some collection of "base observations." Each process takes a random subset of those base observations and then throws down some number of reads for each observation in that set, the number of which has mean >> 1. If the set of base observations is large compared to the number of sample observations, then two draws will always appear significantly different even though they are from the same underlying process. Thus I would only trust a rejection of the null when sampling is quite deep and the same primers are used for the experiments being compared. See `Evans and Matsen`_ for more details on phylogenetic KR. .. _Evans and Matsen: http://arxiv.org/abs/1005.1699 pplacer-1.1.alpha19/docs/details/guppy_kr_heat.rst000066400000000000000000000011631303154601500222060ustar00rootroot00000000000000Draw a "heat tree" in phyloXML format. A heat tree shows the optimal movement of dirt in the "earth movers" interpretation of the Kantorovich-Rubinstein distance. Imagine that the dirt is moving from the placement distribution corresponding to the first place file to that in the second. The branches are thickened in proportion to the amount of dirt which moves through that edge. Dirt moving on an edge towards the root is marked in red, and that moving away from the root is colored in blue. Said another way, clades which are highly represented in the first sample but not the second are colored red, and the others blue. pplacer-1.1.alpha19/docs/details/guppy_lpca.rst000066400000000000000000000035441303154601500215150ustar00rootroot00000000000000*This is an experimental feature. We are currently validating and writing a paper about it.* Perform length principal components analysis ("length PCA"). Length PCA takes the special structure of phylogenetic placement data into account. Consequently, it is possible to visualize the principal component eigenvectors, and it can find consistent differences between samples which may not be so far apart in the tree. Length PCA is similar to :doc:`guppy_epca` but is invariant to edge subdivision on the reference tree where edge PCA is invariant to branch length. Running this command produces the following files for a run with out prefix set to ``out``: out.trans The top eigenvalues (first column) then their corresponding eigenvectors. out.proj The samples projected into principal coordinate space. out.xml The eigenvectors visualized as fattened and colored trees. The ``--som`` flag triggers a Support Overlap Minimization (SOM) rotation of the principal components. Setting this value to ``n`` triggers a rotation of the first n principal component vectors such that the overlap in support (non-zero vector entries) between the vectors is minimized. This can make the projections easier to interpret from a biological perspective, but care should be taken not to rotate noise into more meaningful components (a good rule of thumb is not to rotate vectors with less than 10% of the variance). Acceptable values are 0 (no rotation; the default), 2 or 3. Looking at the output from the non-rotated principal components can help you determine what is most appropriate here. If 2 or 3 are specified, the follows files will also be output: out.som The rotated eigenvectors and corresponding variance values. out.som.xml The rotated vectors visualized as fattened and colored trees. See the :doc:`guppy_splitify` documentation for information about the ``--kappa`` flag. pplacer-1.1.alpha19/docs/details/guppy_mcl.rst000066400000000000000000000003131303154601500213400ustar00rootroot00000000000000Markov clustering done via the Markov Clustering Library `MCL`_ on the overlap graph (see the :doc:`guppy_ograph` documentation for information about the overlap graph). .. _MCL: http://micans.org/mcl/ pplacer-1.1.alpha19/docs/details/guppy_mft.rst000066400000000000000000000014071303154601500213600ustar00rootroot00000000000000 This is the power tool for splitting apart place files and applying mass transforms. If either the ``--transform`` or ``--unitize`` flags are specified, then the resulting placefiles will have mass instead of a name list. Otherwise, the output placefiles will have either mass or a name list depending on what the input placefiles had. To do nothing but transform the input placefiles to placefiles with mass instead of a name list, specify ``--transform no_trans``. One can use the ``--leaf-values`` flag to correct for copy number. This flag runs the internals of :doc:`guppy_indep_c` and then divides the masses of the placements by the inferred value, which can be copy number if you supply ``--leaf-values`` with a CSV file of copy numbers for reference sequences. pplacer-1.1.alpha19/docs/details/guppy_ograph.rst000066400000000000000000000005461303154601500220550ustar00rootroot00000000000000The overlap of a pair of pqueries is defined to be the inner product of their likelihood weight ratios (or posterior probabilities) as indexed by tree edges. This subcommand outputs all nonzero overlaps between pqueries in the form:: pquery_1 pquery_2 inner_product which is a specification of the weighted edges of a graph with pqueries as vertices. pplacer-1.1.alpha19/docs/details/guppy_rarefact.rst000066400000000000000000000012131303154601500223540ustar00rootroot00000000000000Calculate phylogenetic rarefaction curves. For every :math:`k \in [2, n]`, where n is the number of pqueries in a placefile, subsample the given placefile to contain every combination of :math:`k` pqueries and calculate the mean and variance of phylogenetic divesity for all of these subsampled placefiles. The ``rooted_mean`` and ``rooted_variance`` columns are respectively the mean and variance of the phylogenetic diversity only requiring mass on the distal side of the edge (which normally requires mass proximal and distal to the edge). For more details, see `Nipperess and Matsen`_. .. _Nipperess and Matsen: http://arxiv.org/abs/1208.6552 pplacer-1.1.alpha19/docs/details/guppy_rarefy.rst000066400000000000000000000001431303154601500220560ustar00rootroot00000000000000Rarefaction *with replacement*, which is necessary because we allow floating point multiplicities. pplacer-1.1.alpha19/docs/details/guppy_redup.rst000066400000000000000000000032721303154601500217130ustar00rootroot00000000000000From placefiles generated by running ``pplacer`` on a deduplicated sequence file, restore duplicated sequences to the placefiles. A script is included to deduplicate sequences: :ref:`deduplicate-sequences`:: scripts/deduplicate_sequences.py --deduplicated-sequences-file sample.dedup sample.fasta sample_deduped.fasta pplacer -c sample.refpkg sample_deduped.fasta guppy redup -d sample.dedup --prefix reduped_ sample_deduped.jplace If you wish to use :ref:`split-placefiles` in ``guppy`` analysis, specify a map using ``--split-map``, and at least one read from each group will be added to dedup file, and added in ``guppy redup``. By default, duplicate sequences are reduced to a single sequence per split with mass totalling all the identical sequences within the split. If you want to retain all sequence IDs after reduplicating, use the ``--keep-ids`` flag. The format for dedup files is very simple, for ease of reading and writing. Each dedup file is just a CSV file with three columns: the sequence name in the deduplicated file, the name to put in the reduplicated file, and the mass associated with the latter name. For most purposes, the ingoing mass will simply be the number of reads. For example with the following dedup file:: A_0,A_0,1 A_0,A_1,3 A_0,A_2,1 B_0,B_0,1 C_0,C_0,2 C_0,C_1,2 For one set of name/mass pairs, the transformation done is:: [A_0, 1] -> [A_0, 1; A_1, 3; A_2, 1] [B_0, 1] -> [B_0, 1] [C_0, 1] -> [C_0, 2; C_1, 2] And a more complicated example:: [A_0, 2; B_0, 1] -> [A_0, 2; A_1, 6; A_2, 2; B_0, 1] [C_0, 0.5] -> [C_0, 1; C_1, 1] [D_0, 1] -> [D_0, 1] Sequences with no changes need not be present in the dedup file. pplacer-1.1.alpha19/docs/details/guppy_round.rst000066400000000000000000000007011303154601500217150ustar00rootroot00000000000000This subcommand provides very basic "clustering" functionality. This is not meant to derive "species level" or analogous groupings, but rather to group placements which will have essentially identical impact in a guppy analysis. Rounding is done as follows: * throw out the placement mass below the ``--cutoff`` level * round the branch lengths to ``--sig-figs`` significant figures * group placements that are identical after this process. pplacer-1.1.alpha19/docs/details/guppy_sing.rst000066400000000000000000000002141303154601500215250ustar00rootroot00000000000000Only suggested for detailed analysis of a few sequences: because this makes one tree per query sequence, it can easily make very big files. pplacer-1.1.alpha19/docs/details/guppy_splitify.rst000066400000000000000000000021741303154601500224370ustar00rootroot00000000000000 The first step to perform edge PCA is to make a matrix with rows indexed by the samples, and columns by the edges of the tree. The :math:`(s,e)` entry of this matrix is the difference between the distribution of mass on either side of edge :math:`e` for the sample :math:`s`. Specifically, it is the amount of mass on the distal (non-root) side of edge :math:`e` minus the amount of mass on the proximal side. The matrix is indexed such that the first numerical column is edge labeled 0 in the reference tree. The ``splitify`` subcommand simply writes out this matrix. Specifying ``--rep-edges x`` will only take representatives from collections of neighboring edges whose Euclidean distance between splitified columns is less than ``x``. The ``--kappa`` option enables a componentwise transformation :math:`\varphi_\kappa` on the entries of this matrix. .. math:: \varphi_\kappa(x) = \mathrm{sgn}(x) |x|^\kappa where the :math:`\kappa` parameter can any non-negative number. This parameter scales between ignoring abundance information (:math:`\kappa = 0`), using it linearly (:math:`\kappa = 1`), and emphasizing it (:math:`\kappa > 1`). pplacer-1.1.alpha19/docs/details/guppy_squash.rst000066400000000000000000000007021303154601500220730ustar00rootroot00000000000000Perform `squash clustering`_. Bootstrapping is performed by resampling directly on placements. Note that the bootstrap values for clustering are calculated in a rooted way. That means that you may observe different bootstrap values on either side of the root, especially if a whole clade from one side of the root likes to flip to a location distal to the clade on the other side of the root. .. _squash clustering: http://arxiv.org/abs/1107.5095 pplacer-1.1.alpha19/docs/details/guppy_tog.rst000066400000000000000000000000421303154601500213550ustar00rootroot00000000000000Only the best placement is used. pplacer-1.1.alpha19/docs/details/guppy_trim.rst000066400000000000000000000021231303154601500215410ustar00rootroot00000000000000This subcommand is a quick root-dependent way to trim the reference tree to what is relevant for a collection of placements. The first step is to select a collection of leaves that will be present in the trimmed tree. Convert all of the placements into mass by unitizing mass for each placerun individually and then take the overall average of those collections of masses. Then select any leaf for inclusion that has at least ``--min-path-mass`` on the path from the root to the leaves. Once those leaves are selected, we take the induced subtree on those leaves. That is, if we were to take the induced subtree of :: ^ / \ /\ \ ab /\ c d with the leaf set {a,d}, we would get the tree :: ^ / \ / \ a \ d with the branch lengths induced by adding branch lengths along edges that are not bifurcating. This trimmed tree is then put in the placefile. Note that even though the tree is different than the one in the reference package, we have arranged things so that it's possible to use reference package *C* with a tree that has been trimmed from *C*'s tree. pplacer-1.1.alpha19/docs/details/pplacer.rst000066400000000000000000000656531303154601500210110ustar00rootroot00000000000000 Introduction ------------ Pplacer places query sequences on a fixed reference phylogenetic tree according to a reference alignment. In maximum likelihood (ML) mode, pplacer tries to find the attachment location and the pendant branch length which maximize the likelihood of the tree with pendant branch length attached. In Bayesian posterior probability (PP) mode, pplacer tries to find the edge attachment which maximizes the posterior probability of a fragment placement on an edge conditioned on the reference tree (with branch lengths). A basic pplacer run looks like:: pplacer -c my.refpkg aln.fasta with a reference package. Running pplacer with a reference package is simple and produces taxonomic annotations which can be used for classification and visualization (see, for example classify_ and fat_). If you wish to override specific parts of the reference package, you can do so with command line options. A "reference package" is simply a collection of files including a reference tree, a reference alignment, and associated taxonomic information. We have the beginnings of a `reference package database`_ which we hope in the future to be a comprehensive resource for phylogenetic placement. It's just started, and we would love to have your submissions. For now most users will have to make a reference package using our taxtastic_ package. The ``aln.fasta`` is the alignment file. It should have the reference sequences which were used to make the reference tree, aligned with the query sequences to be placed on the reference tree. The reference sequences must have identical names to those used in the reference tree. It's possible to split the alignment into two files (the reference sequences and the query sequences); in that case you need to make sure that those alignments are in the same frame and have the same length. This splitting was obligatory in v1.0. The alignment can be in FASTA format (with a ``.fasta`` or ``.fa`` suffix) or Stockholm format (with a ``.sto`` or ``.sth`` suffix). Migrating from pplacer v1.0 --------------------------- There are a couple of differences between the present version and the previous version of pplacer which are worth knowing about. * Rather than having a plain text ".place" output file, we now have a JSON_-format file which contains the placements * Reference packages encapsulate reference information, making it easy to do placement and taxonomic annotation * Alignments can now be supplied as a single file, rather than being split into reference and query alignments * Much better: faster, taxonomic integration, etc * ``placeviz``, ``placeutil`` and ``mokaphy`` have been replaced by a single binary called ``guppy`` * ``rppr`` binary for preparing reference packages Pre-masking and masking ----------------------- One of the primary design goals of pplacer is to have it work efficiently and consistently when placing short reads in what might be a longer alignment. As part of achieving these design goals, we have put effort into two masking procedures, which are fairly strict in their interpretation of what is informative in a sequence alignment. Specifically, we consider columns that are gap in a query sequence or all gap in the reference alignment to not be informative for the placement of that query sequence. This is a different statement than saying that a column does not impact the phylogenetic likelihood, and indeed columns that are all gap except for one sequence do change the likelihood in all implementations that interpret gaps as missing data (this is true for essentially all phylogenetic inference software). We call the first procedure "pre-masking," and it ignores columns that are all gap in either the reference alignment or the query alignment. This has been the default behavior since v1.1alpha08, but it can be disabled with the ``--no-pre-mask`` flag. You can see the effect of pre-masking by supplying a file name to the ``--write-pre-masked`` flag. However, in certain situations this can lead to sequences other than the given sequence influencing the likelihood. Specifically, imagine that we have two sequences A and B that are non-gap in column sets X and Y, respectively, and that there are no all-gap columns in the reference alignment. Say that X and Y are disjoint sets. If we ran pplacer with pre-masking on A alone, or B alone, the alignment columns would be subset to X and Y, respectively. However, if we run them together, the columns would be subset to the union of X and Y. Then, when we are placing A in the presence of B, A's gap entries in Y will influence the likelihood (similarly for B in the presence of A). These effects are subtle but nonzero. Therefore, we have a second procedure, which we call "masking," that only computes likelihoods for the columns in each placement that are informative in that placement. This ensures identical behavior when sequences are run separately or together, and also makes things faster. This is now the default behavior, and you can see the results of masking by supplying the ``--write-masked`` flag. (Careful when using this, as it will make one fasta file for each query sequence.) Groups ------ When placing metagenomic sequences onto trees built from very wide alignments (such as concatenations), we suggest using the "groups" feature. Using, say, ``--groups 5`` will divide the alignment into 5 evenly spaced sectors across the width of the alignment. The reads are then grouped into which sector they fit into best, and each group is run sequentially. In combination with the pre-masking, this can result in a very substantial reduction of memory usage, because the likelihood vectors are calculated for one sector (plus a bit extra) at a time. Note that these gains will be eliminated if you have reads that span the whole reference alignment. Using this feature will not change the result except possibly for likelihood computations where the query sequence has a gap; these likelihoods are not meaningful, so if there is a substantial difference when you use groups your alignment is lacking signal! JSON_ format specification -------------------------- The JSON format is described in detail in our paper on the `phylogenetic placement format`_. Each document is a JSON object with a minimum of four keys: ``tree``, ``fields``, ``placements``, and ``version``. Another key, ``metadata``, is optional. Other keys in the root object are ignored. =================== ===== Key Value =================== ===== ``version`` The version of the JSON format as an integer. ``tree`` The reference tree as a string, in "edge-numbered Newick" format. ``placements`` An array of placements. ``fields`` An array of strings corresponding to the data given in the placements array. ``metadata`` An object containing metadata about the generation of this collection of placements. =================== ===== An "edge-numbered Newick" tree is simply a Newick format tree with integers in curly braces which provide a well-defined numbering of edges. These edge numbers are used to specify the edges on which the placements lie. Currently there are three versions of the placefile format accepted by ``guppy`` and ``rppr``: ``1``, ``2``, and ``3``, though only version 3 will be generated. Differences between versions ``1`` and ``2`` ```````````````````````````````````````````` There are only two differences between versions 1 and 2: the format of the Newick tree in the ``tree`` field has changed, and ``marginal_prob`` was renamed to ``marginal_like`` in version 2. Version 1 used a slightly different version of edge-numbered Newick trees for the ``tree`` field, where edge numbers were specified in square brackets instead of curly braces. Both this kind of Newick tree and version 1 of the JSON format are now deprecated. Differences between versions ``2`` and ``3`` ```````````````````````````````````````````` Version 3 replaces the separate ``n`` and ``m`` keys in placement objects with a more general ``nm`` key that can associate mass with each name. Format summary `````````````` The pplacer suite currently uses the following field names: ===================== =========== Field Description ===================== =========== ``edge_num`` The edge number from the provided ``tree`` as an integer. ``likelihood`` ML log likelihood as a float. ``like_weight_ratio`` ML likelihood weight ratio as a float. ``distal_length`` ML distance from the distal side of the edge as a float. ``pendant_length`` ML pendant branch length as a float. ``post_prob`` The posterior probability of a placement on the edge. ``marginal_like`` The marginal likelihood of a placement on the edge. [#f1]_ ``marginal_prob`` The marginal likelihood of a placement on the edge. [#f2]_ ``classification`` The ``tax_id`` from a reference package as a string. ``map_ratio`` The percent identity between this sequence and the corresponding MAP sequence. ``map_overlap`` The number of overlapping sites between this sequence and the corresponding MAP sequence. ===================== =========== For ``guppy`` to be able to load a JSON file, it must have ``edge_num``, ``likelihood``, ``like_weight_ratio``, ``distal_length``, and ``pendant_length`` fields. All other fields are optional, but if one of ``post_prob`` and ``marginal_like`` are specified, both must be specified. Each entry in the ``placements`` array is an object with the following keys: ====== ===== Key Value ====== ===== ``n`` A string or array of strings corresponding to the name or names of the sequences placed here. [#f5]_ ``p`` An array of arrays containing placement data in the same order as ``fields``. ``m`` *(optional)* A float that represents the mass of this placement. If this key is specified, ``n`` must only be or contain a single string. [#f1]_ [#f4]_ ``nm`` An array of ``[name, mass]`` pair arrays representing the mass for each sequence placed here. [#f3]_ ====== ===== An example JSON document follows, with the first placement showing uncertainty in location, and the second showing two reads that had identical placements but different masses:: { "tree": "((A:0.2{0},B:0.09{1}):0.7{2},C:0.5{3}){4};", "placements": [ {"p": [[1, -2578.16, 0.777385, 0.004132, 0.0006], [0, -2580.15, 0.107065, 0.000009, 0.0153] ], "n": ["fragment1", "fragment2"] }, {"p": [[2, -2576.46, 1.0, 0.003555, 0.000006]], "nm": [["fragment3", 1.5], ["fragment4", 2]]} ], "metadata": {"invocation": "pplacer -c tiny.refpkg frags.fasta" }, "version": 3, "fields": ["edge_num", "likelihood", "like_weight_ratio", "distal_length", "pendant_length"] } .. [#f1] New in format version ``2``. .. [#f2] Removed in format version ``2``. .. [#f3] New in format version ``3``. .. [#f4] Removed in format version ``3``. .. [#f5] This key will not ever be generated by any program in the pplacer suite as of format version ``3``, but will continue to be accepted by ``guppy`` and ``rppr``. Making alignments for use with pplacer -------------------------------------- There are several options and formats for providing alignments of reference and query sequences. Examples below illustrate various steps in the sequence alignment process. Examples using Infernal ``````````````````````` Infernal_ is an excellent package for searching and aligning sequences using RNA secondary structure information. Creating a reference alignment '''''''''''''''''''''''''''''' The first step in any pipeline involving Infernal (assuming you already have an alignment profile but are not working from a reference package) is to create an alignment of reference sequences. See the Infernal docs for a description of options not mentioned here. For example:: cmalign --hbanded --sub --dna -1 -o refalign.sto profile.cm refseqs.fasta Inputs to this command include an alignment profile (``profile.cm``) and unaligned reference sequences (``refs.fasta``). The output file, identified using the ``-o`` option, contains the aligned reference sequences in Stockholm format. The ``-1`` (that's a one, not an L) specifies non-interleaved output, one sequence per line. Merging reference and query sequences ''''''''''''''''''''''''''''''''''''' Query sequences must be aligned with respect to the reference sequences. This is easily accomplished using two calls to cmalign. First, align the query sequences just like the reference sequences above:: cmalign --hbanded --sub --dna -1 -o qalign.sto profile.cm qseqs.fasta Next, merge the reference and query alignments using the ``--merge`` option:: cmalign --merge --hbanded --sub --dna -1 -o merged.sto profile.cm refalign.sto qalign.sto Now ``merged.sto`` contains a single alignment of both reference and query sequences, and can be used with pplacer as follows after making a reference tree and accompanying statistics file:: pplacer -t reference_tree -s statistics_file merged.sto Using a reference package ''''''''''''''''''''''''' A closely related example involves alignment with the profile and reference sequences included in a reference package (``my.refpkg`` - note that names may vary in a reference package). So now we skip creation of the reference alignment. First, create the query alignment:: cmalign --hbanded --sub --dna -1 -o qalign.sto my.refpkg/profile.cm qseqs.fasta ...then merge:: cmalign --merge --hbanded --sub --dna -1 \ -o mergedWithRefpkg.sto \ my.refpkg/profile.cm my.refpkg/refalign.sto qalign.sto Now it is even easier to write the pplacer command:: pplacer -c my.refpkg mergedWithRefpkg.sto Examples using HMMER ```````````````````` HMMER_ is another excellent package for searching and aligning sequences by the Eddy group, which can align amino acid and nucleotide sequences. Assume that we have a reference alignment ``refseqs.sto`` in Stockholm format. We first build an HMM:: hmmbuild refseqs.hmm refseqs.sto Then we can use it to make a combined alignment with the reference sequences and the reads:: hmmalign -o combo.sto --mapali refseqs.sto refseqs.hmm qseqs.fasta Now we can run pplacer:: pplacer -t rpoB.tre -s RAxML_info.rpoB combo.sto ... or with a reference package:: pplacer -c rpoB.refpkg combo.sto Making reference trees ---------------------- FastTree ```````` We save the log file so it can get parsed and become part of the reference package. Nucleotide alignments ''''''''''''''''''''' FastTree should be used in the following way when making nucleotide reference trees for use with pplacer:: FastTree -nt -gtr -log vaginal.log vaginal.fasta > vaginal.tre In particular, do not use the ``-gamma`` option, but do use the ``-gtr`` option. Amino Acid alignments ''''''''''''''''''''' FastTree should be used in the following way when making amino acid reference trees for use with pplacer:: FastTree -log TIGR00001.log TIGR00001.fasta > TIGR00001.tre Again, ``-gamma`` should not be used. phyml and RAxML ``````````````` PHYML_ and RAxML_ are two nice packages for making ML trees that are supported for use with pplacer. Pplacer only knows about the GTR, WAG, LG, and JTT models, so use those to build your trees. If you are fond of another model and can convince me that I should implement it, I will. Both of these packages implement gamma rate variation among sites, which accomodates that some regions evolve more quickly than others. That's generally a good thing, but if you have millions of query sequences, you might have to run pplacer with fewer rate parameters to make it faster. I run RAxML like so, on similar alignments (the "F" suffix on PROTGAMMAWAGF means to use the empirical amino acid frequencies):: raxmlHPC -m GTRGAMMA -n test -s nucleotides.phy raxmlHPC -m PROTGAMMAWAGF -n test -s amino_acids.phy pplacer does not support using the CAT model from RAxML, although a similar model is available via FastTree. PHYML can be run like so, on non-interleaved (hence the -q) phylip-format alignments:: phyml -q -d nt -m GTR -i nucleotides.phy phyml -q -d aa -m WAG -i amino_acids.phy Note that pplacer only works with phyml version 3.0 (the current version). Both of these programs emit "statistics files": files that describe the phylogenetic model used. Pplacer then uses those same statistics to place your reads. For RAxML, they are called something like ``RAxML_info.test``, whereas for PHYML they are called something like ``test_aln_phyml_stats.txt``. If your taxon names have too many funny symbols, pplacer will get confused. We have had a difficult time with the wacky names exported by the otherwise lovely software geneious_. If you have a tree which isn't getting parsed properly by pplacer, and you think it should be, send it to us and we will have a look. Avoid giving pplacer a reference tree with lots of very similar sequences. It's a waste of time-- pplacer must evaluate the resultant branches like any others. Identical sequences are especially bad, and the resultant zero length branches will make pplacer complain. If you give pplacer a reference tree which has been rooted in the middle of an edge, you will get a warning like:: Warning: pplacer results make the most sense when the given tree is multifurcating at the root. See manual for details. In pplacer the two edges coming off of the root have the same status as the rest of the edges; therefore they will counted as two separate edges. That will lead to artifactually low likelihood weight ratio and posterior probabilities for query sequences placed on those edges. This doesn't matter if your query sequences do not get placed next to the root, but you can avoid the problem altogether by rooting the tree at an internal node, or by leaving the outgroup in and rerooting the output trees. Baseball -------- "Baseball" is one way that pplacer substantially increases the speed of placement, especially on very large trees. Baseball is a game where the player with the bat has a certain number of unsuccessful attempts, called "strikes", to hit the ball. Pplacer applies this logic as follows. Before placing placements, the algorithm gathers some extra information at each edge which makes it very fast to do a quick initial evaluation of those edges. This initial evaluation of the edges gives the order with which those edges are evaluated in a more complete sense. We will call full evaluations "pitches." We start with the edge that looks best from the initial evaluation; say that the ML attachment to that edge for a given query has log likelihood L. Fix some positive number D, which we call the "strike box." We proceed down the list in order until we encounter the first placement which has log likelihood less than L - D, which we call a "strike." Continue, allowing some number of strikes, until we stop doing detailed evaluation of what are most likely rather poor parts of the tree. You can control the behavior of baseball playing using the ``--max-strikes``, ``--strike-box``, and ``--max-pitches`` options. If, for any reason, you wish to disable baseball playing, simply add ``--max-strikes`` to zero (this also disables the ``--max-pitches`` option). Having control over these options raises the question of how to set them. The answer to this question can be given by pplacer's "fantasy baseball" feature. To gain an understanding of the tradeoff between runtime and accuracy, it analyzes all ``--max-pitches`` best locations. It then runs the baseball algorithm with each combination of strike box (from 0 to the specified ``--strike-box``) and max strikes (from 1 to the specified ``--max-strikes``). Using these different settings the program reports - the "batting average," i.e. the number of times the baseball algorithm with those settings achieved the optimal location obtained by evaluating all ``--max-pitches`` best locations; found in the file prefix.batting_avg.out - the "log likelihood difference," i.e. the difference between the ML log likelihood achieved by the baseball algorithm with those settings compared to the best obtained by evaluating all ``--max-pitches`` best locations; found in the file prefix.like_diff.out - the "number of trials," i.e. the number of locations fully evaluated by the baseball algorithm with those settings; found in the file prefix.n_trials.out The fantasy mode is invoked by telling pplacer what average likelihood difference you would like via the ``--fantasy`` option. You can also tell it to run an evenly-spaced fraction of the query sequences in fantasy mode using the ``--fantasy-frac`` option, which gives you an idea of the optimal run parameters for the rest of the sequences. For example:: pplacer --max-strikes 10 --strike-box 10 --fantasy 0.05 --fantasy-frac 0.02 -r example.fasta... says to run pplacer trying all of the combinations of max strikes and strike box up to 10, looking for the optimal combination which will give an average log likelihood difference of 0.05, and running on 2% of the query sequences. If, for any reason, you wish to disable baseball playing, simply add ``--max-strikes`` to zero (this also disables the ``--max-pitches`` option). You can use R to plot these matrices in a heat-map like fashion like so:: ba > read.table("reads_nodups.batting_avg.out") image(x=c(0:nrow(ba)-1),xlab= "strike box", ylab= "number of strikes", \ y=c(1:ncol(ba)-1),z=as.matrix(ba), main="batting average") Note that we have set things up so that turning on posterior probability with ``-p`` now changes the default search parameters to make a deeper search as follows:: --keep-at-most 20 --keep-factor 0.001 --max-strikes 20 You can set these to anything you like by using these flags *after* the ``-p``. Fig ranking ----------- "Fig ranking" is a way to reduce the number of initial comparisons done by using the structure of the reference tree. This initial phase is not the bottleneck for trees on a thousand or so taxa, but it is for trees on tens of thousands of taxa or more. If a value is specified as ``--fig-cutoff x``, pplacer will find subtrees of the reference tree (that we call figs) on the reference tree such that no two leaves in the cluster have a distance of greater than ``x``. Each leaf is contained in exactly one fig. A representative edge of the fig is chosen as follows: say *n* is the most proximal node contained in the fig; the representative is the edge descending from *n* to the subtree with the greatest number of leaves. With a collection of figs, pplacer will rank each of the representative edges by the initial evaluation likelihood given a query sequence. For each fig, in this order, pplacer selects all of the edges within the fig as well as all of the edges proximal to the fig up to the root of the tree. These edges are ranked by the same initial evaluation likelihood before pplacer attempts to place the query sequence on each in turn. No edge will be attempted twice; if the same edge is proximal to two separate figs, it will only be attempted when the first fig is evaluated. As each fig is evaluated for a query sequence, pplacer will also select any figs ordered immediately after the current fig where the difference between that fig's representative likelihood and the current fig's representative likelihood is less than the value of the ``--strike-box`` parameter. Each of these figs' sets of edges are then merged into the current fig's edge set. To test the accuracy of fig evaluation vs. full evaluation, the ``--fig-eval-all`` flag can be specified to do both fig and full evaluation, then show the percentage of sequences where the best location chosen by full evaluation and fig evaluation is the same. ``--fig-eval-all`` must be specified to specify the ``--fig-eval-discrepancy-tree`` flag. If this flag is specified, a tree will be written out showing the locations chosen by both methods for each sequence where the two differ. The colored trees written out by the ``--fig-tree`` and ``--fig-eval-discrepancy-tree`` flags shows figs as colored subtrees within the reference tree. Model refinement ---------------- By default when using the FastTree CAT model, the site rate categories used directly from the FastTree run. This is not possible, however, when a different reference alignment is supplied than was used to build the tree. This can happen when supplying an integrated reference and query alignment. When the site rates cannot be used directly, the model gets "refined". Currently, this only actually means something for the CAT model, in which case it infers site categories. You can force this behavior by using the ``--always-refine`` flag. .. _memory usage: Memory usage ------------ The amount of memory pplacer needs will vary depending on the reference package and input alignment and is directly proportional to the number of sites after pre-masking and the number of nodes on the reference tree. :ref:`As mentioned in the FAQ `, placing on a GTRGAMMA RAxML tree will use about four times as much memory as placing on a FastTree tree. To see how much memory would be used for by the part of pplacer which uses the most memory (i.e. internal nodes), pass the ``--pretend`` flag and it will be displayed. pplacer will use more memory than this value, but for most analyses, this will be by far the biggest allocation. In cases when there isn't enough memory for pplacer to use for internal nodes, or it's otherwise disadvantageous to use physical memory, it's possible to instead tell pplacer to |mmap|_ a file instead using the ``--mmap-file`` flag. This will, very roughly, perform disk IO instead of using physical memory. You will see that pplacer will use the same amount of *address space*, but less *physical memory*. In terms of ``top(1)`` on linux, ``VIRT`` will stay the same but ``RES`` will decrease. The speed of pplacer will also become at least partially dependent on the speed of the drive where the mmap file is located; with an SSD you might not see any difference from using physical memory, while with a spinning metal drive there might be some slowdown. Placing the file on an NFS mount is likely not ideal for this reason. The implementation and underlying behavior of mmap may vary between platforms (the link above is only for linux out of convenience), but pplacer will always call |mmap|_ with ``PROT_READ | PROT_WRITE`` and ``MAP_SHARED``. It's also possible to pass a directory for the value of the ``--mmap-file`` flag; this will create a temporary file in that directory, and then unlink it after opening it. The data will be written to the drive, but when the process exits, the last reference to that filesystem entry will be removed and it will get cleaned up. .. _Infernal: http://infernal.janelia.org/ .. _HMMER: http://hmmer.janelia.org/ .. _reference package database: http://microbiome.fhcrc.org/apps/refpkg/ .. _taxtastic: https://github.com/fhcrc/taxtastic/ .. _JSON: http://www.json.org/ .. _PHYML: http://www.atgc-montpellier.fr/phyml/ .. _RAxML: http://sco.h-its.org/exelixis/software.html .. _geneious: http://www.geneious.com/ .. _classify: guppy_classify.html .. _fat: guppy_fat.html .. _phylogenetic placement format: http://www.plosone.org/article/info:doi/10.1371/journal.pone.0031009 .. |mmap| replace:: ``mmap(2)`` .. _mmap: http://www.kernel.org/doc/man-pages/online/pages/man2/mmap.2.html pplacer-1.1.alpha19/docs/details/rppr.rst000066400000000000000000000023311303154601500203260ustar00rootroot00000000000000==== rppr ==== :Authors: Erick Matsen and Aaron Gallagher :Title: rppr :Version: 1.1 :License: GPL v3 :Date: September 2011 |rppr| is a binary to help prepare reference packages and select sequences. It's pronounced "ripper" and is short for Reference Package PReparer. "Evaluator" might be a more appropriate descriptor than "preparer", but acronym aesthetics won out over precision here. Usage ===== Command line interface ---------------------- The general way to invoke |rppr| is ``rppr COMMAND [options] placefile[s]`` where COMMAND is one of the |rppr| commands. For example:: rppr info -c some.refpkg These programs are listed with more detail below, and can always be found using ``rppr --cmds`` . |rppr| can also be invoked as ``rppr --quiet COMMAND [...]``, which prevents the specified command from writing to stdout unless explicitly requested. List of subcommands =================== The following table provides links to more in-depth documentation for each rppr subcommand: .. command-table .. toctree:: :glob: :hidden: rppr_* .. |rppr| replace:: ``rppr`` .. |guppy| replace:: ``guppy`` .. |pplacer| replace:: ``pplacer`` .. |KR| replace:: Kantorovich-Rubinstein .. vim:set ai fo+=n fo-=l ft=rst: pplacer-1.1.alpha19/docs/details/rppr_check_refpkg.rst000066400000000000000000000003311303154601500230170ustar00rootroot00000000000000 ``check_refpkg`` checks that all of the necessary elements for a reference package are present, as well as verifying that the taxomomy information is sensible and that it meshes with the names in the reference tree. pplacer-1.1.alpha19/docs/details/rppr_convexify.rst000066400000000000000000000012061303154601500224200ustar00rootroot00000000000000 ``convexify`` applies an exact dynamic program to identify leaves of a phylogenetic tree that don't agree with their taxonomic labels. You can read more in the announcement_ or the paper_. You can either specify a reference package or a tree and a CSV file of colors. The CSV file is formatted as follows:: leaf_name1,color1 leaf_name2,color2 where the colors are just strings. Note that ``--no-early`` and ``--naive`` don't change the results. They just (much) run more slowly for all but the most trivial problems. .. _announcement: http://matsen.fhcrc.org/general/2011/09/27/convexify.html .. _paper: http://arxiv.org/abs/1109.5423 pplacer-1.1.alpha19/docs/details/rppr_infer.rst000066400000000000000000000007221303154601500215130ustar00rootroot00000000000000Take any unclassified sequences in the reference package and place them with pplacer against the classified sequences in the reference package. The result is a table of the suggested classifications of these sequences: ============ =========== Column name Description ============ =========== seq_name The name of the sequence. new_taxid The actual suggested tax_id. new_name The name of the suggested tax_id for this sequence. ============ =========== pplacer-1.1.alpha19/docs/details/rppr_min_adcl.rst000066400000000000000000000010471303154601500221570ustar00rootroot00000000000000.. important:: ``rppr min_adcl`` Prints the labels of the leaves that should be **removed** from the tree, not those that should be kept. Chooses the set of *k* sequences *X* that minimize the average distance between each placement the closest sequence in *X*. You can read more in the announcement_ or the paper_. See :ref:`min_adcl_tree ` for the same equivalent operation on a tree without placements. .. _announcement: http://matsen.fhcrc.org/general/2012/05/31/adcl-paper.html .. _paper: http://arxiv.org/abs/1205.6867 pplacer-1.1.alpha19/docs/details/rppr_min_adcl_tree.rst000066400000000000000000000010741303154601500231760ustar00rootroot00000000000000.. important:: ``rppr min_adcl_tree`` Prints the labels of the leaves that should be **removed** from the tree, not those that should be kept. ``min_adcl_tree`` chooses the set of *k* sequences *X* that minimize the average distance from each pruned sequence to the closest sequence in *X*. You can read more in the announcement_ or the paper_. See :ref:`min_adcl_tree ` for the same equivalent operation on a tree with placements. .. _announcement: http://matsen.fhcrc.org/general/2012/05/31/adcl-paper.html .. _paper: http://arxiv.org/abs/1205.6867 pplacer-1.1.alpha19/docs/details/rppr_prep_db.rst000066400000000000000000000011411303154601500220170ustar00rootroot00000000000000Creates and populates tables in the specified sqlite3 database, initializing the database if it doesn't already exist. The following tables are both created and populated with data from the reference pacakge: * ``ranks`` -- all of the ranks contained in the provided reference package. * ``taxa`` -- all of the taxa in the provided reference package. Other tables are created, but are populated by :ref:`guppy classify `. See the `microbiome demo`_ for some examples of using ``rppr prep_db`` and ``guppy classify`` together. .. _microbiome demo: http://fhcrc.github.com/microbiome-demo/ pplacer-1.1.alpha19/docs/details/rppr_reclass.rst000066400000000000000000000053061303154601500220470ustar00rootroot00000000000000Suggest better classifications of sequences in a reference package. ``rppr reclass`` first looks at all ranks of a reference package, starting at the most specific rank, until it finds the first rank with discordance. Discordant leaves are cut off using the convexify algorithm. The sequences corresponding to the cut leaves are then placed with pplacer against the remaining sequences in the reference package. The result is a table of the suggested reclassifications of these sequences: =============== =========== Column name Description =============== =========== seq_name The name of the sequence. old_name The name of the tax_id this sequence used to have. old_taxid The actual tax_id this sequence used to have. new_name The name of the suggested tax_id for this sequence. new_taxid The actual suggested tax_id. makes_convex ``true`` if reclassifying this sequence with the new tax_id will result in a convex tree, otherwise ``false``. uninformative ``true`` if this sequence sits inside a clade determined to be uninformative, otherwise ``false``. old_median_dist The median distance from this leaf to the convex subset of leaves classified with the previous tax_id. old_avg_cv The coefficient of variation of the distances from this leaf to the convex subset of leaves classified with the previous tax_id, multiplied by 100%. [#f1]_ new_median_dist The median distance from this leaf to the convex subset of leaves classified with the suggested tax_id. [#f2]_ new_avg_cv The coefficient of variation of the distances from this leaf to the convex subset of leaves classified with the suggested tax_id, multiplied by 100%. [#f1]_ n_with_old The number of leaves in the original tree which were classified with the previoux tax_id. n_nonconvex The number of leaves in the original tree classified with the previous tax_id which were also non-convex. =============== =========== .. [#f1] This may be ``-`` if there are only zero or one other leaves with that tax_id. .. [#f2] This may be ``-`` if there are no other leaves with that tax_id. Uninformative clades are determined to be clades containing all of the representatives of exactly two tax_ids which are not found anywhere else in the tree. The suggestion tree emitted with the ``-t`` flag is similar to the discordance tree emitted by ``rppr convexify``; it colors all of the leaves which were cut by the convexify step red, colors all of the edges which are considered uninformative (with the overlap between these two sets colored orange), and relabels the cut sequences to include the name of the suggested new classification. The new label is in the format ``seq_name -> new_name``, using the column names described above. pplacer-1.1.alpha19/docs/faq.rst000066400000000000000000000046711303154601500164760ustar00rootroot00000000000000.. _faq: FAQ === How can I cite pplacer? ----------------------- Right now there is only one paper to cite:: @article{matsen2010pplacer, title={pplacer: linear time maximum-likelihood and Bayesian phylogenetic placement of sequences onto a fixed reference tree}, author={Matsen, F.A. and Kodner, R.B. and Armbrust, E.}, journal={BMC Bioinformatics}, volume={11}, number={1}, pages={538}, year={2010}, publisher={BioMed Central Ltd} } At some point we will write something up for the new pplacer, guppy, taxtastic, etc., but if you use a method implemented in guppy (such as edge PCA) we hope you will cite the paper describing that method. Why is pplacer taking up so much memory? ---------------------------------------- Because it caches likelihood vectors for all of the internal nodes. This is what makes it fast! Pplacer uses about 1/4 of the memory when placing on a FastTree tree as compared to a RAxML tree inferred with GTRGAMMA. If your reads are short and in a fixed region, the memory used by pplacer v1.1 alpha08 (or later) scales with respect to the total number of non-gap columns in your query alignment. You can also make it use less memory (and run faster) by cutting down the size of your reference tree. Additionally, if you are placing metagenomic reads onto a very wide alignment (such as a concatenation) read about the ``--groups`` feature in the documentation. If all else fails, there is also a flag ``--mmap-file`` to pplacer. If this flag is passed, pplacer will use an mmapped file instead of making large allocations. Details about mmap are covered in more detail in the :ref:`pplacer details section `. Why doesn't pplacer output a Newick tree? ----------------------------------------- Pplacer does not output a Newick tree because it does not build phylogenetic trees. It maps sequences into trees, with uncertainty, and thus its output format encodes those maps. You can read more about the pplacer/EPA output format and our motivations for it in the corresponding paper_. If you do need a newick tree, you can look at guppy's :ref:`tog ` command, but be careful, as the output is not a real phylogenetic tree. For example, two very similar query sequences that are both rather different than the reference sequences will end up on long parallel branches rather than in a subtree of size two. .. _paper: http://www.plosone.org/article/info%3Adoi%2F10.1371%2Fjournal.pone.0031009 pplacer-1.1.alpha19/docs/generated_rst/000077500000000000000000000000001303154601500200135ustar00rootroot00000000000000pplacer-1.1.alpha19/docs/generated_rst/.gitignore000066400000000000000000000000011303154601500217720ustar00rootroot00000000000000*pplacer-1.1.alpha19/docs/glossary.rst000066400000000000000000000014021303154601500175570ustar00rootroot00000000000000:tocdepth: 3 .. _glossary: ======== glossary ======== We try to keep things as simple as possible, but by necessity have developed a bit of lingo. Here are the definitions for some words that you will see in the manual. placement An assignment of a single query sequence to a single location in the reference tree. (Contrast with pquery). pquery A "placed query" sequence, with uncertainty. In practice this means a collection of placements and their corresponding confidence values (e.g. likelihood weight ratio, etc). placerun A collection of pqueries. Short for a run of a placement program. query sequence The sequence getting placed into the reference tree. Typically a short read. reference tree The fixed tree on which placement occurs. pplacer-1.1.alpha19/docs/index.rst000066400000000000000000000051401303154601500170260ustar00rootroot00000000000000pplacer documentation home ========================== The pplacer suite consists of three separate binaries: pplacer, guppy, and rppr. The pplacer binary actually does phylogenetic placement and produces place files, guppy does all of the downstream analysis of placements, and rppr does useful things having to do with reference packages. If this is your first time looking at this documentation we suggest looking at our `overview`_. Precompiled binaries for Mac OS X and Linux can be found on the `main pplacer site`_. .. toctree:: :maxdepth: 2 generated_rst/pplacer generated_rst/guppy generated_rst/rppr scripts glossary compiling changelog .. raw:: html

Warning

pplacer is under heavy development, and not all parts are at the same level of maturity. The general guideline is: if we have released a paper about a method, then we have verified and tested it. Thus, the following functionality is stable: * placement and visualization ability as described in the BMC Bioinformatics paper * Kantorovich-Rubenstein distances * edge principal components and squash clustering * taxonomic/phylogenetic discordance analysis * taxon subsetting by minimizing the average distance to the closest leaf We suggest that you wait to do any serious analysis using features not described on this list. In particular, the taxonomic classification functionality is not stable and is still being validated. Tutorial -------- We have made a tutorial_ available that demonstrates most of the functionality of the pplacer suite of programs. It can be downloaded and run as a shell script. Getting help ------------ Your question might be covered in the pplacer FAQ already: .. toctree:: :maxdepth: 2 faq Otherwise, support for pplacer happens through the `user group`_. If something is unclear in the manual and you can't find anything in past discussions, post to the group and we will get back to you right away. Acknowledgements ---------------- The pplacer code and documentation is written and maintained by the Matsen group at the Fred Hutchinson Cancer Research Center. Noah Hoffman has contributed many valuable ideas and bits of documentation. We are greatly indebted to our biological collaborators, including Ginger Armbrust, David Fredricks, Robin Kodner, Martin Morgan, and Sujatha Srivnasan for their suggestions. .. _user group: http://groups.google.com/group/pplacer-users .. _tutorial: http://fhcrc.github.com/microbiome-demo/ .. _main pplacer site: http://matsen.fhcrc.org/pplacer/ .. _overview: http://matsen.github.io/pplacer/generated_rst/pplacer.html#details pplacer-1.1.alpha19/docs/scripts.rst000066400000000000000000000232001303154601500174030ustar00rootroot00000000000000:tocdepth: 3 .. _scripts: ======= scripts ======= The `pplacer` package comes with a few scripts to perform common tasks on reference packages and placements: Installing ========== All scripts can be used by specifying the full path. For convenience, a Python ``setup.py`` file is provided, which will install them globally. To install, run:: $ python setup.py install from the ``scripts/`` subdirectory, prefixed with ``sudo`` if the python installation directory is not writable. ``refpkg_align.py`` =================== ``refpkg_align.py`` works with reference package alignments and alignment profiles, providing methods to align sequences to a reference package alignment, and extract an alignment from a reference package. ``refpkg_align.py`` depends on `BioPython `_, as well as the external tools used for alignment: HMMER3_, Infernal_, and PyNAST_. .. _HMMER3: http://hmmer.janelia.org .. _Infernal: http://infernal.janelia.org .. _PyNAST: http://qiime.org/pynast List of subcommands ------------------- ``align`` ********* ``refpkg_align.py align`` aligns sequences to a reference package alignment for use with pplacer. For reference packages built with Infernal_, ``cmalign`` is used for alignment. For packages built using HMMER3_, alignment is performed with ``hmmalign``. Reference packages lacking a ``profile`` entry are aligned using PyNAST_. By default, an alignment :ref:`mask` is applied if it exists. The output format varies: Stockholm for Infernal- and HMMER-based reference packages, FASTA for all others. For Infernal-based reference packages, MPI may be used. :: usage: refpkg_align.py align [options] refpkg seqfile outfile Options ^^^^^^^ :: -h, --help show this help message and exit --align-opts OPTS Alignment options, such as "--mapali $aln_sto". '$' characters will need to be escaped if using template variables. Available template variables are $aln_sto, $profile. Defaults are as follows for the different profiles: (PyNAST: "-l 150 -f /dev/null -g /dev/null") (INFERNAL: "-1 --hbanded --sub --dna") --alignment-method {PyNAST,HMMER3,INFERNAL} Profile version to use. [default: Guess. PyNAST is used if a valid CM or HMM is not found in the reference package.] --no-mask Do not trim the alignment to unmasked columns. [default: apply mask if it exists] --debug Enable debug output --verbose Enable verbose output MPI Options --use-mpi Use MPI [infernal only] --mpi-arguments MPI_ARGUMENTS Arguments to pass to mpirun --mpi-run MPI_RUN Name of mpirun executable ``extract`` *********** ``extract`` extracts a reference alignment from a reference package, apply a :ref:`mask` if it exists by default. :: usage: refpkg_align.py extract [options] refpkg output_file Options ^^^^^^^ :: positional arguments: refpkg Reference package directory output_file Destination optional arguments: -h, --help show this help message and exit --output-format OUTPUT_FORMAT output format [default: stockholm] --no-mask Do not apply mask to alignment [default: apply mask if it exists] .. _mask: mask ---- *Warning:* masking is experimental and we may change our mind about how it gets implemented. Alignment masks may be specified through an entry named "mask" in the ``CONTENTS.json`` file of a reference package pointing to a file with a comma-delimited set of 0-based indices in an alignment to **keep** after masking. For example, a mask specification of: ``0,1,2,3,4,5,6,28,29`` Would discard all columns in an alignment except for 0-7, 28, and 29. ``sort_placefile.py`` ===================== ``sort_placefile.py`` takes a placefile and sorts and formats its contents for then performing a visual diff of placefiles. Output defaults to being emitted to stdout. :: usage: sort_placefile.py [-h] [-o FILE] infile .. ``update_refpkg.py`` ==================== ``update_refpkg.py`` updates a reference package from the 1.0 format to the 1.1 format. It takes the ``CONTENTS.json`` file in the reference package as its parameter and updates it in place, after making a backup copy. :: usage: update_refpkg.py [-h] CONTENTS.json .. ``check_placements.py`` ======================= ``check_placements.py`` checks a placefile for potential issues, including: * Any ``like_weight_ratio`` being equal to 0. * The sum of the ``like_weight_ratios`` not being equal to 1. * Any ``post_prob`` being equal to 0. * The sum of the ``post_probs`` being equal to 0. * The sum of the ``post_probs`` not being equal to 1. :: usage: check_placements.py example.jplace .. .. _deduplicate-sequences: ``deduplicate_sequences.py`` ============================ ``deduplicate_sequences.py`` deduplicates a sequence file and produces a dedup file suitable for use with ``guppy redup -m``. See the :ref:`redup ` documentation for details. ``pca_for_qiime.py`` ==================== ``pca_for_qiime.py`` converts the ``trans`` file output by ``guppy pca`` into the tab-delimited format expected by QIIME's plotting functions. :: usage: pca_for_qiime.py [-h] trans tsv ``extract_taxonomy_from_biom.py`` ================================= ``extract_taxonomy_from_biom.py`` extracts the taxonomy information from a BIOM file, producing seqinfo and taxonomy files which can then be placed into a reference package. :: usage: extract_taxonomy_from_biom.py [-h] biom taxtable seqinfo ``hrefpkg_query.py`` ==================== ``hrefpkg_query.py`` classifies sequences using a hrefpkg. The output is a sqlite database with the same schema as created by :ref:`rppr prep_db `. :: usage: hrefpkg_query.py [options] hrefpkg query_seqs classification_db positional arguments: hrefpkg hrefpkg to classify using query_seqs input query sequences classification_db output sqlite database optional arguments: -h, --help show this help message and exit -j CORES, --ncores CORES number of cores to tell commands to use -r RANK, --classification-rank RANK rank to perform the initial NBC classification at --workdir DIR directory to write intermediate files to (default: a temporary directory) --disable-cleanup don't remove the work directory as the final step --use-mpi run refpkg_align with MPI --alignment {align-each,merge-each,none} respectively: align each input sequence; subset an input stockholm alignment and merge each sequence to a reference alignment; only subset an input stockholm alignment (default: align-each) --cmscores FILE in align-each mode, write out a file containing the cmalign scores external binaries: --pplacer PROG pplacer binary to call --guppy PROG guppy binary to call --rppr PROG rppr binary to call --refpkg-align PROG refpkg_align binary to call --cmalign PROG cmalign binary to call .. ``multiclass_concat.py`` ======================== ``multiclass_concat.py`` takes a database which has been classified using :ref:`guppy classify ` and creates a view ``multiclass_concat``. This view has the same schema as ``multiclass``, with the addition of an ``id_count`` column. However, instead of getting multiple rows when a sequence has multiple classifications at a rank, the ``tax_id`` column will be all of the tax_ids concatenated together, delimited by ``,``. To ensure that it's still easy to join ``multiclass_concat`` to the ``taxa`` table, rows are inserted into the ``taxa`` table for each concatenated tax_id present in the ``multiclass_concat`` table which have a ``tax_name`` created by concatenating the names of all the constituent tax_ids. :: usage: multiclass_concat.py [options] database positional arguments: database sqlite database (output of `rppr prep_db` after `guppy classify`) optional arguments: -h, --help show this help message and exit .. ``split_qiime.py`` ================== ``split_qiime.py`` takes sequences in `QIIME's preprocessed FASTA format`_ and generates a FASTA file which contains the original sequence names. Optionally, a specimen map can also be written out which maps from the original sequence names to their specimens as listed in the QIIME file. For example, an incoming sequence identified by ``>PC.634_1 FLP3FBN01ELBSX`` will be written out as ``>FLP3FBN01ELBSX`` with an entry in the specimen_map of ``FLP3FBN01ELBSX,PC.634``. :: usage: split_qiime.py [-h] [qiime] [fasta] [specimen_map] Extract the original sequence names from a QIIME FASTA file. positional arguments: qiime input QIIME file (default: stdin) fasta output FASTA file (default: stdout) specimen_map if specified, output specimen map (default: don't write) optional arguments: -h, --help show this help message and exit .. _QIIME's preprocessed FASTA format: http://qiime.org/tutorials/tutorial.html#assign-samples-to-multiplex-reads pplacer-1.1.alpha19/json_src/000077500000000000000000000000001303154601500160555ustar00rootroot00000000000000pplacer-1.1.alpha19/json_src/json.ml000066400000000000000000000040611303154601500173610ustar00rootroot00000000000000open Ppatteries open Jsontype let of_string ?fname s = let lexbuf = Lexing.from_string s in Sparse.wrap_of_fname_opt fname (Jsonparse.parse Jsonlex.token) lexbuf let of_file fname = let fobj = MaybeZipped.open_in fname in let input s n = try IO.input fobj s 0 n with BatIO.No_more_input -> 0 in let lexbuf = Lexing.from_function input in let ret = Sparse.file_parse_wrap fname (Jsonparse.parse Jsonlex.token) lexbuf in IO.close_in fobj; ret let to_escape = Str.regexp "\\([\\\\\"/\b\012\n\r\t]\\)" let quote = Str.global_substitute to_escape begin fun s -> match Str.replace_matched "\\1" s with | "\\" -> "\\\\" | "\"" -> "\\\"" | "/" -> "\\/" | "\b" -> "\\b" | "\012" -> "\\f" | "\n" -> "\\n" | "\r" -> "\\r" | "\t" -> "\\t" | s -> failwith ("invalid " ^ s) end let rec to_formatter ff o = let rec aux = function | Bool b -> Format.fprintf ff "%s" (string_of_bool b) | Int i -> Format.fprintf ff "%d" i | Float f -> Format.fprintf ff "%.12g" f | String s -> Format.fprintf ff "\"%s\"" (quote s) | Object o -> Format.fprintf ff "@[<2>{@,"; let _ = Hashtbl.fold (fun k v is_first -> if not is_first then Format.fprintf ff ",@ "; Format.fprintf ff "\"%s\":@ " (quote k); aux v; false ) o true in (); Format.fprintf ff "@]@,}" | Array o -> Format.fprintf ff "@[<2>[@,"; let _ = List.fold_left (fun is_first o -> if not is_first then Format.fprintf ff ",@ "; aux o; false ) true o in (); Format.fprintf ff "@]@,]" | Null -> Format.fprintf ff "null" in Format.fprintf ff "@["; aux o; Format.fprintf ff "@]@." let to_string o = let buf = Buffer.create 256 in to_formatter (Format.formatter_of_buffer buf) o; Buffer.contents buf let to_file name o = let file = MaybeZipped.open_out name in let formatter= Format.make_formatter (fun s p l -> let _ = IO.output file s p l in ()) (fun () -> IO.flush file) in to_formatter formatter o; close_out file pplacer-1.1.alpha19/json_src/jsonlex.mll000066400000000000000000000020271303154601500202460ustar00rootroot00000000000000{ open Ppatteries open Jsonparse open Lexing } let nonzero = ['1'-'9'] let digit = ['0'-'9'] let digit_lead = '0' | nonzero digit* let hexdigit = ['0'-'9' 'a'-'f' 'A'-'F'] let escape = '\\' (['"' '\\' '/' 'b' 'f' 'n' 'r' 't'] | 'u' hexdigit hexdigit hexdigit hexdigit) let nonescape = [^ '\\' '"' '\t' '\n' '\r'] rule token = parse | [' ' '\t' '\r'] { token lexbuf } | '\n' { Sparse.incr_lineno lexbuf; token lexbuf } | '{' { OBRACE } | '}' { CBRACE } | '[' { OBRACK } | ']' { CBRACK } | ':' { COLON } | ',' { COMMA } | '"' (escape | nonescape)* '"' as s { STRING s } | '-'? digit_lead as i { INT (int_of_string i) } | '-'? digit_lead ('.' digit+)? (['e' 'E'] ['+' '-']? digit+)? as f { FLOAT (float_of_string f) } | "true" { TRUE } | "false" { FALSE } | "null" { NULL } | eof { EOF } | _ { raise (Sparse.parse_error_of_positions "syntax error lexing" lexbuf.lex_start_p lexbuf.lex_curr_p) } pplacer-1.1.alpha19/json_src/jsonparse.mly000066400000000000000000000044241303154601500206100ustar00rootroot00000000000000%{ open Ppatteries open Jsontype let utf8_encode x = let x' = Int32.of_int x and (&-) = Int32.logand and (|-) = Int32.logor and (>>-) = Int32.shift_right and chr i = Char.chr (Int32.to_int i) in if x <= 0x7f then let s = String.create 1 in s.[0] <- chr x'; s else if x <= 0x7ff then let s = String.create 2 in s.[0] <- chr (x' >>- 6 &- 0b00011111l |- 0b11000000l); s.[1] <- chr (x' &- 0b00111111l |- 0b10000000l); s else if x <= 0xffff then let s = String.create 3 in s.[0] <- chr (x' >>- 12 &- 0b00001111l |- 0b11100000l); s.[1] <- chr (x' >>- 6 &- 0b00111111l |- 0b10000000l); s.[2] <- chr (x' &- 0b00111111l |- 0b10000000l); s else invalid_arg "utf8_encode" let escapes = Str.regexp "\\\\\\([\"\\\\/bfnrt]\\|u\\(....\\)\\)" let unquote s = let s = String.sub s 1 ((String.length s) - 2) in Str.global_substitute escapes (fun s -> match Str.replace_matched "\\1" s with | "\\" -> "\\" | "\"" -> "\"" | "/" -> "/" | "b" -> "\b" | "f" -> "\012" | "n" -> "\n" | "r" -> "\r" | "t" -> "\t" | _ -> let escape = Str.replace_matched "\\2" s in utf8_encode (int_of_string ("0x" ^ escape)) ) s let add_to_hash h (s, v) = Hashtbl.add h s v; h %} %token STRING %token INT %token FLOAT %token QUOTE OBRACE CBRACE OBRACK CBRACK COLON COMMA TRUE FALSE NULL EOF %start parse %type parse %% pair: STRING COLON value { (unquote $1), $3 } object_content: pair COMMA object_content { add_to_hash $3 $1 } | pair { add_to_hash (Hashtbl.create 16) $1 } array_content: value COMMA array_content { $1 :: $3 } | value { [$1] } value: | STRING { String (unquote $1) } | INT { Int $1 } | FLOAT { Float $1 } | OBRACE object_content CBRACE { Object $2 } | OBRACE CBRACE { Object (Hashtbl.create 0) } | OBRACK array_content CBRACK { Array $2 } | OBRACK CBRACK { Array [] } | TRUE { Bool true } | FALSE { Bool false } | NULL { Null } parse: value EOF { $1 } | error EOF { Sparse.parse_error 1 "syntax error parsing" } pplacer-1.1.alpha19/json_src/jsontype.ml000066400000000000000000000017701303154601500202670ustar00rootroot00000000000000type jsontype = | Bool of bool | Int of int | Float of float | String of string | Object of (string, jsontype) Hashtbl.t | Array of jsontype list | Null let name = function | Bool _ -> "bool" | Int _ | Float _ -> "number" | String _ -> "string" | Object _ -> "object" | Array _ -> "array" | Null -> "null" exception Invalid_format of string let unexpected got expected = raise (Invalid_format (Printf.sprintf "expected %s, got %s" expected (name got))) let bool = function | Bool b -> b | x -> unexpected x "bool" let int = function | Int i -> i | Float f -> int_of_float f | x -> unexpected x "int" let float = function | Float f -> f | Int i -> float_of_int i | x -> unexpected x "float" let string = function | String s -> s | x -> unexpected x "string" let obj = function | Object o -> o | x -> unexpected x "object" let array = function | Array a -> a | x -> unexpected x "array" let null = function | Null -> () | x -> unexpected x "null" pplacer-1.1.alpha19/myocamlbuild.ml000066400000000000000000000224101303154601500172470ustar00rootroot00000000000000open Ocamlbuild_plugin (** Overview of tags: - [pkg_batteries] to use Batteries as a library, without syntax extensions - [use_batteries] and [use_batteries_r] to use both Batteries and all the non-destructive syntax extensions - [pkg_sexplib.syntax] with [syntax_camlp4o] or [syntax_camlp4r] for sexplib *) (** {1 OCamlFind} *) let run_and_read = Ocamlbuild_pack.My_unix.run_and_read let blank_sep_strings = Ocamlbuild_pack.Lexers.blank_sep_strings module OCamlFind = struct (* this lists all supported packages *) let find_packages () = blank_sep_strings & Lexing.from_string & run_and_read "ocamlfind list | cut -d' ' -f1" (* this is supposed to list available syntaxes, but I don't know how to do it. *) let find_syntaxes () = ["camlp4o"; "camlp4r"] (* ocamlfind command *) let ocamlfind x = S[A"ocamlfind"; x] let before_options () = (* by using Before_options one let command line options have an higher priority *) (* on the contrary using After_options will guarantee to have the higher priority *) (* override default commands by ocamlfind ones *) Options.ocamlc := ocamlfind & A"ocamlc"; Options.ocamlopt := ocamlfind & A"ocamlopt"; Options.ocamldep := ocamlfind & A"ocamldep"; Options.ocamldoc := ocamlfind & A"ocamldoc"; Options.ocamlmktop := ocamlfind & A"ocamlmktop" let get_ocamldoc_directory () = let ocamldoc_directory = run_and_read "ocamlfind ocamldoc -customdir" in let length = String.length ocamldoc_directory in assert (length != 0); let char = ocamldoc_directory.[length - 1] in if (char = '\n') || (char = '\r') then String.sub ocamldoc_directory 0 (length - 1) else ocamldoc_directory let after_rules () = (* When one link an OCaml library/binary/package, one should use -linkpkg *) flag ["ocaml"; "byte"; "link"; "program"] & A"-linkpkg"; flag ["ocaml"; "native"; "link"; "program"] & A"-linkpkg"; flag ["ocaml"; "byte"; "link"; "toplevel"] & A"-linkpkg"; (* For each ocamlfind package one inject the -package option when * compiling, computing dependencies, generating documentation and * linking. *) List.iter begin fun pkg -> flag ["ocaml"; "compile"; "pkg_"^pkg] & S[A"-package"; A pkg]; flag ["ocaml"; "ocamldep"; "pkg_"^pkg] & S[A"-package"; A pkg]; flag ["ocaml"; "doc"; "pkg_"^pkg] & S[A"-package"; A pkg]; flag ["ocaml"; "link"; "pkg_"^pkg] & S[A"-package"; A pkg]; end (find_packages ()); (* Like -package but for extensions syntax. Morover -syntax is useless * when linking. *) List.iter begin fun syntax -> flag ["ocaml"; "compile"; "syntax_"^syntax] & S[A"-syntax"; A syntax]; flag ["ocaml"; "ocamldep"; "syntax_"^syntax] & S[A"-syntax"; A syntax]; flag ["ocaml"; "doc"; "syntax_"^syntax] & S[A"-syntax"; A syntax]; end (find_syntaxes ()); (* The default "thread" tag is not compatible with ocamlfind. Indeed, the default rules add the "threads.cma" or "threads.cmxa" options when using this tag. When using the "-linkpkg" option with ocamlfind, this module will then be added twice on the command line. To solve this, one approach is to add the "-thread" option when using the "threads" package using the previous plugin. *) flag ["ocaml"; "pkg_threads"; "compile"] (S[A "-thread"]); flag ["ocaml"; "pkg_threads"; "link"] (S[A "-thread"]); end (** {1 OCaml Batteries Included} *) module Batteries = struct let before_options () = () let after_rules () = flag ["ocaml"; "link"; "byte"; "use_ocamldoc_info"] (S[A "-I"; A "+ocamldoc"; A "odoc_info.cma"]); flag ["ocaml"; "link"; "native"; "use_ocamldoc_info"] (S[A "-I"; A "+ocamldoc"(*; A "odoc_info.cmxa"*)]); flag ["ocaml"; "docfile"; "use_ocamldoc_info"] (S[A "-I"; A "+ocamldoc"]); flag ["ocaml"; "docdir"; "use_ocamldoc_info"] (S[A "-I"; A "+ocamldoc"]); flag ["ocaml"; "doc"; "use_ocamldoc_info"] (S[A "-I"; A "+ocamldoc"]); (*The command-line for [use_batteries] and [use_batteries_r]*) let cl_use_boilerplate = [A "-package"; A "batteries"] and cl_use_batteries = [A "-package"; A "batteries"] and cl_use_batteries_o = [] (*[cl_use_batteries_o]: extensions which only make sense in original syntax*) and cl_camlp4o = [A"-syntax"; A "camlp4o"] and cl_camlp4r = [A"-syntax"; A "camlp4r"] in let cl_boilerplate_original = cl_use_boilerplate @ cl_camlp4o and cl_boilerplate_revised = cl_use_boilerplate @ cl_camlp4r and cl_batteries_original = cl_use_batteries @ cl_use_batteries_o @ cl_camlp4o and cl_batteries_revised = cl_use_batteries @ cl_camlp4r in (** Tag [use_boilerplate] provides boilerplate syntax extensions, in original syntax*) flag ["ocaml"; "compile"; "use_boilerplate"] & S cl_boilerplate_original ; flag ["ocaml"; "ocamldep"; "use_boilerplate"] & S cl_boilerplate_original ; flag ["ocaml"; "doc"; "use_boilerplate"] & S cl_boilerplate_original ; flag ["ocaml"; "link"; "use_boilerplate"] & S cl_boilerplate_original ; (** Tag [use_boilerplate_r] provides boilerplate syntax extensions, in original syntax*) flag ["ocaml"; "compile"; "use_boilerplate_r"] & S cl_boilerplate_revised ; flag ["ocaml"; "ocamldep"; "use_boilerplate_r"] & S cl_boilerplate_revised ; flag ["ocaml"; "doc"; "use_boilerplate_r"] & S cl_boilerplate_revised ; flag ["ocaml"; "link"; "use_boilerplate_r"] & S cl_boilerplate_revised ; (** Tag [use_batteries] provides both package [batteries] and all syntax extensions, in original syntax. *) flag ["ocaml"; "compile"; "use_batteries"] & S cl_batteries_original ; flag ["ocaml"; "ocamldep"; "use_batteries"] & S cl_batteries_original ; flag ["ocaml"; "doc"; "use_batteries"] & S cl_batteries_original ; flag ["ocaml"; "link"; "use_batteries"] & S cl_batteries_original ; (** Tag [use_batteries_r] provides both package [batteries] and all syntax extensions, in revised syntax. *) flag ["ocaml"; "compile"; "use_batteries_r"] & S cl_batteries_revised; flag ["ocaml"; "ocamldep"; "use_batteries_r"] & S cl_batteries_revised; flag ["ocaml"; "doc"; "use_batteries_r"] & S cl_batteries_revised; flag ["ocaml"; "link"; "use_batteries_r"] & S cl_batteries_revised (* flag ["ocaml"; "compile"; "use_batteries"] & S[A "-verbose"; A"-package"; A "batteries.syntax.full"; A"-syntax"; A "batteries.syntax.full"]; flag ["ocaml"; "ocamldep"; "use_batteries"] & S[A "-verbose"; A"-package"; A "batteries.syntax.full"; A"-syntax"; A "batteries.syntax.full"]; flag ["ocaml"; "doc"; "use_batteries"] & S[A "-verbose"; A"-package"; A "batteries.syntax.full"; A"-syntax"; A "batteries.syntax.full"]; flag ["ocaml"; "link"; "use_batteries"] & S[A "-verbose"; A"-package"; A "batteries.syntax.full"; A"-syntax"; A "batteries.syntax.full"];*) end let setup_git_version () = let write_version version ch = Printf.fprintf ch "let version = %S\n" version; close_out ch in match run_and_read "git describe --tags --long | tr -d '\\n'" with | "" -> begin match begin try Some (open_out_gen [Open_creat; Open_excl; Open_wronly] 0o644 "common_src/version.ml") with Sys_error _ -> None end with | Some ch -> write_version "unknown" ch | None -> () end | version -> open_out "common_src/version.ml" |> write_version version let is_osx = (run_and_read "uname -s | tr -d '\\n'") = "Darwin" let _ = dispatch begin function | Before_options -> OCamlFind.before_options (); Batteries.before_options (); (* use static linking for native binaries *) if not is_osx then flag ["link"; "ocaml"; "native"] (S[A"-ccopt"; A"-static"]); | After_rules -> OCamlFind.after_rules (); Batteries.after_rules (); (* c compilation options *) flag ["compile"; "c"] (S[ A"-ccopt"; A"-Wall"; A"-ccopt"; A"-funroll-loops"; A"-ccopt"; A"-O3"; A"-ccopt"; A"-fPIC"; ]); flag ["compile"; "c"; "debug"] (S[ A"-ccopt"; A"-O0"; A"-ccopt"; A"-g"; ]); dep ["compile"; "c"] ["cdd_src/cdd.h"; "cdd_src/cddmp.h"; "cdd_src/cddtypes.h"; "cdd_src/setoper.h"]; if not is_osx then flag ["link"; "ocaml"; "native"] (S[A"-cclib"; A"-lpthread"]); (* custom: incorporate libraries into bytecode *) flag ["link"; "ocaml"; "byte"] (A"-custom"); (* link with libpplacercside given c_pplacer tag *) flag ["link"; "c_pplacer"] (S[A"-cclib"; A"-lpplacercside"; A"-cclib"; A"-Lpplacer_src"]); flag ["link"; "c_cdd"] (S[A"-cclib"; A"-lcdd"; A"-cclib"; A"-Lcdd_src"]); flag ["link"; "c_pam"] (S[A"-cclib"; A"-lpplacer_pam"; A"-cclib"; A"-Lpam_src"]); (* make libpplacercside when needed *) dep ["c_pplacer"] ["pplacer_src/libpplacercside.a"]; dep ["c_cdd"] ["cdd_src/libcdd.a"]; dep ["c_pam"] ["pam_src/libpplacer_pam.a"]; flag ["link"; "c_pam"] (S[A"-cclib"; A"-lgsl"]); | After_options -> setup_git_version () | _ -> () end pplacer-1.1.alpha19/opam-requirements.txt000066400000000000000000000001551303154601500204540ustar00rootroot00000000000000csv.1.2.2 ounit.1.1.2 xmlm.1.1.1 mcl.12-068oasis4 batteries.2.1.0 ocaml-gsl.0.6.3 sqlite3.1.6.3 camlzip.1.05 pplacer-1.1.alpha19/pam_src/000077500000000000000000000000001303154601500156615ustar00rootroot00000000000000pplacer-1.1.alpha19/pam_src/.gitignore000066400000000000000000000000331303154601500176450ustar00rootroot00000000000000pam.o pam .sconsign.dblite pplacer-1.1.alpha19/pam_src/Makefile000066400000000000000000000003041303154601500173160ustar00rootroot00000000000000CFLAGS = -Wall -pedantic -std=c99 -DPAM_TEST LDLIBS = -lgsl -lgslcblas debug: CFLAGS += -g -O0 debug: pam release: CFLAGS += -O3 release: pam clean: rm -f *.o pam .PHONY: debug release clean pplacer-1.1.alpha19/pam_src/caml_pam.c000066400000000000000000000026701303154601500176030ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include size_t * pam(gsl_matrix *, size_t, gsl_vector_char *, /*OUT*/ double *); /* rows for leaves; columns for masses */ CAMLprim value caml_pam(value k_value, value keep_value, value dist_value) { CAMLparam3(k_value, keep_value, dist_value); char *keep = String_val(keep_value); double *dist = Data_bigarray_val(dist_value); gsl_matrix_view m; gsl_vector_char_view v; double work; size_t *medoids, *medoids_ptr; size_t nrow, ncol; CAMLlocal2(res_bigarr, res_tuple); intnat *res_ptr; int i, k; nrow = Bigarray_val(dist_value)->dim[0]; ncol = Bigarray_val(dist_value)->dim[1]; m = gsl_matrix_view_array(dist, nrow, ncol); v = gsl_vector_char_view_array(keep, nrow); k = Int_val(k_value); medoids = pam(&m.matrix, k, &v.vector, &work); res_bigarr = alloc_bigarray_dims(BIGARRAY_CAML_INT | BIGARRAY_C_LAYOUT, 1, NULL, k); res_ptr = Data_bigarray_val(res_bigarr); medoids_ptr = medoids; for (i = 0; i < k; ++i) { *res_ptr++ = *medoids_ptr++; } free(medoids); /* Create a [bigarray;float] tuple to return */ res_tuple = caml_alloc(2, 0); Store_field(res_tuple, 0, res_bigarr); /* Work returned is total. */ Store_field(res_tuple, 1, caml_copy_double(work)); CAMLreturn(res_tuple); } pplacer-1.1.alpha19/pam_src/libpplacer_pam.clib000066400000000000000000000000211303154601500214570ustar00rootroot00000000000000pam.o caml_pam.o pplacer-1.1.alpha19/pam_src/pam.c000066400000000000000000000342341303154601500166100ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #ifdef PAM_TEST #include #endif /* * Partitioning Around Medoids (PAM) * * Let S be a set of selectable items * Let U be a set of unselectable items * * This code takes an SxU distance matrix, and a value k, and attempts to find * the set S' which minimizes the average distance from U to the closest item * in S'. * * This differs from traditional k-medoids, in that instead of choosing a * subset of points from the original dataset, we have distances between two * sets of items: * S - "Selectable" items to search for an optimal subset of * U - "Unselectable" items used to compute cost */ /* Types */ typedef struct __pam_partition_t { /* Number of medoids */ size_t k; /* |S| x |U| Distance matrix */ gsl_matrix *M; /* Indicator whether s_i is a medoid */ gsl_vector_uchar *in_set; /* Index of closest item in set */ gsl_vector_ulong *cl_index; /* distance to item referenced by cl_index */ gsl_vector *cl_dist; /* Indicator vector of positions which must be in solution */ gsl_vector_char *always_select; size_t always_select_count; } pam_partition_t; typedef pam_partition_t *pam_partition; /* Constants */ int PAM_VERBOSE = 0; int PAM_ITERATIONS = 1000000; /* Declarations */ static void gsl_vector_masked_min_index(const gsl_vector * v, const gsl_vector_uchar * mask, /*OUT*/ size_t * index, /*OUT*/ double *value); pam_partition pam_partition_init(gsl_matrix * M, const size_t k, gsl_vector_char * always_select); void pam_partition_free(const pam_partition p); void pam_partition_fprintf(FILE * stream, const pam_partition p); double pam_total_cost(const pam_partition p); static double pam_swap_cost(pam_partition p, size_t m, size_t n); static double pam_swap_update_cost(pam_partition p, size_t m, size_t n, gsl_vector_ulong * cl_index, gsl_vector * cl_dist); static void pam_choose_random_partition(pam_partition p); static void pam_find_closest_medoid(pam_partition p); static void pam_find_closest_medoid_index(pam_partition p, size_t i); /* Indicates if row i must be part of the solution */ static bool pam_always_select(pam_partition p, size_t i); static void pam_run(pam_partition p, size_t max_iters); size_t * pam(gsl_matrix * distances, size_t k, gsl_vector_char * always_select, /*OUT*/ double * dist); /* Initialize a PAM partition given distances M, keep count k */ pam_partition pam_partition_init(gsl_matrix * M, const size_t k, gsl_vector_char * always_select) { assert(k <= M->size1); assert(k > 0); size_t i; pam_partition p = malloc(sizeof(pam_partition_t)); p->M = M; p->k = k; p->always_select_count = 0; p->always_select = always_select; /* Always select */ if(always_select != NULL) { /* Calculate the total number of items */ for (i = 0; i < M->size1; i++) { p->always_select_count += gsl_vector_char_get(always_select, i) != 0; } } assert(p->always_select_count <= k); p->in_set = gsl_vector_uchar_calloc(M->size1); p->cl_index = gsl_vector_ulong_calloc(M->size2); p->cl_dist = gsl_vector_calloc(M->size2); /* Initialize S' randomly, calculate distances between U and S' */ pam_choose_random_partition(p); pam_find_closest_medoid(p); return p; } /* Return the total cost of a partition */ double pam_total_cost(const pam_partition p) { double cost = 0.0; const gsl_vector *cl_dist = p->cl_dist; size_t i; for (i = 0; i < cl_dist->size; i++) { cost += gsl_vector_get(cl_dist, i); } return cost; } /* * Frees p * * Note that the distance matrix p->M is *not* freed by this function. */ void pam_partition_free(const pam_partition p) { gsl_vector_uchar_free(p->in_set); gsl_vector_ulong_free(p->cl_index); gsl_vector_free(p->cl_dist); free(p); } /* Randomly set S' */ static void pam_choose_random_partition(pam_partition p) { gsl_rng *rng; size_t *indices, *chosen, i, *j; /* Number of unconstrained medoids */ size_t random_n = p->M->size1 - p->always_select_count; /* Number of unconstrained medoids to pick */ size_t random_k = p->k - p->always_select_count; rng = gsl_rng_alloc(gsl_rng_taus2); indices = malloc(sizeof(size_t) * random_n); chosen = calloc(random_k, sizeof(size_t)); /* Reset */ gsl_vector_uchar_set_zero(p->in_set); /* First, fill with any indices which must be part of the solution */ j = indices; for (i = 0; i < p->M->size1; i++) { if (pam_always_select(p, i)){ gsl_vector_uchar_set(p->in_set, i, 1); } else { *j++ = i; } } /* Choose randomly from all indices we can */ gsl_ran_choose(rng, (void *) chosen, random_k, indices, random_n, sizeof(size_t)); for (i = 0; i < random_k; i++) { gsl_vector_uchar_set(p->in_set, chosen[i], 1); } gsl_rng_free(rng); free(indices); free(chosen); } void pam_partition_fprintf(FILE * stream, const pam_partition p) { size_t i, j; fprintf(stream, "%zu x %zu; k= %zu; total cost= %f\n", p->M->size1, p->M->size2, p->k, pam_total_cost(p)); for (i = 0; i < p->M->size1; i++) { fprintf(stream, "%d:\t", gsl_vector_uchar_get(p->in_set, i)); for (j = 0; j < p->M->size2; j++) { fprintf(stream, "%f\t", gsl_matrix_get(p->M, i, j)); } fprintf(stream, "\n"); } for (i = 0; i < p->cl_index->size; i++) { fprintf(stream, "\t%zu", gsl_vector_ulong_get(p->cl_index, i)); } fprintf(stream, "\n"); for (i = 0; i < p->cl_dist->size; i++) { fprintf(stream, "\t%f", gsl_vector_get(p->cl_dist, i)); } fprintf(stream, "\n"); } static bool pam_always_select(pam_partition p, size_t i) { return p->always_select == NULL ? false : gsl_vector_char_get(p->always_select, i); } /* Set the closest medoid, distance to closest medoid for all i */ static void pam_find_closest_medoid(pam_partition p) { /* * For each item in U, find closest item in S', recording the distance and * index */ size_t i; for (i = 0; i < p->M->size2; i++) { pam_find_closest_medoid_index(p, i); } } /* Set the closest medoid, distance to closest medoid for column i */ static void pam_find_closest_medoid_index(pam_partition p, size_t i) { size_t index; double min; gsl_vector_view col; min = FLT_MAX; col = gsl_matrix_column(p->M, i); gsl_vector_masked_min_index(&(col.vector), p->in_set, &index, &min); assert(min < FLT_MAX); gsl_vector_ulong_set(p->cl_index, i, index); gsl_vector_set(p->cl_dist, i, min); } /* * v: vector to search for index of minimum value * mask: boolean vector to indicate if v[i] is to be used */ static void gsl_vector_masked_min_index(const gsl_vector * v, const gsl_vector_uchar * mask, size_t * index, /*OUT*/ double * value /*OUT*/) { double min = FLT_MAX, val; long idx = -1; size_t i; assert(v->size == mask->size); for (i = 0; i < v->size; i++) { /* Check mask */ if (!gsl_vector_uchar_get(mask, i)) continue; val = gsl_vector_get(v, i); if (val < min) { min = val; idx = i; } } /* Set result */ if (idx >= 0) { *index = idx; *value = min; } } /* * Calculate cost if states of i and j are reversed. Restores original * configuration prior to returning. * * p: partition * i, j: indices to swap. *i* must be a medoid; *j* must not. */ static double pam_swap_update_cost(pam_partition p, size_t m, size_t n, gsl_vector_ulong * cl_index, gsl_vector * cl_dist) { assert(gsl_vector_uchar_get(p->in_set, m) && !gsl_vector_uchar_get(p->in_set, n)); /* Back up current values */ gsl_vector_ulong *cli = p->cl_index; gsl_vector *cld = p->cl_dist; double result; /* Copy current values */ gsl_vector_ulong_memcpy(cl_index, cli); gsl_vector_memcpy(cl_dist, cld); p->cl_index = cl_index; p->cl_dist = cl_dist; /* Swap */ gsl_vector_uchar_swap_elements(p->in_set, m, n); result = pam_swap_cost(p, m, n); assert(abs(result - pam_total_cost(p)) < 1e-5); /* Finally, restore state */ gsl_vector_uchar_swap_elements(p->in_set, m, n); p->cl_index = cli; p->cl_dist = cld; return result; } /* * Update the cost after swapping current medoid m with non-medoid n * Distance to closest medoid, closest medoid index are updated. */ static double pam_swap_cost(pam_partition p, size_t m, size_t n) { double cost = 0.0; size_t i, cl; gsl_vector_view col; /* Update for each column */ for (i = 0; i < p->M->size2; i++) { cl = gsl_vector_ulong_get(p->cl_index, i); /* If closest to medoid being removed, find new closest medoid */ if (cl == m) { col = gsl_matrix_column(p->M, i); gsl_vector_masked_min_index(&(col.vector), p->in_set, &cl, gsl_vector_ptr(p->cl_dist, i)); gsl_vector_ulong_set(p->cl_index, i, cl); } else { /* Check if the new medoid is closer than the old */ assert(gsl_vector_get(p->cl_dist, i) == gsl_matrix_get(p->M, gsl_vector_ulong_get(p->cl_index, i), i)); if (gsl_matrix_get(p->M, n, i) < gsl_vector_get(p->cl_dist, i)) { gsl_vector_set(p->cl_dist, i, gsl_matrix_get(p->M, n, i)); gsl_vector_ulong_set(p->cl_index, i, n); } } cost += gsl_vector_get(p->cl_dist, i); } return cost; } /* Run PAM */ static void pam_run(pam_partition p, size_t max_iters) { if (p->k == p->M->size1) { /* Simple case */ return; } size_t i, j, k, m, n, trimmed_size = p->M->size1 - p->k, any_swaps = 0, iter = 0; size_t *medoids, *trimmed; double c, current_cost; gsl_vector *cost = gsl_vector_alloc(trimmed_size); gsl_vector_ulong *cl_index = gsl_vector_ulong_alloc(p->cl_index->size); gsl_vector *cl_dist = gsl_vector_alloc(p->cl_dist->size); medoids = malloc(sizeof(size_t) * p->k); trimmed = malloc(sizeof(size_t) * (p->M->size1 - p->k)); j = 0; k = 0; for (i = 0; i < p->M->size1; i++) { if (gsl_vector_uchar_get(p->in_set, i)) medoids[j++] = i; else { assert(!pam_always_select(p, i)); trimmed[k++] = i; } } assert(j == p->k); assert(k == p->M->size1 - p->k); do { if (PAM_VERBOSE) fprintf(stderr, "Iteration %zu\n", iter); any_swaps = 0; /* For every medoid, m, swap with every non-medoid, compute cost */ for (i = 0; i < p->k; i++) { m = medoids[i]; /* If medoid is in the always_select set, no action. */ if (pam_always_select(p, m)) continue; current_cost = pam_total_cost(p); /* Try every non-medoid */ gsl_vector_set_all(cost, FLT_MAX); for (j = 0; j < trimmed_size; j++) { n = trimmed[j]; c = pam_swap_update_cost(p, m, n, cl_index, cl_dist); gsl_vector_set(cost, j, c); } /* Find the minimum cost from all swaps */ j = gsl_vector_min_index(cost); if (gsl_vector_get(cost, j) < current_cost) { /* Current cost beaten */ any_swaps = 1; n = trimmed[j]; assert(n != m); assert(!gsl_vector_uchar_get(p->in_set, n)); assert(gsl_vector_uchar_get(p->in_set, m)); if (PAM_VERBOSE) fprintf(stderr, "SWAP: %zu->%zu [%f -> %f]\n", m, n, current_cost, gsl_vector_get(cost, j)); gsl_vector_uchar_swap_elements(p->in_set, m, n); /* Move n to medoids, m to trimmed */ trimmed[j] = m; medoids[i] = n; /* Recalculate cached values */ pam_swap_cost(p, m, n); } } } while (any_swaps && ++iter < max_iters); if (PAM_VERBOSE) { fprintf(stderr, "Done in %zu iterations. Final config:\n", iter); gsl_vector_uchar_fprintf(stderr, p->in_set, "%d"); fprintf(stderr, "Final cost: %f\n", pam_total_cost(p)); } gsl_vector_free(cost); gsl_vector_ulong_free(cl_index); gsl_vector_free(cl_dist); free(medoids); free(trimmed); } /* Partition around medoids. * * distances: distances between U (columns) and S (rows) * k: Number of medoids to select * always_select: |S|-length vector indicating if s_i is required to be in the * final solution. If NULL, there are no constraints on the solution. * dist: Set to total cost of the partition. * * Returns the indices of the k selected medoids. */ size_t * pam(gsl_matrix * distances, size_t k, gsl_vector_char * always_select, /*OUT*/ double * dist) { size_t * result = malloc(sizeof(size_t) * k); size_t i = 0, j = 0; pam_partition p; assert(k <= distances->size1); p = pam_partition_init(distances, k, always_select); pam_run(p, PAM_ITERATIONS); *dist = pam_total_cost(p); for (i = 0; i < p->in_set->size; i++) { if (gsl_vector_uchar_get(p->in_set, i)) result[j++] = i; } assert(j == k); pam_partition_free(p); return result; } #ifdef PAM_TEST int main(int argc, char **argv) { gsl_matrix *m; FILE *f; size_t *result; double work; int rows, cols, keep, i; time_t start, end; if (argc != 3) { fprintf(stderr, "USAGE: %s dist_matrix keep_rows\n\n", argv[0]); fprintf(stderr, "dist_matrix should have one line with 'n_rows n_cols' "); fprintf(stderr, "followed by the matrix.\n"); return 1; } keep = atoi(argv[2]); f = fopen(argv[1], "r"); /* Read dimensions: width then height */ assert(fscanf(f, "%d %d", &rows, &cols) == 2); m = gsl_matrix_alloc(rows, cols); assert(!gsl_matrix_fscanf(f, m)); fclose(f); time(&start); result = pam(m, keep, NULL, &work); time(&end); for(i = 0; i < keep; i++) printf("%lu ", result[i]); printf("\n"); printf("Total work: %f\n", work); printf("Took: %.2lfs\n", difftime(end, start)); gsl_matrix_free(m); free(result); return 0; } #endif pplacer-1.1.alpha19/pam_src/pam_solver.ml000066400000000000000000000030001303154601500203530ustar00rootroot00000000000000open Ppatteries module BA = Bigarray module BA1 = Bigarray.Array1 type int_vector = (int, BA.int_elt, BA.c_layout) BA1.t external c_pam: int -> string -> Matrix.matrix -> int_vector * float = "caml_pam" module I = Mass_map.Indiv let solve ?keep gt mass leaves = (* transm is old -> new *) let gt', transm = Gtree.renumber gt in let dist = Edge_rdist.build_pairwise_dist gt' |> Edge_rdist.find_pairwise_dist and leaf_arr = Gtree.leaf_ids gt' |> Array.of_list and trans i = IntMap.find i transm (* rtransm is new -> old *) and rtransm = IntMap.enum transm |> Enum.map swap |> IntMap.of_enum in let old_leaf_idx old = Array.findi ((=) (IntMap.find old transm)) leaf_arr and rtrans i = IntMap.find i rtransm and total_mass = I.total_mass mass in let keep_string = String.make (Array.length leaf_arr) '\000' in Option.may (IntSet.iter (fun leaf -> keep_string.[old_leaf_idx leaf] <- '\001')) keep; (* Generate a work matrix. *) let leaf_vec, work = IntMap.fold (fun i vl accum -> List.fold_left (fun accum {I.distal_bl; I.mass} -> (* bl scaled by mass *) Array.map (fun j -> mass *. (dist (trans i) distal_bl j 0.)) leaf_arr :: accum) accum vl) mass [] |> Array.of_list |> Matrix.of_arrays (* rows are masses; columns are leaves. thus, we need to transpose *) |> Matrix.rect_transpose |> c_pam leaves keep_string in BA1.enum leaf_vec |> Enum.map (Array.get leaf_arr %> rtrans) |> IntSet.of_enum, work /. total_mass pplacer-1.1.alpha19/pam_src/sample-data.txt000066400000000000000000000051441303154601500206160ustar00rootroot0000000000000016 16 0 0.32529889 0.41196471 0.35582283 0.40486425 0.50417444 0.49123347 0.51903421 0.52641161 0.52365588 0.52394629 0.51921853 0.50850308 0.51967816 0.54743458 0.51228435 0.32529889 0 0.15885038 0.1027085 0.15174992 0.25106011 0.23811914 0.26591988 0.27329728 0.27054155 0.27083196 0.2661042 0.25538875 0.26656383 0.29432025 0.25917002 0.41196471 0.15885038 0 0.18937302 0.23841444 0.33772463 0.32478366 0.3525844 0.3599618 0.35720607 0.35749648 0.35276872 0.34205327 0.35322835 0.38098477 0.34583454 0.35582283 0.1027085 0.18937302 0 0.10857108 0.20788127 0.1949403 0.22274104 0.23011844 0.22736271 0.22765312 0.22292536 0.21220991 0.22338499 0.25114141 0.21599118 0.40486425 0.15174992 0.23841444 0.10857108 0 0.16973193 0.15679096 0.1845917 0.1919691 0.18921337 0.18950378 0.18477602 0.17406057 0.18523565 0.21299207 0.17784184 0.50417444 0.25106011 0.33772463 0.20788127 0.16973193 0 0.09078497 0.11858571 0.12596311 0.12320738 0.12349779 0.11877003 0.10805458 0.11922966 0.14698608 0.11183585 0.49123347 0.23811914 0.32478366 0.1949403 0.15679096 0.09078497 0 0.10564084 0.11301824 0.11026251 0.11055292 0.10582516 0.09510971 0.10628479 0.13404121 0.09889098 0.51903421 0.26591988 0.3525844 0.22274104 0.1845917 0.11858571 0.10564084 0 0.13797106 0.13521533 0.13550574 0.13077798 0.12006253 0.13123761 0.15899403 0.1238438 0.52641161 0.27329728 0.3599618 0.23011844 0.1919691 0.12596311 0.11301824 0.13797106 0 0.05899761 0.05928802 0.05456026 0.04384481 0.05501989 0.08277631 0.04762608 0.52365588 0.27054155 0.35720607 0.22736271 0.18921337 0.12320738 0.11026251 0.13521533 0.05899761 0 0.04484375 0.04011599 0.03396094 0.04513602 0.07289244 0.03774221 0.52394629 0.27083196 0.35749648 0.22765312 0.18950378 0.12349779 0.11055292 0.13550574 0.05928802 0.04484375 0 0.03298344 0.03425135 0.04542643 0.07318285 0.03803262 0.51921853 0.2661042 0.35276872 0.22292536 0.18477602 0.11877003 0.10582516 0.13077798 0.05456026 0.04011599 0.03298344 0 0.02952359 0.04069867 0.06845509 0.03330486 0.50850308 0.25538875 0.34205327 0.21220991 0.17406057 0.10805458 0.09510971 0.12006253 0.04384481 0.03396094 0.03425135 0.02952359 0 0.02440656 0.05216298 0.01701275 0.51967816 0.26656383 0.35322835 0.22338499 0.18523565 0.11922966 0.10628479 0.13123761 0.05501989 0.04513602 0.04542643 0.04069867 0.02440656 0 0.0495274 0.01437717 0.54743458 0.29432025 0.38098477 0.25114141 0.21299207 0.14698608 0.13404121 0.15899403 0.08277631 0.07289244 0.07318285 0.06845509 0.05216298 0.0495274 0 0.04213359 0.51228435 0.25917002 0.34583454 0.21599118 0.17784184 0.11183585 0.09889098 0.1238438 0.04762608 0.03774221 0.03803262 0.03330486 0.01701275 0.01437717 0.04213359 0 pplacer-1.1.alpha19/pdprune_src/000077500000000000000000000000001303154601500165615ustar00rootroot00000000000000pplacer-1.1.alpha19/pdprune_src/pd.ml000066400000000000000000000102371303154601500175210ustar00rootroot00000000000000open Ppatteries open Ptree (* we use the IdblSet to choose what is the next best edge choice *) type idbl = {id : int; bl : float} (* we only want Pends in the set! *) module OrderedIdbl = struct type t = idbl (* order first by bl, then by id *) let compare a b = match compare a.bl b.bl with 0 -> compare a.id b.id | x -> x end module IdblSet = Set.Make(OrderedIdbl) let idblset_of_ptree exclude_ids pt = fold (fun id e s -> if IntSet.mem id exclude_ids then s else match e with | Pend(id',bl,_) -> assert(id=id'); IdblSet.add {id; bl} s | Inte(_,_,_) -> s) pt IdblSet.empty let hashtbl_freplace f h id = strict_replace h id (f (find h id)) (* *) (* we delete the specified pendant branch, extend the other branches to maintain * the structure of the tree, and perform the corresponding * modification to idbls (which gets returned). *) let delete_pend pt idbl idbls = match find pt idbl.id with | Inte(_,_,_) -> failwith "can't delete internal edge" | Pend(_, _, eidl) -> let del_idbls = IdblSet.remove idbl idbls in strict_remove pt idbl.id; (match eidl with | [] | [_] -> assert false | [eid1; eid2] -> begin (* degree two-- heal the wound. *) match ((eid1,find pt eid1), (eid2,find pt eid2)) with | ((_,Pend(_,_,_)),(_,Pend(_,_,_))) -> raise (Not_implemented "can't cut down trees without internal edges") | ((id1, Inte(bl1,l1,r1)), (id2, Inte(bl2,l2,r2))) -> (* we are deleting a pendant edge which touches two internal edges. * we join these two internal edges together. *) (* id2_far_side is the set of edges far from idbl.id *) let id2_far_side = get_other_side [idbl.id; id1] l2 r2 in (* we need to re-attach the edges which point to id2 *) List.iter (tree_update ~src:id2 ~dst:id1 pt) id2_far_side; strict_replace pt id1 (Inte(bl1+.bl2, get_other_side [idbl.id; id2] l1 r1, id2_far_side)); strict_remove pt id2; del_idbls | ((pid, Pend(orig_id,pbl,pl)), (iid, Inte(ibl,il,ir))) | ((iid, Inte(ibl,il,ir)), (pid, Pend(orig_id,pbl,pl))) -> (* we are deleting one edge of a cherry. in this case, we delete the * other pendant edge and extend the just-proximal edge with the pendant * edge's length. That way, we don't have to update the other edges with * a different id. *) assert(sorted_list_eq pl [iid; idbl.id]); strict_replace pt iid (Pend(orig_id, pbl+.ibl, get_other_side [idbl.id; pid] il ir)); strict_remove pt pid; IdblSet.add {id=iid; bl=pbl+.ibl} (IdblSet.remove {id=pid; bl=pbl} del_idbls) end | eidl -> (* degree greater than two: * delete idbl.id from the edge lists of the other nodes *) let check_del1 l = let out = List.filter ((<>) idbl.id) l in (* make sure that internal nodes still have degree greater than two *) assert(1 < List.length out); out in List.iter (hashtbl_freplace (function | Pend(id,bl,l) -> Pend(id, bl, check_del1 l) | Inte(bl,l,r) -> Inte(bl, check_del1 l, check_del1 r)) pt) eidl; del_idbls ) type stop_criterion = | Branch_length of float | Leaf_count of int let until_stopping safe exclude_ids criterion pt = let should_stop = match criterion with | Branch_length bl -> fun s -> (IdblSet.min_elt s).bl > bl | Leaf_count c -> fun s -> (IdblSet.cardinal s) <= c in let rec aux accu s = if s = IdblSet.empty then accu else begin let m = IdblSet.min_elt s in if should_stop s then accu else match find pt m.id with | Pend(orig_id, bl, _) -> assert(bl = m.bl); let new_s = delete_pend pt m s in if safe then check pt; aux ((orig_id,m.bl,to_stree pt)::accu) new_s | Inte(_,_,_) -> assert false end in List.rev (aux [] (idblset_of_ptree exclude_ids pt)) pplacer-1.1.alpha19/pdprune_src/ptree.ml000066400000000000000000000166011303154601500202360ustar00rootroot00000000000000exception Other_side of int list * int list * int list exception Side_without of int * int list * int list exception Not_implemented of string exception Missing_edge of int * string exception Pend_mismatch of int list (*desired*) * int list (*found*) exception Inte_mismatch of int list (*desired*) * int list (*foundl*) * int list (*foundr*) open Ppatteries type edge = (* id bl connections *) | Pend of int * float * int list | Inte of float * int list * int list (* oh yes! a mutable data structure, just for fun. *) type ptree = (int, edge) Hashtbl.t (* *** EDGE UTILS *** *) let sorted_list_eq l1 l2 = List.sort compare l1 = List.sort compare l2 (* assert that one_side is a (potentially resorted version of) l or r, and * return the one that it is not *) let get_other_side one_side l r = if sorted_list_eq one_side l then r else if sorted_list_eq one_side r then l else raise (Other_side (one_side, l, r)) (* same, but for a single element *) let get_side_without x l r = if List.mem x l then r else if List.mem x r then l else raise (Side_without (x, l, r)) let list_replace ~src ~dst = List.map (fun x -> if x = src then dst else x) let edge_update ~src ~dst = function | Pend(id,bl,l) as p -> if List.mem src l then Pend(id,bl, list_replace src dst l) else p | Inte(bl,l,r) as i -> if not ((List.mem src l) || (List.mem src r)) then i else Inte(bl, list_replace src dst l, list_replace src dst r) (* *** PTREE UTILS *** *) let create = Hashtbl.create let fold = Hashtbl.fold let iter = Hashtbl.iter let strict_replace pt i e = if Hashtbl.mem pt i then Hashtbl.replace pt i e else raise (Missing_edge (i, "strict_replace")) let find pt i = try Hashtbl.find pt i with | Not_found -> raise (Missing_edge (i, "find")) let strict_remove pt i = if Hashtbl.mem pt i then Hashtbl.remove pt i else raise (Missing_edge (i, "strict_remove")) let safe_add h k v = assert(not (Hashtbl.mem h k)); Hashtbl.add h k v let tree_update ~src ~dst pt id = if src = id then raise (Not_implemented "replacing own id"); strict_replace pt id (edge_update ~src ~dst (find pt id)) (* uuuuuugly! *) exception Found_inte of int let find_internal pt = try iter (fun i -> function | Inte(_,_,_) -> raise (Found_inte i) | _ -> ()) pt; None with | Found_inte i -> Some i (* Define a node of an edge to be the * (edge id)::(one of the edge lists of the node) * Here we check if n is one of the nodes of the edge with id eid. * *) let check_node n eid = function | Pend(_,_,l) -> let found = eid::l in if not (sorted_list_eq n found) then raise (Pend_mismatch (n,found)) | Inte(_,l,r) -> let foundl,foundr = (eid::l,eid::r) in if not ((sorted_list_eq n foundl) || (sorted_list_eq n foundr)) then raise (Inte_mismatch (n,foundl,foundr)) (* check all of the connections of a tree *) let check pt = let rec rooted_check above eidl = let our_node = above::eidl in List.iter (fun below -> let e = try find pt below with | Missing_edge (missing,_) as x -> dprintf "%d missing (requested by %d)\n" missing above; raise x in check_node our_node below e; match e with | Pend(_,_,_) -> () | Inte(_,l,r) -> rooted_check below (get_side_without above l r)) eidl in match find_internal pt with | None -> assert false | Some i -> begin match find pt i with | Inte(_,l,r) -> rooted_check i l; rooted_check i r | _ -> assert false end (* *** OF *** *) (* bl_getter is a function which returns a bl given an id *) let of_stree bl_getter st = let pt = create (1+(Stree.max_id st)) in (* righto is None if we have a pendant edge *) let add_edge id left righto = let bl = bl_getter id in safe_add pt id (match righto with | None -> Pend(id, bl, left) | Some right -> Inte(bl, left, right)) in let rec aux above_ids = function | Stree.Node(id, tL) -> let ids_of_tl = List.map Stree.top_id in add_edge id above_ids (Some (ids_of_tl tL)); List.iter (fun (below, rest) -> aux (id::(ids_of_tl rest)) below) (ListFuns.pull_each_out tL) | Stree.Leaf id -> add_edge id above_ids None in (* the basic tree builder, which doesn't take tricky rooting into account *) let root_build (to_build, rest) = aux (List.map Stree.top_id rest) to_build in let () = match st with | Stree.Leaf _ -> () | Stree.Node(_, [t1; t2]) -> begin (* tree with degree two rootings require some special care *) (* first build the basic tree *) List.iter root_build (ListFuns.pull_each_out [t1; t2]); let (id1, id2) = (Stree.top_id t1, Stree.top_id t2) in match (find pt id1, find pt id2) with | (Inte(bl1,l1,r1), Inte(bl2,l2,r2)) -> let join1 = get_other_side [id2] l1 r1 and join2 = get_other_side [id1] l2 r2 in (* make new internal edge *) strict_replace pt id1 (Inte(bl1+.bl2, join1, join2)); (* clean out old edge *) strict_remove pt id2; (* reconnect things to new edge *) List.iter (tree_update ~src:id2 ~dst:id1 pt) (join1 @ join2); | _ -> raise (Not_implemented "rooted on pendant edge") end | Stree.Node(_, tL) -> List.iter root_build (ListFuns.pull_each_out tL); in pt let of_gtree gt = let get_bl i = try (IntMap.find i gt.Gtree.bark_map)#get_bl with | Not_found -> failwith "tree is missing branch lengths" in of_stree get_bl gt.Gtree.stree let of_string s = of_gtree (Newick_gtree.of_string s) let of_file s = of_gtree (Newick_gtree.of_file s) (* *** TO *** *) let to_gtree pt = (* start with maximum of indices of the ids *) let count = ref (fold (fun _ e j -> match e with Pend(i,_,_) -> max i j | _ -> j) pt 0) and m = ref IntMap.empty in let add_bark i bl nameo = m := IntMap.add i (new Newick_bark.newick_bark (`Of_bl_node_edge_label (Some bl, nameo, None))) !m in (* above is a neighboring edge index in the "up" direction in the resulting * rooting *) let rec aux ~above our_id = match find pt our_id with | Inte(bl,l,r) -> incr count; let node_id = !count in (* have to nail down count due to recursion *) add_bark node_id bl None; let our_side = get_side_without above l r in Stree.Node(node_id, List.map (aux ~above:our_id) our_side) | Pend(id,bl,_) -> add_bark id bl (Some (string_of_int id)); Stree.Leaf id in match find_internal pt with | Some start_edge -> begin match find pt start_edge with | Inte(bl,l,r) -> let stl = aux ~above:(List.hd r) start_edge and str = aux ~above:(List.hd l) start_edge in add_bark (Stree.top_id stl) (bl/.2.) None; add_bark (Stree.top_id str) (bl/.2.) None; incr count; Gtree.gtree (Stree.Node(!count, [stl;str])) !m | Pend(_,_,_) -> assert(false) end | None -> let tL = (* fix our mutables *) fold (fun _ e l -> match e with | Inte(_,_,_) -> assert false | Pend(id,bl,_) -> add_bark id bl (Some (string_of_int id)); (Stree.Leaf id)::l) pt [] in Gtree.gtree (Stree.Node (1 + !count, tL)) !m let to_stree pt = Gtree.get_stree (to_gtree pt) pplacer-1.1.alpha19/pdprune_src/rppr_pdprune.ml000066400000000000000000000066621303154601500216450ustar00rootroot00000000000000open Subcommand open Guppy_cmdobjs open Ppatteries class cmd () = object (self) inherit subcommand () as super inherit tabular_cmd () as super_tabular val cutoff = flag "--cutoff" (Needs_argument ("cutoff", "Specify the maximum branch length to be trimmed.")) val leaf_count = flag "--leaves" (Needs_argument ("leaves", "Specify the maximum number of leaves to leave un-trimmed.")) val names_only = flag "--names-only" (Plain (false, "Only split out a list of names, rather than names and PD decrease.")) val safe = flag "--unsafe" (Plain (true, "Don't perform internal checks.")) val never_prune_from = flag "--never-prune-from" (Plain ("", "Provide a file containing sequence names that will not be pruned.")) val never_prune_regex_from = flag "--never-prune-regex-from" (Plain ("", "Provide a file containing regular expressions; sequence names matching one of these will not be pruned.")) method specl = super_tabular#specl @ [ float_flag cutoff; int_flag leaf_count; toggle_flag names_only; toggle_flag safe; string_flag never_prune_from; string_flag never_prune_regex_from; ] method desc = "prunes the tree to maximize PD" method usage = "usage: pdprune [options] tree" method action = function | [fname] -> let never_prune_names = match fv never_prune_from with | "" -> StringSet.empty | fname -> File.lines_of fname |> StringSet.of_enum and never_prune_regexl = match fv never_prune_regex_from with | "" -> [] | fname -> File.lines_of fname |> Enum.map Str.regexp |> List.of_enum and names_only = fv names_only and safe = fv safe and criterion = match fvo cutoff, fvo leaf_count with | Some cutoff, None -> if cutoff <= 0. then failwith "Please specify a positive cutoff value."; Pd.Branch_length cutoff | None, Some count -> Pd.Leaf_count count | _, _ -> failwith "please specify exactly one of --cutoff and --leaves" in let ss_list_add = List.fold_right StringSet.add and search r str = try let _ = Str.search_forward r str 0 in true with | Not_found -> false in let gt = Newick_gtree.of_file fname in let get_name id = (IntMap.find id gt.Gtree.bark_map)#get_node_label in let namel = Gtree.recur (fun _ below -> List.flatten below) (fun i -> [get_name i]) gt in let never_prunes = List.fold_right (fun r -> ss_list_add (List.filter (search r) namel)) never_prune_regexl never_prune_names in StringSet.iter (Printf.printf "not pruning %s\n") never_prunes; let pt = Ptree.of_gtree gt and never_prune_ids = Gtree.fold_over_leaves (fun i b s -> match b#get_node_label_opt with | Some name -> if StringSet.mem name never_prunes then IntSet.add i s else s | None -> s) gt IntSet.empty in let line_of_result = if names_only then (fun (id,_,_) -> [get_name id]) else (fun (id,bl,_) -> [get_name id; string_of_float bl]) in List.map line_of_result (Pd.until_stopping safe never_prune_ids criterion pt) |> self#write_ll_tab | l -> List.length l |> Printf.sprintf "pdprune takes exactly one tree (%d given)" |> failwith end pplacer-1.1.alpha19/pdprune_src/t-pd.ml000066400000000000000000000023541303154601500177630ustar00rootroot00000000000000open Ptree open Pd let pl_of_hash h = Hashtbl.fold (fun k v l -> (k,v)::l) h [] let unit_bl_of_s s = let st = Gtree.get_stree (Newick.of_string s) in of_stree (fun _ -> 1.) st let test_to_from s = let st = Gtree.get_stree (Newick.of_string s) in let pt = of_stree (fun _ -> 1.) st in (s, pl_of_hash pt, st, to_gtree pt);; let test s = let pt = unit_bl_of_s s in let ps = idblset_of_ptree pt in (pl_of_hash pt, IdblSet.elements ps);; let x = test "((x,y),(a,b))";; let x = test_to_from "((x,y),(a,b))";; let x = test "((x,y),((a,b),(c,d)))";; let x = test_to_from "((x,y),((a,b),(c,d)))";; (* let four = of_string "((x:1,y:2):4,(a:9,b:9):9,(c:9,d:9):9):9";; let x = PendSet.elements (pendset_of_pt four);; let x = pl_of_hash four;; let x = perform four 7.;; let six = of_string "((x:1,y:2):4,(a:9,b:9):9,(c:9,d:9):9):9";; let x = to_gtree six;; let s = idblset_of_pt six;; let s = delete_pend six 0 s;; let x = (IdblSet.elements s, pl_of_hash six, to_gtree six);; let s = delete_pend six 3 s;; let x = (IdblSet.elements s, pl_of_hash six, to_gtree six);; *) let six = of_string "((x:1,y:2):1,(a:1,b:9):9,(c:9,d:9):9):9;";; let x = until_stopping six 7.;; (* let pt = of_file "COG0001.auto1.fast.tre" *) (* let out = perform pt 1e-2 *) pplacer-1.1.alpha19/pplacer_src/000077500000000000000000000000001303154601500165325ustar00rootroot00000000000000pplacer-1.1.alpha19/pplacer_src/bark_map.ml000066400000000000000000000011461303154601500206420ustar00rootroot00000000000000(* assumes that the bark is at least a newick bark *) open Ppatteries let union = IntMap.union let ppr ff bm = IntMap.ppr_gen (fun ff bark -> bark#ppr ff) ff bm let boost by m = IntMap.fold (fun k v -> IntMap.add (k+by) v) m IntMap.empty let get_bl m id = (IntMap.find id m)#get_bl let get_node_label m id = (IntMap.find id m)#get_node_label let get_edge_label m id = (IntMap.find id m)#get_edge_label let to_node_label_map bm = IntMap.fold (fun id bark accu -> try IntMap.add id bark#get_node_label accu with | Newick_bark.No_node_label -> accu) bm IntMap.empty pplacer-1.1.alpha19/pplacer_src/barycenter.ml000066400000000000000000000154171303154601500212320ustar00rootroot00000000000000(* Calculating the barycenter of a mass distribution on a tree. *) open Ppatteries open Mass_map (* masses *) let list_sum = List.fold_left (fun accu x -> accu +. x) 0. (* get the sub-map with just the keys in key_list. *) let submap m key_list = List.fold_right (fun k accu -> if IntMap.mem k m then IntMap.add k (IntMap.find k m) accu else accu) key_list IntMap.empty let singleton_map k v = IntMap.add k v IntMap.empty (* Count the numer of elements of the given list which evaluate to true upon the * application of f. *) let list_count f l = List.fold_left (fun accu x -> if f x then accu+1 else accu) 0 l (* * Collect all of the ids which are distal to a given internal node. * Note that "wanted" is not included. * Note: just returns the empty list if the id is not in the tree. * # let t = Gtree.get_stree (Newick_gtree.of_string "((a,b),(c,d))");; val t : Stree.stree = ((0,1)2,(3,4)5)6 # let ids = Barycenter.collect_distal_ids t 2;; val ids : int list = [0; 1] # let ids = Barycenter.collect_proximal_ids t 2;; val ids : int list = [6; 5; 3; 4] * *) let collect_distal_ids stree wanted = let rec aux = function | Stree.Node(i, tL) -> if i = wanted then List.flatten (List.map Stree.node_ids tL) else (let below = List.map aux tL in (* make sure we don't have the id appearing multiple places *) assert(list_count (( <> ) []) below <= 1); List.flatten below) (* if we get to a leaf but haven't hit wanted yet then the leaf must be wanted. * however, in that case we don't include it by the above comment *) | Stree.Leaf _ -> [] in aux stree (* * This time, collect the proximal ids. * We go down the tree, and stop until we hit wanted. * Note: returns all of the ids in the tree if the id is not in the tree. *) let collect_proximal_ids stree wanted = let rec aux = function | Stree.Node(i, tL) -> if i = wanted then [] (* stop *) else (i :: (List.flatten (List.map aux tL))) | Stree.Leaf i -> if i = wanted then [] else [i] in aux stree exception Found_edge of int exception Found_node of int type action = Continue | Stop (* Find the barycenter given a ref tree and an Indiv mass map. * Not especially optimized, as it makes submaps for each work calculation. * Pos is the position along the edge, which is a distal_bl. *) module I = Mass_map.Indiv let find ref_tree mass_m = let smass = Indiv.sort mass_m in (* The work to move the mass in sub_mass to a point mass on edge id at the * given position. *) let work sub_mass id pos = Kr_distance.dist ref_tree 1. sub_mass (singleton_map id [{I.distal_bl = pos; I.mass = I.total_mass sub_mass}]) in (* The amount of work required to move all of the mass on the chosen side, as * well as the edge_mass, to pos on id. The chosen side is determined by * collect_fun which is either collect_distal_ids or collect_proximal_ids. * Edge mass is simply a list of Indiv mass units that sit on the chosen side * of the chosen point. *) let tree_work collect_fun edge_mass id pos = let sub_mass = IntMap.add id edge_mass (submap smass (collect_fun (Gtree.get_stree ref_tree) id)) in work sub_mass id pos in (* ml stands for mass list. * prox_ml is extra mass that is thought of as living on the proximal side of * the edge, i.e. the edge_mass as described above. *) let proximal_work prox_ml id pos = List.iter (fun {I.distal_bl = m_pos} -> assert(m_pos >= pos)) prox_ml; tree_work collect_proximal_ids prox_ml id pos and distal_work dist_ml id pos = List.iter (fun {I.distal_bl = m_pos} -> assert(m_pos <= pos)) dist_ml; tree_work collect_distal_ids dist_ml id pos in (* The difference between the proximal and distal work. *) let delta ~prox_ml ~dist_ml id pos = (proximal_work prox_ml id pos) -. (distal_work dist_ml id pos) in let get_mass_list id = if IntMap.mem id smass then IntMap.find id smass else [] in (* Check determines if the barycenter-containing edge is below the given id, * by telling us to Continue (it's below), Stop (it's above), or it raises a * Found_edge, which means it's on edge id. *) let check id = let bl = Gtree.get_bl ref_tree id and our_mass_list = get_mass_list id in if 0. > delta ~prox_ml:our_mass_list ~dist_ml:[] id 0. (* We are negative at the bottom of the edge. continue. *) then Continue else if 0. > delta ~prox_ml:[] ~dist_ml:our_mass_list id bl (* Top is negative (and bottom is positive from before) *) then raise (Found_edge id) else (* Top is positive *) Stop in (* Find the edge or node where the barycenter lies. *) let rec find_loc = function | Stree.Leaf id -> check id | Stree.Node(id, tL) -> (match check id with | Continue -> let below = List.map find_loc tL in (* This edge is negative at the bottom but nothing was found. * The deepest node to have this must have positive at the tops of all of the * edges. We assert to make sure this is the case. *) List.iter (fun b -> assert(b = Stop)) below; raise (Found_node id) | Stop as s -> s) in (* da and dc are Delta(a) and Delta(c) in the barycenter scan. *) let find_pos id = let bl = Gtree.get_bl ref_tree id in let rec aux ~dist_ml ~prox_ml curr_pos = let our_delta pos = assert(pos <= bl); delta ~dist_ml ~prox_ml id pos in (* The barycenter formula. Because da is negative we are essentially taking * a weighted average here. *) let bary ~above_pos da = assert(da <= 0.); let dc = our_delta curr_pos in assert(dc >= 0.); curr_pos +. (above_pos -. curr_pos) *. dc /. (dc -. da) in match prox_ml with | [] -> (* at the top of the edge *) bary ~above_pos:bl (our_delta bl) | {I.distal_bl = pos} as v :: rest -> begin (* pos is now the next position up *) let da = our_delta pos in if da > 0. then (* we can do better by moving past this placement *) aux ~dist_ml:(v::dist_ml) ~prox_ml:rest pos else bary ~above_pos:pos da end in (* start at the bottom with all the placements on top *) aux ~dist_ml:[] ~prox_ml:(get_mass_list id) 0. in try let _ = find_loc (Gtree.get_stree ref_tree) in failwith "failed to find barycenter edge/node!" with | Found_node id -> (* the node is at the bottom of the edge *) (id, 0.) | Found_edge id -> (id, find_pos id) (* pre means Mass_map.Pre *) let of_pre t pmm = find t (Indiv.of_pre pmm) let of_placerun weighting criterion pr = find (Placerun.get_ref_tree pr) (Indiv.of_placerun weighting criterion pr) pplacer-1.1.alpha19/pplacer_src/bayes_factor.ml000066400000000000000000000073361303154601500215360ustar00rootroot00000000000000(* We will be calculating the Bayes factors on taxonomic rank, and they will guide us to an understanding of what taxonomic level is correct. Let ranks be numbered such that increasing numbers mean more specific taxonomic ranks (as in implementation.) For each rank r we will calculate an evidence; this is P(D|M), where in this case D is the posterior probabilities observed on the edges, and M is the hypothesis that r is the correct rank for classification. We will be marginalizing over the classifications themselves. P(D|M) = \sum_{\theta \in \Theta} P(\theta | M) P(D | \theta, M) Here, \theta is the actual classification, and \Theta is the set of classifications at rank r. P(\theta | M) is the prior given the rank. We will take it to be one over the number of edges painted with classification \theta. The probabilistically right thing to do would be to normalize this such that the sum of the priors is one, but this would penalize more specific classifications in cases where there were lots of choices. We can try it out. P(D | \theta, M) is the likelihood given the classification. In our case, the term that matters is the sum of the posterior probabilities for edges with classification theta. So, for every placement and every rank, we want to report the evidence for that rank, which will be the sum of the following over classifications theta of that rank: [sum of the probability mass for all edges painted theta] / [number of edges painted theta] * *) open Ppatteries module TaxIdMap = Tax_id.TaxIdMap module IAMR = IntAlgMapR type t = (string * float * float option) array (* From a reference package, pquery, and criterion, determine the evidence and * evidence ratio (like a Bayes factor) for each rank. The returned value is an * array of rank names, evidences, and Bayes factor values (if applicable). * Note that this actually takes (see fun below) rp mrca_class criterion pq. * *) let of_refpkg_and_classif_map rp cm = (* A map from each tax_id in the MRCA map to the number of times that tax_id * labels an edge in the tree. *) let denom_map = Classif_map.map cm |> IntMap.values |> TaxIdMap.histogram_of_enum |> TaxIdMap.map float_of_int and td = Refpkg.get_taxonomy rp in fun criterion pq -> (* Build up the evidence map, which maps from ranks to the average amount of * mass per edge. *) let evidence_m = List.fold_left (fun accum p -> match Placement.classif_opt p with | None | Some Tax_id.NoTax -> accum | Some ti -> (* ... *) try IAMR.add_by (Tax_taxonomy.get_tax_rank td ti) (criterion p /. TaxIdMap.find ti denom_map) accum with Not_found -> Printf.sprintf "tax_id %s is not represented on the classification tree. If you used \ --mrca-class for placement did you also use it for classification, \ and vice versa?" (Tax_id.to_string ti) |> failwith) IAMR.empty (Pquery.place_list pq) in let evidence_of i = IAMR.soft_find i evidence_m and prev_represented = ref None in (* Now go down the evidence map, calculating the Bayes factor-ish * quanitities for neighboring pairs of occupied ranks. *) Array.mapi (fun i rankname -> let ev = evidence_of i in rankname, ev, if ev =~ 0. then None else let prev = !prev_represented in prev_represented := Some i; Some (match prev with | None -> infinity | Some i' -> let ev' = evidence_of i' in if ev' =~ 0. then neg_infinity else log (ev /. ev'))) td.Tax_taxonomy.rank_names pplacer-1.1.alpha19/pplacer_src/biom.ml000066400000000000000000000045511303154601500200170ustar00rootroot00000000000000open Ppatteries let split_file_regexp = Str.regexp "^\\(.+\\):\\(.+?\\)$" let split_file s = if not (Str.string_match split_file_regexp s 0) then failwith "biom file provided with no tree"; Str.matched_group 1 s, Str.matched_group 2 s let safe_hashtbl_find h k = try Hashtbl.find h k with | Not_found -> failwith ("'"^k ^"' not found in the BIOM file!") exception No_leaf of string let () = Printexc.register_printer (function | No_leaf l -> Some (Printf.sprintf "leaf %s in BIOM file not found on provided tree" l) | _ -> None) let of_tree_and_biom combined_filename = let tree, biom = split_file combined_filename in let gt = Newick_gtree.of_file tree and j = Jsontype.obj (Json.of_file biom) in let leaf_map = Newick_gtree.leaf_label_map gt |> IntMap.enum |> Enum.map swap |> StringMap.of_enum and get k = match Hashtbl.find_option j k with | Some x -> x | None -> failwith (Printf.sprintf "couldn't find key %S" k) in if get "type" <> Jsontype.String "OTU table" then failwith "only OTU table BIOM files are supported"; let counts = match get "matrix_type" with | Jsontype.String "dense" -> get "data" |> Jsontype.array |> List.mapi (fun i l -> Jsontype.array l |> List.mapi (fun j x -> i, j, Jsontype.int x)) |> List.flatten | Jsontype.String "sparse" -> get "data" |> Jsontype.array |> List.map (Jsontype.array |- List.enum |- map Jsontype.int |- Tuple3.of_enum) | _ -> failwith "OTU matrix must be either sparse or dense" and parse_id obj = safe_hashtbl_find (Jsontype.obj obj) "id" |> Jsontype.string in let parse_ids = get |- Jsontype.array |- List.map parse_id |- Array.of_list in let rows = parse_ids "rows" and columns = parse_ids "columns" in List.group (comparing Tuple3.second) counts |> List.map (fun ll -> let sample = columns.(List.hd ll |> Tuple3.second) in flip List.map ll (fun (row, _, count) -> let loc = try StringMap.find rows.(row) leaf_map with Not_found -> raise (No_leaf rows.(row)) in Pquery.make_ml_sorted ~namlom:["pl_" ^ rows.(row), float_of_int count] ~seq:Pquery_io.no_seq_str [Placement.make_ml loc ~ml_ratio:1. ~log_like:0. ~dist_bl:0. ~pend_bl:0. |> Placement.add_pp ~post_prob:1. ~marginal_prob:1.]) |> Placerun.make gt sample) pplacer-1.1.alpha19/pplacer_src/bootstrap.ml000066400000000000000000000021331303154601500211000ustar00rootroot00000000000000open Ppatteries (* Bootstrap a placerun. This has gotten a little tricky because pqueries * indicate their multiplicity by namloms, which are (string * float) lists. * The total multiplicity for a placerun is defined to be the total of all of * the floats. These pqueries will lose some of their names under * bootstrapping; e.g. [a, 4.; b,3.] may become [a, 9.]. *) let boot_placerun rng pr = let pqa = Array.of_list (Placerun.get_pqueries pr) in let multip = Array.map Pquery.multiplicity pqa in (* multa has the resampled multiplicity of each of the pqueries. *) let multa = Gsl_randist.multinomial rng (int_of_float (Array.fold_left ( +. ) 0. multip)) (* get total multiplicity *) multip and pql = ref [] in for i=(Array.length pqa)-1 downto 0 do if multa.(i) > 0 then let nl = [Pquery.name pqa.(i), float_of_int multa.(i)] in pql := {pqa.(i) with Pquery.namlom = nl}::(!pql) done; let new_pr = { pr with Placerun.pqueries = !pql } in assert(int_of_float (Placerun.total_multiplicity pr) = int_of_float (Placerun.total_multiplicity new_pr)); new_pr pplacer-1.1.alpha19/pplacer_src/check.ml000066400000000000000000000005101303154601500201350ustar00rootroot00000000000000(* routines for doing sanity checks *) open Ppatteries (* check that dir_name is actually a directory *) let directory dir_name = try if not (Sys.is_directory dir_name) then raise (Sys_error "") with | Sys_error _ -> failwith (Printf.sprintf "Bad directory specification: '%s'" dir_name) pplacer-1.1.alpha19/pplacer_src/classif_map.ml000066400000000000000000000024471303154601500213540ustar00rootroot00000000000000open Ppatteries type 'a t = { map: Tax_id.t IntMap.t; tree: 'a Gtree.gtree; } type kind = Mrca_map | Edge_painting let kind_of_mrca_class = function | true -> Mrca_map | false -> Edge_painting let map {map} = map let tree {tree} = tree (* Fill in the normally-sparse MRCA map so that every node in the tree maps to * the appopriate MRCA, instead of just the nodes where the MRCAs occur. *) let all_mrcas rp = let mrcam = Refpkg.get_mrcam rp and utm = Refpkg.get_uptree_map rp in let rec update mrcam i = match IntMap.Exceptionless.find i mrcam with | Some x -> mrcam, x | None -> let mrcam', x = update mrcam (IntMap.find i utm) in IntMap.add i x mrcam', x in Refpkg.get_ref_tree rp |> Gtree.get_stree |> Stree.node_ids |> List.fold_left (update |-- fst) mrcam let of_refpkg rp = function | Mrca_map -> {map = all_mrcas rp; tree = Refpkg.get_ref_tree rp} | Edge_painting -> {map = Edge_painting.of_refpkg rp; tree = Refpkg.get_ref_tree rp} let of_refpkg_mrca_class rp mrca_class = of_refpkg rp (kind_of_mrca_class mrca_class) let root_taxon cm = IntMap.find (Gtree.top_id cm.tree) cm.map let classify cm p = IntMap.get (Placement.location p) Tax_id.NoTax cm.map let classify_strict cm p = IntMap.find (Placement.location p) cm.map pplacer-1.1.alpha19/pplacer_src/convex.ml000066400000000000000000000656651303154601500204100ustar00rootroot00000000000000open Ppatteries open Stree type color = Tax_id.t module ColorSet = Tax_id.TaxIdSet module ColorMap = Tax_id.TaxIdMap type cset = ColorSet.t type 'a cmap = 'a ColorMap.t let ppr_csetim = IntMap.ppr_gen ColorSet.ppr module OrderedColorSet = struct type t = cset let compare = ColorSet.compare end module PprColorSet = struct type t = cset let ppr = ColorSet.ppr end module ColorSetMap = BetterMap (Map.Make(OrderedColorSet)) (PprColorSet) type coloropt = color option module OrderedColorOpt = struct type t = coloropt let compare co1 co2 = match co1, co2 with | None, Some _ -> -1 | Some _, None -> 1 | None, None -> 0 | Some c1, Some c2 -> compare c1 c2 end module PprColorOpt = struct type t = coloropt let ppr ff = function | Some c -> Format.fprintf ff "<%s>" (Tax_id.to_string c) | None -> Format.fprintf ff "--" end module ColorOptSet = BetterSet (Set.Make(OrderedColorOpt)) (PprColorOpt) module ColorOptMap = BetterMap (Map.Make(OrderedColorOpt)) (PprColorOpt) (* A question is a pair (c, X) where c is an arbitrary optional color and X is a * subset of the cut set for the edge above the given internal node. The * terminology comes from wanting to know the best solution for such a subtree * where the colors of that cut set are restricted to X, and there is a leaf of * color c attached to the root of the subtree. *) type question = color option * cset module PprQuestion = struct type t = question let ppr ff (co, cs) = Format.fprintf ff "@[(%s,@ " begin match co with | None -> "-" | Some c -> Tax_id.to_string c end; ColorSet.ppr ff cs; Format.fprintf ff ")@]" end module OrderedQuestion = struct type t = question let compare (co1, cs1) (co2, cs2) = match co1, co2 with | Some c1, Some c2 when c1 = c2 -> ColorSet.compare cs1 cs2 | Some c1, Some c2 -> compare c1 c2 | None, Some _ -> -1 | Some _, None -> 1 | None, None -> ColorSet.compare cs1 cs2 end module QuestionMap = BetterMap (Map.Make(OrderedQuestion)) (PprQuestion) type 'a qmap = 'a QuestionMap.t type csetl = ColorSet.t list type apart = (color option * ColorSet.t) list (* apart = almost partition *) type sizem = int ColorMap.t type colorm = color IntMap.t type cdtree = colorm * stree type local_phi = (apart * int) QuestionMap.t type phi = local_phi IntMap.t (* nu_f is a type for upper bounds for the number of leaves left in a convex * subset of leaves. We pass them phi, the apart, and the list of top indices * for the subtrees at our internal node. *) type nu_f = cset -> sizem list -> apart -> int (* Abbreviations *) module CS = ColorSet module COS = ColorOptSet module COM = ColorOptMap module CSM = ColorSetMap let all colors = List.fold_left CS.union CS.empty colors let between colors = all (List.map (fun (x, y) -> CS.inter x y) (ListFuns.list_pairs_of_single colors)) let build_sizemim_and_cutsetim (colors, tree) = (* Building an internal_node -> szm, color_below map. *) let rec aux = function | Leaf i -> let szm, clbelow = match begin try Some (IntMap.find i colors) with | Not_found -> None end with | Some color -> let szm = ColorMap.singleton color 1 and clbelow = CS.singleton color in szm, clbelow | None -> ColorMap.empty, CS.empty in szm, clbelow, IntMap.singleton i (szm, clbelow) | Node (i, subtrees) -> let maps = List.map aux subtrees in let szm = ColorMap.merge_counts (List.map (fun (a, _, _) -> a) maps) in let clbelow, leafm = List.fold_left (fun (claccum, lfaccum) (_, cl, lf) -> CS.union claccum cl, IntMap.union lfaccum lf) (CS.empty, IntMap.empty) maps in szm, clbelow, IntMap.add i (szm, clbelow) leafm in let _, _, leafm = aux tree in let szm = IntMap.map fst leafm and below_clm = IntMap.map snd leafm in (* Refines the below_clm to just map to the cut colors. * The procedure is to erase non-between colors as we proceed down the tree. * Accum is the partially-erased color set IntMap. * Terminated are the colors for which exist on the "above" side of this * internal node in the tree-- thus if we see a terminated color below then we * know that the color is cut by the edge above this node. * *) let rec aux terminated accum = function | Leaf _ -> accum | Node (_, subtrees) -> let colorsets = List.map (fun tree -> IntMap.find (top_id tree) accum) subtrees in (* Update terminated. *) let terminated' = CS.union terminated (between colorsets) in List.fold_left2 (fun accum colors tree -> let i = top_id tree in (* colors' are just those edge colors in terminated' *) let colors' = CS.inter colors terminated' in if colors = colors' then (* We don't have to cut anything from any of the edges below because * we know that every color below also exists "above" this edge. *) accum else aux terminated' (IntMap.add i colors' accum) tree) accum colorsets subtrees in let cut_clm = aux CS.empty below_clm tree in szm, cut_clm let subtreelist_map f tree = let rec aux accum = function | [] -> accum | Leaf i :: rest -> aux (IntMap.add i [f i] accum) rest | Node (i, subtrees) :: rest -> aux (IntMap.add i (List.map (fun tree -> f (top_id tree)) subtrees) accum) (List.rev_append subtrees rest) in aux IntMap.empty [tree] let maplist_of_map_and_tree map = subtreelist_map (fun i -> IntMap.find i map) (* Cartesian product of a list list. *) let product lists = let rec aux accum base = function | [] -> (List.rev base) :: accum | l :: rest -> List.fold_left (fun accum x -> aux accum (x :: base) rest) accum l in aux [] [] lists (* Find the potential distributions of a color across a list of b values and * cut sets. Each resulting distribution will be a list of sets as long as the * input cut set. *) let cutsetdist apart color = let add_empty = List.cons CS.empty in let add_color = List.cons (CS.singleton color) in let rec aux base b_accum accum = function (* Base case: return our accumulated distributions. *) | [] -> List.map List.rev accum @ List.map List.rev b_accum (* Color is not cut by this edge. *) | (_, cutset) :: rest when not (CS.mem color cutset) -> aux (add_empty base) (List.map add_empty b_accum) (List.map add_empty accum) rest (* Relevant b; color is cut by this edge. *) | (Some b, _) :: rest when b = color -> let b_accum' = List.fold_left (fun accum x -> add_empty x :: add_color x :: accum) [] b_accum in aux (add_empty base) (add_color base :: b_accum') (List.map add_empty accum) rest (* No relevant b; color is cut by this edge. *) | _ :: rest -> aux (add_empty base) (List.map add_empty b_accum) (add_color base :: List.map add_empty accum) rest in aux [] [] [] apart (* Transpose a list of lists, then fold a function along the new list of lists. * e.g. transposed_fold (+) [0; 0] [[1; 2]; [3; 4]] -> [4; 6] *) let transposed_fold f start ll = let rec aux prev = function | [] -> prev | l :: rest -> aux (List.map2 f prev l) rest in aux start ll let coptset_of_cset cset = CS.fold (fun c s -> COS.add (Some c) s) cset COS.empty let cset_of_coptset coptset = COS.fold (fun c s -> match c with | Some c' -> CS.add c' s | None -> s) coptset CS.empty (* From a cutsetl, determine the possible assignments of b onto the edges below * this node. Potential b values are determined for each pair of edges from the * shared cut colors, which are then validated to ensure that an edge isn't * assigned two colors. *) let find_b_assignments cutsetl = (* b assignments can only be usefully done with at least 2 edges. *) if List.length cutsetl < 2 then [List.map (const None) cutsetl] else (* ... *) let cutseta = Array.of_list cutsetl in (* The final step (written first as an aux function) is to perform the * aforementioned validation of each edge pair's b assignment. *) let aux assignments lbl = (* If no other b is assigned, an edge gets None. *) let bs = Array.map (const None) cutseta in let verify_update idx nv = let ov = bs.(idx) in (* If a color has been assigned to this edge and it's not the color that * was already assigned, this is invalid, so bail out. *) if ov <> None && ov <> nv then Return.return lbl None; bs.(idx) <- nv in (* For each edge pair and color, try to assign both edges that color. *) List.iter (function | _, _, None -> () | a, b, copt -> verify_update a copt; verify_update b copt) assignments; (* If there wasn't an invalid assignment, this is a valid list of b values * for each edge. *) Some (Array.to_list bs) in EnumFuns.combinations (Array.range cutseta |> List.of_enum) 2 |> Enum.map (function | [a; b] -> (* For each pair of edges, determine the shared cut colors. *) CS.inter cutseta.(a) cutseta.(b) |> CS.elements |> List.map (fun x -> a, b, Some x) |> List.cons (a, b, None) | _ -> invalid_arg "find_bs") |> List.of_enum (* Take the cartesian product, giving a list of every possible assignment for * every pair of edges. *) |> List.n_cartesian_product |> List.enum (* Filter and transform the edge-pair assignments to edge assignments. *) |> Enum.filter_map (fun assignments -> Return.label (aux assignments)) |> List.of_enum (* Don't return duplicate assignments. *) |> List.sort_unique compare (* As indicated by the underscore, this function is not designed to work as is. * Indeed, we need to preprocess with the case of c not being in any of the cut * sets under the internal node as defined in build_apartl below. *) let _build_apartl strict cutsetl kappa (c, x) = let xopt = coptset_of_cset x in (* Anything in kappa - x doesn't get distributed. *) let to_exclude = coptset_of_cset (CS.diff kappa x) in (* These are the colors that we need to put in the different subsets. *) let to_distribute = match c with (* Having a c in strict convexity means we can only have c below. *) | Some c' when strict -> [c'] | _ -> COS.union xopt (COS.diff (coptset_of_cset (all cutsetl)) to_exclude) |> cset_of_coptset |> CS.elements in (* The potential b's for our apartl. *) let b_assignments = (* Because xopt never contains None, this is in fact testing c in x. If * that is true, b can only be assigned c. This is also the case in strict * convexity if there is any c. *) if COS.mem c xopt || (strict && c <> None) then [List.map (const c) cutsetl] else (* Otherwise, assign b from the cut sets. *) find_b_assignments cutsetl in (* Iterate over the lists of b assignments. Each assignment indicates the * color of each edge below this node. *) List.enum b_assignments |> Enum.map (fun blist -> let startsl = List.map (const CS.empty) cutsetl in (* The colors are distributed in a few steps. We first find the potential * distributions for each color. cutsetdist does most of the work here. *) List.map (cutsetdist (List.combine blist cutsetl)) to_distribute (* Taking the cartesian product gives all of the possible distributions of * all colors. *) |> product |> List.enum (* Then, each of the per-color distributions are unioned to find one * distribution for all colors, which is then combined with the b * assignments to form a pi. *) |> Enum.filter_map (fun pre_csetl -> let csetl = transposed_fold CS.union startsl pre_csetl in (* However, in strict convexity, each x_i in a pi can only contain one * color. *) if strict && not (List.for_all (CS.cardinal |- (>=) 1) csetl) then None else Some (List.combine blist csetl))) |> Enum.flatten |> List.of_enum let build_apartl_memo = Hashtbl.create 1024 (* The primary apartl builder. * Cutsetl is the list of cut sets below, kappa are those sets colors cut from * the internal node above. * While this function is mostly a wrapper around the apartl memo, it /does/ * also update `c`, as it's useful to do so pre-memoization. *) let build_apartl ?(strict = false) cutsetl kappa (c, x) = (* If c is not in any of the cut sets below and we're not building strict * apartls, then we can replace it with None. *) let c = match c with | Some c' when not strict && not (List.exists (CS.mem c') cutsetl) -> None | x -> x in let q = c, x in try Hashtbl.find build_apartl_memo (cutsetl, kappa, q) with | Not_found -> let ret = _build_apartl strict cutsetl kappa q in Hashtbl.add build_apartl_memo (cutsetl, kappa, q) ret; ret let apart_nu kappa sizeml pi = List.fold_left2 (fun accum (b, cutset) sizem -> let kappa = match b with | Some c -> ColorSet.remove c kappa | None -> kappa in let to_ignore = ColorSet.diff kappa cutset in let is_ignored c = ColorSet.mem c to_ignore in ColorMap.fold (fun color count accum -> if is_ignored color then accum else accum + count) sizem accum) 0 pi sizeml let add_phi node question answer phi = let local_phi = try IntMap.find node phi with | Not_found -> QuestionMap.empty in IntMap.add node (QuestionMap.add question answer local_phi) phi let rec phi_recurse ?strict ?nu_f cutsetim sizemlim tree ((_, x) as question) phi = let i = top_id tree in match begin try Some (QuestionMap.find question (IntMap.find i phi)) with | Not_found -> None end with | Some (_, omega) -> phi, omega | None -> (* Begin real work. *) let phi_recurse = phi_recurse ?strict ?nu_f cutsetim sizemlim in let phi, res = match tree with | Leaf _ -> (* Could put in some checks here about the size of cutsetim. *) let omega = if x = IntMap.find i cutsetim then 1 else 0 in phi, Some (omega, []) | Node (_, subtrees) -> let cutsetl = List.map (fun subtree -> IntMap.find (top_id subtree) cutsetim) subtrees in let apartl = build_apartl ?strict cutsetl (IntMap.find i cutsetim) question in (* Recur over subtrees to calculate (omega, updated_phi) for the apart * (b, pi). *) let apart_omega phi pi = List.fold_left2 (fun (phi, subtotal) pi_i subtree -> let phi, omega = phi_recurse subtree pi_i phi in phi, subtotal + omega) (phi, 0) pi subtrees in let nu_apartl = match nu_f with | None -> List.map (fun apart -> None, apart) apartl | Some nu_f -> let apart_nu' = nu_f (IntMap.find i cutsetim) (IntMap.find i sizemlim) in List.map (fun apart -> Some (apart_nu' apart), apart) apartl |> List.sort compare in let rec aux phi current_best = function | (nu_opt, apart) :: rest -> ( let phi, omega = apart_omega phi apart in match current_best, nu_opt with | None, _ -> aux phi (Some (omega, apart)) rest | Some (prev_omega, _), _ when omega > prev_omega -> aux phi (Some (omega, apart)) rest | Some (prev_omega, _), Some nu when nu < prev_omega -> phi, current_best | _, _ -> aux phi current_best rest) | [] -> phi, current_best in aux phi None nu_apartl in match res with | Some (omega, apart) -> let phi' = add_phi i question (apart, omega) phi in phi', omega | None -> (* In this case, there's no viable candidates below this node on the * tree. The important part is that since there's no viable apart, this * can't be stored in phi. So: if a question is not found in the final * phi, the answer is "ignore this node and all below it." *) phi, 0 let badness cutsetim = IntMap.fold (fun _ cutset (worst, total) -> let badness_i = max 0 ((CS.cardinal cutset) - 1) in max worst badness_i, total + badness_i) cutsetim (0, 0) (* From an stree, produce a map from all the node numbers in the stree to sets * of all of the node numbers below that respective node. *) let rec belowm_of_stree = function | Leaf i -> IntSet.singleton i |> IntMap.singleton i | Node (i, subtrees) -> let map = List.map belowm_of_stree subtrees |> List.reduce IntMap.union in IntMap.add i (IntMap.values map |> Enum.reduce IntSet.union |> IntSet.add i) map let prune_tree (colors, st) = let kept_leaves = IntMap.keys colors |> IntSet.of_enum and belowm = belowm_of_stree st and all_leaves = leaf_ids st |> IntSet.of_list in let rec should_keep i = IntMap.find i belowm |> IntSet.disjoint kept_leaves |> not and aux = function | Leaf _ as l -> l | Node (i, subtrees) -> List.filter_map (fun t -> let j = top_id t in if not (should_keep j) then None else Some (aux t)) subtrees |> node i in IntSet.diff all_leaves kept_leaves, aux st let solve ?strict ?nu_f ((_, tree) as cdtree) = let sizemim, cutsetim = build_sizemim_and_cutsetim cdtree in let cutsetim = IntMap.add (top_id tree) CS.empty cutsetim in let sizemlim = maplist_of_map_and_tree sizemim tree in Hashtbl.clear build_apartl_memo; phi_recurse ?strict ?nu_f cutsetim sizemlim tree (None, CS.empty) IntMap.empty (* Given a phi (an implicit solution) get an actual solution, i.e. a subset of * the leaves to include. The recursion works as follows: maintain rest, which * is the list of things that remain to be expanded. If the first element of * rest has a leaf, then add it to the list if appropriate and recur. If not, * expand out the subtrees of the first element of rest and recur. *) let nodeset_of_phi_and_tree phi tree = let rec aux accum = function | (Leaf i, question) :: rest -> let _, omega = QuestionMap.find question (IntMap.find i phi) in let accum = if omega = 0 then accum else IntSet.add i accum in aux accum rest | (Node (i, subtrees), question) :: rest -> let qmap = IntMap.find i phi in (* As above, if a question isn't found in the final phi, we should be * ignoring this node and all the nodes below it. *) if not (QuestionMap.mem question qmap) then aux accum rest else let pi, _ = QuestionMap.find question qmap in let rest' = List.fold_left2 (fun rest pi_i subtree -> (subtree, pi_i) :: rest) rest pi subtrees in aux accum rest' | [] -> accum in aux IntSet.empty [tree, (None, CS.empty)] (* Make map from names to their respective indices. *) let node_label_map_of_tree t = Gtree.fold_over_leaves (fun i bark accum -> try StringMap.add bark#get_node_label i accum with Newick_bark.No_node_label -> accum) t StringMap.empty let gen_build_rank_tax_map empty add_fn td node_fn enum = let add_to_rankmap seq rankmap ti = match node_fn seq with | Some node -> let rank = Tax_taxonomy.get_tax_rank td ti in let seqmap = IntMap.get rank empty rankmap in IntMap.add rank (add_fn node ti seqmap) rankmap | None -> rankmap in Enum.fold (fun rankmap (seq, ti) -> List.fold_left (add_to_rankmap seq) rankmap (Tax_taxonomy.get_lineage td ti)) IntMap.empty enum let build_rank_tax_map a b c = gen_build_rank_tax_map IntMap.empty IntMap.add a b c let rank_tax_map_of_refpkg rp = let node_map = Refpkg.get_ref_tree rp |> node_label_map_of_tree and td = Refpkg.get_taxonomy rp in Refpkg.get_seqinfom rp |> StringMap.enum |> Enum.map (Tuple.Tuple2.map2 (fun {Tax_seqinfo.tax_id} -> tax_id)) |> build_rank_tax_map td (flip StringMap.Exceptionless.find node_map) |> tap (fun m -> Array.iteri (fun rank rankname -> if not (IntMap.mem rank m) then deprintf "warning: rank %s not represented in the lineage of any \ sequence in reference package %s.\n" rankname (Refpkg.get_name rp)) td.Tax_taxonomy.rank_names) let add_color_setly k v m = IntMap.add k (CS.add v (IntMap.get k CS.empty m)) m let merge_color_setly m1 m2 = IntMap.fold (fun k v m -> IntMap.add k (CS.union v (IntMap.get k CS.empty m)) m) m1 m2 let alternate_colors ((colors, tree) as cdtree) = let _, cutsetim = build_sizemim_and_cutsetim cdtree in let cutsetlim = maplist_of_map_and_tree cutsetim tree in let rec aux accum counter = function | [] -> accum | (group, cur_tree) :: rest -> let i = top_id cur_tree in let cutsetl = IntMap.find i cutsetlim in let cutset = all cutsetl in assert (CS.cardinal cutset <= 1); let node_relevant = CS.is_empty cutset in let accum', counter', group' = match group, cur_tree with | Some g, Leaf _ -> IntMap.add_listly g (i, true) accum, counter, group | None, Leaf _ when not (IntMap.mem i colors) -> IntMap.add_listly counter (i, true) accum, counter + 1, Some counter | Some g, Node _ when node_relevant -> IntMap.add_listly g (i, false) accum, counter, group | None, Node _ when node_relevant -> IntMap.add_listly counter (i, false) accum, counter + 1, Some counter | _ -> accum, counter, None in let rest' = match cur_tree with | Leaf _ -> rest | Node (_, subtrees) -> List.fold_left (fun accum subtree -> (group', subtree) :: accum) rest subtrees in aux accum' counter' rest' in let groupmap = aux IntMap.empty 0 [None, tree] in let rev_groupmap = IntMap.fold (fun group entries accum -> List.fold_left (fun accum (i, _) -> IntMap.add i group accum) accum entries) groupmap IntMap.empty in let rec aux accum = function | [] -> accum | (_, Leaf _) :: rest -> aux accum rest | (parent, (Node (i, subtrees) as cur_tree)) :: rest -> let accum' = if IntMap.mem i rev_groupmap then let g = IntMap.find i rev_groupmap in let subtrees' = match parent with | Some parent -> parent :: subtrees | None -> subtrees in List.fold_left (fun accum -> function | Leaf i | Node (i, _) -> merge_color_setly accum (IntMap.singleton g (all (IntMap.find i cutsetlim)))) accum subtrees' else List.fold_left (fun accum -> function | Leaf j when IntMap.mem j rev_groupmap -> let g = IntMap.find j rev_groupmap in merge_color_setly accum (IntMap.singleton g (all (IntMap.find i cutsetlim))) | _ -> accum) accum subtrees in let parent' = Some cur_tree in let rest' = List.fold_left (fun accum subtree -> (parent', subtree) :: accum) rest subtrees in aux accum' rest' in let group_colors = aux IntMap.empty [None, tree] in IntMap.fold (fun g entries accum -> let g_colors = IntMap.get g CS.empty group_colors in List.fold_left (fun accum (i, is_leaf) -> if is_leaf then IntMap.add i g_colors accum else accum) accum entries) groupmap IntMap.empty let copt_singleton = function | Some color -> CS.singleton color | None -> CS.empty let add_longest k v m = match begin try Some (CSM.find k m) with Not_found -> None end with | Some prev when IntSet.cardinal v <= IntSet.cardinal prev -> m | _ -> CSM.add k v m module Naive = struct let solve ((_, tree) as cdtree) = let _, cutsetim = build_sizemim_and_cutsetim cdtree in let cutsetim = IntMap.add (top_id tree) CS.empty cutsetim in let cutsetlim = maplist_of_map_and_tree cutsetim tree in let rec walk = function | Leaf i -> let kappa = IntMap.find i cutsetim in if CS.is_empty kappa then COM.singleton None (CSM.singleton CS.empty (IntSet.singleton i)) else let color = CS.choose kappa in let csm = CSM.singleton (CS.singleton color) (IntSet.singleton i) in COM.of_pairlist [Some color, csm; None, csm] | Node (i, subtrees) -> let phi = List.map walk subtrees and big_b = between (IntMap.find i cutsetlim) and kappa = IntMap.find i cutsetim in let ret = COS.fold (fun c accum -> let c' = copt_singleton c in let ret_c = COS.fold (fun b accum -> let b' = copt_singleton b in let rec aux used_colors used_nodes accum = function | [] -> add_longest used_colors used_nodes accum | phi_i :: rest -> let accum' = aux used_colors used_nodes accum rest in let x_is = match COM.get b CSM.empty phi_i with | x when CSM.is_empty x -> COM.find None phi_i | x -> x in CSM.fold (fun x_i nodes accum -> if CS.is_empty (CS.diff (CS.inter x_i used_colors) b') && (b = c || CS.is_empty (CS.inter x_i c')) then aux (CS.union used_colors x_i) (IntSet.union used_nodes nodes) accum rest else accum) x_is accum' in aux CS.empty IntSet.empty accum phi) (COS.add c (coptset_of_cset big_b)) CSM.empty in COM.add c ret_c accum) (COS.add None (coptset_of_cset kappa)) COM.empty in if CS.is_empty kappa then let best = CSM.fold (fun _ cur -> function | Some prev when IntSet.cardinal cur <= IntSet.cardinal prev -> Some prev | _ -> Some cur) (COM.find None ret) None in match best with | Some best -> COM.singleton None (CSM.singleton CS.empty best) | None -> failwith "no clades on an internal node ???" else ret in CSM.find CS.empty (COM.find None (walk tree)) end pplacer-1.1.alpha19/pplacer_src/convex.mli000066400000000000000000000126561303154601500205510ustar00rootroot00000000000000(* Notes: In the manuscript, there is no notion of optional color. However, that notion is useful here. In the aparts, an between color of None is any color that is not in B(\pi), and is not forced upon us by the above color. In this situation, the between color b can be any color from one of the pis; all such colors are equivalent so we just use None to decrease the complexity slightly. *) open Ppatteries open Stree type color = Tax_id.t module ColorSet: MapsSets.S with type elt = color module ColorMap: MapsSets.M with type key = color type cset = ColorSet.t type 'a cmap = 'a ColorMap.t val ppr_csetim: Format.formatter -> cset IntMap.t -> unit module ColorSetMap: MapsSets.M with type key = cset type coloropt = color option module ColorOptMap: MapsSets.M with type key = coloropt type question = color option * cset (* a pair (c, X) *) module QuestionMap: MapsSets.M with type key = question type 'a qmap = 'a QuestionMap.t type csetl = cset list type apart = (color option * ColorSet.t) list (* apart = almost partition *) type sizem = int cmap type colorm = color IntMap.t type cdtree = colorm * stree type local_phi = (apart * int) qmap type phi = local_phi IntMap.t (* Here the int list is the list of top_id's that are in parallel with the * top_id's of the subtree below. *) type nu_f = cset -> sizem list -> apart -> int val find_b_assignments: csetl -> color option list list val cutsetdist: apart -> color -> csetl list (* QuestionMap should be a map from questions *) (* Basics. *) val all: csetl -> cset (** Just list union, called A in the manuscript. *) val between: csetl -> cset (** The union of the pairwise intersections, called B in the manuscript. *) (* Getting ready. *) val build_sizemim_and_cutsetim: cdtree -> sizem IntMap.t * cset IntMap.t (** Given a colored tree, for every (integer-indexed) node record the number of * leaves below with a given color. * * Make a map that goes from every internal node to the color sets in the * subtrees below that internal node. *) (* Building up aparts. *) val build_apartl: ?strict:bool -> csetl -> cset -> question -> apart list (** Given an [X1,...,Xk] and a (c, X) return a list of (b, pi)'s. * If c is in X or if B = B([X1,...,Xk]) is empty, then b = c. * Otherwise, b can be anything in B. * In either case, B(pi) must be a subset of {b} and A(pi) = X. * Build up stepwise using add_elt_to_apart, starting with the list consisting * of all (b,pi) such that pi is just the possible distributions of b into the * x's. * *) (* For the recursion. *) val apart_nu: nu_f (** Calculate the nu of an apart, given a sizem list for the nodes below it, and the color set of the kappa above it. *) (* The recursion, as it were. *) val phi_recurse: ?strict:bool -> ?nu_f:nu_f -> cset IntMap.t -> sizem list IntMap.t -> Stree.stree -> question -> phi -> phi * int (** phi_recurse id q phi returns a phi map which includes the answer * to the posed question. *) (* Version with lower bounds. * First make sure that the question isn't already answered in phi. * If so, return phi. * Otherwise... let csetl = IntMap.find node_num cutsetlm let apartl = build_apartl csetl q in let nul = List.map apart_nu apartl in ... sort the apartl in decreasing order according to nul ... proceed down the sorted apartl and nul lists. inner recursion: keep track of the best solution found so far (best_phi) and its size (best_size). pick off the next apart and nu. if none then return (best_phi, best_size) if nu is less than or equal to best_nu then return (best_phi, best_size) otherwise if apart is (b, pi) then for each x_i pi, then recur down the subtree i with the question (b, x_i). take that phi and pass on to the next subtree. If it's a leaf, then just return the same phi and 0 if the incoming question is not empty and one otherwise (assert that it doesn't have more than one elt.) *) val prune_tree: cdtree -> IntSet.t * stree (** Prune a tree down to just the leaves that are represented in the color map, also providing the leaves which were cut. *) val solve: ?strict:bool -> ?nu_f:nu_f -> cdtree -> phi * int (** Solve a tree, returning the solved phi and the omega of the best solution. *) val badness: cset IntMap.t -> int * int (** Calculate (respectively) the maximum and total badness of a cutsetim. *) val nodeset_of_phi_and_tree: phi -> stree -> IntSet.t (** From a solved phi, find the set of leaves on the provided tree which were not cut. *) val maplist_of_map_and_tree: 'a IntMap.t -> stree -> 'a list IntMap.t (** From a tree and a map from node numbers to 'a, build a map from internal node numbers to a list of the values of the map at each of the subtrees of that internal node. *) val gen_build_rank_tax_map: 'a -> ('b -> Tax_id.tax_id -> 'a -> 'a) -> Tax_taxonomy.t -> ('c -> 'b option) -> ('c * Tax_id.tax_id) Enum.t -> 'a IntMap.t val build_rank_tax_map: Tax_taxonomy.t -> ('a -> int option) -> ('a * Tax_id.t) Enum.t -> Tax_id.t IntMap.t IntMap.t val rank_tax_map_of_refpkg: Refpkg.t -> Tax_id.tax_id IntMap.t IntMap.t (** Build a map from leaves to tax_ids for each rank of the taxonomy in a reference package. *) val alternate_colors: cdtree -> cset IntMap.t (** From a partially-uncolored tree, determine the potential colors of uncolored leaves. *) module Naive: sig val solve: cdtree -> IntSet.t (** Solve a tree using the naive algorithm. Returns a set of the leaves to keep from the tree. *) end pplacer-1.1.alpha19/pplacer_src/core.ml000066400000000000000000000400701303154601500200150ustar00rootroot00000000000000(* Here we actually do the work. * The optimization is split into two stages-- the first "rough" stage and the * second stage where branches and locations are more thoroughly optimized. * See http://www.biomedcentral.com/1471-2105/11/538/#sec5 *) open Ppatteries open Prefs let max_iter = 200 (* The second stage tolerance for branch length optimization. Modify in online * help if changed here. *) let final_tolerance = 1e-5 let avg l = (List.reduce (+.) l) /. (List.length l |> float_of_int) (* Make an array that indexes the true values of the array. # Core.mask_reindex [|true; false; false; true; false; true;|];; - : int array = [|0; 3; 5|] * When applied to a mask indicator array, it gives an array such that the ith * index of the reindexed array is the index of the original sequence * corresponding to the ith index of the masked sequence. *) let mask_reindex a = Array.fold_lefti (fun l i elt -> if elt then i::l else l) [] a |> List.rev |> Array.of_list (* This function returns a map from the internal nodes i to the mean of the * prior used for the pendant branch lengths. This is the average of the leaf * distances strictly below the edge corresponding to the internal node i, plus * top_segment_f applied to the edge labeled i. *) let prior_mean_map top_segment_f t = let bl = Gtree.get_bl t in let rec aux = function | Stree.Leaf i -> IntMap.singleton i (top_segment_f (bl i)), [bl i] | Stree.Node (i, subtrees) -> let map, distances = List.map aux subtrees |> List.reduce (fun (m1, l1) (m2, l2) -> IntMap.union m1 m2, List.append l1 l2) in (* Add the average distance for i onto the map. *) distances |> List.map ((+.) (top_segment_f (bl i))) |> avg |> flip (IntMap.add i) map, (* Increase the collection of distances by the given branch length. *) List.map ((+.) (bl i)) distances in aux t.Gtree.stree |> fst |> IntMap.remove (Gtree.top_id t) type prior = | Uniform_prior | Flat_exp_prior of float | Informative_exp_prior of float IntMap.t type result = | Fantasy of (int * (float * float * float)) list | Pquery of Pquery.pquery | Timing of string * float | Evaluated_best of string * int * int * int (* Prefs.prefs -> *) (* Ppatteries.IntMap.key list -> *) (* prior -> *) (* Model.t -> *) (* (string * string) Ppatteries.Array.mappable -> *) (* < get_bl : float; .. > Gtree.gtree -> *) (* darr:Glv.glv array -> *) (* parr:Glv.glv array -> *) (* snodes:Glv.glv array -> string * string -> result list *) (* pplacer_core : * Actually try the placements, etc. Return placement records. *) let pplacer_core (type a) (type b) m prefs figs prior (model: a) ref_align gtree ~(darr: b array) ~(parr: b array) ~(snodes: b array) = let module Model = (val m: Glvm.Model with type t = a and type glv_t = b) in let module Glv = Model.Glv in let module Glv_arr = Glv_arr.Make(Model) in let module Glv_edge = Glv_edge.Make(Model) in let module Three_tax = Three_tax.Make(Model) in let keep_at_most = Prefs.keep_at_most prefs and keep_factor = Prefs.keep_factor prefs in let log_keep_factor = log keep_factor in let seq_type = Model.seq_type model (* The prior function takes an edge number and a pendant BL. *) and prior_fun = match prior with | Uniform_prior -> (fun _ _ -> 1.) | Flat_exp_prior mean -> fun _ -> Gsl_randist.exponential_pdf ~mu:mean | Informative_exp_prior mean_map -> fun id -> Gsl_randist.exponential_pdf ~mu:(IntMap.find id mean_map) and ref_length = Alignment.length ref_align in let utilv_nsites = Gsl_vector.create ref_length in (* Set up the number of pitches and strikes according to the prefs. *) let (t_max_pitches, t_max_strikes) = if fantasy prefs <> 0. then (* In fantasy mode we evaluate the first max_pitches locations. *) (max_pitches prefs, max_int) else if max_strikes prefs = 0 then (* We have disabled ball playing, and evaluate every location. *) (max_int, max_int) else (* Usual ball playing. *) (max_pitches prefs, max_strikes prefs) in (* Making glvs which are appropriate for query side of the first placement * stage. In contrast to the second stage query glv, this guy is full length. *) let full_query_orig = Model.make_glv model ~n_sites:ref_length in let full_query_evolv = Glv.mimic full_query_orig in (* *** The main query loop. *** *) let process_query ?show_query (query_name, query_seq) = begin match show_query with | Some fn -> fn query_name | None -> Printf.printf ">%s\n" query_name; flush_all () end; if String.length query_seq <> ref_length then failwith ("query '"^query_name^"' is not the same length as the ref alignment"); (* Turn the query sequence into a character array. *) let query_arr = StringFuns.to_char_array query_seq in let lv_arr_of_char_arr a = match seq_type with | Alignment.Nucleotide_seq -> Array.map Nuc_models.lv_of_nuc a | Alignment.Protein_seq -> Array.map Prot_models.lv_of_aa a in (* *** First prepare for the first phase of optimization. *** * This phase is not masked. Make full_query_orig, the glv for the unmasked * likelihood vector, which will be used for the first stage optimization * only. Note that it only has one rate. *) Glv.prep_constant_rate_glv_from_lv_arr full_query_orig (lv_arr_of_char_arr query_arr); (* Making full_query_evolv, which is full_query_orig after it has been * evolved along the fixed pendant branch length used for the first stage * of optimization. *) Model.evolve_into model ~dst:full_query_evolv ~src:full_query_orig (start_pend prefs); (* *** Now begin preparing for the three-taxon tree! *** * This tree will be masked on both the query and the reference side of * things. First make an array showing which sites are informative in that * query sequence. *) let mask_arr = Array.map Alignment.informative query_arr in (* The corresponding vector version. *) let mask_vec = Bigarray.Array1.of_array Bigarray.int16_unsigned Bigarray.c_layout (Array.map (fun b -> if b then 1 else 0) mask_arr) in (* reind_arr has the reindexing induced by the masking (see mask_reindex * above). *) let reind_arr = mask_reindex mask_arr in (* Subset sites of query_arr to just informative sequences. *) let masked_query_arr = Array.filter Alignment.informative query_arr in if masked_query_arr = [||] then failwith ("sequence '"^query_name^"' has no informative sites."); (* Write out a masked alignment with just the given query sequence and the * reference sequences if desired. *) if write_masked prefs then Alignment.to_fasta (Alignment.mask_align mask_arr (Alignment.stack [|query_name, query_seq|] ref_align)) ((out_dir prefs)^"/"^query_name^".mask.fasta"); let query_glv = Model.make_constant_rate_glv_from_lv_arr model (lv_arr_of_char_arr masked_query_arr) in (* Make the edges for our three-taxon tree that will be used for the second * stage of optimization. We will breaking interface by changing * them in place later, but it would be silly to have setting functions for * each edge. *) (* Note that Gmix_models are homogenous across sites, so we don't need to pass a reind_arr. Gcat_models aren't. *) let edge_make_fn a b c = match Model.get_model_class () with | Glvm.Gmix_model -> Glv_edge.make a b c | Glvm.Gcat_model -> Glv_edge.make ~reind_arr a b c in let dist_edge = edge_make_fn model (Glv.mimic query_glv) (start_pend prefs) and prox_edge = edge_make_fn model (Glv.mimic query_glv) (start_pend prefs) and pend_edge = edge_make_fn model query_glv (start_pend prefs) in let curr_time = Sys.time () in let logdots = ref 0 in let score loc = incr logdots; Glv.masked_logdot utilv_nsites full_query_evolv (Glv_arr.get snodes loc) mask_vec in (* The h_ranking ranks the locations according to the first stage of * optimization. We use this as an ordering for the second stage. *) let h_ranking = Fig.enum_by_score score (strike_box prefs) figs and best_seen = ref None in let h_ranking = if evaluate_all prefs then (* Keep track of what the best location we've seen is if we're going to * compare this against the actual best location. *) Enum.map (tap (fun (score, loc) -> match !best_seen with | Some (prev_score, _) when prev_score >= score -> () | _ -> best_seen := Some (score, loc))) h_ranking else h_ranking in let results = [Timing ("ranking", (Sys.time ()) -. curr_time)] in (* first get the results from ML *) let curr_time = Sys.time () in (* make our three taxon tree. we can't move this higher because the cached * calculation on the edges needs to be the right size for the length of * the query sequence. *) let tt = Three_tax.make model utilv_nsites ~dist:dist_edge ~prox:prox_edge ~pend:pend_edge in (* set tt edges to be for location loc with given pendant and distal branch lengths *) let set_tt_edges loc ~pendant ~distal = let cut_bl = Gtree.get_bl gtree loc in let set_edge edge glv_arr len = Glv.mask_into mask_arr ~src:(Glv_arr.get glv_arr loc) ~dst:(Glv_edge.get_orig edge); Glv_edge.set_bl model edge len in (* still the same glv for query, but have to set branch length *) Glv_edge.set_bl model pend_edge pendant; (* need to set the glv and branch length for dist and prox *) set_edge dist_edge darr distal; set_edge prox_edge parr (cut_bl -. distal) in let tt_edges_default loc = let cut_bl = Gtree.get_bl gtree loc in set_tt_edges loc ~pendant:(start_pend prefs) ~distal:(cut_bl /. 2.) in let tt_edges_from_placement p = let loc = Placement.location p in set_tt_edges loc ~pendant:(Placement.pendant_bl p) ~distal:(Placement.distal_bl p) in (* prepare_tt: set tt up for loc. side effect! *) let prepare_tt loc = tt_edges_default loc in (* evaluate the location wrt ML *) let ml_optimize_location mlo_tolerance loc = let () = try let n_like_calls = Three_tax.optimize mlo_tolerance (max_pend prefs) max_iter tt in dprintf ~l:2 "\tlocation %d: %d likelihood function calls\n" loc n_like_calls; with | Minimization.ExceededMaxIter -> dprintf "optimization for %s at %d exceeded maximum number of iterations.\n" query_name loc; in (* get the results *) Three_tax.get_results tt in let safe_ml_optimize_location tol loc = try ml_optimize_location tol loc with | Gsl_error.Gsl_exn(_,_) -> begin (* try again starting with default branch lengths *) tt_edges_default loc; ml_optimize_location tol loc end in (* in play_ball we go down the h_ranking list and wait until we get * strike_limit strikes, i.e. placements that are strike_box below the * best one so far. *) let rec play_ball like_record n_strikes results = match Enum.get h_ranking with | Some (_, loc) -> prepare_tt loc; begin match begin try Some (safe_ml_optimize_location (initial_tolerance prefs) loc) with Gsl_error.Gsl_exn(_,warn_str) -> dprintf "Warning: GSL problem with location %d for query %s; Skipped with warning \"%s\".\n" loc query_name warn_str; None end with | None -> play_ball like_record n_strikes results | Some ((like,_,_) as result) -> (* ... *) let new_results = (loc, result)::results in if List.length results >= t_max_pitches then new_results else if like > like_record then (* we have a new best likelihood *) play_ball like n_strikes new_results else if like < like_record-.(strike_box prefs) then (* we have a strike *) if n_strikes+1 >= t_max_strikes then new_results else play_ball like_record (n_strikes+1) new_results else (* not a strike, just keep on accumulating results *) play_ball like_record n_strikes new_results end | None -> results in let ml_results = (* important to reverse for fantasy baseball. also should save time on sorting *) List.rev (play_ball (-. infinity) 0 []) in if ml_results = [] then failwith (Printf.sprintf "empty results for %s!\n" query_name); let results = Timing ("ML calculation", (Sys.time ()) -. curr_time) :: results |> maybe_cons (if evaluate_all prefs then let logdots = !logdots in let best_loc_complete = Fig.enum_all figs |> Enum.arg_max score and _, best_loc_seen = Option.get !best_seen in Some (Evaluated_best (query_name, logdots, best_loc_complete, best_loc_seen)) else None) in if fantasy prefs <> 0. then Fantasy ml_results :: results else begin (* these tuples are ugly but that way we don't need * to make a special type for ml results. *) let get_like (_, (like, _, _)) = like in let sorted_ml_results = List.sort (comparing get_like |> flip) ml_results in assert(sorted_ml_results <> []); let best_like = get_like (List.hd sorted_ml_results) in let _ = match classify_float best_like with | FP_infinite | FP_nan -> dprintf "Warning: encountered %g for final likelihood.\n" best_like; | _ -> () in let keep_results, _ = ListFuns.partitioni (fun i r -> ((i < keep_at_most) && (get_like r >= log_keep_factor +. best_like))) sorted_ml_results in (* do final refinement of branch lengths *) let refined_results = List.map (fun initial -> let (loc, (_, pendant, distal)) = initial in set_tt_edges loc ~pendant ~distal; try (loc, safe_ml_optimize_location final_tolerance loc) with | Gsl_error.Gsl_exn(_,warn_str) -> dprintf "Warning: GSL problem with final branch length optimization for location %d. %s\n" loc warn_str; initial) keep_results in let sorted_ml_placements = List.map2 (fun ml_ratio (loc, (log_like, pend_bl, dist_bl)) -> Placement.make_ml loc ~ml_ratio ~log_like ~pend_bl ~dist_bl) (ll_normalized_prob (List.map get_like refined_results)) refined_results in let results, placements = if calc_pp prefs then begin (* pp calculation *) let curr_time = Sys.time () in (* calculate marginal likes for those placements we will keep *) let marginal_probs = List.map (fun placement -> tt_edges_from_placement placement; Three_tax.calc_marg_prob (prior_fun (Placement.location placement)) (pp_rel_err prefs) (max_pend prefs) tt) sorted_ml_placements in (* add pp *) Timing ("PP calculation", (Sys.time ()) -. curr_time) :: results, ((ListFuns.map3 (fun placement marginal_prob post_prob -> Placement.add_pp placement ~marginal_prob ~post_prob) sorted_ml_placements marginal_probs (ll_normalized_prob marginal_probs))) end else results, sorted_ml_placements in Pquery (Pquery.make_ml_sorted ~namlom:[query_name, 1.] ~seq:query_seq placements) :: results end in process_query pplacer-1.1.alpha19/pplacer_src/decor.ml000066400000000000000000000064221303154601500201640ustar00rootroot00000000000000(* decor gives types and routines for attaching information to trees *) open Ppatteries (* note that order is important so the xml comes out right when we sort using * polymorphic compare *) type decoration = | Width of float | Color of int * int * int | Dot of int | Taxinfo of Tax_id.tax_id * string type decor = decoration list let assert_ubyte i = assert(i >= 0 || i <= 255) let assert_ubytes = List.iter assert_ubyte let assert_unit_interval x = assert(0. <= x && x <= 1.) (* colors! 255 is the most saturated. *) let color (r, g, b) = assert_ubytes [r; g; b]; Color(r, g, b) let random_color () = let cv () = Random.int 192 + 64 in color (cv (), cv (), cv ()) (* basic colors *) let white = color (255,255,255) let black = color (0,0,0) let red = color (255,0,0) let orange = color (255, 165, 0) let yellow = color (255, 255, 0) let green = color (0, 255, 0) let blue = color (0, 0, 255) (* interesting colors *) let sand = color (255, 90, 90) (* Set2 from colorbrewer.org *) let brew_orange = color (252, 141, 98) let brew_green = color (102, 194, 165) let brew_blue = color (141, 160, 203) (* white is 255, black is 0 *) let gray intensity = color (intensity, intensity, intensity) (* weight is the weight of a *) let int_avg weight a b = assert(0. <= weight && weight <= 1.); int_of_float ((float_of_int a) *. weight +. (float_of_int b) *. (1. -. weight)) let triple_weighted_avg weight (r1,g1,b1) (r2,g2,b2) = (int_avg weight r1 r2, int_avg weight g1 g2, int_avg weight b1 b2) (* weight is the weight of a *) let color_avg weight c1 c2 = match c1, c2 with | Color (r1,g1,b1), Color (r2,g2,b2) -> color (triple_weighted_avg weight (r1,g1,b1) (r2,g2,b2)) | _ -> invalid_arg "color_avg" (* (* gray_level is the amount of gray to put in *) let gray_red ~gray_level level = color level gray_level gray_level let gray_green ~gray_level level = color gray_level level gray_level let gray_blue ~gray_level level = color gray_level gray_level level (* "a_color" is actually any map from an int to a decoration *) let scaled_color a_color ~min ~max x = assert_unit_interval x; a_color (min + (int_of_float ((float_of_int (max - min)) *. x))) *) (* width *) let width w = Width w let scaled_width ~min ~max x = assert_unit_interval x; width (min +. (max -. min) *. x) (* dot *) let dot i = Dot i (* Taxinfo *) let taxinfo ti name = Taxinfo (ti, name) (* writing *) let ppr ff = function | Color(r,g,b) -> Format.fprintf ff "Color(%d, %d, %d)" r g b | Width w -> Format.fprintf ff "Width(%g)" w | Dot i -> Format.fprintf ff "Dot(%d)" i | Taxinfo (ti,name) -> Format.fprintf ff "Taxinfo(%a,%s)" Tax_id.ppr ti name let to_xml = function | Color (r, g, b) -> [Myxml.tag "color" ~children:[ Myxml.tag "red" (string_of_int r); Myxml.tag "green" (string_of_int g); Myxml.tag "blue" (string_of_int b); ] ""] | Width w -> [Myxml.tag "width" (Printf.sprintf "%g" w)] | Dot i -> let tag_name = match i mod 3 with | 0 -> "duplications" | 1 -> "speciations" | _ -> "losses" in [Myxml.tag "events" ~children:[ Myxml.tag tag_name (string_of_int (i + 1)); ] ""] | Taxinfo (ti, name) -> [Myxml.tag "taxonomy" ~children:( Tax_id.to_xml ti @ [ Myxml.tag "scientific_name" name; ]) ""] pplacer-1.1.alpha19/pplacer_src/decor_bark.ml000066400000000000000000000026341303154601500211640ustar00rootroot00000000000000(* bark for trees that have newick + a list of Decor decorations. *) open Ppatteries class decor_bark arg = let (bl, node_label, edge_label, decor) = match arg with | `Empty -> (None, None, None, []) | `Of_newick_bark nb -> (nb#get_bl_opt, nb#get_node_label_opt, nb#get_edge_label_opt, []) | `Of_bl_node_edge_label_decor (bl, node_label, edge_label, decor) -> (bl, node_label, edge_label, decor) in object (* (self) *) val decor = decor inherit Newick_bark.newick_bark (`Of_bl_node_edge_label (bl, node_label, edge_label)) as super method get_decor = decor method ppr ff = Format.fprintf ff "@[{%a decor = %a;}@]" (fun ff () -> super#ppr_inners ff) () (Ppr.ppr_list Decor.ppr) decor method to_xml is_leaf = super#to_xml is_leaf @ List.flatten (List.map Decor.to_xml (List.sort compare decor)) method set_decor decor_list = {< decor = decor_list >} method append_decor decor_list = {< decor = decor @ decor_list >} end let compare b1 b2 = try raise_if_different Newick_bark.compare b1 b2; raise_if_different compare b1#get_decor b2#get_decor; 0 with | Different c -> c let of_newick_bark nb = new decor_bark (`Of_newick_bark nb) let to_newick_bark db = new Newick_bark.newick_bark (`Of_bl_node_edge_label (db#get_bl_opt, db#get_node_label_opt, db#get_edge_label_opt)) pplacer-1.1.alpha19/pplacer_src/decor_gtree.ml000066400000000000000000000040001303154601500213400ustar00rootroot00000000000000(* routines for gtrees which have a Decor bark map. *) open Ppatteries type t = Decor_bark.decor_bark Gtree.gtree let compare t1 t2 = Gtree.compare Decor_bark.compare t1 t2 let of_newick_gtree t = Gtree.map_bark_map Decor_bark.of_newick_bark t let to_newick_gtree t = Gtree.map_bark_map Decor_bark.to_newick_bark t let to_numbered t = Gtree.mapi_bark_map (fun i x -> x#to_numbered i) t (* append (id, decorl) to the bark map *) let map_add_decor_listly id decorl barkm = IntMap.add id ((if IntMap.mem id barkm then IntMap.find id barkm else new Decor_bark.decor_bark `Empty) #append_decor decorl) barkm (* decor_map is an IntMap to a Decor.decoration list *) let add_decor_by_map t decor_map = Gtree.set_bark_map t (IntMap.fold map_add_decor_listly decor_map (Gtree.get_bark_map t)) (* given a color, a tree and a set of leaves: first, give all of the leaves on * the tree that color. then, proceed up the tree giving all edges that same * color as long as all of the edges below also have that color. *) let color_clades_above ?(color = Decor.red) leaves gt = Gtree.get_stree gt |> Stree.nodes_containing leaves |> flip (IntSet.fold (fun i accum -> map_add_decor_listly i [color] accum)) (Gtree.get_bark_map gt) |> Gtree.set_bark_map gt (* not a real average, but good enough *) let list_color_average = List.reduce (Decor.color_avg 0.5) |- some let keep_only_one _ = None let keep_first = function [x] -> Some x | _ -> None let consolidate_colors resolution_fn gt = Gtree.get_bark_map gt |> IntMap.map (fun b -> let decor' = match List.partition (function Decor.Color _ -> true | _ -> false) b#get_decor with | [], others -> others | [color], others -> color :: others | colors, others -> maybe_cons (resolution_fn colors) others in b#set_decor decor') |> Gtree.set_bark_map gt let add_zero_root_bl = Newick_gtree.gen_add_zero_root_bl (new Decor_bark.decor_bark `Empty) pplacer-1.1.alpha19/pplacer_src/diagd.ml000066400000000000000000000132671303154601500201450ustar00rootroot00000000000000(* diagd: * a type for diagonalized matrices * * Time-reversible models are typically speficied by giving the stationary * frequency and the "exchangeability" between states. * Let D be diag(\pi) and B_{ij} be the exchangeability; note B_{ij} = B_{ji}. * We need to set up the diagonal elements of B such that DB is a transition * rate matrix, i.e. such that the row sums are zero. * Because (DB)_{ij} is \pi_i B_{ij}, we want * \pi_i B_{ii} + \sum_{j \ne i} pi_j B_{ij} = 0, i.e. * B_{ii} = - (1/pi_i) \sum_{j \ne i} pi_j B_{ij}. * * From there the DB matrix is easily diagonalized: * Say that U \Lambda U^T = D^{1/2} B D^{1/2}. * Then DB = (D^{1/2} U) \Lambda (D^{1/2} U)^{-1} * Thus we want X = D^{1/2} U, and so * X inverse transpose is D^{-1/2} U. * See Felsenstein p. 206. * * For this module, x and lambdav are such that x diag(lambdav) x^{-1} is the * matrix being diagonalized. * xit is the inverse transpose of x, which is handy for speedy computations. *) open Linear_utils let mm = alloc_mat_mat_mul let get1 a i = Bigarray.Array1.unsafe_get (a:Gsl_vector.vector) i let set1 a i = Bigarray.Array1.unsafe_set (a:Gsl_vector.vector) i (* the setup is that X diag(\lambda) X^{-1} is the matrix of interest. *) type t = { x: Gsl_matrix.matrix; l: Gsl_vector.vector; (* lambda *) xit: Gsl_matrix.matrix; (* x inverse transpose *) util: Gsl_vector.vector; } let make ~x ~l ~xit = let n = Gsl_vector.length l in assert((n,n) = Gsl_matrix.dims x); assert((n,n) = Gsl_matrix.dims xit); { x; l; xit; util = Gsl_vector.create n; } (* *** utils *** *) let dim dd = Gsl_vector.length dd.l let matrix_of_same_dims dd = Gsl_matrix.create (dim dd) (dim dd) (* *** into matrices *** *) let to_matrix dd = let m = matrix_of_same_dims dd in Linear.dediagonalize m dd.x dd.l dd.xit; m (* return an exponentiated matrix *) let to_exp dd bl = let dst = matrix_of_same_dims dd in for i=0 to (Gsl_vector.length dd.l)-1 do set1 dd.util i (exp (bl *. (get1 dd.l i))) done; Linear.dediagonalize dst dd.x dd.util dd.xit; dst (* here we exponentiate our diagonalized matrix across all the rates. * if D is the diagonal matrix, we get a #rates matrices of the form * X exp(D rate bl) X^{-1}. * util should be a vector of the same length as lambda. * mask is an optional argument that, if specified, only does the multi_exp for * those rates that are marked true in the mask. *) let multi_exp ?mask ~dst dd rates bl = let compute = match mask with | None -> fun _ -> true (* no mask, do everything *) | Some m -> fun r -> m.(r) = true (* compute if specified *) in let n = Gsl_vector.length dd.l in try Tensor.set_all dst 0.; for r=0 to (Array.length rates)-1 do if compute r then begin for i=0 to n-1 do set1 dd.util i (exp (rates.(r) *. bl *. (get1 dd.l i))) done; let dst_mat = Tensor.BA3.slice_left_2 dst r in Linear.dediagonalize dst_mat dd.x dd.util dd.xit; end done; with | Invalid_argument s -> invalid_arg ("multi_exp: "^s) (* *** making *** *) exception StationaryFreqHasNegativeEntry let vec_nonneg v = vec_predicate (fun x -> x >= 0.) v let check_stationary v = if not (vec_nonneg v) then raise StationaryFreqHasNegativeEntry let of_symmetric m = let (l, x) = symm_eigs m in make ~l ~x ~xit:x (* If pi_i is zero then we needn't worry about the ith row because it's * going to get multiplied by D=diag(pi) on the left, for which the ith row and * column will be zero. This should only be used in that case. *) let safe_invert x = if x = 0. then 1. else 1. /. x (* d = vector for diagonal, b = symmetric matrix which has been set up with * diagonal entries so that BD is a Q-transpose matrix (with zero column * totals). See top. *) let of_d_b d b = (* make sure that diagonal matrix is all positive *) if not (vec_nonneg d) then failwith("negative element in the diagonal of a DB matrix!"); let d_root = vec_map sqrt d in let dm_root = diag d_root in let dm_root_inv = diag (vec_map safe_invert d_root) in (* Here we multiply on the left by dm_root, justifying use of safe_invert. *) let (l, u) = symm_eigs (mm dm_root (mm b dm_root)) in make ~l ~x:(mm dm_root_inv u) ~xit:(mm dm_root u) (* Here we set up the diagonal entries of the symmetric matrix so * that we get the column sum of the Q matrix is zero. * See top of code. * For this to make sense WRT safe_invert one needs to make sure that the * resulting matrix gets multiplied on the left by something that zeroes out * the ith row for every i that has a zero entry in pi. *) let b_of_exchangeable_pair r pi = let n = Gsl_vector.length pi in mat_init n n (fun i j -> if i <> j then Gsl_matrix.get r i j else (* r_ii = - (pi_i)^{-1} \sum_{k \ne i} r_ki pi_k *) (let total = ref 0. in for k=0 to n-1 do if k <> i then total := !total +. r.{k,i} *. pi.{k} done; -. (!total *. (safe_invert pi.{i})))) (* Note that of_d_b multiplies m on the left by the square root of diag(pi), * justifying use of safe_invert. *) let of_exchangeable_pair m pi = of_d_b pi (b_of_exchangeable_pair m pi) let find_rate dd pi = let q = to_matrix dd in let rate = ref 0. in for i=0 to (dim dd)-1 do rate := !rate -. q.{i,i} *. (Gsl_vector.get pi i) done; !rate let normalize_rate dd pi = Gsl_vector.scale dd.l (1. /. (find_rate dd pi)) let normed_of_exchangeable_pair m pi = let dd = of_exchangeable_pair m pi in normalize_rate dd pi; dd let symm_q n = let off_diag = 1. /. (float_of_int (n-1)) in mat_init n n (fun i j -> if i = j then -. 1. else off_diag) let symm_diagd n = of_symmetric (symm_q n) let binary_symm_diagd = symm_diagd 2 pplacer-1.1.alpha19/pplacer_src/edge_painting.ml000066400000000000000000000027071303154601500216670ustar00rootroot00000000000000(* Edge painting. The algorithm progressively builds up a map from edges to taxids. Maintain a list of unpainted edges. Start at the lowest (most specific) rank. For every unpainted edge, consider the collection of taxids cut by that edge. Is there exactly one? If so, then assign the edge to that taxid. If not, move up a rank. *) open Ppatteries open Convex open Stree (* Build a map of node numbers (on the refpkg's reference tree) to the inferred * tax_id for each node. Used for classifying things placed onto the reference * tree. *) let of_refpkg: Refpkg.t -> Tax_id.t IntMap.t = fun rp -> let gt = Refpkg.get_ref_tree rp in let st = Gtree.get_stree gt in (* rankmap is an edge-number-indexed map of rank-indexed maps of cutsetims for * the corresponding edge number and rank. *) let rankmap = rank_tax_map_of_refpkg rp |> IntMap.map (flip (curry build_sizemim_and_cutsetim) st %> snd) in let highest_rank, _ = IntMap.max_binding rankmap in node_ids st |> List.enum |> Enum.map (fun i -> let rec aux rank = if not (IntMap.mem rank rankmap) then aux (rank - 1) else (* ... *) let cset = IntMap.find rank rankmap |> IntMap.find i in if ColorSet.cardinal cset = 1 then i, ColorSet.choose cset else if rank = 0 then i, Tax_id.NoTax else aux (rank - 1) in aux highest_rank) |> IntMap.of_enum pplacer-1.1.alpha19/pplacer_src/edge_rdist.ml000066400000000000000000000131741303154601500212030ustar00rootroot00000000000000(* Let A and B be two edges in a tree. let C be their common ancestor. we say * that A and B are "serial" if C is one of A or B, and "parallel" if not. * * This module supports two kinds of calculation: length of common ancestry, and * pairwise distances. The idea is that we want to be able to compute distances * between things and common ancestry without doing a tree traversal. * * The pairwise distances are standard distal-side distances except that they * have this Parallel versus Serial thing. * * For common ancestry, for each pair of edges we store the distance from the * root to their common ancestor, with an indication if the relationship between * the edges is serial or parallel. If they are parallel, then the distance from * the common ancestor of two placements on those edge to the root is just the * included value. If they are serial, then we need to add in the distance from * the placement to the proximal side of the placement edge. * * The v part of a ca_info gives the distance from the root to the distal side * of the edge. This "diagonal" part is needed when we have two placements on * the same edge. * * NOTE: this function assumes that edges are numbered in a depth first manner, * such that edge numbering strictly increases from a leaf to the root. *) open Ppatteries type relation_dist = Parallel of float | Serial of float let ppr_rdist ff = function | Parallel x -> Format.fprintf ff "P%g" x | Serial x -> Format.fprintf ff "S%g" x let ppr_rdist_uptri ff u = Uptri.ppr_uptri ppr_rdist ff u (* ***** DISTANCE ***** *) (* Build a matrix of distances between distal sides of edges with Serial and * Parallel labels (i.e. m_ij is the distance between the distal sides of the * ith and jth edges. Note that we assume that there are no placements on the * root edge, and so do not have an entry in our uptri for it. * *) let build_pairwise_dist t = let stree = Gtree.get_stree t in let u = Uptri.create (Stree.n_edges stree) (Parallel 0.) in (* set all pairs of the below with (Parallel distance) *) let parallel_set below = ListFuns.list_iter_over_pairs_of_single (ListFuns.list_iter_over_pairs_of_two (fun (i,di) (j,dj) -> Uptri.set u i j (Parallel (di+.dj)))) below in let rec aux = function | Stree.Node(id, tL) -> let curr_bl = Gtree.get_bl t id in let below = List.map aux tL in parallel_set below; let flat_below = List.flatten below in (* note that we don't include the current distance in the serial edge * (we are calculating to the proximal side) *) List.iter (fun (i,d) -> Uptri.set u i id (Serial d)) flat_below; (id, curr_bl):: (List.map (fun (i,d) -> (i, d +. curr_bl)) flat_below) | Stree.Leaf id -> [id, Gtree.get_bl t id] in (* avoid root edge *) match stree with | Stree.Node(_, tL) -> parallel_set (List.map aux tL); u | Stree.Leaf _ -> failwith "unexpected leaf at root of tree" (* Find the distance between two locations on the tree. *) let find_pairwise_dist rdist_uptri edge1 distal1 edge2 distal2 = if edge1 = edge2 then abs_float (distal1 -. distal2) else match Uptri.get_loose rdist_uptri edge1 edge2 with | Parallel x -> x -. distal1 -. distal2 | Serial x -> if edge1 > edge2 then x +. distal1 -. distal2 else x +. distal2 -. distal1 (* ***** COMMON ANCESTRY (not explicitly unit tested) ***** *) type ca_info = { u : relation_dist Uptri.uptri; v : float array; } (* make an uptri with (i,j) entry equal to the distance from the root to the * MRCA of edges numbered i and j with Parallel and Serial as above. * * note that we assume that there are no placements on the root edge, and so do * not have an entry in our uptri for it. * *) let build_ca_info t = let stree = Gtree.get_stree t in let u = Uptri.create (Stree.n_edges stree) (Parallel 0.) and v = Array.make (Stree.n_edges stree) 0. in (* set all pairs of the below with (Parallel curr_dist) *) let parallel_set below curr_dist = ListFuns.list_iter_over_pairs_of_single (ListFuns.list_iter_over_pairs_of_two (fun i j -> Uptri.set u i j (Parallel curr_dist))) below in let set_v i x = Array.set v i x in let rec aux dist_to_root = function | Stree.Node(id, tL) -> let curr_dist = dist_to_root +. Gtree.get_bl t id in let below = List.map (aux curr_dist) tL in (* note that for the below ones we want to use curr_dist, which includes * the length of the current edge *) parallel_set below curr_dist; let flat_below = List.flatten below in (* whereas in the serial case we don't want to include current edge *) List.iter (fun i -> Uptri.set u i id (Serial curr_dist)) flat_below; set_v id curr_dist; id::flat_below | Stree.Leaf id -> set_v id (dist_to_root +. Gtree.get_bl t id); [id] in (* avoid root edge *) match stree with | Stree.Node(_, tL) -> parallel_set (List.map (aux 0.) tL) 0.; { u; v; } | Stree.Leaf _ -> failwith "unexpected leaf at root of tree" (* find the distance to the common ancestor given info from two placements *) let find_ca_dist ca_info (edge1, distal1) (edge2, distal2) = if edge1 = edge2 then ca_info.v.(edge1) -. (max distal1 distal2) else match Uptri.get_loose ca_info.u edge1 edge2 with | Parallel x -> (* the common ancestor is distal to both *) x | Serial x -> (* if edge 1 is on top, then we need to subtract the distal part of its * placement from the common ancestry *) x -. (if edge1 > edge2 then distal1 else distal2) pplacer-1.1.alpha19/pplacer_src/edpl.ml000066400000000000000000000024501303154601500200110ustar00rootroot00000000000000(* This is where we compute the EDPL distance. *) open Ppatteries (* Calculate the EDPL of a pquery, given a criterion and a pairwise distance * uptri. *) let of_pquery criterion rdist_uptri pq = let d p1 p2 = Edge_rdist.find_pairwise_dist rdist_uptri p1.Placement.location p1.Placement.distal_bl p2.Placement.location p2.Placement.distal_bl in let rec aux accum = function | x :: l -> aux (List.fold_left (fun tot y -> tot +. (criterion x) *. (criterion y) *. (d x y)) accum l) l | _ -> accum in 2. *. (aux 0. pq.Pquery.place_list) (* Take a weighted average of the elements of a list, the elements of which are * of the form (x, weight). *) let weighted_average l = List.fsum (List.map (fun (a, b) -> a *. b) l) /. List.fsum (List.map snd l) let map_of_placerun criterion pr = let dm = Placerun.get_ref_tree pr |> Edge_rdist.build_pairwise_dist in List.fold_left (fun accum pq -> let edpl_val = of_pquery criterion dm pq in List.fold_left (fun accum p -> IntMap.add_listly (Placement.location p) (edpl_val, criterion p) accum) accum (Pquery.place_list pq)) IntMap.empty (Placerun.get_pqueries pr) |> IntMap.map weighted_average pplacer-1.1.alpha19/pplacer_src/fantasy.ml000066400000000000000000000131371303154601500205360ustar00rootroot00000000000000(* routines for "fantasy baseball" *) open Ppatteries type info = { n_hits : int; n_trials : int; like_diff : float } let empty_info = { n_hits = 0; n_trials = 0; like_diff = 0.; } let get_n_hits r = r.n_hits let get_n_trials r = r.n_trials let get_like_diff r = r.like_diff let add_to_info a (hit, n_trials, like_diff) = { n_hits = a.n_hits + if hit then 1 else 0; n_trials = a.n_trials + n_trials; like_diff = a.like_diff +. like_diff; } let get_like (_, (like, _, _)) = like let get_loc (loc, _) = loc let find_best ml_results = let rec aux best_loc like_record = function | r::rest -> if get_like r > like_record then aux (get_loc r) (get_like r) rest else aux best_loc like_record rest | [] -> (best_loc, like_record) in match ml_results with | r::rest -> aux (get_loc r) (get_like r) rest | [] -> invalid_arg "find_best" (* returns (hit, n_trials). hit is whether we would have gotten a hit (i.e. if * we found the best one by playing baseball) and the number of trials needed. * note that we don't do anything with max_pitches, assuming that is has been * taken care of by filtering down the ml_results. *) let fantasy_ball ml_results strike_box max_strikes = let (best_loc, best_like) = find_best ml_results in let rec play_ball our_like_record n_strikes prev_found prev_n_trials = function | (loc, (like,_,_))::rest -> begin let n_trials = prev_n_trials+1 in (* have we found it yet? *) let found = if loc = best_loc then true else prev_found in if like > our_like_record then (* we have a new best likelihood *) play_ball like n_strikes found n_trials rest else if like < our_like_record-.strike_box then (* we have a strike *) if n_strikes+1 >= max_strikes then (* struck out *) (found, n_trials, our_like_record) else play_ball our_like_record (n_strikes+1) found n_trials rest else (* not a strike, just keep on accumulating results *) play_ball our_like_record n_strikes found n_trials rest end | [] -> (prev_found, prev_n_trials, our_like_record) in let (found, n_trials, our_like_record) = play_ball (-. infinity) 0 false 0 ml_results in (found, n_trials, best_like -. our_like_record) let make_fantasy_matrix ~max_strike_box ~max_strikes = Array.make_matrix (1+max_strike_box) (1+max_strikes) empty_info let add_single_to_fm fm strike_box max_strikes result = fm.(strike_box).(max_strikes) <- add_to_info (fm.(strike_box).(max_strikes)) result let add_to_fantasy_matrix ml_results fm = let max_strike_box = (Array.length fm)-1 and max_strikes = (Array.length fm.(0))-1 in for strike_box=0 to max_strike_box do for max_strikes=0 to max_strikes do add_single_to_fm fm strike_box max_strikes (fantasy_ball ml_results (float_of_int strike_box) max_strikes) done; done (* mostly for testing.. we will typically make one fm then add lots of seqs to * it. *) let build_fantasy_matrix ml_results ~max_strike_box ~max_strikes = let fm = make_fantasy_matrix max_strike_box max_strikes in add_to_fantasy_matrix ml_results fm; fm let mat_map f m = Array.map (Array.map f) m let calc_stats fantasy_mat n_fantasies = let avg x = x /. (float_of_int n_fantasies) in (mat_map (fun r -> avg (float_of_int (get_n_hits r))) fantasy_mat, mat_map (fun r -> avg (float_of_int (get_n_trials r))) fantasy_mat, mat_map (fun r -> avg (get_like_diff r)) fantasy_mat) (* find the set of parameters which minimizes the number of trials for a given * cutoff. the cutoff is the average likelihood difference for the fantasy * runs. return Some (strike box, n strikes) if found, None if not. *) let find_optimum fantasy_mat cutoff n_fantasies = let best_choice = ref (-1,-1) and best_n_trials = ref max_int (* the cutoff argument is an average *) and big_cutoff = cutoff *. (float_of_int n_fantasies) in MatrixFuns.iterij (fun sbox maxs info -> let our_trials = get_n_trials info in if (get_like_diff info) < big_cutoff && our_trials < !best_n_trials then begin best_choice := (sbox, maxs); best_n_trials := our_trials end) fantasy_mat; if !best_n_trials = max_int then None (* couldn't find anything *) else Some (!best_choice) let print_optimum fantasy_mat cutoff n_fantasies = match find_optimum fantasy_mat cutoff n_fantasies with | None -> Printf.printf "No (strike box, max strikes) combination found with average likelihood difference of %g or better.\n" cutoff | Some (strike_box, n_strikes) -> Printf.printf "Fantasy baseball results: fastest combination with average likelihood difference %g is as follows:\n" cutoff; Printf.printf "--strikeBox %d --maxStrikes %d\n" strike_box n_strikes let arr_forget_first a = let len = Array.length a in assert(len > 0); Array.sub a 1 (len-1) let results_to_file fname_prefix fantasy_mat n_fantasies = let batting_avg,n_trials_avg,like_diff_avg = calc_stats fantasy_mat n_fantasies in let write_mat fname m = let ch = open_out fname in Printf.fprintf ch "# fantasy run. results obtained by evaluating %d equally spaced sequences.\n" n_fantasies; Printf.fprintf ch "# strike box is first coordinate (indexed from zero), and max strikes is second (indexed from one).\n"; String_matrix.write_padded ch (mat_map string_of_float (Array.map arr_forget_first m)); close_out ch in write_mat (fname_prefix^".batting_avg.out") batting_avg; write_mat (fname_prefix^".n_trials.out") n_trials_avg; write_mat (fname_prefix^".like_diff.out") like_diff_avg; () pplacer-1.1.alpha19/pplacer_src/fasta.ml000066400000000000000000000041111303154601500201570ustar00rootroot00000000000000open Ppatteries type token = | Name of string | Sequence of string let fasta_regexp = Str.regexp begin (* each line is either ... *) "\\(" ^ (String.concat "\\|" [ (* nothing but whitespace (matched at the end of the group), *) ""; (* a comment (not captured), *) ";[^\n\r]*"; (* a sequence name (group 3; group 2 should be non-matching), *) "\\(>[ \t]*\\([^ \t\n\r]+\\)[^\n\r]*\\)"; (* or a sequence chunk (group 4). *) "\\([^\ \t\n\r]+\\)"; (* and finally, strip off any trailing whitespace. The last bit of this * deserves some explanation, as it's a little unreadable with the * backslashes. It matches successive sequences of \r, \n, or \r\n, /or/ the * end of the string. Just the latter isn't good enough because it won't work * with files delimited with just \r, and just the former isn't good enough * because it won't match on strings without linebreaks. *) ]) ^ "\\)[ \t]*\\(\\(\r\\|\n\\|\r\n\\)+\\|$\\)" end let token_of_match s = match Sparse.first_match [2; 4] s with | 2, _ -> Name (Str.matched_group 3 s) | 4, s -> Sequence s | _, _ -> invalid_arg "token_of_match" let tokenize_fasta = Sparse.tokenize_string fasta_regexp token_of_match type phase = | Beginning | Accumulating of (string * string) list * string * string list let parse tokens = let combine res name seql = (name, String.concat "" (List.rev seql)) :: res in let res = Enum.fold (fun state tok -> match state, tok with | Beginning, Name n -> Accumulating ([], n, []) | Accumulating (res, name, seql), Sequence s -> Accumulating (res, name, s :: seql) | Accumulating (res, name, seql), Name n -> Accumulating (combine res name seql, n, []) | Beginning, Sequence _ -> Sparse.syntax_error "sequence before name") Beginning tokens in match res with | Accumulating (res, name, seql) -> List.rev (combine res name seql) | Beginning -> [] let of_string, of_file = Sparse.gen_parsers tokenize_fasta parse let of_refpkg_contents = Refpkg_parse.of_file_or_string of_file of_string pplacer-1.1.alpha19/pplacer_src/fig.ml000066400000000000000000000153311303154601500176340ustar00rootroot00000000000000open Ppatteries open Stree (* A pair of (representative edge, all edges). *) type fig = int * IntSet.t (* Dummy is a fig collection without any actual figs; it just implements the * same APIs for the case of not wanting figs. *) type t = | Dummy of int list | Figs of fig list (* This type is used for propagating information up a gtree when determining * figs. Just using a tuple gets too complicated too quickly. *) type fig_state = { (* the distance to the most distant leaf, if there are any distal leaves not * already in a fig *) max_bl: float option; (* all of the edges that might become part of this fig *) edges: IntSet.t; (* the current representative edge *) rep_edge: int; (* all of the figs that were already determined *) accum: fig list; } (* This type represents all of the information about the subtrees below an * internal node. *) type fold_state = { (* the most distant leaves from all of the subtrees, after removing Nones *) bls: float list; (* the union of all of the edge sets from the fig_states below this node *) all_edges: IntSet.t; (* a (representative, leaves below representative) pair; always Some after * the fold unless the node had no subtrees *) rep_opt: (int * int) option; (* a list of all of the subtrees as figs, for the case when all of the * subtrees can't share one fig *) maybe_figs: fig list; (* all of the figs determined by all subtrees *) tot_accum: fig list; } (** add_edge_to_figs: int -> fig list -> fig list Given an edge and a list of figs, add the edge to each fig in the list. *) let add_edge_to_figs i fl = List.map (IntSet.add i |> Tuple.Tuple2.map2) fl (** fold_figs: (int * fig_state) list -> fold_state Part of determining the figs on a tree: at each node, this is used to coalesce all of the information about the subtrees together. *) let fold_figs fl = List.fold_left (fun accum (j, cur) -> let cur_card = IntSet.cardinal cur.edges in {bls = maybe_cons cur.max_bl accum.bls; all_edges = IntSet.union cur.edges accum.all_edges; rep_opt = (match accum.rep_opt with | Some (_, prev_card) as prev when prev_card >= cur_card -> prev | _ -> Some (j, cur_card)); maybe_figs = (cur.rep_edge, cur.edges) :: accum.maybe_figs; tot_accum = List.append cur.accum accum.tot_accum}) {bls = []; all_edges = IntSet.empty; maybe_figs = []; rep_opt = None; tot_accum = []} fl (** _figs_of_gtree: float -> Newick_gtree.t -> fig list Determine all of the figs on a tree such that no two leaves in each fig have a distance greater than the cutoff. *) let _figs_of_gtree cutoff gt = let get_bl = Gtree.get_bl gt and top = Gtree.top_id gt in let rec aux = function | Leaf i -> {max_bl = Some (get_bl i); edges = IntSet.singleton i; rep_edge = i; accum = []} | Node (i, subtrees) -> let {bls; all_edges = edges; rep_opt; maybe_figs; tot_accum} = List.map (top_id &&& aux) subtrees |> fold_figs in let accum = if i = top then tot_accum else add_edge_to_figs i tot_accum and rep_edge = Option.get rep_opt |> fst in match List.sort (flip compare) bls with | [] -> {max_bl = None; edges; rep_edge; accum} | _ when i = top -> {max_bl = None; edges; rep_edge; accum = List.append accum maybe_figs} | [bl] -> {max_bl = Some (bl +. get_bl i); edges; rep_edge; accum} | bl1 :: bl2 :: _ when bl1 +. bl2 <= cutoff -> {max_bl = Some (bl1 +. get_bl i); edges; rep_edge; accum} | _ -> {max_bl = None; edges = IntSet.empty; rep_edge; accum = add_edge_to_figs i maybe_figs |> List.append accum} in (Gtree.get_stree gt |> aux).accum (** figs_of_gtree: float -> Newick_gtree.t -> t Make a collection of figs from a tree, using a Dummy if the cutoff is 0. *) let figs_of_gtree cutoff gt = if cutoff = 0. then Dummy (Gtree.nonroot_node_ids gt) else Figs (_figs_of_gtree cutoff gt) (** uniquifier: unit -> (IntSet.t -> IntSet.t) Create a uniquifier which takes IntSets and returns IntSets which don't contain elements from any previously-specified IntSets. *) let uniquifier () = let yielded = ref IntSet.empty in fun s -> IntSet.diff s !yielded |> tap (fun _ -> yielded := IntSet.union s !yielded) (** _enum_by_score: fig list -> (int -> float) -> float -> (float * int) Enum.t Actually enumerate over a list of figs. This first sorts the representative edges by the scoring function, then the edges contained in each fig. If successive representative scores are within the strike_box, the corresponding figs are all merged together before sorting. Each edge is yielded with its score. *) let _enum_by_score figl score_func strike_box = let uniquify = uniquifier () in let fig_enum = List.map (Tuple.Tuple2.map1 score_func) figl |> List.sort (comparing fst |> flip) |> List.enum in Enum.map (fun (score, edges) -> Enum.take_while (fst %> approx_equal ~epsilon:strike_box score) fig_enum |> Enum.fold (snd %> IntSet.union |> flip) edges |> uniquify |> IntSet.elements |> List.map (score_func &&& identity) |> List.sort (comparing fst |> flip) |> List.enum) fig_enum |> Enum.flatten (** enum_by_score: (int -> float) -> float -> t -> (float * int) Enum.t Enumerate all of the edges in a collection of figs and the score given to them by the provided scoring function, roughly ordered by their score. *) let enum_by_score score strike_box = function | Dummy l -> List.map (score &&& identity) l |> List.sort (comparing fst |> flip) |> List.enum | Figs fl -> _enum_by_score fl score strike_box (** enum_all: t -> int Enum.t Enumerate all of the edges in collection of figs in an undefined order. *) let enum_all = function | Dummy l -> List.enum l | Figs fl -> let uniquify = uniquifier () in List.enum fl |> Enum.map (snd %> uniquify %> IntSet.enum) |> Enum.flatten (** length: t -> int The number of figs in a collection of figs. *) let length = function | Dummy _ -> 0 | Figs fl -> List.length fl (** onto_decor_gtree: Decor_gtree.t -> t -> Decor_gtree.t Decorate a Decor_gtree with all of the figs in the collection of figs. Each fig is given a random color, and all of the edges contained within only one fig are painted with that color. Edges contained within multiple figs are left uncolored. *) let onto_decor_gtree dt = function | Dummy _ -> dt | Figs fl -> List.fold_left (fun dt (_, edges) -> let color = Decor.random_color () in Decor_gtree.color_clades_above ~color edges dt) dt fl |> Decor_gtree.consolidate_colors Decor_gtree.keep_only_one pplacer-1.1.alpha19/pplacer_src/fig.mli000066400000000000000000000003761303154601500200100ustar00rootroot00000000000000open Ppatteries type t val figs_of_gtree: float -> Newick_gtree.t -> t val enum_by_score: (int -> float) -> float -> t -> (float * int) Enum.t val enum_all: t -> int Enum.t val length: t -> int val onto_decor_gtree: Decor_gtree.t -> t -> Decor_gtree.t pplacer-1.1.alpha19/pplacer_src/gamma.ml000066400000000000000000000045241303154601500201530ustar00rootroot00000000000000(* i consulted Yang's tools.c from PAML in writing this code * * the GSL gamma is computed according to * p(x) dx = {1 \over \Gamma(a) b^a} x^{a-1} e^{-x/b} dx * so a is the shape parameter, and b is the scale parameter. * on wikipedia, a is k and b is theta. * * Yang works in terms of alpha and beta, where alpha is the shape parameter, * and beta is the rate parameter, which is one over the scale parameter. *) open Ppatteries let inverse_gamma_cdf ~alpha ~beta ?(epsilon = 1e-7) y = let beta = 1. /. beta in (* Check if the provided `y` is below the gamma of some epsilon, so Gsl won't * raise an exception saying the inverse fails to converge in the case of that * gamma_inv(y) is too small. * * y < C(epsilon) <=> Cinv(y) < epsilon *) if y < Gsl_cdf.gamma_P ~a:alpha ~b:beta ~x:epsilon then 0. else Gsl_cdf.gamma_Pinv ~a:alpha ~b:beta ~p:y let make_mean_one v = let tot = Array.fold_left (+.) 0. v and f_n_entries = float_of_int (Array.length v) in Array.map (fun x -> f_n_entries *. x /. tot) v (* * incomplete_gamma : * According to GSL, gamma_inc_P is the complementary normalized incomplete * Gamma Function is * P(a,x) = 1/\Gamma(a) \int_0^x dt t^{a-1} \exp(-t) for a > 0, x >= 0. * which is what Yang calls the incomplete gamma function. * We use his terminology here. *) let incomplete_gamma ~alpha x = Gsl_sf.gamma_inc_P alpha x let int_div i j = (float_of_int i) /. (float_of_int j) (* discrete_gamma : * make a discrete gamma rate distribution with n_cat categories * agrees with Fig. 1 of Yang 1994 # discrete_gamma 4 0.5;; - : float array = [0.0333877533835995541; 0.251915917593438454; 0.820268481973647878; 2.89442784704931411] *) let discrete_gamma n_cat alpha = assert(n_cat > 0); let freq = Array.init (n_cat+1) (fun i -> if i=0 then 0. else if i=n_cat then 1. else begin (* equation (9) of Yang J Mol Evol 1994. *) let cutpoint = inverse_gamma_cdf (int_div i n_cat) ~alpha:alpha ~beta:1. in (* equation (10) of Yang J Mol Evol 1994 pre subtraction *) (* the +1 for alpha is so that we are getting the integral of x times * the gamma function *) incomplete_gamma cutpoint ~alpha:(alpha +. 1.) end) in make_mean_one (Array.init n_cat (fun i -> freq.(i+1) -. freq.(i))) pplacer-1.1.alpha19/pplacer_src/gaussian_approx.ml000066400000000000000000000115641303154601500222760ustar00rootroot00000000000000(* Recall \xi(u) = \frac{1}{\sqrt{mn}} [ \sum_i G_i(u) \eta_i - \frac{1}{m+n} (\sum_i G_i(u)) (\sum_i \eta_i) ] and we want to find [ \int_T |\xi(u)|^p \, \lambda(du)]^{\frac{1}{p} \wedge 1}. For convenience, set \omega(u) = \sum_i G_i(u) \eta_i \sigma(u) = \sum_i G_i(u) Note that when going past a placement j of mass \mu_j, \omega(u) gets incremented by \mu_j \eta_j, and \sigma(u) gets incremented by \mu_j. For this code, we will be setting up "labeled masses" that correspond to the indices, then sampling Gaussians, and doing the corresponding summation. They get stored in labeled_mass_arr. The quantity (\frac{1}{\sqrt{mn}})^p is called front_coeff. We pull it out of the integral, but leave it inside the outer exponentiation to avoid having to deal with the \frac{1}{p} \wedge 1 thing again. *) open Ppatteries open Mass_map (* this exception shows up if the average mass isn't one *) exception Avg_mass_not_one of float (* These are masses which are associated with an index. * The index is so that we can sample the eta's, then multiply the eta_j with * the appropriate mu_j. *) type labeled_mass = { pquery_num: int ; mass: float } (* the intermediate things held for calculation; see scan *) type calc_intermediate = { omega: float ref; (* weighted sum of gaussians *) sigma: float ref; } (* sum of weights *) let get_omega i = !(i.omega) let get_sigma i = !(i.sigma) let intermediate_sum i1 i2 = { omega = ref ((get_omega i1) +. (get_omega i2)); sigma = ref ((get_sigma i1) +. (get_sigma i2)) } (* This looks a bit nuts, and it kind of is, but we are actually only doing this * operation O(#edges of the tree) times. For bifurcating trees these are lists * of two, and the above is actually the most efficient way to go. *) let intermediate_list_sum = List.reduce intermediate_sum (* Note: upre1 and upre2 must have unit mass per placement. *) let pair_approx ?(normalization=1.) rng n_samples p t upre1 upre2 = let np1 = List.length upre1 and np2 = List.length upre2 and int_inv x = 1. /. (float_of_int x) in let labeled_mass_arr = Array.make (1+Gtree.top_id t) [] and pquery_counter = ref 0 and front_coeff = (sqrt(int_inv(np1 * np2))) ** p (* sample is a (mutable) array with all of the Gaussian samples (the etas) *) and sample = Array.make (np1 + np2) 0. in (* Initialize the labeled_mass_arr array with mass from both samples. *) List.iter (List.iter (* recall multimul = mass unit list with multiplicity *) (fun {Pre.multi; Pre.mul} -> if multi <> 1. then failwith "Nontrivial transformed multiplicity for Gaussian significance not \ supported at the moment."; List.iter (fun mu -> labeled_mass_arr.(mu.Pre.loc) <- (mu.Pre.distal_bl, { pquery_num = !pquery_counter; mass = multi *. mu.Pre.mass }) :: (labeled_mass_arr.(mu.Pre.loc))) mul; incr pquery_counter)) [upre1; upre2]; (* Sort by position along the edge. *) Array.modify (List.sort (comparing fst)) labeled_mass_arr; (* The sampling routine. *) let sample_gaussians () = Array.iteri (fun i _ -> sample.(i) <- Gsl_randist.gaussian rng ~sigma:1.) sample in (* Go "past" a labeled mass. *) let update_data data lm = data.omega := (get_omega data) +. lm.mass *. sample.(lm.pquery_num); data.sigma := (get_sigma data) +. lm.mass; in (* Take the samples and do the calculation. *) List.init n_samples (fun _ -> sample_gaussians (); (* sample_avg is \frac{1}{m+n} (\sum_i \eta_i) *) let sample_avg = (int_inv (np1 + np2)) *. (Array.fold_left (+.) 0. sample) in (* xi is * \sum_i G_i(u) \eta_i - \frac{1}{m+n} (\sum_i G_i(u)) (\sum_i \eta_i) * \omega(u) - \sigma(u) \frac{1}{m+n} (\sum_i \eta_i) *) let to_xi_p_times_bl p data bl = ((abs_float ((get_omega data) -. (get_sigma data) *. sample_avg)) ** p) *. bl in (* The total for a single edge. *) let edge_total id = Kr_distance.total_along_edge (to_xi_p_times_bl p) (Gtree.get_bl t id) labeled_mass_arr.(id) update_data (* Make sure that the average weight totals to one. *) and check_final_data data = let avg_weight = int_inv (np1 + np2) *. (get_sigma data) in if abs_float (avg_weight -. 1.) > Kr_distance.tol then raise (Avg_mass_not_one (avg_weight-.1.)) in (* as described up top, front_coeff goes outside the integral but inside * the outer exponentiation. *) (front_coeff *. (Kr_distance.total_over_tree edge_total check_final_data intermediate_list_sum (fun () -> { omega = ref 0.; sigma = ref 0.; }) (Gtree.get_stree t)) /. normalization) ** (Kr_distance.outer_exponent p)) pplacer-1.1.alpha19/pplacer_src/gcat_model.ml000066400000000000000000000413111303154601500211620ustar00rootroot00000000000000(* Support for the gamma CAT model of sequence heterogeneity as implemented in * FastTree. * * The rates are parsed from the FastTree info file and kept in the refpkg. * If the reference alignment is the same as that in the refpkg, then we use * those rate category assignments. Otherwise we find them ourselves, following * the FastTree source: /* Select best rate for each site, correcting for the prior For a prior, use a gamma distribution with shape parameter 3, scale 1/3, so Prior(rate) ~ rate**2 * exp(-3*rate) log Prior(rate) = C + 2 * log(rate) - 3 * rate */ for (iRate = 0; iRate < nRateCategories; iRate++) { double site_loglk_with_prior = site_loglk[NJ->nPos*iRate + iPos] + 2.0 * log(rates[iRate]) - 3.0 * rates[iRate]; if (site_loglk_with_prior > dBest) { iBest = iRate; dBest = site_loglk_with_prior; } } * * * *) open Ppatteries open Gstar_support module LSM = Like_stree.Make module rec Model: Glvm.Model = struct type t = { statd: Gsl_vector.vector; diagdq: Diagd.t; seq_type: Alignment.seq_type; rates: float array; occupied_rates: bool array; (* which of the rate categories actually used *) tensor: Tensor.tensor; (* multi-rate transition matrix for the model *) mutable site_categories: int array; (* which category does each site use *) } type model_t = t let statd model = model.statd let diagdq model = model.diagdq let rates model = model.rates let tensor model = model.tensor let seq_type model = model.seq_type let n_states model = Alignment.nstates_of_seq_type model.seq_type let n_rates model = Array.length (rates model) let setup_occupied_rates ?(reset = true) model = if reset then Array.modify (const false) model.occupied_rates; Array.iter (fun v -> model.occupied_rates.(v) <- true) model.site_categories let build ref_align = function | Glvm.Gcat_model_i (model_name, empirical_freqs, transitions, rates, site_categories) -> let seq_type, (trans, statd) = Gstar_support.seqtype_and_trans_statd_of_info model_name transitions empirical_freqs ref_align in let occupied_rates = Array.make (Array.length rates) false and n_states = Alignment.nstates_of_seq_type seq_type in let model = { statd; seq_type; rates; site_categories; occupied_rates; diagdq = Diagd.normed_of_exchangeable_pair trans statd; tensor = Tensor.create (Array.length rates) n_states n_states; } in setup_occupied_rates ~reset:false model; model | _ -> invalid_arg "build" (* prepare the tensor for a certain branch length *) let prep_tensor_for_bl reind_arr_opt model bl = let f x = Diagd.multi_exp ~mask:x ~dst:model.tensor model.diagdq model.rates bl in match reind_arr_opt with | Some reind_arr -> begin (* Iterate through the reind_arr and just turn on the rates that are * actually used for this use of prep_tensor_for_bl. *) let m = Array.make (Array.length model.occupied_rates) false in Array.iter (fun i -> m.(model.site_categories.(i)) <- true) reind_arr; f m end | None -> f model.occupied_rates let write ch model = Format.fprintf (Format.formatter_of_out_channel ch) "@[@\n%s model:@\n@\nstat distn:@\n%a@\n@\nsite rates:@\n%a@\n@\n\ %d site categories (0-indexed):@\n%a@\n@\noccupied rates@\n%a@]@." (Alignment.seq_type_to_str model.seq_type) Linear_utils.ppr_gsl_vector model.statd Ppr.ppr_float_array model.rates (Array.length model.site_categories) Ppr.ppr_int_array model.site_categories Ppr.ppr_bool_array model.occupied_rates let get_model_class () = Glvm.Gcat_model module Glv = struct type t = { e: (int, BA.int_elt, BA.c_layout) BA1.t; a: Matrix.matrix; } let get_n_sites g = let n = Matrix.dim1 g.a in assert(n = BA1.dim g.e); n let get_n_states g = Matrix.dim2 g.a let dims g = get_n_sites g, get_n_states g let ppr ff g = Format.fprintf ff "@[{ e = %a; @,a = %a }@]" iba1_ppr g.e Matrix.ppr g.a let make ~n_sites ~n_states = { e = iba1_create n_sites; a = Matrix.create n_sites n_states; } (* make a glv of the same dimensions *) let mimic x = { e = iba1_mimic x.e; a = Matrix.mimic x.a; } (* deep copy *) let copy x = { e = iba1_copy x.e; a = Matrix.copy x.a; } let memcpy ~dst ~src = BA1.blit src.e dst.e; Matrix.blit src.a dst.a let set_unit g = BA1.fill g.e 0; Matrix.fill g.a 1. (* Find the "worst" fpclass of the floats in g. *) let fp_classify g = Matrix.fp_classify g.a (* set g according to function fe for exponenent and fa for entries *) let seti g fe fa = let n_sites = get_n_sites g and n_states = get_n_states g in for site=0 to n_sites-1 do for state=0 to n_states-1 do g.a.{site, state} <- fa ~site ~state done; g.e.{site} <- fe site done (* copy the site information from src to dst. _i is which site to copy. *) let copy_site ~src_i ~src ~dst_i ~dst = (dst.e).{dst_i} <- (src.e).{src_i}; BA1.blit (Matrix.slice_left src.a src_i) (Matrix.slice_left dst.a dst_i) (* copy the sites marked with true in site_mask_arr from src to dst. the number * of trues in site_mask_arr should be equal to the number of sites in dst. *) let mask_into site_mask_arr ~src ~dst = let dst_n_sites = get_n_sites dst in let dst_i = ref 0 in Array.iteri (fun src_i b -> if b then begin assert(!dst_i < dst_n_sites); copy_site ~src ~src_i ~dst_i:(!dst_i) ~dst; incr dst_i; end) site_mask_arr; assert(!dst_i = dst_n_sites) (* For comments, see Gmix_model.prep_constant_rate_glv_from_lv_arr. *) let prep_constant_rate_glv_from_lv_arr g lv_arr = assert(lv_arr <> [||]); assert(get_n_sites g = Array.length lv_arr); assert(get_n_states g = Gsl_vector.length lv_arr.(0)); seti g (fun _ -> 0) (fun ~site ~state -> lv_arr.(site).{state}) (* *** pulling exponent *** *) (* pull out the exponent if it's below min_allowed_twoexp and return it. this * process is a bit complicated by the fact that we are partitioned by rate, as * can be seen below. *) let perhaps_pull_exponent min_allowed_twoexp g = let n_sites = get_n_sites g in (* cycle through sites *) for site=0 to n_sites-1 do let _, twoexp = Matrix.slice_left g.a site |> Gsl_vector.max |> frexp in (* now scale if it's needed *) if twoexp < min_allowed_twoexp then begin (* take the negative so that we "divide" by 2^our_twoexp *) Gsl_vector.scale (Matrix.slice_left g.a site) (of_twoexp (-twoexp)); (* bring the exponent out *) g.e.{site} <- g.e.{site} + twoexp; end done (* *** likelihood calculations *** *) (* The log "dot" of the likelihood vectors masked by the boolean vector * mask. Note that we don't have to use the utilv_nsites, so we ignore it * here with a _. *) let masked_logdot _ x y mask = assert(dims x = dims y); (Linear.mat_masked_logdot x.a y.a mask) +. (log_of_2 *. ((masked_total_twoexp x.e mask) +. (masked_total_twoexp y.e mask))) (* the log "dot" of the likelihood vectors in the 0-indexed interval * [start,last]. Note that we don't have to use the utilv_nsites , so we * ignore it here with a _. * *) let bounded_logdot _ x y start last = assert(dims x = dims y); assert(start >= 0 && start <= last && last < get_n_sites x); (Linear.mat_bounded_logdot x.a y.a start last) +. (log_of_2 *. ((bounded_total_twoexp x.e start last) +. (bounded_total_twoexp y.e start last))) (* just take the log "dot" of the likelihood vectors *) let logdot _ x y = bounded_logdot () x y 0 ((get_n_sites x)-1) (* take the pairwise product of glvs g1 and g2, then store in dest. *) let pairwise_prod ~dst g1 g2 = assert(dims g1 = dims g2); iba1_pairwise_sum dst.e g1.e g2.e; Linear.mat_pairwise_prod dst.a g1.a g2.a (* take the product of all of the GLV's in the list, then store in dst. * could probably be implemented more quickly, but typically we are only * taking pairwise products anyway. we pull out the x::y below to optimize * for that case. *) let listwise_prod dst = function | x::y::rest -> (* first product of first two *) pairwise_prod ~dst x y; (* now take product with each of the rest *) List.iter (pairwise_prod ~dst dst) rest | [src] -> (* just copy over *) memcpy ~dst ~src | [] -> assert(false) (* For verification purposes. *) let get_a g ~site ~state = Matrix.get g.a site state (* pick the ML state by taking the sum across rates for each state and site *) let summarize_post summarize_f initial g = let n_sites = get_n_sites g and n_states = get_n_states g in let summary = Array.make n_sites initial and u = Gsl_vector.create ~init:0. n_states in for site=0 to n_sites-1 do Gsl_vector.set_all u 0.; for state=0 to n_states-1 do u.{state} <- u.{state} +. (get_a ~site ~state g) done; summary.(site) <- summarize_f u done; summary end type glv_t = Glv.t let make_glv model = Glv.make ~n_states:(n_states model) let mmap_glv_arrays model fd shared n_arrays n_glvs ~n_sites = gen_mmap_glv_arrays fd shared n_arrays n_glvs [|n_sites|] [|n_sites; n_states model|] (fun ega aga -> {Glv.e = BA.array1_of_genarray ega; Glv.a = BA.array2_of_genarray aga}) let size_of_glv_arrays model n_arrays n_glvs ~n_sites = gen_size_of_glv_arrays (n_states model) n_sites n_arrays n_glvs (* Make a glv out of a list of likelihood vectors. For comments, see * Gmix_model.prep_constant_rate_glv_from_lv_arr. *) let make_constant_rate_glv_from_lv_arr _ lv_arr = assert(lv_arr <> [||]); let g = Glv.make ~n_sites:(Array.length lv_arr) ~n_states:(Gsl_vector.length lv_arr.(0)) in Glv.prep_constant_rate_glv_from_lv_arr g lv_arr; g (* take the log like of the product of three things then dot with the stationary * distribution. Here we ignore utilv_nsites, as we don't need it for * mat_log_like3. *) let log_like3 model _ x y z = assert(Glv.dims x = Glv.dims y && Glv.dims y = Glv.dims z); (Linear.mat_log_like3 (statd model) x.Glv.a y.Glv.a z.Glv.a) +. (log_of_2 *. ((total_twoexp x.Glv.e) +. (total_twoexp y.Glv.e) +. (total_twoexp z.Glv.e))) (* evolve_into: evolve src according to model for branch length bl, then * store the results in dst. *) let evolve_into model ?reind_arr ~dst ~src bl = (* copy over the exponents *) BA1.blit src.Glv.e dst.Glv.e; (* prepare the matrices in our matrix cache *) prep_tensor_for_bl reind_arr model bl; (* apply transform specified by model on the a component *) let site_fn = match reind_arr with | Some a -> Array.get a | None -> identity in let mat_by_cat cat = BA3.slice_left_2 model.tensor cat in for i=0 to (Glv.get_n_sites src) - 1 do let src_mat = BA2.slice_left src.Glv.a i and dst_mat = BA2.slice_left dst.Glv.a i and evo_mat = mat_by_cat model.site_categories.(site_fn i) in Linear_utils.mat_vec_mul dst_mat evo_mat src_mat done (* take the pairwise product of glvs g1 and g2, incorporating the * stationary distribution, then store in dest. *) let statd_pairwise_prod model ~dst g1 g2 = assert(Glv.dims g1 = Glv.dims g2); iba1_pairwise_sum dst.Glv.e g1.Glv.e g2.Glv.e; Linear.mat_statd_pairwise_prod (statd model) dst.Glv.a g1.Glv.a g2.Glv.a (* Make the per-site log likelihood array. *) let site_log_like_arr3 model x y z = let log_site_likes = Array.make (Glv.get_n_sites x) 0. and statd = statd model in for site=0 to (Glv.get_n_sites x)-1 do let site_like = ref 0. in for state=0 to (Glv.get_n_states x)-1 do site_like := !site_like +. statd.{state} *. (Glv.get_a x ~site ~state) *. (Glv.get_a y ~site ~state) *. (Glv.get_a z ~site ~state) done; if 0. >= !site_like then failwith (Printf.sprintf "Site %d has zero likelihood." site); log_site_likes.(site) <- log(!site_like) +. log_of_2 *. (float_of_int (x.Glv.e.{site} + y.Glv.e.{site} + z.Glv.e.{site})) done; log_site_likes let slow_log_like3 model x y z = Array.fold_left ( +. ) 0. (site_log_like_arr3 model x y z) let set_site_categories model a = if Array.length model.site_categories <> Array.length a then invalid_arg "set_site_categories"; Array.iteri (Array.set model.site_categories) a; setup_occupied_rates model (* Optimize site categories. See top of this file. *) let refine model n_sites ref_tree like_aln_map util_glv_arr_1 util_glv_arr_2 = dprint "Optimizing site categories... "; model.site_categories <- Array.make n_sites 0; let best_log_lks = Array.make n_sites (-. infinity) and best_log_lk_cats = Array.make n_sites (-1) and rates = rates model in let n_rates = Array.length rates and log_rates = Array.map log rates in (* For every category, we make an "attempt". Here we record those attempts * that are actually best. *) let record_best_log_lks attempt cat = Array.iteri (fun site log_lk -> let x = log_lk +. 2. *. log_rates.(cat) -. 3. *. rates.(cat) in if x > best_log_lks.(site) then begin best_log_lks.(site) <- x; best_log_lk_cats.(site) <- cat end) attempt in let cat_array = Array.make n_sites (-1) in (* Try all of the rate categories. *) for cat=0 to n_rates-1 do dprintf "%d " (cat+1); Array.fill cat_array 0 n_sites cat; set_site_categories model cat_array; record_best_log_lks (Like_stree.site_log_like_arr model ref_tree like_aln_map util_glv_arr_1 util_glv_arr_2) cat; done; set_site_categories model best_log_lk_cats; dprint "done.\n" let check model ref_align = let n_sites = ref_align.(0) |> snd |> String.length in if n_sites <> Array.length model.site_categories then Printf.sprintf "mismatch: %d sites in site_categories and %d sites in reference alignment" n_sites (Array.length model.site_categories) |> failwith let mask_sites model mask = (* We don't care about the case when they're not equal; either the * refinement will already repopulate the site_categories or the mask is * invalid and `check` will raise an error. *) if Array.length model.site_categories = Array.length mask then begin model.site_categories <- (Enum.combine (Array.enum model.site_categories, Array.enum mask) |> Enum.filter_map (function x, true -> Some x | _, false -> None) |> Array.of_enum); setup_occupied_rates model end end and Like_stree: sig val site_log_like_arr: Model.t -> Newick_gtree.t -> Gsl_vector.vector array IntMap.t -> Model.Glv.t array -> Model.Glv.t array -> float array end = LSM(Model) module Glv_edge = Glv_edge.Make(Model) module Glv_arr = Glv_arr.Make(Model) let init_of_json o ref_align = let model_name = safe_hashtbl_find o "subs_model" |> Jsontype.string in if Alignment.is_nuc_align ref_align && model_name <> "GTR" then dprint "WARNING: You have given me what appears to be a nucleotide alignment, but have specified a model other than GTR. I only know GTR for nucleotides!\n"; let empirical_freqs = safe_hashtbl_find o "empirical_frequencies" |> Jsontype.bool and opt_transitions = Hashtbl.Exceptionless.find o "subs_rates" |> Option.map (Jsontype.obj %> (fun tbl -> List.map (safe_hashtbl_find tbl %> Jsontype.float) ["ac"; "ag"; "at"; "cg"; "ct"; "gt"]) %> Array.of_list) and price_cat = safe_hashtbl_find o "Price-CAT" |> Jsontype.obj in let rates = safe_hashtbl_find price_cat "Rates" |> Jsontype.array |> List.map Jsontype.float |> Array.of_list and site_categories = safe_hashtbl_find price_cat "SiteCategories" |> Jsontype.array |> List.map Jsontype.int |> Array.of_list |> Array.map (fun x -> x-1) (* FastTree writes out 1-indexed arrays. *) in Glvm.Gcat_model_i (model_name, empirical_freqs, opt_transitions, rates, site_categories) pplacer-1.1.alpha19/pplacer_src/gen_docs.ml000066400000000000000000000057001303154601500206470ustar00rootroot00000000000000open Ppatteries open Rst let docs_dir = "docs/" let details_dir = docs_dir^"details/" let generated_dir = docs_dir^"generated_rst/" let check_directory path = if not (Sys.is_directory path) then failwith ("Could not find the "^path^" directory. \ Please run this command in the pplacer repository root directory.") (* copy the contents of fname into the channel *) let cat_file_to_channel fname out_ch = let in_ch = open_in fname in try while true; do Printf.fprintf out_ch "%s\n" (input_line in_ch) done with End_of_file -> close_in in_ch let command_list_of_subcommand_program (prefix, command_list) = let commands = command_list |> List.map snd |> List.flatten in let command_matrix = Array.append [|[|"Command"; "Description"|]|] (Array.of_list (List.sort compare (List.map (fun (name, cmd) -> [|Printf.sprintf ":ref:`%s <%s_%s>`" name prefix name; (cmd ())#desc|]) commands))) in let index_out = Printf.sprintf "%s%s.rst" generated_dir prefix |> open_out in Printf.sprintf "%s%s.rst" details_dir prefix |> File.lines_of |> Enum.iter (fun line -> if line = ".. command-table" then Rst.write_table index_out command_matrix else Printf.fprintf index_out "%s\n" line); close_out index_out; List.map (fun (name, pre_o) -> name, Some prefix, pre_o) commands let () = List.iter check_directory [docs_dir; details_dir; generated_dir;]; List.iter (fun (name, prefix, pre_o) -> let o = pre_o () and full_name = (match prefix with | None -> "" | Some s -> s ^ "_") ^ name in let rst_name = full_name ^ ".rst" in let ch = open_out (generated_dir^rst_name) in let endline () = Printf.fprintf ch "\n" in (* write top matter *) Printf.fprintf ch ":tocdepth: 3\n\n"; Printf.fprintf ch ".. _%s:\n\n" full_name; write_top_title ch name; Printf.fprintf ch "\n`%s` %s." name o#desc; endline (); write_literal_block_start ch; Printf.fprintf ch " %s\n\n" o#usage; (* write flags *) write_section_title ch "Options" 0; endline (); List.iter (fun (flagstr,_,description) -> write_option ch flagstr description) o#specl; endline (); (* write details if they exist *) let details_path = details_dir^rst_name in if Sys.file_exists details_path then begin write_section_title ch "Details" 0; endline (); cat_file_to_channel details_path ch; end; print_endline ("Wrote "^generated_dir^rst_name^"...") ) (("pplacer", None, (fun () -> new Prefs.pplacer_cmd ())) :: (List.map command_list_of_subcommand_program ["guppy", Guppy_commands.command_list (); "rppr", Rppr_commands.command_list ()] |> List.flatten)) pplacer-1.1.alpha19/pplacer_src/glv_arr.ml000066400000000000000000000033021303154601500205160ustar00rootroot00000000000000(* just routines for arrays of Glv's. *) module Make (Model: Glvm.Model): sig type t = Model.glv_t array val make: Model.t -> n_glvs:int -> n_sites:int -> t val copy: t -> t val mimic: t -> t val arr_get: t -> int -> Model.glv_t val iter: (Model.glv_t -> unit) -> t -> unit val get: t -> int -> Model.glv_t val get_one: t -> Model.glv_t val evolve_into: Model.t -> src:t -> dst:t -> (int -> float) -> unit val prep_supernodes: Model.t -> dst:t -> t -> t -> (int -> float) -> unit end = struct module Glv = Model.Glv type t = Glv.t array let arr_get = Array.get let make model ~n_glvs ~n_sites = Array.init n_glvs (fun _ -> Model.make_glv model ~n_sites) let iter = Array.iter let copy a = Array.map Glv.copy a let mimic a = Array.map Glv.mimic a let get a glvi = arr_get a glvi let get_one a = assert(a <> [||]); a.(0) let evolve_into model ~src ~dst bl_fun = let n = Array.length src in if n <> Array.length dst then failwith "Glv_arr.evolve_into: unequal lengths!"; for i=0 to n-1 do Model.evolve_into model ~src:src.(i) ~dst:dst.(i) (bl_fun i) done (* for making a collection of nodes for the first (fast) evaluation *) let prep_supernodes model ~dst darr parr bl_fun = let n = Array.length dst in if n <> Array.length darr || n <> Array.length parr then failwith "Glv_arr.prep_supernode: unequal lengths!"; let utild = Glv.mimic (get_one darr) and utilp = Glv.mimic (get_one parr) in for i=0 to n-1 do Model.evolve_into model ~src:darr.(i) ~dst:utild (bl_fun i); Model.evolve_into model ~src:parr.(i) ~dst:utilp (bl_fun i); Model.statd_pairwise_prod model ~dst:dst.(i) utild utilp done end pplacer-1.1.alpha19/pplacer_src/glv_edge.ml000066400000000000000000000021111303154601500206330ustar00rootroot00000000000000(* Makes a type for edges, with cached glv calculations. * Evolv is orig evolved along an edge of length bl. * * Scary side-effect land! But by keeping with the interface, we should be safe. *) module Make (Model: Glvm.Model): sig type t val make: Model.t -> ?reind_arr:int array -> Model.glv_t -> float -> t val get_bl: t -> float val get_orig: t -> Model.glv_t val get_evolv: t -> Model.glv_t val set_bl: Model.t -> t -> float -> unit end = struct module Glv = Model.Glv type t = { orig: Glv.t; evolv: Glv.t; bl: float ref; reind_arr: int array option; } let get_bl e = !(e.bl) let get_orig e = e.orig let get_evolv e = e.evolv let recalculate model glve = Model.evolve_into model ?reind_arr:(glve.reind_arr) ~dst:(glve.evolv) ~src:(glve.orig) !(glve.bl) let set_bl model glve new_bl = glve.bl := new_bl; recalculate model glve let make model ?reind_arr orig init_bl = let glve = { orig; evolv = Glv.copy orig; bl = ref init_bl; reind_arr; } in recalculate model glve; glve end pplacer-1.1.alpha19/pplacer_src/glvm.ml000066400000000000000000000050511303154601500200320ustar00rootroot00000000000000open Ppatteries type model_class = Gmix_model | Gcat_model type init_params = (* Gmix_model (model_name, empirical_freqs, opt_transitions, rates) *) | Gmix_model_i of string * bool * float array option * float array (* Gcat_model (model_name, empirical_freqs, transitions, rates, site_categories) *) | Gcat_model_i of string * bool * float array option * float array * int array module type Model = sig type t type glv_t val build: Alignment.t -> init_params -> t val seq_type: t -> Alignment.seq_type val rates: t -> float array val refine: t -> int -> Newick_gtree.t -> Gsl_vector.vector array IntMap.t -> glv_t array -> glv_t array -> unit val check: t -> Alignment.t -> unit val mask_sites: t -> bool array -> unit val write: unit IO.output -> t -> unit val get_model_class: unit -> model_class module Glv: sig type t = glv_t val get_n_sites: t -> int val ppr: Format.formatter -> t -> unit val mimic: t -> t val copy: t -> t val set_unit: t -> unit val fp_classify: t -> fpclass val mask_into: bool array -> src:t -> dst:t -> unit val perhaps_pull_exponent: int -> t -> unit val masked_logdot: Gsl_vector.vector -> t -> t -> Linear.uint16_vector -> float val bounded_logdot: Gsl_vector.vector -> t -> t -> int -> int -> float val logdot: Gsl_vector.vector -> t -> t -> float val listwise_prod: t -> t list -> unit val prep_constant_rate_glv_from_lv_arr: t -> Gsl_vector.vector array -> unit val summarize_post: (Gsl_vector.vector -> 'a) -> 'a -> t -> 'a array end val make_glv: t -> n_sites:int -> Glv.t val mmap_glv_arrays: t -> Unix.file_descr -> bool -> int -> int -> n_sites:int -> Glv.t array array val size_of_glv_arrays: t -> int -> int -> n_sites:int -> int val make_constant_rate_glv_from_lv_arr: t -> Gsl_vector.vector array -> Glv.t val log_like3: t -> Gsl_vector.vector -> Glv.t -> Glv.t -> Glv.t -> float val site_log_like_arr3: t -> Glv.t -> Glv.t -> Glv.t -> float array val slow_log_like3: t -> Glv.t -> Glv.t -> Glv.t -> float val evolve_into: t -> ?reind_arr:int array -> dst:Glv.t -> src:Glv.t -> float -> unit val statd_pairwise_prod: t -> dst:Glv.t -> Glv.t -> Glv.t -> unit end type t = (module Model) * init_params let get_symbol code = function | -1 -> '-' | i -> try code.(i) with | Invalid_argument _ -> assert(false) let to_sym_str code ind_arr = StringFuns.of_char_array (Array.map (get_symbol code) ind_arr) let code = function | Alignment.Nucleotide_seq -> Nuc_models.nuc_code | Alignment.Protein_seq -> Prot_models.prot_code pplacer-1.1.alpha19/pplacer_src/gmix_model.ml000066400000000000000000000335551303154601500212230ustar00rootroot00000000000000(* Support for the gamma mixture model of sequence heterogeneity. * *) open Ppatteries open Gstar_support module Model: Glvm.Model = struct type t = { statd: Gsl_vector.vector; diagdq: Diagd.t; seq_type: Alignment.seq_type; rates: float array; tensor: Tensor.tensor; (* multi-rate transition matrix for the model *) } let statd model = model.statd let diagdq model = model.diagdq let rates model = model.rates let tensor model = model.tensor let seq_type model = model.seq_type let n_states model = Alignment.nstates_of_seq_type model.seq_type let n_rates model = Array.length (rates model) let build ref_align = function | Glvm.Gmix_model_i (model_name, empirical_freqs, transitions, rates) -> let seq_type, (trans, statd) = Gstar_support.seqtype_and_trans_statd_of_info model_name transitions empirical_freqs ref_align in let n_states = Alignment.nstates_of_seq_type seq_type in { statd; seq_type; rates; diagdq = Diagd.normed_of_exchangeable_pair trans statd; tensor = Tensor.create (Array.length rates) n_states n_states; } | _ -> invalid_arg "build" let write ch model = Format.fprintf (Format.formatter_of_out_channel ch) "@[%s model@\n@\nstat distn:@\n%a@\n@\nsite rates:@\n%a@]@." (Alignment.seq_type_to_str model.seq_type) Linear_utils.ppr_gsl_vector model.statd Ppr.ppr_float_array model.rates let get_model_class () = Glvm.Gmix_model (* prepare the tensor for a certain branch length *) let prep_tensor_for_bl model bl = Diagd.multi_exp model.tensor model.diagdq model.rates bl module Glv = struct type t = { e: (int, BA.int_elt, BA.c_layout) BA1.t; a: Tensor.tensor; } let get_n_rates g = Tensor.dim1 g.a let get_n_sites g = let n = Tensor.dim2 g.a in assert(n = BA1.dim g.e); n let get_n_states g = Tensor.dim3 g.a let dims g = get_n_rates g, get_n_sites g, get_n_states g let ppr ff g = Format.fprintf ff "@[{ e = %a; @,a = %a }@]" iba1_ppr g.e Tensor.ppr g.a let make ~n_rates ~n_sites ~n_states = { e = iba1_create n_sites; a = Tensor.create n_rates n_sites n_states; } (* make a glv of the same dimensions *) let mimic x = { e = iba1_mimic x.e; a = Tensor.mimic x.a; } (* deep copy *) let copy x = { e = iba1_copy x.e; a = Tensor.copy x.a; } let memcpy ~dst ~src = BA1.blit src.e dst.e; BA3.blit src.a dst.a let set_unit g = BA1.fill g.e 0; BA3.fill g.a 1. (* Find the "worst" fpclass of the floats in g. *) let fp_classify g = Tensor.fp_classify g.a (* set g according to function fe for exponenent and fa for entries *) let seti g fe fa = let n_sites = get_n_sites g and n_rates = get_n_rates g and n_states = get_n_states g in for site=0 to n_sites-1 do for rate=0 to n_rates-1 do for state=0 to n_states-1 do g.a.{rate,site,state} <- fa ~rate ~site ~state done done; g.e.{site} <- fe site done (* copy the site information from src to dst. _i is which site to copy. *) let copy_site ~src_i ~src ~dst_i ~dst = (dst.e).{dst_i} <- (src.e).{src_i}; for rate=0 to (get_n_rates src)-1 do BA1.blit (BA3.slice_left_1 src.a rate src_i) (BA3.slice_left_1 dst.a rate dst_i) done (* copy the sites marked with true in site_mask_arr from src to dst. the number * of trues in site_mask_arr should be equal to the number of sites in dst. *) let mask_into site_mask_arr ~src ~dst = let dst_n_sites = get_n_sites dst in let dst_i = ref 0 in Array.iteri (fun src_i b -> if b then begin assert(!dst_i < dst_n_sites); copy_site ~src ~src_i ~dst_i:(!dst_i) ~dst; incr dst_i; end) site_mask_arr; assert(!dst_i = dst_n_sites) (* This is used when we have a pre-allocated GLV and want to fill it with a * same-length lv array. Zero pulled exponents as well. "Constant rate" * to the fact that the glvs at the internal nodes have different lvs for * each rate. For this one we have them all set to the same lvs, which * makes sense when, say, we are at a leaf. *) let prep_constant_rate_glv_from_lv_arr g lv_arr = assert(lv_arr <> [||]); assert(get_n_sites g = Array.length lv_arr); assert(get_n_states g = Gsl_vector.length lv_arr.(0)); seti g (fun _ -> 0) (fun ~rate:_ ~site ~state -> lv_arr.(site).{state}) (* *** Pulling exponents. *** *) (* pull out the exponent if it's below min_allowed_twoexp and return it. this * process is a bit complicated by the fact that we are partitioned by rate, as * can be seen below. *) let perhaps_pull_exponent min_allowed_twoexp g = let n_rates = get_n_rates g and n_sites = get_n_sites g in let max_twoexp = ref (-max_int) in (* cycle through sites *) for site=0 to n_sites-1 do max_twoexp := (-max_int); (* first find the max twoexp *) for rate=0 to n_rates-1 do let s = BA3.slice_left_1 g.a rate site in let (_, twoexp) = frexp (Gsl_vector.max s) in if twoexp > !max_twoexp then max_twoexp := twoexp done; (* now scale if it's needed *) if !max_twoexp < min_allowed_twoexp then begin for rate=0 to n_rates-1 do (* take the negative so that we "divide" by 2^our_twoexp *) Gsl_vector.scale (BA3.slice_left_1 g.a rate site) (of_twoexp (-(!max_twoexp))); done; (* bring the exponent out *) g.e.{site} <- g.e.{site} + !max_twoexp; end done (* *** likelihood calculations *** *) (* The log "dot" of the likelihood vectors masked by the boolean vector * mask. *) let masked_logdot utilv_nsites x y mask = assert(dims x = dims y); (Linear.ten_masked_logdot x.a y.a mask utilv_nsites) +. (log_of_2 *. ((masked_total_twoexp x.e mask) +. (masked_total_twoexp y.e mask))) (* the log "dot" of the likelihood vectors in the 0-indexed interval * [start,last] *) let bounded_logdot utilv_nsites x y start last = assert(dims x = dims y); assert(start >= 0 && start <= last && last < get_n_sites x); (Linear.ten_bounded_logdot x.a y.a start last utilv_nsites) +. (log_of_2 *. ((bounded_total_twoexp x.e start last) +. (bounded_total_twoexp y.e start last))) (* just take the log "dot" of the likelihood vectors *) let logdot utilv_nsites x y = bounded_logdot utilv_nsites x y 0 ((get_n_sites x)-1) (* take the pairwise product of glvs g1 and g2, then store in dest. *) let pairwise_prod ~dst g1 g2 = assert(dims g1 = dims g2); iba1_pairwise_sum dst.e g1.e g2.e; Linear.ten_pairwise_prod dst.a g1.a g2.a (* take the product of all of the GLV's in the list, then store in dst. * could probably be implemented more quickly, but typically we are only * taking pairwise products anyway. we pull out the x::y below to optimize * for that case. *) let listwise_prod dst = function | x::y::rest -> (* first product of first two *) pairwise_prod ~dst x y; (* now take product with each of the rest *) List.iter (pairwise_prod ~dst dst) rest | [src] -> (* just copy over *) memcpy ~dst ~src | [] -> assert(false) (* For verification purposes. *) let get_a g ~rate ~site ~state = BA3.get g.a rate site state (* pick the ML state by taking the sum across rates for each state and site *) let summarize_post summarize_f initial g = let n_sites = get_n_sites g and n_states = get_n_states g and n_rates = get_n_rates g in let summary = Array.make n_sites initial and u = Gsl_vector.create ~init:0. n_states in for site=0 to n_sites-1 do Gsl_vector.set_all u 0.; for rate=0 to n_rates-1 do for state=0 to n_states-1 do u.{state} <- u.{state} +. (get_a ~rate ~site ~state g) done done; summary.(site) <- summarize_f u done; summary end type glv_t = Glv.t let make_glv model = Glv.make ~n_states:(n_states model) ~n_rates:(n_rates model) let mmap_glv_arrays model fd shared n_arrays n_glvs ~n_sites = gen_mmap_glv_arrays fd shared n_arrays n_glvs [|n_sites|] [|n_rates model; n_sites; n_states model|] (fun ega aga -> {Glv.e = BA.array1_of_genarray ega; Glv.a = BA.array3_of_genarray aga}) let size_of_glv_arrays model n_arrays n_glvs ~n_sites = gen_size_of_glv_arrays (n_states model * n_rates model) n_sites n_arrays n_glvs (* Make a glv out of a list of likelihood vectors. For comments, see * prep_constant_rate_glv_from_lv_arr. *) let make_constant_rate_glv_from_lv_arr model lv_arr = assert(lv_arr <> [||]); let g = Glv.make ~n_rates:(n_rates model) ~n_sites:(Array.length lv_arr) ~n_states:(Gsl_vector.length lv_arr.(0)) in Glv.prep_constant_rate_glv_from_lv_arr g lv_arr; g (* take the log like of the product of three things then dot with the stationary * distribution. *) let log_like3 model utilv_nsites x y z = assert(Glv.dims x = Glv.dims y && Glv.dims y = Glv.dims z); (Linear.ten_log_like3 (statd model) x.Glv.a y.Glv.a z.Glv.a utilv_nsites) +. (log_of_2 *. ((total_twoexp x.Glv.e) +. (total_twoexp y.Glv.e) +. (total_twoexp z.Glv.e))) (* evolve_into: evolve src according to model for branch length bl, then * store the results in dst. *) let evolve_into model ?reind_arr ~dst ~src bl = let _ = reind_arr in (* Ignore reind_arr. *) (* copy over the exponents *) BA1.blit src.Glv.e dst.Glv.e; (* prepare the matrices in our matrix cache *) prep_tensor_for_bl model bl; (* The matrices for various rates are juxtaposed in the tensor. *) tensor_mul (tensor model) ~dst:dst.Glv.a ~src:src.Glv.a (* take the pairwise product of glvs g1 and g2, incorporating the * stationary distribution, then store in dest. *) let statd_pairwise_prod model ~dst g1 g2 = assert(Glv.dims g1 = Glv.dims g2); iba1_pairwise_sum dst.Glv.e g1.Glv.e g2.Glv.e; Linear.ten_statd_pairwise_prod (statd model) dst.Glv.a g1.Glv.a g2.Glv.a (* Make the per-site log likelihood array. *) let site_log_like_arr3 model x y z = let log_site_likes = Array.make (Glv.get_n_sites x) 0. and f_n_rates = float_of_int (n_rates model) and statd = statd model in for site=0 to (Glv.get_n_sites x)-1 do let site_like = ref 0. in for rate=0 to (Glv.get_n_rates x)-1 do for state=0 to (Glv.get_n_states x)-1 do site_like := !site_like +. statd.{state} *. (Glv.get_a x ~rate ~site ~state) *. (Glv.get_a y ~rate ~site ~state) *. (Glv.get_a z ~rate ~site ~state) done; done; if 0. >= !site_like then failwith (Printf.sprintf "Site %d has zero likelihood." site); log_site_likes.(site) <- log(!site_like /. f_n_rates) +. log_of_2 *. (float_of_int (x.Glv.e.{site} + y.Glv.e.{site} + z.Glv.e.{site})) done; log_site_likes let slow_log_like3 model x y z = Array.fold_left ( +. ) 0. (site_log_like_arr3 model x y z) (* We don't do anything for model refinement. *) let refine _ _ _ _ _ _ = () let check _ _ = () let mask_sites _ _ = () end module Glv_edge = Glv_edge.Make(Model) module Glv_arr = Glv_arr.Make(Model) let init_of_prefs ref_dir_complete prefs ref_align = let opt_transitions = match Prefs.stats_fname prefs with | s when s = "" -> Printf.printf "NOTE: you have not specified a stats file. I'm using the %s model.\n" (Prefs.model_name prefs); None | _ -> Parse_stats.parse_stats ref_dir_complete prefs in if Alignment.is_nuc_align ref_align && (Prefs.model_name prefs) <> "GTR" then dprint "WARNING: You have given me what appears to be a nucleotide alignment, but have specified a model other than GTR. I only know GTR for nucleotides!\n"; Glvm.Gmix_model_i ((Prefs.model_name prefs), (Prefs.empirical_freqs prefs), opt_transitions, (Gamma.discrete_gamma (Prefs.gamma_n_cat prefs) (Prefs.gamma_alpha prefs))) (* deprecated now *) let init_of_stats_fname prefs stats_fname ref_align = prefs.Prefs.stats_fname := stats_fname; init_of_prefs "" prefs ref_align let init_of_json o ref_align = let model_name = safe_hashtbl_find o "subs_model" |> Jsontype.string in if Alignment.is_nuc_align ref_align && model_name <> "GTR" then dprint "WARNING: You have given me what appears to be a nucleotide alignment, but have specified a model other than GTR. I only know GTR for nucleotides!\n"; if safe_hashtbl_find o "ras_model" |> Jsontype.string <> "gamma" then failwith "Whoops! This is supposed to be a gamma mixture model."; let gamma_o = safe_hashtbl_find o "gamma" in let opt_transitions = if Hashtbl.mem o "subs_rates" then begin let subs_rates_o = safe_hashtbl_find o "subs_rates" in Some [| Simple_json.find_float subs_rates_o "ac"; Simple_json.find_float subs_rates_o "ag"; Simple_json.find_float subs_rates_o "at"; Simple_json.find_float subs_rates_o "cg"; Simple_json.find_float subs_rates_o "ct"; Simple_json.find_float subs_rates_o "gt"; |] end else None in Glvm.Gmix_model_i (model_name, (safe_hashtbl_find o "empirical_frequencies" |> Jsontype.bool), opt_transitions, (Gamma.discrete_gamma (Simple_json.find_int gamma_o "n_cats") (Simple_json.find_float gamma_o "alpha"))) pplacer-1.1.alpha19/pplacer_src/gstar_support.ml000066400000000000000000000072231303154601500220040ustar00rootroot00000000000000open Ppatteries module BA = Bigarray module BA1 = BA.Array1 module BA2 = BA.Array2 module BA3 = BA.Array3 module GA = BA.Genarray let log_of_2 = log 2. let safe_hashtbl_find h k = try Hashtbl.find h k with | Not_found -> failwith ("'"^k ^"' not found in the model!") (* integer big arrays *) let iba1_create = BA1.create BA.int BA.c_layout let iba1_mimic a = iba1_create (BA1.dim a) let iba1_copy a = let b = iba1_mimic a in BA1.blit a b; b let iba1_to_array a = let arr = Array.make (BA1.dim a) 0 in for i=0 to (BA1.dim a)-1 do arr.(i) <- a.{i} done; arr let iba1_ppr ff a = Ppr.ppr_int_array ff (iba1_to_array a) let iba1_pairwise_sum dest x y = let n = BA1.dim x in assert(n = BA1.dim y && n = BA1.dim dest); for i=0 to n-1 do BA1.unsafe_set dest i ((BA1.unsafe_get x i) + (BA1.unsafe_get y i)) done (* gets the base two exponent *) let get_twoexp x = snd (frexp x) (* makes a float given a base two exponent. we use 0.5 because: # frexp (ldexp 1. 3);; - : float * int = (0.5, 4) so that's how ocaml interprets 2^i anyway. *) let of_twoexp i = ldexp 0.5 (i+1) (* total all of the stored exponents. we use a float to avoid overflow. *) let total_twoexp e = let last = BA1.dim e - 1 and tot = ref 0. in for i=0 to last do tot := !tot +. float_of_int (BA1.unsafe_get e i) done; !tot (* The sum of the unmasked entries of e. *) let masked_total_twoexp e mask = assert(BA1.dim e = BA1.dim mask); let tot = ref 0. in for i=0 to BA1.dim e - 1 do if BA1.unsafe_get mask i <> 0 then tot := !tot +. float_of_int (BA1.unsafe_get e i) done; !tot (* total all of the stored exponents in a specified range. *) let bounded_total_twoexp e start last = let tot = ref 0. in for i=start to last do tot := !tot +. float_of_int (BA1.unsafe_get e i) done; !tot (* multiply by a tensor *) let tensor_mul tensor ~dst ~src = let last = Tensor.dim1 src - 1 in (* iter over rates *) for i=0 to last do let src_mat = BA3.slice_left_2 src i and evo_mat = BA3.slice_left_2 tensor i and dst_mat = BA3.slice_left_2 dst i in Linear.gemmish dst_mat evo_mat src_mat done let seqtype_and_trans_statd_of_info model_name transitions empirical_freqs ref_align = if model_name = "GTR" then (Alignment.Nucleotide_seq, match transitions with | Some transitions -> (Nuc_models.b_of_trans_vector transitions, Alignment.emper_freq 4 Nuc_models.nuc_map ref_align) | None -> failwith "GTR specified but no substitution rates given.") else (Alignment.Protein_seq, let model_trans, model_statd = Prot_models.trans_and_statd_of_model_name model_name in (model_trans, if empirical_freqs then Alignment.emper_freq 20 Prot_models.prot_map ref_align else model_statd)) let gen_mmap_glv_arrays fd shared n_arrays n_glvs eba_dims aba_dims glv_cb = let dims = [|n_arrays; n_glvs|] in let aba = Array.append dims aba_dims |> GA.map_file fd BA.float64 BA.c_layout shared in let pos = GA.dims aba |> Array.enum |> Enum.fold ( * ) 8 |> Int64.of_int in let eba = Array.append dims eba_dims |> GA.map_file fd ~pos BA.int BA.c_layout shared in 0 --^ n_arrays |> Enum.map (fun i -> 0 --^ n_glvs |> Enum.map (fun j -> glv_cb (GA.slice_left eba [|i; j|]) (GA.slice_left aba [|i; j|])) |> Array.of_enum) |> Array.of_enum let gen_size_of_glv_arrays eba_base aba_base n_arrays n_glvs = (* int and nativeint _should_ be the same size *) let int_bytes = Nativeint.size / 8 in let aba_elements = aba_base * n_arrays * n_glvs in let eba_elements = aba_elements * eba_base in (aba_elements * 8) + (eba_elements * int_bytes) pplacer-1.1.alpha19/pplacer_src/gtree.ml000066400000000000000000000230121303154601500201700ustar00rootroot00000000000000(* our tree data stucture with information. * * Gtree stands for general tree, meaning that we have a tree with any kind of * bark that has get/set methods for bl, node_label, and edge_label. * * We number all of the nodes and then have maps which tell us about the edges. * Note that the edge information is for the node directly above the node with * the chosen edge. * *) open Ppatteries (* these are raised when we are asked for something that isn't in a bark map *) exception Lacking_bark of int exception Lacking_branchlength of int exception Lacking_node_label of int exception Lacking_edge_label of int exception Attachment_distal_bl_out_of_range of int * float (* Rounding errors crop up when subtracting branch lengths. * This is our tolerance. *) let bl_arithmetic_tol = 1e-10 type 'a gtree = {stree : Stree.stree; bark_map : 'a IntMap.t} let gtree stree bark_map = {stree; bark_map} let of_stree stree = {stree; bark_map = IntMap.empty} let get_stree t = t.stree let get_bark_map t = t.bark_map let get_bark t id = try IntMap.find id t.bark_map with | Not_found -> raise (Lacking_bark id) let get_bark_opt t id = if IntMap.mem id t.bark_map then Some(get_bark t id) else None let get_bl t id = try (get_bark t id)#get_bl with | Not_found -> raise (Lacking_branchlength id) let get_node_label t id = try (get_bark t id)#get_node_label with | Not_found -> raise (Lacking_node_label id) let get_edge_label t id = try (get_bark t id)#get_edge_label with | Not_found -> raise (Lacking_edge_label id) let set_stree t stree = {t with stree} let set_bark_map t bark_map = {t with bark_map} let add_bark t id bark = set_bark_map t (IntMap.add id bark (get_bark_map t)) let set_bl t id bl = add_bark t id ((get_bark t id)#set_bl bl) (* stree related *) let top_id t = Stree.top_id (get_stree t) let n_taxa t = Stree.n_taxa (get_stree t) (* Number of non-root edges. *) let n_edges t = Stree.n_edges (get_stree t) (* Number of non-root edges. *) let recur f_node f_leaf t = Stree.recur f_node f_leaf (get_stree t) let recur_listly f t = Stree.recur_listly f (get_stree t) let node_ids t = Stree.node_ids (get_stree t) let nonroot_node_ids t = Stree.nonroot_node_ids (get_stree t) let leaf_ids t = Stree.leaf_ids (get_stree t) (* bark map related *) let add_bark id b t = { t with bark_map = (IntMap.add id b (get_bark_map t)) } let map_bark_map f t = {t with bark_map = IntMap.map f (get_bark_map t)} let mapi_bark_map f t = {t with bark_map = IntMap.mapi f (get_bark_map t)} let fold_over_leaves f t v = let open Stree in let rec aux v = function | (Leaf i) :: rest when IntMap.mem i t.bark_map -> aux (f i (IntMap.find i t.bark_map) v) rest | Leaf _ :: rest -> aux v rest | Node (_, subtrees) :: rest -> aux v (List.append subtrees rest) | [] -> v in aux v [t.stree] let leaf_bark_map t = fold_over_leaves IntMap.add t IntMap.empty (* general *) let compare bark_compare t1 t2 = try raise_if_different compare (get_stree t1) (get_stree t2); raise_if_different (IntMap.compare bark_compare) (get_bark_map t1) (get_bark_map t2); 0 with | Different c -> c let tree_length tree = let get_our_bl id = get_bl tree id in let rec aux = function | Stree.Node(id, tL) -> List.fold_left ( +. ) (get_our_bl id) (List.map aux tL) | Stree.Leaf id -> get_our_bl id in match get_stree tree with | Stree.Node(_, tL) -> (* exclude the root edge *) List.fold_left ( +. ) 0. (List.map aux tL) | Stree.Leaf _ -> 0. (* adding things to trees *) type 'a addition = | Subtree of 'a gtree | Internal_node let addition_n_edges = function | Subtree t -> n_edges t | Internal_node -> 0 (* copy the info from src at id over to dest *) let copy_bark ~dest ~src id = match IntMap.Exceptionless.find id (get_bark_map src) with | Some bark -> add_bark id bark dest | None -> dest (* swap the bark for the two given ids *) let swap_bark a b ({bark_map = m} as t) = let av, m' = IntMap.opt_extract a m in let bv, m'' = IntMap.opt_extract b m' in {t with bark_map = IntMap.opt_add b av m'' |> IntMap.opt_add a bv} let reroot t i = swap_bark i (top_id t) {t with stree = Stree.reroot t.stree i} (* Given a gtree, renumber its nodes so that all of the node numbers are on the * range [0, N), where N is the number of nodes. A translation map is also * returned that maps from the old node numbers to the new node numbers. *) let renumber {bark_map; stree} = let open Stree in let next ir = let res = !ir in incr ir; res and counter = ref 0 in let rec aux = function | Leaf i -> let j = next counter in leaf j, IntMap.Exceptionless.find i bark_map |> Option.map_default (IntMap.singleton j) IntMap.empty, IntMap.singleton i j | Node (i, subtrees) -> let subtrees', barkm, transm = List.fold_left (fun (ta, ba, ma) x -> let tx, bx, mx = aux x in tx :: ta, IntMap.union bx ba, IntMap.union mx ma) ([], IntMap.empty, IntMap.empty) subtrees and j = next counter in List.rev subtrees' |> node j, IntMap.Exceptionless.find i bark_map |> Option.map_default (flip (IntMap.add j) barkm) barkm, IntMap.add i j transm in let stree, bark_map, transm = aux stree in {stree; bark_map}, transm (* join a list of info_trees *) let join new_id tL = gtree (Stree.node new_id (List.map get_stree tL)) (List.reduce Bark_map.union (List.map get_bark_map tL)) let boost by = function | Subtree t -> Subtree (gtree (Stree.boost by (get_stree t)) (Bark_map.boost by (get_bark_map t))) | Internal_node -> Internal_node (* join two trees and add bark to the top *) let opt_join t t_opt new_id bark = add_bark new_id bark (join new_id (match t_opt with | Subtree t_new -> [t; t_new] | Internal_node -> [t])) (* add a subtree above the prev one, giving * * | * | - - new_t * root bl = orig bl | * | bl = where * | * t * * we boost all of the indices in new_t by boost_by, and take the newly created * node to have id = 1 + top_id of boosted new_t. * bark_of_bl is called with the new top bl to equip the root of the new tree * with bark corresponding to the branch length bl. *) let add_boosted_subtree_above bark_of_bl ~t ~new_t where boost_by = let our_top_id = top_id t in let boosted_new_t = boost boost_by new_t in let new_id = 1 + boost_by + (addition_n_edges new_t) in let final_top_bl = let new_top_bl = (get_bl t our_top_id) -. where in if new_top_bl >= 0. then new_top_bl else begin (* new_top_bl is neg then highest_distal was bigger than top edge *) if abs_float new_top_bl < bl_arithmetic_tol then 0. (* ignore it if it's within tolerance *) else raise (Attachment_distal_bl_out_of_range (our_top_id, new_top_bl)) end in opt_join (set_bl t our_top_id where) boosted_new_t new_id (bark_of_bl final_top_bl) (* add a collection of subtrees given a list of (where, tree) pairs; where * describes where the tree should be glued in. pos is the "where" of the * previous lowest tree. * we assume that the top_id for each of the subtrees is equal to the number of * internal nodes of new_t minus one, as it would be from a postorder traversal, * starting from zero. * we assume that all ids >= avail_id are available. *) let add_subtrees_above avail_id tree where_subtree_list = let rec aux pos accu accu_id = function | [] -> accu_id, accu | (new_pos, new_t, bark_of_bl)::rest -> aux new_pos (add_boosted_subtree_above bark_of_bl ~t:accu ~new_t (new_pos -. pos) accu_id) (2 + accu_id + (addition_n_edges new_t)) rest in let get_where (where,_,_) = where in aux 0. tree avail_id (List.sort (comparing get_where) where_subtree_list) (* where_subtree_map is a map from a location to a triple (pos, tree, * bark_of_bl), where pos is the position along the edge in terms of distal * branch length, tree is the tree to attach, and bark_of_bl is the function to * use when making a new bark out of the branch length which has been cut down. * we assume that all input trees have their maximal ids at the top. *) let add_subtrees_by_map ref_tree where_subtree_map = (* here we keep track of the available ids so that we can use new ones *) let global_avail_id = ref (1+(top_id ref_tree)) in let globalized_id_add_subtrees_above tree where_subtree_list = let new_id, result = add_subtrees_above !global_avail_id tree where_subtree_list in global_avail_id := new_id; result in (* add the info from ref tree back in and then add above subtrees *) let our_add_above below = let id = top_id below in try globalized_id_add_subtrees_above (copy_bark ~src:ref_tree ~dest:below id) (if IntMap.mem id where_subtree_map then IntMap.find id where_subtree_map else []) with | Attachment_distal_bl_out_of_range(_, new_top_bl) -> failwith (Printf.sprintf "Internal edge became %g when attaching subtrees to %d" new_top_bl id) in (* fill the stree skeleton back in with info and add subtrees *) let rec aux = function | Stree.Node(i, tL) -> our_add_above (join i (List.map aux tL)) | Stree.Leaf i -> our_add_above (of_stree (Stree.Leaf i)) in aux (get_stree ref_tree) pplacer-1.1.alpha19/pplacer_src/guppy.ml000066400000000000000000000003411303154601500202260ustar00rootroot00000000000000let () = if !Sys.interactive then () else Ppatteries.exn_wrap (fun () -> Subcommand.inner_loop ~prg_name:"guppy" ~version:Version.version (Subcommand.cmd_map_of_list (Guppy_commands.command_list ()))) pplacer-1.1.alpha19/pplacer_src/guppy_adcl.ml000066400000000000000000000050251303154601500212150ustar00rootroot00000000000000open Ppatteries open Subcommand open Guppy_cmdobjs class cmd () = object (self) inherit subcommand () as super inherit mass_cmd ~point_choice_allowed:false () as super_mass inherit refpkg_cmd ~required:false as super_refpkg inherit placefile_cmd () as super_placefile inherit tabular_cmd ~default_to_csv:true () as super_tabular val max_dist = flag "--min-distance" (Needs_argument ("min distance", "Specify the minimum distance to leaves to report")) val max_reported = flag "--max-matches" (Needs_argument ("N", "Only report the deepest N placements")) val include_pendant = flag "--include-pendant" (Plain (false, "Include pendant branch lengths in distance calculations.")) val no_collapse = flag "--no-collapse" (Plain (false, "List all of the names per pquery instead of just one.")) method specl = super_mass#specl @ [ float_flag max_dist; int_flag max_reported; toggle_flag include_pendant; toggle_flag no_collapse; ] @ super_tabular#specl method desc = "calculates ADCL for each pquery in a placefile" method usage = "usage: adcl [options] placefile" method private dist dist_fn p = dist_fn p |> (if fv include_pendant then (+.) (Placement.pendant_bl p) else identity) method private placefile_action = function | [pr] -> let criterion = self#criterion and collapse_fn = if fv no_collapse then Pquery.namlom else fun pq -> [Pquery.name pq, Pquery.multiplicity pq] and gt = Placerun.get_ref_tree pr in let graph = Voronoi.of_gtree gt in let snipdist = Voronoi.get_snipdist graph in let dist = Voronoi.placement_distance graph ~snipdist and best_placement = Pquery.best_place criterion in Placerun.get_pqueries pr |> List.map (fun pq -> let distance = self#dist dist (best_placement pq) in List.map (curry identity distance) (collapse_fn pq)) |> List.flatten |> List.sort (flip compare) |> List.enum |> (match fvo max_dist with | Some max_dist -> Enum.filter (fun (dist, _) -> dist > max_dist) | None -> identity) |> (match fvo max_reported with | Some n -> Enum.take n | None -> identity) |> Enum.map (fun (dist, (name, multiplicity)) -> [name; Printf.sprintf "%1.6f" dist; Printf.sprintf "%g" multiplicity]) |> List.of_enum |> self#write_ll_tab | l -> List.length l |> Printf.sprintf "adcl takes exactly one placefile (%d given)" |> failwith end pplacer-1.1.alpha19/pplacer_src/guppy_bary.ml000066400000000000000000000033061303154601500212470ustar00rootroot00000000000000open Subcommand open Guppy_cmdobjs open Ppatteries let prel_of_prl weighting criterion prl = List.map (Mass_map.Pre.of_placerun weighting criterion) prl let make_bary_tree t prel = let bary_map = IntMap.of_pairlist_listly (List.mapi (fun i pre -> let (loc, pos) = Barycenter.of_pre t pre in (loc, (pos, Gtree.Internal_node, (fun bl -> new Decor_bark.decor_bark (`Of_bl_node_edge_label_decor (Some bl, None, None, [Decor.dot i])))))) prel) in Gtree.add_subtrees_by_map t bary_map class cmd () = object (self) inherit subcommand () as super inherit mass_cmd () as super_mass inherit placefile_cmd () as super_placefile inherit output_cmd () as super_output inherit numbered_tree_cmd () as super_numbered_tree inherit refpkg_cmd ~required:false as super_refpkg method specl = super_refpkg#specl @ super_mass#specl @ super_output#specl @ super_numbered_tree#specl method desc = "draws the barycenter of a placement collection on the reference tree" method usage = "usage: bary [options] placefile[s]" method private placefile_action prl = let t = self#decor_ref_tree_from_placerunl prl |> Decor_gtree.add_zero_root_bl |> self#maybe_numbered and weighting, criterion = self#mass_opts in let prel = prel_of_prl weighting criterion prl in if prl <> [] then begin let fname = self#single_file ~default:(File ((Mokaphy_common.cat_names prl) ^ ".heat.xml")) () in Phyloxml.named_gtree_to_file fname (safe_chop_suffix fname ".xml") (* tree name *) (make_bary_tree t prel) end end pplacer-1.1.alpha19/pplacer_src/guppy_check.ml000066400000000000000000000017051303154601500213700ustar00rootroot00000000000000open Ppatteries open Subcommand open Guppy_cmdobjs open Placerun class cmd () = object (self) inherit subcommand () as super inherit placefile_cmd () as super_placefile method specl = [] method desc = "checks placefiles for common problems" method usage = "usage: check [options] placefile[s]" method private check_locations pr = let bl = Placerun.get_ref_tree pr |> Gtree.get_bl in Placerun.get_pqueries pr |> List.iter (fun pq -> let open Placement in let name = Pquery.name pq in List.iter (fun p -> if p.distal_bl > bl p.location then dprintf "invalid placement location in %s: %g > %g\n" name p.distal_bl (bl p.location); if p.distal_bl < 0. then dprintf "invalid placement location in %s: %g < 0\n" name p.distal_bl) (Pquery.place_list pq)) method private placefile_action prl = List.iter self#check_locations prl end pplacer-1.1.alpha19/pplacer_src/guppy_classify.ml000066400000000000000000000655371303154601500221450ustar00rootroot00000000000000open Subcommand open Guppy_cmdobjs open Ppatteries (* TIAMR = Taxid Algebraic Map Real. These will store the confidence that we have in various taxonomic classifications. *) module TIAMR = AlgMapR (Tax_id.TaxIdMap) (* The lower case tiamr also associates a place_id with this classification. *) type tiamr = { tiamr: float TIAMR.t; place_id: int64; } (* A classification at every rank and perhaps a Bayes_factor *) type classification = { (* tiamrim = tiamr IntMap; the integer key is the rank. Rank increases from zero, with zero being the "root". *) tiamrim: tiamr IntMap.t; bayes_factors: Bayes_factor.t option; } type seq_classifications = classification StringMap.t let classification ?bayes_factors place_id tiamrim = let tiamrim = IntMap.map (fun tiamr -> {tiamr; place_id}) tiamrim in {tiamrim; bayes_factors} let subclassification ?bayes_factors tiamrim = {tiamrim; bayes_factors} let tiamr {tiamr} = tiamr let set_tiamr t tiamr = {t with tiamr} let map_tiamr t f = {t with tiamr = f t.tiamr} let tiamrim {tiamrim} = tiamrim let bayes_factors {bayes_factors} = Option.get bayes_factors let set_tiamrim cf tiamrim = {cf with tiamrim} let map_tiamrim cf f = {cf with tiamrim = f cf.tiamrim} (* If rank is less than the tax rank of ti, then move up the taxonomy until * the first time that the tax rank is less than or equal to rank. *) let classify_at_rank td rank ti = let rec aux curr_ti = if rank >= Tax_taxonomy.get_tax_rank td curr_ti then curr_ti else Tax_taxonomy.get_ancestor td curr_ti |> aux in aux ti (* Apply f to all of the keys and add the results together. *) let keymap_add_by f m = List.fold_right (fun (k,v) -> (TIAMR.add_by (f k) v)) (TIAMR.to_pairs m) TIAMR.empty (* This is the equivalent to filtering by `rank = desired_rank` in the * old best_classifications view. *) let tiamr_at_rank td rank tiamr = TIAMR.filter (fun ti _ -> Tax_taxonomy.get_tax_rank td ti = rank) tiamr |> junction TIAMR.is_empty (const None) some (* From a map from the edges to the confidence we have in their placements, produce a full classification map. *) let partition_by_rank td tiamr = let outmap = ref IntMap.empty and m = ref tiamr and n_ranks = Tax_taxonomy.get_n_ranks td in for desired_rank=(n_ranks-1) downto 0 do m := keymap_add_by (classify_at_rank td desired_rank) !m; outmap := IntMap.opt_add desired_rank (tiamr_at_rank td desired_rank !m) !outmap done; !outmap (* Produce a classification map for each pquery in a placerun using pplacer * classification. The callback function `f` will be called for each pquery. *) let placerun_classify how criterion td f pr = let prn = Placerun.get_name pr in List.iter (fun pq -> partition_by_rank td (List.fold_right (fun p -> TIAMR.add_by (how p) (criterion p)) (Pquery.place_list pq) (TIAMR.empty)) |> f prn pq) (Placerun.get_pqueries pr) (* From a classificication map, find the best classifications for each rank. *) let filter_best ?multiclass_min cutoff cf = IntMap.filter_map (fun _ {tiamr; place_id} -> match TIAMR.enum tiamr |> Enum.arg_max snd, multiclass_min with (* If there's a clear best, pick that. *) | (t, l), _ when l >= cutoff -> Some {tiamr = TIAMR.singleton t l; place_id} | _, None -> None | _, Some multiclass_min -> (* Otherwise, if we're multiclassifying, see if it adds up. *) (* Filter out the ones that are less than multiclass_min *) TIAMR.filterv (fun l -> l >= multiclass_min) tiamr (* `let junction pred f g a = if pred a then f a else g a` * So if we are in total less than the cutoff, then we keep the tiamr. *) |> junction (TIAMR.values |- Enum.fold (+.) 0. |- (fun s -> s >= cutoff)) (fun tiamr -> Some {tiamr; place_id}) (const None)) |> map_tiamrim cf let filter_best_by_bayes ?multiclass_min bayes_cutoff cf = let factors = bayes_factors cf in IntMap.backwards cf.tiamrim (* enum with keys in decreasing order, so here starting with lowest (away from * root, but highest number) rank. *) |> Enum.fold (fun (found_evidence, accum) (rank, value) -> (* If we have found evidence for a rank below, continue to accumulate * all taxonomic classifications in ranks above. *) if found_evidence then true, IntMap.add rank value accum else (* ... *) match factors.(rank) with | _, _, Some evidence when evidence >= bayes_cutoff -> true, IntMap.add rank value accum | _ -> false, accum) (false, IntMap.empty) |> snd (* Get accum, the map of ranks to tiamr's. *) |> (match multiclass_min with | None -> identity | Some multiclass_min -> IntMap.filter_map (fun _ t -> TIAMR.filterv (fun l -> l >= multiclass_min) t.tiamr |> junction TIAMR.is_empty (const None) (set_tiamr t |- some))) |> set_tiamrim cf (* For every rank, find the first rank at or above it with a valid set of * classifications. *) let find_ranks_per_want_rank td cf = let rec aux rank = match IntMap.Exceptionless.find rank cf.tiamrim with | Some tiamr -> tiamr | _ when rank = 0 -> {tiamr = TIAMR.empty; place_id = -1L} | _ -> aux (rank - 1) in 0 --^ Tax_taxonomy.get_n_ranks td |> Enum.map (identity &&& aux) |> IntMap.of_enum (* let maybe_cl = function *) (* | Some (_, cl) as x when not (List.is_empty cl) -> x *) (* | _ -> None *) (* Is parent anywhere on the lineage of child? *) let on_lineage td parent child = Tax_taxonomy.get_lineage td child |> List.mem parent let filter_ranks_below rank tiamrim = IntMap.split (succ rank) tiamrim |> Tuple3.first let best_classification {tiamr} = TIAMR.enum tiamr |> Enum.arg_max snd |> fst let mrca td {tiamr} = TIAMR.keys tiamr |> List.of_enum |> Tax_taxonomy.list_mrca td let hybrid_merge_fn f _ a b = match a, b with | None, None -> None | Some _, None -> dprint "Warning: entry in jplace with no corresponding nbc-sequence"; None | None, Some _ -> dprint "Warning: nbc-sequence with no corresponding entry in jplace"; None | Some a, Some b -> Some (f a b) (* Get the maximum binding in a.tiamrim or return lbl b. When applied to a tiamrim this gives the most specific classification that the tiamrim has to offer. If a is empty just return lbl b. *) let max_tiamrim_or_return_other lbl a b = try IntMap.max_binding a.tiamrim with Invalid_argument _ -> Return.return lbl b let label3 f a b c = Return.label (f a b c) (* UI-related *) class cmd () = object (self) inherit subcommand () as super inherit refpkg_cmd ~required:true as super_refpkg inherit placefile_cmd () as super_placefile inherit sqlite_cmd () as super_sqlite inherit rng_cmd () as super_rng val classifier = flag "--classifier" (Formatted ("pplacer", "Which classifier to use, out of 'pplacer', 'nbc', 'hybrid2', 'hybrid5' or 'rdp'. default: %s")) val cutoff = flag "--cutoff" (Formatted (0.9, "The default value for the likelihood_cutoff param. Default: %0.2f")) val bayes_cutoff = flag "--bayes-cutoff" (Formatted (1., "The default value for the bayes_cutoff param. Default: %0.2f")) val multiclass_min = flag "--multiclass-min" (Formatted (0.2, "The default value for the multiclass_min param. Default: %0.2f")) val bootstrap_cutoff = flag "--bootstrap-cutoff" (Formatted (0.8, "The default value for the bootstrap_cutoff param. Default: %0.2f")) val bootstrap_extension_cutoff = flag "--bootstrap-extension-cutoff" (Formatted (0.4, "The default value for the bootstrap_cutoff param. Default: %0.2f")) val use_pp = flag "--pp" (Plain (false, "Use posterior probability for our criteria in the pplacer classifier.")) val tax_identity = flag "--tax-median-identity-from" (Needs_argument ("", "Calculate the median identity for each sequence per-tax_id from the specified alignment.")) val mrca_class = flag "--mrca-class" (Plain (false, "Classify against a placefile that was generated with MRCA classification")) val nbc_sequences = flag "--nbc-sequences" (Needs_argument ("nbc query sequences", "The query sequences to use for the NBC classifier. \ Can be specified multiple times for multiple inputs.")) val word_length = flag "--word-length" (Formatted (8, "The length of the words used for NBC classification. default: %d")) val nbc_rank = flag "--nbc-rank" (Formatted ("genus", "The desired most specific rank for NBC classification. \ 'all' puts each sequence in the classifier at every rank of its lineage. default: %s")) val n_boot = flag "--n-boot" (Formatted (100, "The number of times to bootstrap a sequence with the NBC classifier. 0 = no bootstrap. default: %d")) val children = flag "-j" (Formatted (2, "The number of processes to spawn to do NBC classification. default: %d")) val no_pre_mask = flag "--no-pre-mask" (Plain (false, "Don't pre-mask the sequences for NBC classification.")) val nbc_counts = flag "--nbc-counts" (Needs_argument ("", "Read/write NBC k-mer counts to the given file. File cannot be NFS mounted.")) val nbc_as_rdp = flag "--nbc-as-rdp" (Plain (false, "Do NBC classification like RDP: find the lineage of the full-sequence classification, \ then bootstrap to find support for it.")) val rdp_results = flag "--rdp-results" (Needs_argument ("rdp results", "The RDP results file for use with the RDP classifier. \ Can be specified multiple times for multiple inputs.")) val blast_results = flag "--blast-results" (Needs_argument ("BLAST results", "The BLAST results file for use with the BLAST classifier. \ Can be specified multiple times for multiple inputs.")) (* Below note difference between flag name and string. Default is true, toggle_flag turns it off if flag present. *) val random_tie_break = flag "--no-random-tie-break" (Plain (true, "Take the first NBC hit even if there are others that are equally good.")) method specl = super_refpkg#specl @ super_sqlite#specl @ super_rng#specl @ [ string_flag classifier; float_flag cutoff; float_flag bayes_cutoff; float_flag multiclass_min; float_flag bootstrap_cutoff; float_flag bootstrap_extension_cutoff; toggle_flag use_pp; string_flag tax_identity; toggle_flag mrca_class; delimited_list_flag nbc_sequences; int_flag word_length; string_flag nbc_rank; int_flag n_boot; int_flag children; toggle_flag no_pre_mask; string_flag nbc_counts; toggle_flag nbc_as_rdp; delimited_list_flag rdp_results; delimited_list_flag blast_results; toggle_flag random_tie_break; ] method desc = "outputs classification information in SQLite format" method usage = "usage: classify [options] placefile[s]" method private merge_hybrid2 td pp nbc lbl = let pp_rank, pp_best = max_tiamrim_or_return_other lbl pp nbc and nbc_rank, nbc_best = max_tiamrim_or_return_other lbl nbc pp in if pp_rank >= nbc_rank (* on_lineage td parent child *) && on_lineage td (best_classification nbc_best) (best_classification pp_best) then pp else nbc method private merge_fake_hybrid2 td pp nbc lbl = let pp_rank, pp_best = max_tiamrim_or_return_other lbl pp nbc and nbc_rank, nbc_best = max_tiamrim_or_return_other lbl nbc pp in if false && pp_rank >= nbc_rank (* on_lineage td parent child *) && on_lineage td (best_classification nbc_best) (best_classification pp_best) then pp else nbc method private merge_hybrid5 td pp nbc lbl = let nbc_rank, nbc_best = max_tiamrim_or_return_other lbl nbc pp in match IntMap.split nbc_rank pp.tiamrim with | _, Some pp_best, pp_above -> if IntMap.cardinal pp_above <= 1 && on_lineage td (best_classification nbc_best) (best_classification pp_best) then pp else nbc | _ -> nbc method private nbc_classifier rp rank_idx infile = let query_aln = Alignment.upper_aln_of_any_file infile and n_boot = fv n_boot and word_length = fv word_length and rng = self#random_state in match fvo nbc_counts with | Some counts -> let map_file = if Sys.file_exists counts then Unix.openfile counts [Unix.O_RDONLY] 0o666, false else Unix.openfile counts [Unix.O_RDWR; Unix.O_CREAT] 0o666, true in Nbc.Classifier.of_refpkg ~n_boot ~map_file ~rng word_length rank_idx rp, Array.to_list query_aln | None -> let ref_aln = Refpkg.get_aln_fasta rp in let query_list, ref_aln, _, _ = if fv no_pre_mask then Array.to_list query_aln, ref_aln, 0, None else begin let ref_name_set = Array.enum ref_aln |> Enum.map fst |> StringSet.of_enum in let query_aln', ref_aln' = Pplacer_run.partition_queries ref_name_set query_aln |> Tuple.Tuple2.map2 (Option.default ref_aln) in let n_sites = Alignment.length ref_aln' and query_list = Array.to_list query_aln' in Pplacer_run.check_query n_sites query_list; dprint "pre-masking sequences... "; Pplacer_run.premask Alignment.Nucleotide_seq ref_aln' query_list end in Nbc.Classifier.of_refpkg ~ref_aln ~n_boot ~rng word_length rank_idx rp, query_list method private placefile_action prl = self#set_default_seed; let rp = self#get_rp in let criterion = if (fv use_pp) then Placement.post_prob else Placement.ml_ratio in let td = Refpkg.get_taxonomy rp in let db = self#get_db in Sql.check_exec db ~cb:(fun row _ -> match row with | [| Some "1" |] -> () | _ -> failwith "run `rppr prep_db` before running `guppy classify`") "SELECT EXISTS(SELECT 1 FROM sqlite_master WHERE name = 'placement_classifications')"; Sql.check_exec db "BEGIN TRANSACTION"; let st = Sqlite3.prepare db "INSERT INTO runs VALUES (NULL, ?)" in Sql.bind_step_reset db st [|Sql.D.TEXT (Array.to_list Sys.argv |> String.concat " ")|]; let run_id = Sqlite3.last_insert_rowid db in let new_place_id = let p_st = Sqlite3.prepare db "INSERT INTO placements VALUES (NULL, ?, ?)" in fun classifier -> Sql.bind_step_reset db p_st [|Sql.D.TEXT classifier; Sql.D.INT run_id|]; Sqlite3.last_insert_rowid db in let rec default_filter_nbc m = filter_best (fv bootstrap_cutoff) m and perform_one_nbc infile = let nbc_rank = fv nbc_rank and children = fv children in let rank_idx = match nbc_rank with | "auto" -> Nbc.Classifier.Auto_rank | "all" -> Nbc.Classifier.All_ranks | _ -> try Nbc.Classifier.Rank (Tax_taxonomy.get_rank_index td nbc_rank) with Not_found -> failwith (Printf.sprintf "invalid rank %s" nbc_rank) in let classif, query_list = self#nbc_classifier rp rank_idx infile in let rdp_filter = if fv nbc_as_rdp then fun seq -> let on_lineage = Nbc.Classifier.classify classif ~like_rdp:true ~random_tie_break:(fv random_tie_break) seq |> Tax_taxonomy.get_lineage td |> flip List.mem in TIAMR.filter (fun tid _ -> on_lineage tid) |- junction TIAMR.is_empty (const None) some |> const |> IntMap.filter_map else const identity in let bootstrap seq = Alignment.ungap seq |> Nbc.Classifier.bootstrap ~random_tie_break:(fv random_tie_break) classif |> partition_by_rank td |> rdp_filter seq and pn_st = Sqlite3.prepare db "INSERT INTO placement_names VALUES (?, ?, ?, 1);" and pc_st = Sqlite3.prepare db "INSERT INTO placement_nbc VALUES (?, ?, ?)" in let classify name boot_map accum = let place_id = new_place_id "nbc" in Sql.bind_step_reset db pn_st [| Sql.D.INT place_id; Sql.D.TEXT name; Sql.D.TEXT infile; |]; flip IntMap.iter boot_map (fun _ likelihoods -> flip TIAMR.iter likelihoods (fun ti likelihood -> Sql.bind_step_reset db pc_st [| Sql.D.INT place_id; Sql.D.TEXT (Tax_id.to_string ti); Sql.D.FLOAT likelihood |])); StringMap.add name (classification place_id boot_map) accum and progress_handler = progress_displayer "classifying %s (%d/%d)..." (List.length query_list) in Multiprocessing.map ~children ~progress_handler (tap (fst |- print_endline) |- Tuple.Tuple2.map2 bootstrap) query_list |> List.fold_left (uncurry classify |> flip) StringMap.empty and perform_nbc () = fv nbc_sequences |> List.map perform_one_nbc |> List.fold_left StringMap.union StringMap.empty and default_filter_pplacer = let multiclass_min = match fv multiclass_min with | v when v < 0.0 -> None | v -> Some v and bayes_cutoff = fv bayes_cutoff and cutoff = fv cutoff in fun m -> if bayes_cutoff =~ 0. then filter_best ?multiclass_min cutoff m else filter_best_by_bayes ?multiclass_min bayes_cutoff m and perform_pplacer () = let pn_st = Sqlite3.prepare db "INSERT INTO placement_names VALUES (?, ?, ?, ?);" and pc_st = Sqlite3.prepare db "INSERT INTO placement_classifications VALUES (?, ?, ?)" and pp_st = Sqlite3.prepare db "INSERT INTO placement_positions VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)" and pe_st = Sqlite3.prepare db "INSERT INTO placement_evidence VALUES (?, ?, ?, ?)" and classif_map = Classif_map.of_refpkg_mrca_class rp (fv mrca_class) and best_classif_map = ref StringMap.empty in let lax_classif = let root_taxon = Classif_map.root_taxon classif_map in Placement.classif_opt |- Option.default root_taxon and bayes_factors = Bayes_factor.of_refpkg_and_classif_map rp classif_map criterion in let tax_identity_func = match fvo tax_identity with | None -> fun _ _ -> () | Some aln_file -> let open Tax_id in let aln_map = Alignment.upper_aln_of_any_file aln_file |> Array.enum |> StringMap.of_enum and seqinfom = Refpkg.get_seqinfom rp in let refs_by_tax_id = Refpkg.get_ref_tree rp |> Newick_gtree.leaf_label_map |> IntMap.values |> Enum.map (Tax_seqinfo.tax_id_by_node_label seqinfom &&& flip StringMap.find aln_map) |> List.of_enum |> TaxIdMap.of_pairlist_listly and pmi_st = Sqlite3.prepare db "INSERT INTO placement_median_identities VALUES (?, ?, ?)" in fun place_id pq -> let id = StringMap.find (Pquery.name pq) aln_map |> Alignment.identity |- fst in TaxIdMap.iter (fun ti seql -> Sql.bind_step_reset db pmi_st [| Sql.D.INT place_id; to_sql ti; Sql.D.FLOAT (List.map id seql |> List.sort compare |> median); |]) refs_by_tax_id; in let classify prn pq rank_map = let place_id = new_place_id "pplacer" in List.iter (fun (name, mass) -> Sql.bind_step_reset db pn_st [| Sql.D.INT place_id; Sql.D.TEXT name; Sql.D.TEXT prn; Sql.D.FLOAT mass; |]) (Pquery.namlom pq); flip IntMap.iter rank_map (fun _ tiamr -> flip TIAMR.iter tiamr (fun tax_id prob -> Sql.bind_step_reset db pc_st [| Sql.D.INT place_id; Tax_id.to_sql tax_id; Sql.D.FLOAT prob; |])); List.iter (fun p -> Sql.bind_step_reset db pp_st [| Sql.D.INT place_id; Sql.D.INT (Int64.of_int (Placement.location p)); Sql.D.FLOAT (Placement.ml_ratio p); Sql.D.FLOAT (Placement.log_like p); Sql.D.FLOAT (Placement.distal_bl p); Sql.D.FLOAT (Placement.pendant_bl p); lax_classif p |> Tax_id.to_sql; (match Placement.map_identity_opt p with | None -> Sql.D.NULL | Some (ratio, _) -> Sql.D.FLOAT ratio); (match Placement.map_identity_opt p with | None -> Sql.D.NULL | Some (_, denom) -> Sql.D.INT (Int64.of_int denom)); |]) (Pquery.place_list pq); let bayes_factors = bayes_factors pq in Array.iter (fun (rank, ev, bf) -> Sql.bind_step_reset db pe_st [| Sql.D.INT place_id; Sql.D.TEXT rank; Sql.D.FLOAT ev; (match bf with | None -> Sql.D.NULL | Some bf -> Sql.D.FLOAT bf); |]) bayes_factors; let bc = classification ~bayes_factors place_id rank_map in List.fold_left (flip StringMap.add bc |> flip) !best_classif_map (Pquery.namel pq) |> (:=) best_classif_map; tax_identity_func place_id pq; in List.iter (placerun_classify lax_classif criterion td classify) prl; !best_classif_map and default_filter_rdp m = filter_best (fv bootstrap_cutoff) m and perform_rdp () = let name_map = Tax_id.TaxIdMap.keys td.Tax_taxonomy.tax_name_map |> Enum.map (Guppy_to_rdp.get_mothur_name td &&& identity) |> StringMap.of_enum and pn_st = Sqlite3.prepare db "INSERT INTO placement_names VALUES (?, ?, ?, 1.);" and pc_st = Sqlite3.prepare db "INSERT INTO placement_nbc VALUES (?, ?, ?)" and best_classif_map = ref StringMap.empty and split_line = Str.regexp "[\t;]" |> Str.split in let process origin name rows = let place_id = new_place_id "rdp" in Sql.bind_step_reset db pn_st [| Sql.D.INT place_id; Sql.D.TEXT name; Sql.D.TEXT origin; |]; List.iter (fun (tid, boot) -> Sql.bind_step_reset db pc_st [| Sql.D.INT place_id; Sql.D.TEXT (Tax_id.to_string tid); Sql.D.FLOAT boot; |]) rows; List.enum rows |> Enum.map (fun (ti, boot) -> Tax_taxonomy.get_tax_rank td ti, TIAMR.singleton ti boot) |> IntMap.of_enum |> classification place_id |> flip (StringMap.add name) !best_classif_map |> (:=) best_classif_map and classify line = match split_line line with | name :: taxonomy -> name, List.map (fun s -> let tax_name, boot = Scanf.sscanf s "%s@(%g)" (curry identity) in (try StringMap.find tax_name name_map with Not_found -> failwith (tax_name ^ " not found in refpkg's taxonomy")), boot /. 100.) taxonomy | _ -> failwith (Printf.sprintf "malformed line: %S" line) in fv rdp_results |> List.enum |> Enum.map (identity &&& (File.lines_of |- Enum.map classify)) |> Enum.iter (fun (a, bcl) -> Enum.iter (process a |> uncurry) bcl); !best_classif_map and perform_blast () = let ref_name_map = Refpkg.get_seqinfom rp |> StringMap.map (fun {Tax_seqinfo.tax_id} -> tax_id) and pn_st = Sqlite3.prepare db "INSERT INTO placement_names VALUES (?, ?, ?, 1.);" and pc_st = Sqlite3.prepare db "INSERT INTO placement_nbc VALUES (?, ?, ?)" and best_classif_map = ref StringMap.empty in let process origin (name, ref_name, pid) = let place_id = new_place_id "blast" and tax_id = StringMap.find ref_name ref_name_map in let tiamrim = TIAMR.singleton tax_id pid |> partition_by_rank td in Sql.bind_step_reset db pn_st [| Sql.D.INT place_id; Sql.D.TEXT name; Sql.D.TEXT origin; |]; flip IntMap.iter tiamrim (fun _ tiamr -> flip TIAMR.iter tiamr (fun tid pid -> Sql.bind_step_reset db pc_st [| Sql.D.INT place_id; Sql.D.TEXT (Tax_id.to_string tid); Sql.D.FLOAT pid; |])); tiamrim |> classification place_id |> flip (StringMap.add name) !best_classif_map |> (:=) best_classif_map and classify line = let splut = String.nsplit line "\t" |> Array.of_list in splut.(0), splut.(1), float_of_string splut.(2) /. 100. in fv blast_results |> List.enum |> Enum.map (identity &&& (File.lines_of |- Enum.map classify |- Enum.group Tuple3.first |- Enum.map (Enum.arg_max Tuple3.third))) |> Enum.iter (fun (a, bcl) -> Enum.iter (process a) bcl); !best_classif_map in let default_pplacer () = perform_pplacer () |> StringMap.map default_filter_pplacer and default_nbc () = perform_nbc () |> StringMap.map default_filter_nbc and default_rdp () = perform_rdp () |> StringMap.map default_filter_rdp in let multiclass = match fv classifier with | "pplacer" -> default_pplacer () | "nbc" -> default_nbc () | "rdp" -> default_rdp () | "blast" -> perform_blast () | "hybrid2" -> StringMap.merge (label3 self#merge_hybrid2 td |> hybrid_merge_fn) (default_pplacer ()) (default_nbc ()) | "hybrid2f" -> StringMap.merge (label3 self#merge_fake_hybrid2 td |> hybrid_merge_fn) (default_pplacer ()) (default_nbc ()) | "hybrid5" -> StringMap.merge (label3 self#merge_hybrid5 td |> hybrid_merge_fn) (default_pplacer ()) (default_nbc ()) | s -> failwith (Printf.sprintf "invalid classifier: %s" s) and mc_st = Sqlite3.prepare db "INSERT INTO multiclass VALUES (?, ?, ?, ?, ?, ?)" in flip StringMap.iter multiclass (fun seq_name cf -> flip IntMap.iter (find_ranks_per_want_rank td cf) (fun want_rank t -> flip TIAMR.iter t.tiamr (fun ti l -> Sql.bind_step_reset db mc_st [| Sql.D.INT t.place_id; Sql.D.TEXT seq_name; Sql.D.TEXT (Tax_taxonomy.get_rank_name td want_rank); Sql.D.TEXT (Tax_taxonomy.rank_name_of_tax_id td ti); Sql.D.TEXT (Tax_id.to_string ti); Sql.D.FLOAT l; |]))); Sql.check_exec db "COMMIT"; Sql.close db end pplacer-1.1.alpha19/pplacer_src/guppy_cmdobjs.ml000066400000000000000000000623611303154601500217410ustar00rootroot00000000000000(* * This is for the hierarchy of common command objects. *) open Subcommand open Ppatteries (* *** general objects *** *) type outputloc = | File of string | Directory of string * string | Unspecified class output_cmd ?(show_fname = true) ?(prefix_required = false) () = object (self) val out_fname = flag "-o" (Needs_argument ("output file", "Specify the filename to write to.")) val out_dir = flag "--out-dir" (Needs_argument ("output directory", "Specify the directory to write files to.")) val out_prefix = flag "--prefix" (Needs_argument ("output prefix", if prefix_required then "Specify a string to be prepended to filenames. Required." else "Specify a string to be prepended to filenames.")) method specl = let flags = [ string_flag out_dir; string_flag out_prefix; ] in if show_fname then string_flag out_fname :: flags else flags method private out_channel = match fvo out_fname, fvo out_dir, fvo out_prefix with | None, None, None | Some "-", None, None -> stdout | Some fname, Some dir, Some prefix -> open_out (Filename.concat dir (prefix ^ fname)) | Some fname, Some dir, None -> open_out (Filename.concat dir fname) | Some fname, None, Some prefix -> open_out (prefix ^ fname) | Some fname, None, None -> open_out fname | None, _, _ -> failwith "-o option is required" method private out_file_or_dir ?(default = Directory (".", "")) () = match fvo out_fname, fvo out_dir, fvo out_prefix with | None, None, None -> default | None, Some dir, None -> Directory (dir, "") | None, None, Some prefix -> Directory (".", prefix) | None, Some dir, Some prefix -> Directory (dir, prefix) | Some fname, None, None -> File fname | Some fname, None, Some prefix -> File (prefix ^ fname) | Some fname, Some dir, None -> File (Filename.concat dir fname) | Some fname, Some dir, Some prefix -> File (Filename.concat dir (prefix ^ fname)) method private single_prefix ?(requires_user_prefix = false) () = match self#out_file_or_dir () with | Directory (_, "") when requires_user_prefix -> failwith "--prefix option is required" | Directory (dir, prefix) -> Filename.concat dir prefix | _ -> failwith "-o option is illegal" method private single_file ?default () = match self#out_file_or_dir ?default () with | File fname -> fname | _ -> failwith "-o option is required" end class tabular_cmd ?(default_to_csv = false) () = object (self) inherit output_cmd () as super_output val as_csv = if default_to_csv then flag "--no-csv" (Plain (true, "Output the results as a padded matrix instead of csv.")) else flag "--csv" (Plain (false, "Output the results as csv instead of a padded matrix.")) method specl = super_output#specl @ [toggle_flag as_csv] method private channel_opt ch = match ch with | Some x -> x | None -> self#out_channel method private write_csv ?ch data = self#channel_opt ch |> csv_out_channel |> Csv.to_out_obj |> flip Csv.output_all data method private write_matrix ?ch data = self#channel_opt ch |> flip String_matrix.write_padded data method private write_ll_tab ?ch data = if fv as_csv then self#write_csv ?ch data else List.map Array.of_list data |> Array.of_list |> self#write_matrix ?ch method private write_aa_tab ?ch data = if not (fv as_csv) then self#write_matrix ?ch data else Array.map Array.to_list data |> Array.to_list |> self#write_csv ?ch end class rng_cmd () = object (self) val seed = flag "--seed" (Formatted (1, "Set the random seed, an integer > 0. Default is %d.")) method specl = [ int_flag seed; ] method private set_default_seed = let seed = fv seed in Gsl_rng.set_default_seed (Nativeint.of_int seed); Random.init seed method private rng = self#set_default_seed; Gsl_rng.make Gsl_rng.KNUTHRAN2002 method private random_state = Random.State.make [| fv seed |] end (* *** pplacer objects *** *) class refpkg_cmd ~required = object(self) val refpkg_path = flag "-c" (Needs_argument ("reference package path", if required then "Reference package path. Required." else "Reference package path.")) method specl = [ string_flag refpkg_path; ] method private get_rp = Refpkg.of_path (fv refpkg_path) method private get_rpo = match fvo refpkg_path with | Some path -> Some (Refpkg.of_path path) | None -> None method private check_rpo_tree name t = match self#get_rpo with | None -> () | Some rp -> Refpkg.check_tree_approx rp name t method private check_rpo_tree_subset name t = match self#get_rpo with | None -> () | Some rp -> Refpkg.check_tree_subset rp name t method private check_placerun pr = (if Placerun.get_transm_opt pr |> Option.is_some then self#check_rpo_tree_subset else self#check_rpo_tree) (Placerun.get_name pr) (Placerun.get_ref_tree pr) method private check_placerunl = List.iter self#check_placerun (* This checks to make sure that the placerun given has a reference tree that * matches the reference package tree, if it exists. *) method private get_rpo_and_tree pr = let alt_tree = Decor_gtree.of_newick_gtree pr.Placerun.ref_tree in match self#get_rpo with | None -> (None, alt_tree) | Some rp -> self#check_placerun pr; if Refpkg.tax_equipped rp then begin Some rp, let alt_gt = Placerun.get_transm_opt pr |> Option.map (const pr.Placerun.ref_tree) in Refpkg.get_tax_ref_tree ?alt_gt rp end else (None, alt_tree) method private get_decor_ref_tree = let rp = self#get_rp in if Refpkg.tax_equipped rp then Refpkg.get_tax_ref_tree rp else Decor_gtree.of_newick_gtree (Refpkg.get_ref_tree rp) method private decor_ref_tree_from_placerunl prl = self#check_placerunl prl; List.hd prl |> self#get_rpo_and_tree |> snd end module SM = MapsSets.StringMap (* *** accessing placefiles *** *) (* our strategy is to load the placefiles in to memory when we need them, but if * they are already in memory, then we use them *) let placerun_map = ref SM.empty let placerun_by_name fname = if SM.mem fname !placerun_map then SM.find fname !placerun_map else begin let pr = Placerun_io.of_any_file fname in if 0 = Placerun.n_pqueries pr then failwith (fname^" has no placements!"); placerun_map := SM.add fname pr !placerun_map; pr end class virtual placefile_cmd () = object (self) method virtual private placefile_action: 'a Placerun.placerun list -> unit method action fnamel = fnamel |> List.map (Placerun_io.maybe_of_split_file ~getfunc:placerun_by_name) |> List.flatten |> self#placefile_action method private write_placefile fname pr = if fname.[0] = '@' then let name = MaybeZipped.chop_extension (String.sub fname 1 ((String.length fname) - 1)) in placerun_map := SM.add fname (Placerun.set_name pr name) !placerun_map else Placerun_io.to_json_file fname pr end (* *** mass and kr-related objects *** *) class mass_cmd ?(point_choice_allowed = true) () = object (self) val use_pp = flag "--pp" (Plain (false, "Use posterior probability for the weight.")) val spread = flag "--point-mass" (Plain (true, "Treat every pquery as a point mass concentrated on the highest-weight placement.")) method specl = [ toggle_flag use_pp; ] |> if point_choice_allowed then toggle_flag spread |> List.cons else identity method private criterion = (if fv use_pp then Placement.post_prob else Placement.ml_ratio) method private mass_opts = ( (if fv spread then Mass_map.Spread else Mass_map.Point), self#criterion ) end (* For normalizing by various things related to the tree. *) class normalization_cmd () = let no_normalization _ = 1. and tree_length t = Gtree.tree_length t in let normalization_map = StringMap.of_pairlist [ "", no_normalization; "tree-length", tree_length; ] in object val normalize = flag "--normalize" (Plain ("", "Divide KR by a given value. Legal arguments are \"tree-length\".")) method specl = [ string_flag normalize; ] method private get_normalization: Gtree.gtree -> float = fun t -> let s = fv normalize in let f = try StringMap.find s normalization_map with | Not_found -> failwith ("Normalization "^s^" not known.") in f t end class kr_cmd () = object (* normalizations. We can divide by these to get a given perspective on KR. *) val p_exp = flag "-p" (Formatted (1., "Exponent for KR integration, i.e. value of p in Z_p. Default %g.")) method specl = [ float_flag p_exp; ] end (* *** visualization-related objects *** *) class numbered_tree_cmd () = object val numbered = flag "--node-numbers" (Plain (false, "Put the node numbers in where the bootstraps usually go.")) method specl = [ toggle_flag numbered; ] method private maybe_numbered: ( 'a; ..> as 'a) Gtree.gtree -> 'a Gtree.gtree = if fv numbered then Gtree.mapi_bark_map (fun i x -> x#to_numbered i) else identity end exception Invalid_abs_tot class fat_cmd () = object(self) inherit numbered_tree_cmd () as super_numbered_tree val min_fat_bl = flag "--min-fat" (Formatted (1e-2, "The minimum branch length for fattened edges (to increase their visibility). To turn off set to 0. Default: %g")) val total_width = flag "--total-width" (Formatted (300., "Set the total pixel width for all of the branches of the tree. Default: %g")) val width_multiplier = flag "--width-factor" (Plain (0., "Override total-width by directly setting the number of pixels per unit of thing displayed.")) method specl = [ float_flag min_fat_bl; float_flag total_width; float_flag width_multiplier; ] @ super_numbered_tree#specl (* Given an absolute total quantity, come up with a scaling which will make * that total. *) method private multiplier_of_abs_tot abs_tot = if abs_tot <= 0. then raise Invalid_abs_tot; match fv width_multiplier with | 0. -> (fv total_width) /. abs_tot (* not set manually *) | mw -> mw (* Feed the absolute-value total of the given float map to the above method. * *) method private multiplier_of_float_map m = self#multiplier_of_abs_tot (IntMap.fold (fun _ v x -> (abs_float v) +. x) m 0.) method private spread_short_fat t = match fv min_fat_bl with | 0. -> t | min_bl -> Visualization.spread_short_fat min_bl t (* Here every mass is the sand color, and there is no min width for coloring. * However, we do throw out the width argument if it's less than 1 to avoid * disappearing branches. * The multiplier_opt allows for overriding the multiplier. * *) method private decor_map_of_mass_map ?multiplier_override m = let multiplier = match multiplier_override with | None -> self#multiplier_of_float_map m | Some m -> m in let to_decor x = if x <= 0. then [] else begin let width = x *. multiplier in [Decor.sand] @ (if width < 1. then [] else [Decor.width width]) end in IntMap.map to_decor m method private write_spread_tree ~fname ~tree_name t = Phyloxml.named_gtree_to_file ~fname ~tree_name (self#spread_short_fat t) method private fat_tree_of_massm ?multiplier_override decor_t m = self#spread_short_fat (Decor_gtree.add_decor_by_map decor_t (self#decor_map_of_mass_map ?multiplier_override m)) end class heat_cmd () = object(self) inherit fat_cmd () as super_viz val gray_black_colors = flag "--gray-black" (Plain (false, "Use gray/black in place of red/blue to signify the sign of the coefficient for that edge.")) val min_width = flag "--min-width" (Formatted (1., "Specify the minimum width for a branch to be colored and thickened. Default is %g.")) method specl = super_viz#specl @ [ toggle_flag gray_black_colors; float_flag min_width; ] method private color_of_heat heat = if heat >= 0. then Decor.brew_orange else Decor.brew_green method private gray_black_of_heat heat = if heat >= 0. then Decor.gray 180 else Decor.black (* Here we have red and blue for positive and negative, and if it's below * min_width then the color and the width argument get thrown out. *) method private decor_map_of_float_map m = let our_color_of_heat = if fv gray_black_colors then self#gray_black_of_heat else self#color_of_heat in let multiplier = self#multiplier_of_abs_tot (IntMap.fold (fun _ v x -> (abs_float v) +. x) m 0.) in let to_decor x = let width = abs_float (x *. multiplier) in if width < fv min_width then [] else [our_color_of_heat x; Decor.width width] in IntMap.map to_decor m method private heat_tree_of_floatim decor_t m = self#spread_short_fat (Decor_gtree.add_decor_by_map decor_t (self#decor_map_of_float_map m)) method private heat_tree_of_float_arr decor_t a = self#heat_tree_of_floatim decor_t (Visualization.intmap_of_arr a) end class classic_viz_cmd () = object (self) inherit numbered_tree_cmd () as super_numbered_tree val xml = flag "--xml" (Plain (false, "Write phyloXML (with colors) for all visualizations.")) method specl = [ toggle_flag xml; ] @ super_numbered_tree#specl method private fmt = if fv xml then Visualization.Phyloxml else Visualization.Newick method private decor_ref_tree pr = Placerun.get_ref_tree pr |> self#maybe_numbered |> Decor_gtree.of_newick_gtree method private write_trees suffix named_trees = function | Directory (dir, prefix) -> let prefix = Filename.concat dir prefix in List.iter (fun (name, trees) -> Visualization.trees_to_file self#fmt (prefix ^ name ^ suffix) trees) named_trees | File fname -> Visualization.trees_to_file ~with_suffix:false self#fmt fname (List.map snd named_trees |> List.flatten) | Unspecified -> () end class sqlite_cmd () = object val sqlite_fname = flag "--sqlite" (Needs_argument ("sqlite database", "Specify the database file to use. Required.")) method specl = [ string_flag sqlite_fname; ] method private get_db = Sqlite3.db_open (fv sqlite_fname) end let find_rep_edges max_edge_d fal gt = let dist i j = List.map (fun arr -> (arr.(i) -. arr.(j)) ** 2.) fal |> List.fsum |> sqrt in let open Stree in let rec aux = function | Leaf i -> IntSet.empty, IntSet.singleton i | Node (i, subtrees) -> let rep_edges, possible_cur_edges = List.fold_left (fun (rea, pcea) t -> let re, pce = aux t in IntSet.union re rea, IntSet.union pce pcea) (IntSet.empty, IntSet.empty) subtrees in let cur_edges, far_edges = IntSet.partition (fun j -> dist i j < max_edge_d) possible_cur_edges in IntSet.union rep_edges far_edges, if IntSet.is_empty cur_edges then IntSet.singleton i else cur_edges in Gtree.get_stree gt |> aux |> uncurry IntSet.union class splitify_cmd () = let tolerance = 1e-3 and splitify x = (1. -. x) -. x and sgn = flip compare 0. %> float_of_int and arr_of_map default len m = Array.init len (fun i -> IntMap.get i default m) in (* get the mass below the given edge, excluding that edge *) let below_mass_map edgem t = let m = ref IntMap.empty in let total = Gtree.recur (fun i below_massl -> let below_tot = List.fold_left ( +. ) 0. below_massl in m := IntMap.check_add i below_tot (!m); (IntMap.get i 0. edgem) +. below_tot) (fun i -> IntMap.get i 0. edgem) t in assert(abs_float(1. -. total) < tolerance); !m (* get the mass below the given edge, NOT excluding that edge *) and below_mass_map_nx edgem t = let m = ref IntMap.empty in let total = Gtree.recur (fun i below_massl -> let below_tot = List.fold_left ( +. ) 0. below_massl in let on_tot = (IntMap.get i 0. edgem) +. below_tot in m := IntMap.check_add i on_tot (!m); on_tot) (fun i -> let on_tot = IntMap.get i 0. edgem in m := IntMap.add i on_tot (!m); on_tot) t in assert(abs_float(1. -. total) < tolerance); !m in object (self) val kappa = flag "--kappa" (Formatted (1., "Specify the exponent for scaling between weighted and unweighted splitification. default: %g")) val rep_edges = flag "--rep-edges" (Needs_argument ("", "Cluster neighboring edges that have splitified euclidean distance less than the argument.")) val epsilon = flag "--epsilon" (Formatted (1e-5, "The epsilon to use to determine if a split matrix's column \ is constant for filtering. default: %g")) method specl = [ float_flag kappa; float_flag rep_edges; float_flag epsilon; ] method private splitify_transform = let kappa = fv kappa in if kappa =~ 0. then splitify %> sgn else if kappa =~ 1. then splitify else if kappa < 0. then failwith "--kappa must be a non-negative number" else fun x -> let y = splitify x in sgn y *. abs_float y ** kappa (* Take a placerun and turn it into a vector which is indexed by the edges of * the tree. *) method private splitify_placerun weighting criterion pr = let preim = Mass_map.Pre.of_placerun weighting criterion pr and t = Placerun.get_ref_tree pr and splitify_fn = self#splitify_transform in arr_of_map (splitify_fn 0.) (1+(Gtree.top_id t)) (IntMap.map splitify_fn (below_mass_map (Mass_map.By_edge.of_pre preim) t)) (* Same as splitify_placerun, but without excluding mass on the "current" edge. TODO: merge this implementation with splitify_placerun *) method private splitify_placerun_nx weighting criterion pr = let preim = Mass_map.Pre.of_placerun weighting criterion pr and t = Placerun.get_ref_tree pr and splitify_fn = self#splitify_transform in arr_of_map (splitify_fn 0.) (1+(Gtree.top_id t)) (IntMap.map splitify_fn (below_mass_map_nx (Mass_map.By_edge.of_pre preim) t)) method private filter_fal orig_length fal edges = List.map (Array.filteri (fun i _ -> IntSet.mem i edges)) fal, Enum.combine (Enum.range 0, IntSet.enum edges) |> IntMap.of_enum, orig_length method private filter_rep_edges prl fal = let orig_length = Array.length (List.hd fal) in match fvo rep_edges with | None -> (* No filtering; return identity map etc. *) fal, 0 --^ orig_length |> Enum.map (identity &&& identity) |> IntMap.of_enum, orig_length | Some max_edge_d -> (* Perform filtering, such that edges that are within max_edge_d of each other are collapsed.*) let gt = Mokaphy_common.list_get_same_tree prl in find_rep_edges max_edge_d fal gt |> self#filter_fal orig_length fal method private filter_constant_columns fal = let width = Array.length (List.hd fal) in let minarr = Array.make width infinity and maxarr = Array.make width neg_infinity and epsilon = fv epsilon in List.iter (fun arr -> Array.modifyi (Array.get arr %> min) minarr; Array.modifyi (Array.get arr %> max) maxarr) fal; 0 --^ width |> Enum.filter (fun i -> not (approx_equal ~epsilon minarr.(i) maxarr.(i))) |> IntSet.of_enum |> self#filter_fal width fal end class voronoi_cmd () = object (self) inherit tabular_cmd ~default_to_csv:true () as super_tabular inherit numbered_tree_cmd () as super_numbered_tree inherit rng_cmd () as super_rng val verbose = flag "-v" (Plain (false, "If specified, write progress output to stderr.")) val trimmed_tree_file = flag "-t" (Needs_argument ("trimmed tree file", "If specified, the path to write the trimmed tree to.")) val leaf_cutoff = flag "--leaves" (Needs_argument ("", "The maximum number of leaves to keep in the tree.")) val adcl_cutoff = flag "--max-adcl" (Needs_argument ("", "The maximum ADCL that a solution can have.")) val algorithm = flag "--algorithm" (Formatted ("full", "Which algorithm to use to prune leaves. \ Choices are 'greedy', 'full', 'force', and 'pam'. Default %s.")) val all_adcls_file = flag "--all-adcls-file" (Needs_argument ("", "If specified, write out a csv file containing every intermediate computed ADCL.")) val soln_log = flag "--log" (Needs_argument ("", "If specified with the full algorithm, write out a csv file containing solutions at \ every internal node.")) val always_include = flag "--always-include" (Needs_argument ("", "If specified, the leaf names read from the provided file will not be trimmed.")) method specl = super_tabular#specl @ super_numbered_tree#specl @ super_rng#specl @ [ toggle_flag verbose; string_flag trimmed_tree_file; int_flag leaf_cutoff; float_flag adcl_cutoff; string_flag algorithm; string_flag all_adcls_file; string_flag soln_log; string_flag always_include; ] method private perform_voronoi ?decor_tree gt mass_cb = let alg = match fv algorithm with | "greedy" -> (module Voronoi.Greedy: Voronoi.Alg) | "full" -> (module Voronoi.Full: Voronoi.Alg) | "force" -> (module Voronoi.Forced: Voronoi.Alg) | "pam" -> (module Voronoi.PAM: Voronoi.Alg) | x -> failwith (Printf.sprintf "unknown algorithm: %s" x) and keep = match fvo always_include with | None -> None | Some fname -> let name_map = Newick_gtree.leaf_label_map gt |> IntMap.enum |> Enum.map swap |> StringMap.of_enum in File.lines_of fname |> Enum.map (fun name -> match StringMap.Exceptionless.find name name_map with | None -> failwith ("no leaf named " ^ name) | Some i -> i) |> IntSet.of_enum |> some and verbose = fv verbose and n_leaves = fvo leaf_cutoff and max_adcl = fvo adcl_cutoff in (* setting the default seed will affect C code, so this sets PAM's seed * even though PAM gets a Gsl_rng.t through C. *) self#set_default_seed; Voronoi.Full.csv_log := fvo soln_log |> Option.map (open_out %> csv_out_channel %> Csv.to_out_obj); let module Alg = (val alg: Voronoi.Alg) in let diagram = Voronoi.of_gtree gt in let mass = mass_cb diagram in begin match Option.map IntSet.cardinal keep, n_leaves with | Some n_include, Some leaf_cutoff when n_include > leaf_cutoff -> failwith (Printf.sprintf "More leaves specified via --always-include (%d) than --leaves (%d)" n_include leaf_cutoff) | _ -> () end; begin match Gtree.n_taxa gt, n_leaves with | n_taxa, Some leaf_cutoff when n_taxa < leaf_cutoff -> failwith (Printf.sprintf "Cannot prune %d leaves from a tree with %d taxa" leaf_cutoff n_taxa) | _ -> () end; let solm = Alg.solve ?n_leaves ?max_adcl ?keep ~strict:(fvo all_adcls_file |> Option.is_none) ~verbose gt mass in if IntMap.is_empty solm then failwith "no solutions were found"; let leaves = match n_leaves with | Some leaf_cutoff -> if not (IntMap.mem leaf_cutoff solm) then failwith (Printf.sprintf "no solution with cardinality %d found; only solutions on the range [%d, %d]" leaf_cutoff (IntMap.min_binding solm |> fst) (IntMap.max_binding solm |> fst)); (IntMap.find leaf_cutoff solm).Voronoi.leaves (* if there's no obvious cardinality to choose, pick the one which cuts * the largest number of leaves. *) | None -> (IntMap.min_binding solm |> snd).Voronoi.leaves in let cut_leaves = gt |> Gtree.leaf_ids |> IntSet.of_list |> flip IntSet.diff leaves in begin match fvo trimmed_tree_file with | Some fname -> decor_tree |> Option.default (Decor_gtree.of_newick_gtree gt) |> Decor_gtree.color_clades_above cut_leaves |> self#maybe_numbered |> Phyloxml.gtree_to_file fname | None -> () end; begin match fvo all_adcls_file with | Some fname -> IntMap.enum solm |> Enum.map (fun (c, {Voronoi.work}) -> [string_of_int c; Printf.sprintf "%g" work]) |> List.of_enum |> Csv.save fname | None -> () end; cut_leaves |> IntSet.enum |> Enum.map (Gtree.get_node_label gt %> flip List.cons []) |> List.of_enum |> self#write_ll_tab; end pplacer-1.1.alpha19/pplacer_src/guppy_commands.ml000066400000000000000000000042001303154601500221050ustar00rootroot00000000000000let command_list () = [ "visualization", [ "fat", (fun () -> new Guppy_fat.cmd ()); "heat", (fun () -> new Guppy_heat.cmd ()); "sing", (fun () -> new Guppy_sing.cmd ()); "tog", (fun () -> new Guppy_tog.cmd ()); ]; "statistical comparison", [ "bary", (fun () -> new Guppy_bary.cmd ()); "squash", (fun () -> new Guppy_squash.cmd ()); "kr_heat", (fun () -> new Guppy_kr_heat.cmd ()); "kr", (fun () -> new Guppy_kr.cmd ()); "epca", (fun () -> new Guppy_epca.cmd ()); "lpca", (fun () -> new Guppy_lpca.cmd ()); "pmlpca", (fun () -> new Guppy_pmlpca.cmd ()); "splitify", (fun () -> new Guppy_splitify.cmd ()); "edpl", (fun () -> new Guppy_edpl.cmd ()); "rarefact", (fun () -> new Guppy_rarefact.cmd ()); "error", (fun () -> new Guppy_error.cmd ()); "fpd", (fun () -> new Guppy_fpd.cmd ()); "unifrac", (fun () -> new Guppy_unifrac.cmd ()); "indep_c", (fun () -> new Guppy_indep_c.cmd ()); "mcl", (fun () -> new Guppy_mcl.cmd ()); ]; "classification", [ "classify", (fun () -> new Guppy_classify.cmd ()); "to_rdp", (fun () -> new Guppy_to_rdp.cmd ()); ]; "utilities", [ "round", (fun () -> new Guppy_round.cmd ()); "demulti", (fun () -> new Guppy_demulti.cmd ()); "to_json", (fun () -> new Guppy_to_json.cmd ()); "distmat", (fun () -> new Guppy_distmat.cmd ()); "merge", (fun () -> new Guppy_merge.cmd ()); "filter", (fun () -> new Guppy_filter.cmd ()); "info", (fun () -> new Guppy_info.cmd ()); "redup", (fun () -> new Guppy_redup.cmd ()); "adcl", (fun () -> new Guppy_adcl.cmd ()); "mft", (fun () -> new Guppy_mft.cmd ()); "islands", (fun () -> new Guppy_islands.cmd ()); "compress", (fun () -> new Guppy_compress.cmd ()); "trim", (fun () -> new Guppy_trim.cmd ()); "ograph", (fun () -> new Guppy_ograph.cmd ()); "check", (fun () -> new Guppy_check.cmd ()); "rarefy", (fun () -> new Guppy_rarefy.cmd ()); "to_csv", (fun () -> new Guppy_to_csv.cmd ()); "placemat", (fun () -> new Guppy_placemat.cmd ()); ]; ] pplacer-1.1.alpha19/pplacer_src/guppy_compress.ml000066400000000000000000000031401303154601500221410ustar00rootroot00000000000000open Ppatteries open Subcommand open Guppy_cmdobjs class cmd () = object (self) inherit subcommand () as super inherit output_cmd () as super_output inherit mass_cmd () as super_mass inherit placefile_cmd () as super_placefile val cutoff = flag "--cutoff" (Needs_argument ("cutoff", "The cutoff parameter for mass compression")) val discard_below = flag "--discard-below" (Plain (0., "In island clustering, ignore pquery locations with a mass less than the specified value.")) val use_mcl = flag "--mcl" (Plain (false, "Use MCL clustering instead of island clustering.")) val inflation = flag "--inflation" (Needs_argument ("", "If specified, pass this as the inflation value to MCL.")) method specl = super_mass#specl @ super_output#specl @ [ float_flag cutoff; float_flag discard_below; toggle_flag use_mcl; float_flag inflation; ] method desc = "compresses a placefile's pqueries" method usage = "usage: compress [options] placefile" method private placefile_action = function | [pr] -> let weighting, criterion = self#mass_opts in let cluster_fn = if fv use_mcl then Guppy_mcl.islands_of_pql ?inflation:(fvo inflation) else Mass_islands.of_pql ~discard_below:(fv discard_below) in Mass_compress.of_placerun ~c:(fv cutoff) cluster_fn weighting criterion pr |> Placerun.set_pqueries pr |> self#write_placefile (self#single_file ()) | l -> List.length l |> Printf.sprintf "compress takes exactly one placefile (%d given)" |> failwith end pplacer-1.1.alpha19/pplacer_src/guppy_demulti.ml000066400000000000000000000017251303154601500217600ustar00rootroot00000000000000open Subcommand open Guppy_cmdobjs let demulti_pquery_list pql = List.flatten (List.map (fun pq -> List.map (fun namlom -> Pquery.set_namlom pq [namlom]) (Pquery.namlom pq)) pql) let demulti_placerun out_name pr = {pr with Placerun.pqueries = demulti_pquery_list pr.Placerun.pqueries; name = out_name;} (* UI-related *) class cmd () = object (self) inherit subcommand () as super inherit output_cmd ~show_fname:false () as super_output inherit placefile_cmd () as super_placefile method desc = "splits apart placements with multiplicity, undoing a round procedure" method usage = "usage: demulti [options] placefile[s]" method private placefile_action prl = let prefix = self#single_prefix () in List.iter (fun pr -> let out_name = (prefix^(pr.Placerun.name)) in self#write_placefile (out_name^".jplace") (demulti_placerun out_name pr)) prl end pplacer-1.1.alpha19/pplacer_src/guppy_distmat.ml000066400000000000000000000011511303154601500217530ustar00rootroot00000000000000open Guppy_cmdobjs open Subcommand open Ppatteries let write_dist_mat ff pr = Uptri.ppr_lowtri ff Edge_rdist.ppr_rdist (Edge_rdist.build_pairwise_dist (Placerun.get_ref_tree pr)) class cmd () = object (self) inherit subcommand () as super inherit output_cmd () as super_output inherit placefile_cmd () as super_placefile method desc = "prints out a pairwise distance matrix between the edges" method usage = "usage: distmat -o my.tab placefile[s]" method private placefile_action prl = let ff = Format.formatter_of_out_channel self#out_channel in List.iter (write_dist_mat ff) prl end pplacer-1.1.alpha19/pplacer_src/guppy_edpl.ml000066400000000000000000000023761303154601500212440ustar00rootroot00000000000000open Ppatteries open Subcommand open Guppy_cmdobjs class cmd () = object (self) inherit subcommand () as super inherit mass_cmd ~point_choice_allowed:false () as super_mass inherit placefile_cmd () as super_placefile inherit tabular_cmd () as super_tabular val first_only = flag "--first-only" (Plain (false, "Only print the first name for each pquery.")) method desc = "calculates the EDPL uncertainty values for a collection of pqueries" method usage = "usage: edpl [options] placefile" method specl = super_tabular#specl @ super_mass#specl @ [toggle_flag first_only] method private placefile_action = function | [pr] -> let select_fn = if fv first_only then fun x -> [List.hd x] else identity and criterion = self#criterion and dm = Placerun.get_ref_tree pr |> Edge_rdist.build_pairwise_dist in let edpl = Edpl.of_pquery criterion dm in List.map (fun pq -> List.map (fun name -> [name; edpl pq |> Printf.sprintf "%g"]) (Pquery.namel pq |> select_fn)) (Placerun.get_pqueries pr) |> List.flatten |> self#write_ll_tab | l -> List.length l |> Printf.sprintf "edpl takes exactly one placefile (%d given)" |> failwith end pplacer-1.1.alpha19/pplacer_src/guppy_epca.ml000066400000000000000000000102541303154601500212220ustar00rootroot00000000000000open Ppatteries open Subcommand open Guppy_cmdobjs let expand full_length m arr = let full = Array.make full_length 0. in Array.iteri (fun i v -> full.(IntMap.find i m) <- v) arr; full type epca_result = { eval: float array; evect: float array array } type epca_data = { edge_diff: float array list; rep_reduction_map: int IntMap.t; rep_orig_length: int; const_reduction_map: int IntMap.t; const_orig_length: int } class cmd () = object (self) inherit Guppy_pca.pca_cmd () as super_pca inherit splitify_cmd () as super_splitify method specl = super_pca#specl @ super_splitify#specl method desc = "performs edge principal components" method usage = "usage: epca [options] placefiles" method private prep_data prl = let weighting, criterion = self#mass_opts in (* edge_diff is n x p, i.e. number of samples by number of variables. *) let edge_diff, rep_reduction_map, rep_orig_length = List.map (self#splitify_placerun weighting criterion) prl |> self#filter_rep_edges prl in let edge_diff, const_reduction_map, const_orig_length = self#filter_constant_columns edge_diff in { edge_diff; rep_reduction_map; rep_orig_length; const_reduction_map; const_orig_length } method private check_data data write_n = let fal = data.edge_diff in self#check_uniqueness fal write_n method private gen_pca ~use_raw_eval ~scale ~symmv write_n data _ = let faa = Array.of_list data.edge_diff in let (eval, evect) = Pca.gen_pca ~use_raw_eval ~scale ~symmv write_n faa in { eval; evect } method private post_pca result data prl = let write_n = fv write_n and som = fv som and t = self#get_ref_tree prl and prefix = self#single_prefix ~requires_user_prefix:true () in (* Various checks and so on... *) if som > write_n || not (Array.exists (fun x -> x = som) [|0; 2; 3|]) then failwith (Printf.sprintf "Number of components to rotate cannot be greater \ than write-n, and must be either 0, 2 or 3."); (* Once we have eigenvalues and eigenvectors, this will project the data * and write. *) let write_results vals vects prefix = (* Truncate to the number of results that were asked for in --write-n * (if needed). *) let write_keep arr = if write_n >= Array.length arr then arr (* no truncation.*) else Array.sub arr 0 write_n in let (vals, vects) = (write_keep vals, write_keep vects) in let combol = (List.combine (Array.to_list vals) (Array.to_list vects)) and names = (List.map Placerun.get_name prl) in let full_combol = List.map (Tuple.Tuple2.map2 (expand data.const_orig_length data.const_reduction_map %> expand data.rep_orig_length data.rep_reduction_map)) combol in Phyloxml.named_gtrees_to_file (prefix^".xml") (List.map (fun (vals, vects) -> (Some (string_of_float vals), self#heat_tree_of_float_arr t vects |> self#maybe_numbered)) full_combol); Guppy_pca.save_named_fal (prefix^".trans") (List.map (fun (vals, vects) -> (string_of_float vals, vects)) combol); (* Below: Take the dot product of each data point with the principal component vector. This is the same as multiplying on the right by the matrix whose columns are the principal components. *) Guppy_pca.save_named_fal (prefix^".proj") (List.combine names (List.map (fun d -> Array.map (Pca.dot d) vects) data.edge_diff)); Guppy_pca.save_named_fal (prefix^".edgediff") (List.combine names data.edge_diff) in write_results result.eval result.evect prefix; if som <> 0 then try let (rot_vals, rot_vects) = Som.som_rotation result.evect som result.eval in write_results rot_vals rot_vects (prefix^".som") with | Som.MinimizationError -> Printf.eprintf "There was a problem with the minimization routine. \ Please either try --som 2 or --som 0\n" | e -> raise e end pplacer-1.1.alpha19/pplacer_src/guppy_error.ml000066400000000000000000000050761303154601500214510ustar00rootroot00000000000000open Subcommand open Guppy_cmdobjs open Ppatteries let pr_to_map transform pr = List.fold_left (fun accum pq -> let v = transform pq in List.fold_left (fun a k -> StringMap.add k v a) accum (Pquery.namel pq)) StringMap.empty (Placerun.get_pqueries pr) let pr_error criterion include_pendant scale_experimental_bl experimental expected = let gt = if scale_experimental_bl then Placerun.get_ref_tree expected else Placerun.get_same_tree experimental expected in let pair_dist = Edge_rdist.build_pairwise_dist gt |> Edge_rdist.find_pairwise_dist and ec_bl = Gtree.get_bl gt and em_bl = Placerun.get_ref_tree experimental |> Gtree.get_bl in let placement_distance p_ec p_em = let open Placement in pair_dist p_ec.location p_ec.distal_bl p_em.location (if scale_experimental_bl then ec_bl p_em.location *. p_em.distal_bl /. em_bl p_em.location else p_em.distal_bl) +. (if include_pendant then p_em.pendant_bl +. p_ec.pendant_bl else 0.) in StringMap.merge (fun _ po plo -> match po, plo with | Some p, Some pl -> List.map (placement_distance p &&& criterion) pl |> Edpl.weighted_average |> (fun x -> Some x) | _, _ -> None) (pr_to_map (Pquery.best_place criterion) expected) (pr_to_map Pquery.place_list experimental) class cmd () = object (self) inherit subcommand () as super inherit mass_cmd ~point_choice_allowed:false () as super_mass inherit placefile_cmd () as super_placefile inherit tabular_cmd () as super_tabular val include_pendant = flag "--include-pendant" (Plain (false, "Include pendant branch lengths in distance calculations.")) val scale_experimental_bl = flag "--scale-experimental-bl" (Plain (false, "Scale the branch lengths in the experimental jplace file.")) method specl = super_mass#specl @ super_tabular#specl @ [ toggle_flag include_pendant; toggle_flag scale_experimental_bl; ] method desc = "finds the error between two placefiles" method usage = "usage: error [options] experimental.jplace expected.jplace" method private placefile_action = function | [experimental; expected] -> pr_error self#criterion (fv include_pendant) (fv scale_experimental_bl) experimental expected |> StringMap.enum |> Enum.map (fun (a, b) -> [a; Printf.sprintf "%g" b]) |> List.of_enum |> self#write_ll_tab | l -> List.length l |> Printf.sprintf "error takes exactly two placefiles (%d given)" |> failwith end pplacer-1.1.alpha19/pplacer_src/guppy_fat.ml000066400000000000000000000114611303154601500210650ustar00rootroot00000000000000open Subcommand open Guppy_cmdobjs open Ppatteries class cmd () = object (self) inherit subcommand () as super inherit output_cmd () as super_output inherit mass_cmd () as super_mass inherit refpkg_cmd ~required:false as super_refpkg inherit fat_cmd () as super_fat inherit placefile_cmd () as super_placefile val average = flag "--average" (Plain (false, "Average all input placefiles together.")) val edpl = flag "--edpl" (Needs_argument ("", "Specify the maximum EDPL for an EDPL tree.")) method specl = super_output#specl @ super_mass#specl @ super_refpkg#specl @ super_fat#specl @ [ toggle_flag average; float_flag edpl; ] method desc = "makes trees with edges fattened in proportion to the number of reads" method usage = "usage: fat [options] placefile[s]" method private total_mass_width total_multiplicity = match fv width_multiplier with | 0. -> fv total_width | x -> x *. (float_of_int total_multiplicity) method private to_pre_pair tax_info pr = let weighting, criterion = self#mass_opts in pr, Mass_map.Pre.of_placerun weighting criterion pr, try match tax_info with | None -> None | Some (taxt, ti_imap) -> let pre = Tax_mass.pre (Gtree.top_id taxt) Placement.classif weighting criterion ti_imap pr in Some (taxt, pre) with (* if we get a No_classif exception then don't make a tax fat tree *) | Placement.No_classif -> None method private decor_map_of_mass_map ?multiplier_override m = let v = super_fat#decor_map_of_mass_map ?multiplier_override m in match fvo edpl with | None -> v | Some _ -> IntMap.map (List.filter ((<>) Decor.sand)) v method private maybe_edpl pr gt = match fvo edpl with | None -> gt | Some max -> IntMap.fold (fun i v accum -> let r = v /. max in Decor_gtree.map_add_decor_listly i (if r > 1. then [Decor.yellow] else [Decor.color_avg r Decor.red Decor.white]) accum) (Edpl.map_of_placerun self#criterion pr) (Gtree.get_bark_map gt) |> Gtree.set_bark_map gt method private to_fat_tree final_rt name (pr, phylo_pre, tax_pre) = let phylo_mass = Mass_map.By_edge.of_pre phylo_pre in [ Some (name^".ref.fat"), self#fat_tree_of_massm final_rt phylo_mass |> self#maybe_numbered |> self#maybe_edpl pr ] @ (match tax_pre with | None -> [] | Some (taxt, tax_pre) -> begin let tax_mass = Mass_map.By_edge.of_pre tax_pre in let multiplier_override = 200. /. (Mass_map.By_edge.total_mass tax_mass) in [ Some (name^".tax.fat"), self#fat_tree_of_massm ~multiplier_override taxt tax_mass ] end) method private placefile_action prl = self#check_placerunl prl; let tax_info = match self#get_rpo with | None -> None | Some rp -> Some (Tax_gtree.of_refpkg_unit rp) in let pre_pairs = List.map (self#to_pre_pair tax_info) prl in if fv average then begin let phylo_pre, tax_pre = List.fold_left (fun (phylo_accum, tax_accum) (_, phylo_pre, tax_pre) -> let phylo_pre' = Mass_map.Pre.normalize_mass phylo_pre in List.rev_append phylo_pre' phylo_accum, match tax_accum, tax_pre with | None, None -> None | (Some _ as tax_accum), None -> tax_accum | None, (Some _ as tax_accum) -> tax_accum | Some (taxt, tax_accum), Some (_, tax_pre) -> Some (taxt, List.rev_append tax_pre tax_accum)) ([], None) pre_pairs in let fname = self#single_file () in let trees = self#to_fat_tree (snd (self#get_rpo_and_tree (List.hd prl))) (safe_chop_suffix fname ".xml") (List.hd prl, phylo_pre, tax_pre) in Phyloxml.named_gtrees_to_file fname trees end else begin let trees = List.map2 (fun pr pair -> let _, final_rt = self#get_rpo_and_tree pr in pr.Placerun.name, self#to_fat_tree final_rt pr.Placerun.name pair) prl pre_pairs in match self#out_file_or_dir () with | Directory (dir, prefix) -> List.iter (fun (name, trees) -> Phyloxml.named_gtrees_to_file (Filename.concat dir (prefix ^ name ^ ".xml")) trees) trees | File fname -> Phyloxml.named_gtrees_to_file fname (List.map snd trees |> List.flatten) | Unspecified -> () end end pplacer-1.1.alpha19/pplacer_src/guppy_filter.ml000066400000000000000000000126051303154601500216010ustar00rootroot00000000000000open Ppatteries open Subcommand open Guppy_cmdobjs let any_match rl s = List.exists (fun r -> try let _ = Str.search_forward r s 0 in true with | Not_found -> false) rl module CF = Guppy_classify let classify how criterion n_ranks td pq = let outl = ref [] in let m = ref (List.fold_right (fun p -> CF.TIAMR.add_by (how p) (criterion p)) (Pquery.place_list pq) (CF.TIAMR.empty)) in for desired_rank=(n_ranks-1) downto 0 do m := CF.keymap_add_by (CF.classify_at_rank td desired_rank) !m; outl := (CF.TIAMR.to_pairs !m) :: !outl done; List.flatten !outl class cmd () = object (self) inherit subcommand () as super inherit refpkg_cmd ~required:false as super_refpkg inherit placefile_cmd () as super_placefile inherit output_cmd () as super_output val regexp_default_exclude = flag "-Vr" (Plain (false, "Exclude every placement name by default (by default everything included).")) val regexp_inclusions = flag "-Ir" (Plain ([], "Include placements whose name matches the given regexp. May be passed multiple times.")) val regexp_exclusions = flag "-Er" (Plain ([], "Exclude placements whose name matches the given regexp. May be passed multiple times.")) val tax_cutoff = flag "--cutoff" (Formatted (0.9, "Use this cutoff for determining how likely a match is for a tax_id. Default: %g")) val use_pp = flag "--pp" (Plain (false, "Use posterior probability for our criteria.")) val tax_default_exclude = flag "-Vx" (Plain (false, "Exclude every tax_id by default (by default everything included).")) val tax_inclusions = flag "-Ix" (Plain ([], "Include placements which are likely matches for the given tax_id. May be passed multiple times.")) val tax_exclusions = flag "-Ex" (Plain ([], "Exclude placements which are likely matches for the given tax_id. May be passed multiple times.")) val mass_gt = flag "--mass-gt" (Plain (0., "Include pqueries with a mass greater than the specified value.")) val mass_le = flag "--mass-le" (Plain (infinity, "Include pqueries with a mass less than or equal to the specified value.")) method specl = super_output#specl @ [ toggle_flag regexp_default_exclude; string_list_flag regexp_inclusions; string_list_flag regexp_exclusions; ] @ super_refpkg#specl @ [ float_flag tax_cutoff; toggle_flag use_pp; toggle_flag tax_default_exclude; string_list_flag tax_inclusions; string_list_flag tax_exclusions; float_flag mass_gt; float_flag mass_le; ] method desc = "filters one or more placefiles by placement name" method usage = "usage: filter [options] placefile[s]" method private placefile_action = function | [] -> failwith "filter takes at least one placefile (zero given)" | prl -> let fname = self#single_file ~default:(File ((Mokaphy_common.cat_names prl) ^ ".jplace")) () in let r_inclusions = List.map Str.regexp (List.rev (fv regexp_inclusions)) and r_exclusions = List.map Str.regexp (List.rev (fv regexp_exclusions)) and r_default_exclude = fv regexp_default_exclude and t_inclusions = List.rev (fv tax_inclusions) and t_exclusions = List.rev (fv tax_exclusions) and t_default_exclude = fv tax_default_exclude in let tax_pred = if t_inclusions = [] && t_exclusions = [] then (fun _ -> true) else let criterion = if fv use_pp then Placement.post_prob else Placement.ml_ratio and td = Refpkg.get_taxonomy (self#get_rp) in let n_ranks = Tax_taxonomy.get_n_ranks td and cutoff = fv tax_cutoff in let tax_match candidates classified = List.exists (fun candidate -> List.exists (fun (tid, prob) -> Tax_id.to_string tid = candidate && prob > cutoff) classified) candidates in let t_included = tax_match t_inclusions and t_excluded = tax_match t_exclusions and classify = classify Placement.classif criterion n_ranks td in (fun pq -> let cfied = classify pq in if t_default_exclude then (t_included cfied) && (not (t_excluded cfied)) else (not (t_excluded cfied)) || (t_included cfied)) in let mass_gt_val = fv mass_gt and mass_le_val = fv mass_le in let mass_pred pq = let mass = Pquery.multiplicity pq in mass > mass_gt_val && mass <= mass_le_val and r_included = any_match r_inclusions and r_excluded = any_match r_exclusions in let fold_pq pqs pq = if not (tax_pred pq && mass_pred pq) then pqs else let namlom = List.filter (fst %> fun name -> if r_default_exclude then (r_included name) && (not (r_excluded name)) else (not (r_excluded name)) || (r_included name)) (Pquery.namlom pq) in if List.is_empty namlom then pqs else (Pquery.set_namlom pq namlom) :: pqs in List.map (Placerun.apply_to_pqueries (List.fold_left fold_pq [])) prl |> List.reduce (Placerun.combine "") |> self#write_placefile fname end pplacer-1.1.alpha19/pplacer_src/guppy_fpd.ml000066400000000000000000000130511303154601500210610ustar00rootroot00000000000000open Subcommand open Guppy_cmdobjs open Ppatteries let epsilon = 1e-10 let merge a x = a := x +. !a (* float ref list -> float ref: sum a list of float refs, returning a new float * ref. *) let lmerge = List.fold_left ((!) %> (+.) |> flip) 0. %> ref module I = Mass_map.Indiv module P = Mass_map.Pre (* convenience function to total the mass along the tree. the callback function * is passed the branch length and the current mass total and returns another * term to sum. the result of total_along_mass is the sum of all the terms. *) let total_along_mass ?(include_pendant = false) criterion pr cb = let gt = Placerun.get_ref_tree pr |> Newick_gtree.add_zero_root_bl in let pre = P.of_placerun Mass_map.Point criterion pr in let mass = I.of_pre pre in let partial_total id = Kr_distance.total_along_edge ((!) %> cb) (Gtree.get_bl gt id) (IntMap.get id [] mass |> List.map I.to_pair |> List.sort compare) merge in Kr_distance.total_over_tree partial_total (const ()) lmerge (fun () -> ref 0.) (Gtree.get_stree gt) |> (if not include_pendant then identity else fun v -> List.fold_left (fun accum {P.multi; P.mul} -> List.fold_left (fun accum {P.pendant_bl; P.mass} -> accum +. cb (mass *. multi) pendant_bl) accum mul) v pre) (* When we're passing along the induced tree, the mass will be on the range * (0, total_mass), and the branch length coefficient should be 1. Otherwise, * we're either before or after the induced tree and the multiplier should * be 0. *) let bump_function r = if r =~ 0. || approx_equal ~epsilon r 1. then 0. else 1. let bump_with_root r = if r =~ 0. then 0. else 1. let pd_of_placerun ?include_pendant ?(bump = bump_function) criterion pr = total_along_mass ?include_pendant criterion pr (fun r bl -> bump r *. bl) let reflect x = if approx_equal ~epsilon x 1. then 0. else begin let y = 1. -. x in if y < 0. then failwith "reflect out of range!" else y end let bwpd_of_placerun ?include_pendant criterion exponent pr = let f = if exponent < 0. || exponent > 1. then failwith("exponent must be between 0 and 1, inclusive") else if exponent = 1. then (fun x -> 2. *. x) else if exponent = 0. then bump_function else (fun x -> (2. *. x) ** exponent) in total_along_mass ?include_pendant criterion pr (fun r bl -> min (f r) (f (reflect r)) *. bl) let entropy_of_placerun ?include_pendant criterion pr = let total = total_along_mass ?include_pendant criterion pr in let phylo r bl = if approx_equal r 0. then 0. else bl *. r *. (log r) and quadro r bl = bl *. r *. (1. -. r) in ~-. (total phylo), total quadro (* Rooted qPD(T) and qD(T) from Chao et al. 2010 doi:10.1098/rstb.2010.0272 *) let chao_qpd_tmean_of_placerun ?include_pendant criterion exponent pr = let t_mean_f r bl = (bump_with_root r) *. bl *. r in let t_mean = total_along_mass ?include_pendant criterion pr t_mean_f in let qpd r bl = (bump_with_root r) *. bl *. (r /. t_mean) ** exponent in let r = total_along_mass ?include_pendant criterion pr qpd in r ** (1. /. (1. -. exponent)), t_mean let chao_qpd_of_placerun ?include_pendant criterion exponent pr = chao_qpd_tmean_of_placerun ?include_pendant criterion exponent pr |> fst let chao_qd_of_placerun ?include_pendant criterion exponent pr = let (r, t_mean) = chao_qpd_tmean_of_placerun ?include_pendant criterion exponent pr in r /. t_mean class cmd () = object (self) inherit subcommand () as super inherit mass_cmd ~point_choice_allowed:false () as super_mass inherit placefile_cmd () as super_placefile inherit tabular_cmd () as super_tabular val theta = flag "--theta" (Plain ([], "A comma-separated list of additional exponents to use for calculating bwpd.")) val include_pendant = flag "--include-pendant" (Plain (false, "Consider pendant branch length in diversity calculations.")) val chao_d = flag "--chao-d" (Plain ([], "A comma-separated list of additional exponents to use for calculating qD(T).")) method specl = super_mass#specl @ super_tabular#specl @ [ delimited_list_flag theta; delimited_list_flag chao_d; toggle_flag include_pendant; ] method desc = "calculates various alpha diversity metrics of placefiles" method usage = "usage: fpd [options] placefile[s]" method private placefile_action prl = let exponents = fv theta |> List.map float_of_string and d_exponents = fv chao_d |> List.map float_of_string and criterion = self#criterion and include_pendant = fv include_pendant in let bwpd = bwpd_of_placerun ~include_pendant criterion and qd = chao_qd_of_placerun ~include_pendant criterion and pd = pd_of_placerun ~include_pendant criterion and rpd = pd_of_placerun ~include_pendant ~bump:bump_with_root criterion and entropy = entropy_of_placerun ~include_pendant criterion in prl |> List.map (fun pr -> let pe, qe = entropy pr and qds = List.map (flip qd pr) d_exponents in [pe; qe; pd pr; rpd pr; bwpd 1. pr] |> (flip List.append (List.map (flip bwpd pr) exponents)) |> (flip List.append qds) |> List.map (Printf.sprintf "%g") |> List.cons (Placerun.get_name pr)) |> List.cons (["placerun"; "phylo_entropy"; "quadratic"; "unrooted_pd"; "rooted_pd"; "bwpd"] @ List.map (Printf.sprintf "bwpd_%g") exponents @ List.map (Printf.sprintf "rooted_qd_%g") d_exponents) |> self#write_ll_tab end pplacer-1.1.alpha19/pplacer_src/guppy_heat.ml000066400000000000000000000030451303154601500212330ustar00rootroot00000000000000open Ppatteries open Subcommand open Guppy_cmdobjs let named_arr_list_of_csv fname = List.map (function | [] -> failwith ("empty csv row in " ^ fname) | name::entries -> (name, Array.of_list (List.map float_of_string entries))) (Csv.load fname) class cmd () = object (self) inherit subcommand () as super inherit output_cmd () as super_output inherit heat_cmd () as super_heat inherit refpkg_cmd ~required:true as super_refpkg method specl = super_output#specl @ super_refpkg#specl @ super_heat#specl method desc = "maps an an arbitrary vector of the correct length to the tree" method usage = "usage: heat -o my.xml -c my.refpkg matrix.csv" method private csv_to_named_trees t fname = (* Below: add one for the root edge. *) let n_edges = 1+Gtree.n_edges t in List.map (fun (name, a) -> if n_edges <> Array.length a then failwith (Printf.sprintf "%d entries in %s, and %d edges in reference tree" (Array.length a) name n_edges); (Some name, try self#heat_tree_of_float_arr t a with Invalid_abs_tot -> failwith (Printf.sprintf "bad abs_tot on %s" name))) (named_arr_list_of_csv fname) method action = function | pathl -> let t = self#maybe_numbered self#get_decor_ref_tree in List.iter (fun fname -> Phyloxml.named_gtrees_to_channel self#out_channel (self#csv_to_named_trees t fname)) pathl end pplacer-1.1.alpha19/pplacer_src/guppy_indep_c.ml000066400000000000000000000023751303154601500217200ustar00rootroot00000000000000open Ppatteries open Subcommand open Guppy_cmdobjs class cmd () = object (self) inherit subcommand () as super inherit placefile_cmd () as super_placefile inherit mass_cmd ~point_choice_allowed:false () as super_mass inherit tabular_cmd () as super_tabular val leaf_values = flag "--leaf-values" (Needs_argument ("leaf values", "Name of CSV file giving values for the leaves of the tree.")) method specl = super_mass#specl @ super_tabular#specl @ [string_flag leaf_values] method desc = "calculates the independent contrasts of pqueries" method usage = "usage: indep_c [options] placefile[s]" method private placefile_action prl = let leaf_copy_map = fv leaf_values |> Csv.load |> List.map (function | [a; b] -> a, float_of_string b | _ -> failwith "malformed copy number csv file") |> StringMap.of_pairlist and criterion = self#criterion and format = Printf.sprintf "%g" in flip List.map prl (fun pr -> Indep_contrasts.of_criterion_map criterion leaf_copy_map pr |> List.map (fun (pq, x) -> List.map (flip List.cons [format x]) (Pquery.namel pq)) |> List.flatten) |> List.flatten |> List.cons ["sequence"; "x"] |> self#write_ll_tab end pplacer-1.1.alpha19/pplacer_src/guppy_info.ml000066400000000000000000000015111303154601500212410ustar00rootroot00000000000000open Ppatteries open Subcommand open Guppy_cmdobjs open Placerun class cmd () = object (self) inherit subcommand () as super inherit placefile_cmd () as super_placefile inherit tabular_cmd () as super_tabular method desc = "writes the number of leaves of the reference tree and the number of pqueries" method usage = "usage: info [options] placefile[s]" method private placefile_action prl = let mat = Array.make_matrix ((List.length prl) + 1) 4 "" in mat.(0) <- [|"name"; "leaves"; "pqueries"; "multi_pqueries"|]; List.iteri (fun e pr -> mat.(e + 1) <- [| pr.name; string_of_int (Gtree.n_taxa pr.ref_tree); string_of_int (n_pqueries pr); Pquery.total_multiplicity pr.pqueries |> Printf.sprintf "%.12g"; |]) prl; self#write_aa_tab mat end pplacer-1.1.alpha19/pplacer_src/guppy_islands.ml000066400000000000000000000021351303154601500217460ustar00rootroot00000000000000open Subcommand open Guppy_cmdobjs open Ppatteries class cmd () = object (self) inherit subcommand () as super inherit placefile_cmd () as super_placefile inherit output_cmd () as super_output inherit mass_cmd ~point_choice_allowed:false () as super_mass val discard_below = flag "--discard-below" (Plain (0., "Ignore pquery locations with a mass less than the specified value.")) method specl = super_output#specl @ super_mass#specl @ [float_flag discard_below] method desc = "finds the mass islands of one or more pqueries" method usage = "usage: islands [options] placefile[s]" method private placefile_action prl = let gt = Mokaphy_common.list_get_same_tree prl and prefix = self#single_prefix ~requires_user_prefix:true () in List.map Placerun.get_pqueries prl |> List.flatten |> Mass_islands.of_pql ~discard_below:(fv discard_below) self#criterion |> List.iteri (fun e (_, pql) -> Placerun.make gt (string_of_int e) pql |> self#write_placefile (Printf.sprintf "%s%d.jplace" prefix e)) end pplacer-1.1.alpha19/pplacer_src/guppy_kr.ml000066400000000000000000000176651303154601500207430ustar00rootroot00000000000000open Ppatteries open Subcommand open Guppy_cmdobjs type result = { distance : float; p_value : float option; } (* uniformly shuffle the elements of an array using the Knuth shuffle * http://en.wikipedia.org/wiki/Random_permutation * http://rosettacode.org/wiki/Knuth_shuffle#OCaml *) let shuffle rng a = let swap i j = let x = a.(i) in a.(i) <- a.(j); a.(j) <- x in for i = Array.length a - 1 downto 1 do swap i (Gsl_rng.uniform_int rng (i+1)) done (* just calculate the fraction of elements of a which are geq x. * that's the probability that something of value x or greater was drawn from * the distribution of a. * clearly, l doesn't need to be sorted *) let int_div x y = (float_of_int x) /. (float_of_int y) let list_onesided_pvalue l x = int_div (List.fold_left (fun accu a_elt -> if a_elt >= x then accu+1 else accu) 0 l) (List.length l) let get_distance r = r.distance let get_p_value r = match r.p_value with | Some p -> p | None -> failwith "no p-value!" (* Apply f to n_shuffles pairs generated by shuffling. *) let map_shuffled_pres f rng n_shuffles pre1 pre2 = let pre_arr = Array.of_list (pre1 @ pre2) and n1 = List.length pre1 and n2 = List.length pre2 in let pquery_sub start len = Array.to_list (Array.sub pre_arr start len) in List.init n_shuffles (fun _ -> shuffle rng pre_arr; f (pquery_sub 0 n1) (pquery_sub n1 n2)) exception Uptri_dim_mismatch let write_uptril list_output namea fun_namel ul ch = match ul with | [] -> () | hd::tl -> if 0 = List.fold_left (fun d u -> if d = Uptri.get_dim u then d else raise Uptri_dim_mismatch) (Uptri.get_dim hd) tl then failwith "can't do anything interesting with fewer than two place files"; if list_output then begin let make_line i j = Array.of_list ([namea.(i); namea.(j)] @ (List.map (fun u -> Printf.sprintf "%g" (Uptri.get u i j)) ul)) in String_matrix.write_padded ch (Array.of_list ((Array.of_list (["sample_1";"sample_2"] @ fun_namel)):: (let m = ref [] in Uptri.iterij (fun i j _ -> m := ((make_line i j)::!m)) hd; List.rev !m))) end else begin List.iter2 (fun fun_name u -> Printf.fprintf ch "%s distances:\n" fun_name; Mokaphy_common.write_named_float_uptri ch namea u;) fun_namel ul end (* core * run pair_core for each unique pair *) class cmd () = object (self) inherit subcommand () as super inherit mass_cmd () as super_mass inherit refpkg_cmd ~required:false as super_refpkg inherit output_cmd () as super_output inherit kr_cmd () as super_kr inherit normalization_cmd () as super_normalization inherit rng_cmd () as super_rng inherit placefile_cmd () as super_placefile val list_output = flag "--list-out" (Plain (false, "Output the KR results as a list rather than a matrix.")) val density = flag "--density" (Plain (false, "Make density plots showing the distribution of randomized \ values with the calculated values")) val n_samples = flag "-s" (Formatted (0, "Set how many samples to use for significance calculation (0 means \ calculate distance only). Default is %d.")) val gaussian = flag "--gaussian" (Plain (false, "Use the Gaussian process approximation for p-value \ estimation")) method specl = super_mass#specl @ super_refpkg#specl @ super_output#specl @ super_kr#specl @ super_normalization#specl @ super_rng#specl @ [ toggle_flag list_output; toggle_flag density; int_flag n_samples; toggle_flag gaussian; ] method desc = "calculates the Kantorovich-Rubinstein distance and corresponding p-values" method usage = "usage: kr [options] placefiles" (* Note that we don't call self#rng to avoid re-seeding the rng. *) method private pair_core rng n_samples t name1 pre1 name2 pre2 = let p = fv p_exp and normalization = self#get_normalization t in let calc_dist = Kr_distance.scaled_dist_of_pres ~normalization p t in let original_dist = calc_dist pre1 pre2 in let type_str = if fv gaussian then "gaussian" else "density" in { distance = original_dist; p_value = if 0 < n_samples then begin (* We must have unitized masses so shuffling works properly. Otherwise * the amount of mass per read will depend on its origin. *) let upre1 = Mass_map.Pre.unitize_mass pre1 and upre2 = Mass_map.Pre.unitize_mass pre2 in let null_dists = if fv gaussian then Gaussian_approx.pair_approx ~normalization rng n_samples p t upre1 upre2 else map_shuffled_pres calc_dist rng n_samples upre1 upre2 in if fv density then R_plots.write_density p type_str name1 name2 original_dist null_dists; Some (list_onesided_pvalue null_dists original_dist) end else None; } method private nontrivial_placefile_action prl = let n_samples = fv n_samples and pra = Array.of_list prl and p = fv p_exp and weighting, criterion = self#mass_opts and tax_refpkgo = match self#get_rpo with | None -> None | Some rp -> if Refpkg.tax_equipped rp then Some rp else None and ch = self#out_channel and rng = self#rng in (* in the next section, pre_f is a function which takes a pr and makes a pre, * and t is a gtree *) let uptri_of_t_pre_f (t, pre_f) = let prea = Array.map pre_f pra and namea = Array.map Placerun.get_name pra in Uptri.init (Array.length prea) (fun i j -> let context = Printf.sprintf "comparing %s with %s" namea.(i) namea.(j) in try self#pair_core rng n_samples t namea.(i) prea.(i) namea.(j) prea.(j) with | Kr_distance.Invalid_place_loc a -> invalid_arg (Printf.sprintf "%g is not a valid placement location when %s" a context) | Kr_distance.Total_kr_not_zero tkr -> failwith ("total kr_vect not zero for "^context^": "^ (string_of_float tkr))) (* here we make one of these pairs from a function which tells us how to * assign a branch length to a tax rank *) and t_pre_f_of_bl_of_rank rp bl_of_rank = let (taxt, ti_imap) = Tax_gtree.of_refpkg_gen bl_of_rank rp in (Decor_gtree.to_newick_gtree taxt, Mokaphy_common.make_tax_pre taxt weighting criterion ti_imap) and gt = Mokaphy_common.list_get_same_tree prl |> Newick_gtree.add_zero_root_bl in (* here we make a list of uptris, which are to get printed *) let uptris = List.map uptri_of_t_pre_f ([gt, Mass_map.Pre.of_placerun weighting criterion] @ (match tax_refpkgo with | None -> [] | Some rp -> List.map (t_pre_f_of_bl_of_rank rp) [Tax_gtree.unit_bl; Tax_gtree.inverse])) (* here are a list of function names to go with those uptris *) and fun_names = List.map (fun s -> Printf.sprintf "%s%g" s p) (["Z_"] @ (match tax_refpkgo with | Some _ -> ["unit_tax_Z_"; "inv_tax_Z_"] | None -> [])) (* the names of the placeruns *) and names = Array.map Placerun.get_name pra and print_pvalues = n_samples > 0 and neighborly f l = List.flatten (List.map f l) in write_uptril (fv list_output) names (if print_pvalues then neighborly (fun s -> [s;s^"_p_value"]) fun_names else fun_names) (if print_pvalues then neighborly (fun u -> [Uptri.map get_distance u; Uptri.map get_p_value u]) uptris else (List.map (Uptri.map get_distance) uptris)) ch method private placefile_action prl = match List.length prl with | (0 | 1) as n -> Printf.sprintf "kr requires two or more placefiles (%d given)" n |> failwith | _ -> self#nontrivial_placefile_action prl end pplacer-1.1.alpha19/pplacer_src/guppy_kr_heat.ml000066400000000000000000000065541303154601500217370ustar00rootroot00000000000000open Subcommand open Guppy_cmdobjs open Ppatteries (* Make a map with the amount of transport along each edge. *) let transport_map t pre1 pre2 = let kr_map = IntMap.map (* we don't care about where we are along the edge *) (List.map snd) (Kr_distance.make_n_kr_map [Mass_map.Indiv.of_pre pre1; Mass_map.Indiv.of_pre pre2]) in let sum_over_krs_of_id id = List.fold_right (fun kr_v -> ( +. ) (kr_v.(0) -. kr_v.(1))) (IntMap.get id [] kr_map) in let heat_list = Stree.recur_listly (fun id below -> ((id, sum_over_krs_of_id id (* the first item a list from a subtree is the total of all of the heat in that * subtree. therefore to get the total heat for our tree, we just have to total * all of those *) (List.fold_left (fun accu -> function | (_,heat)::_ -> heat +. accu | [] -> accu) 0. below))) :: (List.flatten below)) (Gtree.get_stree t) in let (_,top_heat) = List.hd heat_list in if top_heat > Kr_distance.tol then raise (Kr_distance.Total_kr_not_zero top_heat); IntMap.of_pairlist heat_list (* The commands *) class cmd () = object (self) inherit subcommand () as super inherit mass_cmd () as super_mass inherit refpkg_cmd ~required:false as super_refpkg inherit kr_cmd () as super_kr inherit heat_cmd () as super_heat inherit placefile_cmd () as super_placefile inherit output_cmd () as super_output method specl = super_mass#specl @ super_refpkg#specl @ super_kr#specl @ super_heat#specl @ super_output#specl method desc = "makes a heat tree" method usage = "usage: heat [options] placefile1 placefile2" method private placefile_action = function | [pr1; pr2] as prl -> let fname = self#single_file ~default:(File ((Mokaphy_common.cat_names prl) ^ ".heat.xml")) () in let weighting, criterion = self#mass_opts and tree_name = safe_chop_suffix fname ".xml" in let my_pre_of_pr = Mass_map.Pre.of_placerun weighting criterion and refpkgo, ref_tree = self#get_rpo_and_tree pr1 in let make_heat_tree decor_t pre1 pre2 = self#spread_short_fat (Decor_gtree.add_decor_by_map decor_t (self#decor_map_of_float_map (transport_map decor_t pre1 pre2))) in Phyloxml.named_gtrees_to_file fname ([Some tree_name, make_heat_tree (self#maybe_numbered ref_tree) (my_pre_of_pr pr1) (my_pre_of_pr pr2)] @ match refpkgo with | None -> [] | Some rp -> try let (taxt, ti_imap) = Tax_gtree.of_refpkg_unit rp in let my_make_tax_pre = Mokaphy_common.make_tax_pre taxt weighting criterion ti_imap in [Some (tree_name^".tax"), make_heat_tree taxt (my_make_tax_pre pr1) (my_make_tax_pre pr2)] with | Placement.No_classif -> begin print_endline "Warning: taxonomic heat tree skipped because \ some placements missing taxonomic information."; [] end ) | l -> List.length l |> Printf.sprintf "kr_heat takes exactly two placefiles (%d given)" |> failwith end pplacer-1.1.alpha19/pplacer_src/guppy_lpca.ml000066400000000000000000000142151303154601500212320ustar00rootroot00000000000000open Ppatteries open Subcommand open Guppy_cmdobjs open Lpca (* Normalize the rows of a matrix m to unit vectors. *) let norm_rows m = let n_rows, _ = Gsl_matrix.dims m in for i=0 to (n_rows-1) do Linear_utils.l2_normalize (Gsl_matrix.row m i); done (* Compute the n largest singular values of a matrix m (or its transpose) as the square root of the eigenvalues of (m* m), where m* is the conjugate transpose of m. We assume m is real-valued and therefore compute m* as m' for simplicity. *) let singular_values ~trans m n = let real c = let open Gsl_complex in c.re in let n_rows, n_cols = Gsl_matrix.dims m in let n_mm, ta, tb = if trans then (n_rows, Gsl_blas.NoTrans, Gsl_blas.Trans) else (n_cols, Gsl_blas.Trans, Gsl_blas.NoTrans) in let mm = Gsl_matrix.create n_mm n_mm in Gsl_blas.gemm ~ta ~tb ~alpha:1. ~a:m ~b:m ~beta:0. ~c:mm; let eval_c = Gsl_eigen.nonsymm ~protect:false (`M(mm)) in let eval = Array.map real (Gsl_vector_complex.to_array eval_c) in Array.sort (flip compare) eval; Array.map sqrt (Array.sub eval 0 n) class cmd () = object (self) inherit Guppy_pca.pca_cmd () as super_pca inherit splitify_cmd () as super_splitify method specl = super_pca#specl @ super_splitify#specl method desc = "performs length principal components" method usage = "usage: lpca [options] placefiles" method private prep_data prl = let weighting, criterion = self#mass_opts in let sl = List.map (fun pr -> Mass_map.Indiv.sort (Mass_map.Indiv.of_placerun weighting criterion pr)) prl and t = self#get_ref_tree prl in Lpca.gen_data sl t method private check_data data write_n = let fal = Array.to_list (Gsl_matrix.to_arrays data.fplf) in self#check_uniqueness fal write_n method private gen_pca ~use_raw_eval ~scale ~symmv n_components data _ = let (eval, evect) = Pca.gen_pca ~use_raw_eval ~scale ~symmv n_components (Gsl_matrix.to_arrays data.fplf) in (* Populate the edge-averaged e x s matrix AF from its IntMap encoding. See eq:f_tilde. *) let af = Gsl_matrix.of_arrays (Array.of_list (List.map Gsl_vector.to_array (List.of_enum (IntMap.values data.af)))) and w' = Gsl_matrix.of_arrays evect in let n_edges, _ = Gsl_matrix.dims af in let afw = Gsl_matrix.create n_edges n_components in (* Compute the edge-averaged eigenvectors. *) Gsl_blas.gemm ~ta:Gsl_blas.NoTrans ~tb:Gsl_blas.Trans ~alpha:1. ~a:af ~b:w' ~beta:0. ~c:afw; let afw' = Gsl_matrix.create n_components n_edges in Gsl_matrix.transpose afw' afw; (* Normalize the eigenvectors and the edge-averaged eigenvectors to unit length. *) norm_rows w'; norm_rows afw'; (* We want to compute U'Fw, where the columns of w are the eigenvectors of F'LF (and therefore Fw are the eigenvectors of GL). For the sake of computational efficiency, though, we're accumulating U'F as we traverse the tree, and therefore can't normalize the transformed eigenvectors Fw before projecting the sample data in U. Luckily we can find the scalars needed to normalize the results as the ratio of the singular values of U'F to those of U'. *) (* let weighting, criterion = self#mass_opts in let sufa = singular_values ~trans:false data.ufl n_components and sua = singular_values ~trans:true (Gsl_matrix.of_arrays (Array.of_list (List.map (self#splitify_placerun_nx weighting criterion) prl))) n_components in let sfa = Array.map2 (/.) sufa sua in Array.iteri (fun i x -> Gsl_vector.scale (Gsl_matrix.row w' i) (1. /. x)) sfa; *) let norm_evect = Gsl_matrix.to_arrays w' and edge_evect = Gsl_matrix.to_arrays afw' in { eval; evect = norm_evect; edge_evect } method private post_pca result data prl = let write_n = fv write_n and som = fv som and t = self#get_ref_tree prl and prefix = self#single_prefix ~requires_user_prefix:true () in (* Various checks and so on... *) if som > write_n || not (Array.exists (fun x -> x = som) [|0; 2; 3|]) then failwith (Printf.sprintf "Number of components to rotate cannot be greater \ than write-n, and must be either 0, 2 or 3."); (* Once we have eigenvalues and eigenvectors, this will project the data * and write. *) let write_results vals vects prefix = (* Only want to keep as many of the results as were asked for in --write-n *) let write_keep arr = Array.sub arr 0 write_n in let (vals, vects) = (write_keep vals, write_keep vects) in let combol = (List.combine (Array.to_list vals) (Array.to_list vects)) and names = (List.map Placerun.get_name prl) in let edge_combol = (List.combine (Array.to_list result.eval) (Array.to_list result.edge_evect)) in Phyloxml.named_gtrees_to_file (prefix^".xml") (List.map (fun (vals, vects) -> (Some (string_of_float vals), self#heat_tree_of_float_arr t vects |> self#maybe_numbered)) edge_combol); Guppy_pca.save_named_fal (prefix^".trans") (List.map (fun (vals, vects) -> (string_of_float vals, vects)) combol); (* Guppy_pca.save_named_fal (prefix^".edgetrans") (List.map (fun (eval, evect) -> (string_of_float eval, evect)) edge_combol) *) (* Below: Take the dot product of each aggregated inner term of eq:ufl with the principal component vector. This is the same as multiplying on the right by the matrix whose columns are the principal components. *) Guppy_pca.save_named_fal (prefix^".proj") (List.combine names (List.map (fun d -> Array.map (Pca.dot d) vects) (Array.to_list (Gsl_matrix.to_arrays data.ufl)))) in write_results result.eval result.evect prefix; if som <> 0 then try let (rot_vals, rot_vects) = Som.som_rotation result.evect som result.eval in write_results rot_vals rot_vects (prefix^".som") with | Som.MinimizationError -> Printf.eprintf "There was a problem with the minimization routine. \ Please either try --som 2 or --som 0\n" | e -> raise e end pplacer-1.1.alpha19/pplacer_src/guppy_mcl.ml000066400000000000000000000036631303154601500210730ustar00rootroot00000000000000open Subcommand open Guppy_cmdobjs open Ppatteries let of_pql ?inflation criterion pql = let pqa = Array.of_list pql in let name_map = Enum.combine (Array.enum pqa |> Enum.map Pquery.name, Enum.range 0) |> StringMap.of_enum in let count = StringMap.cardinal name_map in let arrays = Array.init count (fun _ -> [||]) in let insert idx v = arrays.(idx) <- Array.append arrays.(idx) [|v|] in Mass_overlap.of_pql criterion pql |> Enum.iter (fun (n1, n2, v) -> let i = StringMap.find n1 name_map and j = StringMap.find n2 name_map in insert i (j, v); insert j (i, v)); Mcl.mcl ?inflation arrays |> Array.map (Array.map (Array.get pqa)) let islands_of_pql ?inflation criterion pql = of_pql ?inflation criterion pql |> Array.enum |> Enum.map (fun pqa -> IntSet.empty, Array.to_list pqa) |> List.of_enum class cmd () = object (self) inherit subcommand () as super inherit placefile_cmd () as super_placefile inherit tabular_cmd () as super_tabular inherit mass_cmd ~point_choice_allowed:false () as super_mass val inflation = flag "--inflation" (Needs_argument ("", "If specified, pass this as the inflation value to MCL.")) method specl = super_tabular#specl @ super_mass#specl @ [float_flag inflation] method desc = "cluster pqueries using Markov clustering via MCL" method usage = "usage: mcl [options] placefile" method private placefile_action = function | [pr] -> Placerun.get_pqueries pr |> of_pql ?inflation:(fvo inflation) self#criterion |> Array.enum |> Enum.mapi (fun e arr -> Array.enum arr |> Enum.map (fun pq -> [Pquery.name pq; string_of_int e])) |> Enum.flatten |> List.of_enum |> List.cons ["pquery"; "cluster"] |> self#write_ll_tab | l -> List.length l |> Printf.sprintf "mcl takes exactly one placefile (%d given)" |> failwith end pplacer-1.1.alpha19/pplacer_src/guppy_merge.ml000066400000000000000000000026311303154601500214110ustar00rootroot00000000000000open Ppatteries open Subcommand open Guppy_cmdobjs class cmd () = object (self) inherit subcommand () as super inherit placefile_cmd () as super_placefile inherit output_cmd () as super_output val split_csv = flag "--split-csv" (Needs_argument ("", "Write out a csv file indicating the source of each read in the combined placefile.")) method specl = super_output#specl @ [string_flag split_csv] method desc = "merges placefiles together" method usage = "usage: merge [options] placefiles" method private placefile_action = function | [] -> failwith "merge takes at least one placefile (zero given)" | prl -> let fname = self#single_file ~default:(File ((Mokaphy_common.cat_names prl) ^ ".jplace")) () in begin match fvo split_csv with | None -> () | Some fname -> let csv_out = open_out fname |> csv_out_channel |> Csv.to_out_obj in List.enum prl |> Enum.map (fun pr -> let pr_name = Placerun.get_name pr in Placerun.get_pqueries pr |> List.enum |> Enum.map (Pquery.namel %> List.enum) |> Enum.flatten |> Enum.map (fun name -> [name; pr_name])) |> Enum.flatten |> Enum.iter (Csv.output_record csv_out) end; let combined = List.reduce (Placerun.combine "") prl in self#write_placefile fname combined end pplacer-1.1.alpha19/pplacer_src/guppy_mft.ml000066400000000000000000000042051303154601500210770ustar00rootroot00000000000000open Ppatteries open Subcommand open Guppy_cmdobjs class cmd () = object (self) inherit subcommand () as super inherit output_cmd () as super_output inherit placefile_cmd () as super_placefile val unitize = flag "--unitize" (Plain (false, "Make total unit mass per placerun by multiplying with a scalar.")) val transform = flag "--transform" (Plain ("", "A transform to apply to the read multiplicities before calculating. \ Options are 'log', 'unit', 'asinh', and 'no_trans'. Default is no transform.")) val leaf_values = flag "--leaf-values" (Needs_argument ("", "Name of CSV file giving values for the leaves of the tree to use in independent contrasts.")) method specl = super_output#specl @ [ toggle_flag unitize; string_flag transform; string_flag leaf_values; ] method desc = "Multi-Filter and Transform placefiles" method usage = "usage: mft [options] placefile[s]" method private placefile_action prl = let prl = prl |> (match fv transform with | "" -> identity | transform -> List.map (Mass_map.transform_of_str transform |> Placerun.transform)) |> (match fvo leaf_values with | None -> identity | Some infile -> Csv.load infile |> List.map (function | [a; b] -> a, float_of_string b | _ -> failwith "malformed copy number csv file") |> StringMap.of_pairlist |> Indep_contrasts.scale_placerun Placement.ml_ratio |> List.map) |> if not (fv unitize) then identity else List.map Placerun.unitize in match self#out_file_or_dir () with | Directory (dir, prefix) -> List.iter (fun pr -> let fname = Filename.concat dir (prefix ^ pr.Placerun.name ^ ".jplace") in self#write_placefile fname pr) prl | File fname -> prl |> List.map Placerun.get_pqueries |> List.flatten |> Placerun.make (Mokaphy_common.list_get_same_tree prl) "" |> self#write_placefile fname | Unspecified -> () end pplacer-1.1.alpha19/pplacer_src/guppy_ograph.ml000066400000000000000000000014631303154601500215740ustar00rootroot00000000000000open Subcommand open Guppy_cmdobjs open Ppatteries class cmd () = object (self) inherit subcommand () as super inherit placefile_cmd () as super_placefile inherit output_cmd () as super_output inherit mass_cmd ~point_choice_allowed:false () as super_mass method specl = super_output#specl @ super_mass#specl method desc = "finds the overlap graph of one or more pqueries" method usage = "usage: ograph [options] placefile" method private placefile_action = function | [pr] -> Placerun.get_pqueries pr |> Mass_overlap.of_pql self#criterion |> Enum.map (Tuple3.uncurry (Printf.sprintf "%s %s %g")) |> File.write_lines (self#single_file ()) | l -> List.length l |> Printf.sprintf "ograph takes exactly one placefile (%d given)" |> failwith end pplacer-1.1.alpha19/pplacer_src/guppy_pca.ml000066400000000000000000000051311303154601500210530ustar00rootroot00000000000000open Ppatteries open Subcommand open Guppy_cmdobjs let save_named_fal fname fal = Csv.save fname (Guppy_splitify.fal_to_strll fal) class virtual pca_cmd () = object (self) inherit subcommand () as super inherit output_cmd ~show_fname:false ~prefix_required:true () as super_output inherit mass_cmd () as super_mass inherit heat_cmd () as super_heat inherit refpkg_cmd ~required:false as super_refpkg inherit placefile_cmd () as super_placefile val write_n = flag "--write-n" (Formatted (5, "The number of principal coordinates to calculate (default is %d).")) val som = flag "--som" (Formatted (0, "The number of dimensions to rotate for support overlap minimization\ (default is %d; options are 0, 2, 3).")) val scale = flag "--scale" (Plain (false, "Scale variances to one before performing principal components.")) val symmv = flag "--symmv" (Plain (false, "Use a complete eigendecomposition rather than power iteration.")) val raw_eval = flag "--raw-eval" (Plain (false, "Output the raw eigenvalue rather than the fraction of variance.")) method specl = super_output#specl @ super_mass#specl @ super_refpkg#specl @ super_heat#specl @ [ int_flag write_n; int_flag som; toggle_flag scale; toggle_flag symmv; toggle_flag raw_eval; ] method private virtual prep_data : 'prl_t -> 'data_t method private virtual check_data : 'data_t -> int -> int method private virtual gen_pca : use_raw_eval:bool -> scale:bool -> symmv:bool -> int -> 'data_t -> 'prl_t -> 'result_t method private virtual post_pca : 'result_t -> 'data_t -> 'prl_t -> unit method private get_ref_tree prl = self#get_rpo_and_tree (List.hd prl) |> snd |> Decor_gtree.add_zero_root_bl method private check_uniqueness fal write_n = let n_unique_rows = List.length (List.sort_unique compare fal) in if n_unique_rows <= 2 then failwith (Printf.sprintf "You have only %d unique row(s) in your data \ after transformation. This is not enough to do PCA." n_unique_rows); if n_unique_rows < write_n then Printf.printf "You have only %d unique rows in your data after \ transformation. Restricting to this number of principal components.\n" n_unique_rows; min n_unique_rows write_n method private placefile_action prl = self#check_placerunl prl; let data = self#prep_data prl in let write_n = self#check_data data (fv write_n) in let result = self#gen_pca ~use_raw_eval:(fv raw_eval) ~scale:(fv scale) ~symmv:(fv symmv) write_n data prl in self#post_pca result data prl end pplacer-1.1.alpha19/pplacer_src/guppy_placemat.ml000066400000000000000000000035431303154601500221030ustar00rootroot00000000000000open Guppy_cmdobjs open Subcommand open Ppatteries class cmd () = object (self) inherit subcommand () as super inherit tabular_cmd () as super_tabular inherit mass_cmd () as super_mass inherit placefile_cmd () as super_placefile method specl = super_tabular#specl @ super_mass#specl method desc = "prints out a pairwise distance matrix between placements" method usage = "usage: placemat [options] placefile" method private placefile_action = function | [pr] -> let dist = Placerun.get_ref_tree pr |> Edge_rdist.build_pairwise_dist |> Edge_rdist.find_pairwise_dist and weighting, criterion = self#mass_opts in let placement_dist p1 p2 = dist (Placement.location p1) (Placement.distal_bl p1) (Placement.location p2) (Placement.distal_bl p2) in let pquery_dist = match weighting with | Mass_map.Point -> fun pq1 pq2 -> placement_dist (Pquery.best_place criterion pq1) (Pquery.best_place criterion pq2) | Mass_map.Spread -> fun pq1 pq2 -> List.cartesian_product (Pquery.place_list pq1) (Pquery.place_list pq2) |> List.map (fun (p1, p2) -> placement_dist p1 p2 *. criterion p1 *. criterion p2) |> List.fsum in let pqa = Array.of_list (Placerun.get_pqueries pr) in Uptri.init (Array.length pqa) (fun i j -> let pq1 = pqa.(i) and pq2 = pqa.(j) in [Pquery.name pq1; Pquery.name pq2; Printf.sprintf "%g" (pquery_dist pq1 pq2)]) |> Uptri.to_array |> Array.to_list |> List.cons ["name1"; "name2"; "distance"] |> self#write_ll_tab | l -> List.length l |> Printf.sprintf "placemat takes exactly one placefile (%d given)" |> failwith end pplacer-1.1.alpha19/pplacer_src/guppy_pmlpca.ml000066400000000000000000000101461303154601500215660ustar00rootroot00000000000000open Ppatteries open Subcommand open Linear_utils open Guppy_cmdobjs (* Multiplication of matrices by diagonal vectors on left and right sides. The * examples below are based on: let vd = Gsl_vector.of_array [|1.; 2.; 3.;|];; let faa = [| [| 2.; 1.; 5.; |]; [| 2.; 4.; 0.; |] |];; *) (* let m = Gsl_matrix.of_arrays faa;; left_diag_mul_mat vd m;; - : Gsl_matrix.matrix = {{2.; 1.; 5.}; {4.; 8.; 0.}} *) let left_diag_mul_mat vd m = for i=0 to (fst (Gsl_matrix.dims m))-1 do Gsl_vector.scale (Gsl_matrix.row m i) vd.{i} done (* let m = Gsl_matrix.of_arrays faa;; right_diag_mul_mat m vd;; - : Gsl_matrix.matrix = {{2.; 2.; 15.}; {2.; 8.; 0.}} *) let right_diag_mul_mat m vd = for i=0 to (fst (Gsl_matrix.dims m))-1 do Gsl_vector.mul (Gsl_matrix.row m i) vd done (* let va = Array.map Gsl_vector.of_array faa;; right_diag_mul_va va vd;; - : Gsl_vector.vector array = [|{2.; 2.; 15.}; {2.; 8.; 0.}|] *) let right_diag_mul_va va vd = Array.iter (fun v -> Gsl_vector.mul v vd) va type epca_result = { eval: float array; evect: float array array } type epca_data = { edge_diff: float array list } class cmd () = object (self) inherit Guppy_pca.pca_cmd () as super_pca inherit splitify_cmd () as super_splitify method specl = super_pca#specl @ super_splitify#specl method desc = "performs poor-man's length principal components" method usage = "usage: pmlpca [options] placefiles" method private prep_data prl = let weighting, criterion = self#mass_opts in let edge_diff = List.map (self#splitify_placerun_nx weighting criterion) prl in { edge_diff } method private check_data data write_n = let fal = data.edge_diff in self#check_uniqueness fal write_n method private gen_pca ~use_raw_eval ~scale ~symmv write_n data prl = let _ = use_raw_eval in let faa_z = Gsl_matrix.of_arrays (Array.of_list data.edge_diff) in let n_samples, n_edges = Gsl_matrix.dims faa_z in let tmp = Gsl_matrix.create n_edges n_samples in Gsl_matrix.transpose tmp faa_z; for i=0 to n_edges-1 do let col = Gsl_matrix.row tmp i in Gsl_vector.add_constant col (-. Lpca.vec_mean col); done; Gsl_matrix.transpose faa_z tmp; let inv_sqrt_smo = 1. /. (sqrt (float (n_samples - 1))) in Gsl_matrix.scale faa_z inv_sqrt_smo; let faa = Gsl_matrix.to_arrays faa_z in let m = Pca.covariance_matrix ~scale faa and d = Gsl_vector.create ~init:0. n_edges and ref_tree = self#get_ref_tree prl in for i=0 to n_edges-1 do d.{i} <- (Gtree.get_bl ref_tree i); done; (* The trick for diagonalizing matrices of the form GD, where D is * diagonal. See diagd.ml for notes. *) let d_root = vec_map sqrt d in left_diag_mul_mat d_root m; right_diag_mul_mat m d_root; let (l, u) = (if symmv then Pca.symmv_eigen else Pca.power_eigen) write_n m in (* If we were just going for the eigenvects of GD then this would be a * right multiplication of the inverse of the diagonal matrix d_root. * However, according to length PCA we must multiply on the right by d, * which ends up just being right multiplication by d_root. *) right_diag_mul_va u d_root; { eval = l; evect = Array.map Gsl_vector.to_array u } method private post_pca result data prl = let combol = (List.combine (Array.to_list result.eval) (Array.to_list result.evect)) and prefix = self#single_prefix ~requires_user_prefix:true () and ref_tree = self#get_ref_tree prl and names = List.map Placerun.get_name prl in Phyloxml.named_gtrees_to_file (prefix^".xml") (List.map (fun (eval, evect) -> (Some (string_of_float eval), self#heat_tree_of_float_arr ref_tree evect |> self#maybe_numbered)) combol); Guppy_pca.save_named_fal (prefix^".rot") (List.map (fun (eval, evect) -> (string_of_float eval, evect)) combol); Guppy_pca.save_named_fal (prefix^".trans") (List.combine names (List.map (fun d -> Array.map (Pca.dot d) result.evect) data.edge_diff)); Guppy_pca.save_named_fal (prefix^".edgediff") (List.combine names data.edge_diff) end pplacer-1.1.alpha19/pplacer_src/guppy_rarefact.ml000066400000000000000000000053021303154601500220770ustar00rootroot00000000000000open Subcommand open Guppy_cmdobjs open Ppatteries class cmd () = object (self) inherit subcommand () as super inherit mass_cmd ~point_choice_allowed:false () as super_mass inherit placefile_cmd () as super_placefile inherit tabular_cmd () as super_tabular val variance = flag "--variance" (Plain (false, "Calculate variance of phylogenetic entropy.")) val weight_as_count = flag "--weight-as-count" (Plain (false, "Interpret (integer) weights on pqueries as counts.")) val k_max = flag "-k" (Needs_argument ("k max", "The highest value of k to calculate.")) method specl = super_mass#specl @ super_tabular#specl @ [ toggle_flag variance; toggle_flag weight_as_count; int_flag k_max; ] method desc = "calculates phylogenetic rarefaction curves" method usage = "usage: rarefact [options] placefile" method private placefile_action = function | [] -> failwith "rarefact takes more than one placefile (0 given)" | prl -> let k_max = fvo k_max in let criterion = self#criterion in let aux pr = let pr = if fv weight_as_count then Placerun.duplicate_pqueries_by_count pr else pr in let is_uniform_mass = Placerun.get_pqueries pr |> List.map (Pquery.namlom |- List.map snd) |> List.flatten |> List.sort_unique (<~>) |> List.length |> (=) 1 and fmt = Printf.sprintf "%g" and pr_name = Placerun.get_name pr in if not is_uniform_mass then begin if fv variance then failwith (Printf.sprintf "not all sequences in %s have uniform weight; variance can't \ be calculated" pr_name); deprintf "warning: not all sequences in %s have uniform weight; \ expectation of quadratic entropy can't be calculated\n" pr_name; end; Rarefaction.of_placerun criterion ?k_max pr |> Enum.map (fun (k, um, rm, qm) -> [pr_name; string_of_int k; fmt um; fmt rm] @ (if is_uniform_mass then [fmt qm] else [""])) |> begin if fv variance then curry Enum.combine (Rarefaction.variance_of_placerun criterion ?k_max pr) |- Enum.map (fun ((_, uv, rv), sl) -> sl @ [fmt uv; fmt rv]) else identity end |> List.of_enum in List.map aux prl |> List.flatten |> List.cons (["placerun"; "k"; "unrooted_mean"; "rooted_mean"; "quadratic_mean"] @ (if fv variance then ["unrooted_variance"; "rooted_variance"] else [])) |> self#write_ll_tab; end pplacer-1.1.alpha19/pplacer_src/guppy_rarefy.ml000066400000000000000000000046721303154601500216110ustar00rootroot00000000000000open Subcommand open Guppy_cmdobjs open Ppatteries let rarefy sample pqa = let multi_arr = Array.range pqa |> Enum.map (fun i -> Pquery.namlom pqa.(i) |> List.enum |> Enum.map (const i &&& identity)) |> Enum.flatten |> Array.of_enum in let p = Array.map (snd %> snd) multi_arr in sample ~p |> Array.fold_lefti (fun accum j -> function | 0 -> accum | count -> let i, (name, _) = multi_arr.(j) in IntMap.add_listly i (name, float_of_int count) accum) IntMap.empty |> IntMap.enum |> Enum.fold (fun accum (i, namlom) -> Pquery.set_namlom pqa.(i) namlom :: accum) [] let verify_inty f = if not (mod_float f 1. =~ 0.) then failwith "--weight-as-count requires integer counts on pqueries" let multivariate_hypergeometric_sample rng ~n ~p = Array.iter verify_inty p; let src = Array.map round p in let sum = Array.reduce (+) src in if n > sum then failwith (Printf.sprintf "can't sample %d elements out of %d" n sum); let src = Array.map float_of_int src in let dst = Array.map (const 0) p in 0 --^ n |> Enum.iter (fun _ -> let i = Gsl_randist.discrete rng (Gsl_randist.discrete_preproc src) in src.(i) <- src.(i) -. 1.; dst.(i) <- succ dst.(i)); dst class cmd () = object (self) inherit subcommand () as super inherit placefile_cmd () as super_placefile inherit output_cmd () as super_output inherit rng_cmd () as super_rng val n_taken = flag "-n" (Needs_argument ("n_taken", "The number of pqueries to keep per placefile.")) val weight_as_count = flag "--weight-as-count" (Plain (false, "Interpret (integer) weights on pqueries as counts and sample without replacement.")) method specl = super_output#specl @ super_rng#specl @ [ int_flag n_taken; toggle_flag weight_as_count; ] method desc = "performs rarefaction on collections of placements" method usage = "usage: rarefy [options] placefile" method private placefile_action prl = let sample_fun = if fv weight_as_count then multivariate_hypergeometric_sample else Gsl_randist.multinomial in let sample = sample_fun self#rng ~n:(fv n_taken) and gt = Mokaphy_common.list_get_same_tree prl in List.map (Placerun.get_pqueries %> Array.of_list %> rarefy sample) prl |> List.flatten |> Placerun.make gt "" |> self#write_placefile (self#single_file ()) end pplacer-1.1.alpha19/pplacer_src/guppy_redup.ml000066400000000000000000000037651303154601500214420ustar00rootroot00000000000000open Ppatteries open Subcommand open Guppy_cmdobjs let white_regexp = Str.regexp "[ \t]+" class cmd () = object (self) inherit subcommand () as super inherit output_cmd () as super_output inherit placefile_cmd () as super_placefile val dupfile = flag "-d" (Needs_argument ("dupfile", "The dedup file to use to restore duplicates.")) val multi_dupfile = flag "-m" (Plain (false, "If specified, redup with counts instead of a name list.")) val as_mass = flag "--as-mass" (Plain (false, "If specified, add mass instead of names to each pquery.")) method specl = super_output#specl @ [ string_flag dupfile; toggle_flag multi_dupfile; toggle_flag as_mass; ] method desc = "restores duplicates to deduped placefiles" method usage = "usage: redup -d dupfile placefile" method private placefile_action = function | [pr] -> let pr' = if fv multi_dupfile then let sequence_tbl = Hashtbl.create 1024 in let f = function | [canon; rep; count] -> Hashtbl.add sequence_tbl canon (rep, float_of_string count) | _ -> failwith ("Found a row without three columns in: "^(fv dupfile)) in fv dupfile |> open_in |> csv_in_channel |> Csv.of_in_obj |> Csv.iter ~f; Placerun.redup sequence_tbl pr else let sequence_tbl = Hashtbl.create 1024 in fv dupfile |> File.lines_of |> Enum.map (Str.split white_regexp |- (List.hd &&& identity)) |> Enum.iter (fun (k, vs) -> List.iter (identity &&& const 1. |- Hashtbl.add sequence_tbl k) vs); Placerun.redup ~as_mass:(fv as_mass) sequence_tbl pr in self#write_placefile (self#single_file ()) pr' | l -> List.length l |> Printf.sprintf "redup takes exactly one placefile (%d given)" |> failwith end pplacer-1.1.alpha19/pplacer_src/guppy_round.ml000066400000000000000000000071441303154601500214450ustar00rootroot00000000000000open Subcommand open Guppy_cmdobjs open Ppatteries (* Note that this version of rounded placements does not take the likelihood * weight ratio into account. However, we do preserve the order of appearance of * edges in the rounded pquery, which does maintain some of that information. * Furthermore, branch lengths must be similar. *) type rounded_placement = { location: int; distal_bl: float; pendant_bl: float; } let rounded_placement_of_placement multiplier p = let round = match multiplier with | Some mult -> fun x -> float_of_int (round (mult *. x)) | None -> fun x -> x in { location = p.Placement.location; distal_bl = round p.Placement.distal_bl; pendant_bl = round p.Placement.pendant_bl; } type rounded_pquery = rounded_placement list (* compare first by descending ml ratio, then arbitrary *) let compare_by_ml_ratio x y = match compare x.Placement.ml_ratio y.Placement.ml_ratio with | 0 -> compare x y | ml_cmp -> - ml_cmp (* Round after filtering the ones that don't make the ML ratio cutoff. * We sort here to make sure that they are in ml_ratio descending order. *) let rounded_pquery_of_pquery cutoff multiplier pq = List.map (rounded_placement_of_placement multiplier) (List.sort compare_by_ml_ratio (List.filter (fun p -> p.Placement.ml_ratio >= cutoff) pq.Pquery.place_list)) module RPQMap = Map.Make (struct type t = rounded_pquery let compare = Pervasives.compare end) let add_listly k v m = if RPQMap.mem k m then RPQMap.add k (v::(RPQMap.find k m)) m else RPQMap.add k [v] m (* given a list of pqueries, we round them, then cluster the pqueries which are * identical after the rounding step. *) let round_pquery_list cutoff sig_figs pql = if sig_figs < 0 then invalid_arg "round_pquery_list"; let multiplier = match sig_figs with | 0 -> None | f -> Some (int_pow 10. f) in (* collect placements together using a map *) let m = List.fold_left (fun m pq -> add_listly (rounded_pquery_of_pquery cutoff multiplier pq) pq m) RPQMap.empty pql in (* take the first placement in the collected list, and give it all of the * names associated with the other pqueries *) List.map (fun pql -> List.map Pquery.namlom pql |> List.flatten |> Pquery.set_namlom (List.hd pql)) (RPQMap.fold (fun _ v l -> (List.rev v)::l) m []) (* the clustered ones *) let round_placerun cutoff sig_figs out_name pr = {pr with Placerun.pqueries = round_pquery_list cutoff sig_figs (pr.Placerun.pqueries); name = out_name;} (* UI-related *) class cmd () = object (self) inherit subcommand () as super inherit output_cmd ~show_fname:false () as super_output inherit placefile_cmd () as super_placefile val sig_figs = flag "--sig-figs" (Formatted (3, "Set the number of significant figures used for rounding. Specify 0 for no rounding. Default: %d.")) val cutoff = flag "--cutoff" (Formatted (0.01, "Set the rounding inclusion cutoff for the ML weight ratio. Default: %g.")) method specl = super_output#specl @ [ int_flag sig_figs; float_flag cutoff; ] method desc = "clusters the placements by rounding branch lengths" method usage = "usage: round [options] placefile[s]" method private placefile_action prl = let prefix = self#single_prefix () and round_placerun = round_placerun (fv cutoff) (fv sig_figs) in List.iter (fun pr -> let out_name = (prefix^(pr.Placerun.name)) in self#write_placefile (out_name^".jplace") (round_placerun out_name pr)) prl end pplacer-1.1.alpha19/pplacer_src/guppy_sing.ml000066400000000000000000000046501303154601500212550ustar00rootroot00000000000000open Subcommand open Guppy_cmdobjs open Ppatteries let sing_tree weighting criterion mass_width ref_tree pquery = let pqname = String.concat "_" (Pquery.namel pquery) in match weighting with | Mass_map.Spread -> Gtree.add_subtrees_by_map ref_tree (IntMap.of_pairlist_listly (List.mapi (fun num p -> let mass = criterion p in (Placement.location p, (Placement.distal_bl p, Visualization.make_zero_leaf [ Decor.red; Decor.width (mass_width *. mass); ] (Placement.pendant_bl p) (Printf.sprintf "%s_#%d_M=%g" pqname num mass), Visualization.decor_bark_of_bl))) (Pquery.place_list pquery))) | Mass_map.Point -> let p = Pquery.best_place criterion pquery in Gtree.add_subtrees_by_map ref_tree (IntMap.of_pairlist_listly [Placement.location p, (Placement.distal_bl p, Visualization.make_zero_leaf [ Decor.red; ] (Placement.pendant_bl p) (Printf.sprintf "%s" pqname), Visualization.decor_bark_of_bl)]) let sing_trees weighting criterion mass_width ref_tree placed_pquery_list = List.map (sing_tree weighting criterion mass_width ref_tree) placed_pquery_list class cmd () = object (self) inherit subcommand () as super inherit output_cmd () as super_output inherit mass_cmd () as super_mass inherit placefile_cmd () as super_placefile inherit fat_cmd () as super_fat inherit! classic_viz_cmd () as super_classic_viz method specl = super_mass#specl @ super_output#specl @ super_fat#specl @ super_classic_viz#specl method desc = "makes one tree for each query sequence, showing uncertainty" method usage = "usage: sing [options] placefile[s]" method private placefile_action prl = let weighting, criterion = self#mass_opts in let mass_width = self#multiplier_of_abs_tot 1. in let trees = List.map (fun pr -> Placerun.get_name pr, sing_trees weighting criterion mass_width (self#decor_ref_tree pr) (List.filter Pquery.is_placed (Placerun.get_pqueries pr))) prl in self#write_trees ".sing" trees (self#out_file_or_dir ()) end pplacer-1.1.alpha19/pplacer_src/guppy_splitify.ml000066400000000000000000000030141303154601500221510ustar00rootroot00000000000000open Subcommand open Guppy_cmdobjs open Ppatteries (* *** splitify *** *) let fal_to_strll fal = List.map (fun (name, v) -> name::(List.map string_of_float (Array.to_list v))) fal let save_out_named_fal ch fal = csv_out_channel ch |> Csv.to_out_obj |> flip Csv.output_all (fal_to_strll fal) class cmd () = object (self) inherit subcommand () as super inherit output_cmd () as super_output inherit mass_cmd () as super_mass inherit placefile_cmd () as super_placefile inherit splitify_cmd () as super_splitify val! epsilon = flag "--epsilon" (Needs_argument ("", "The epsilon to use to determine if a split matrix's column \ is constant for filtering. default: no filtering")) method specl = super_output#specl @ super_mass#specl @ super_splitify#specl method desc = "writes out differences of masses for the splits of the tree" method usage = "usage: splitify [options] placefile(s)" method private maybe_filter_constant_columns = match fvo epsilon with | None -> identity | Some _ -> self#filter_constant_columns %> Tuple3.first method private placefile_action prl = let weighting, criterion = self#mass_opts in let data = List.map (self#splitify_placerun weighting criterion) prl and names = (List.map Placerun.get_name prl) in let data' = self#filter_rep_edges prl data |> Tuple3.first |> self#maybe_filter_constant_columns in save_out_named_fal self#out_channel (List.combine names data') end pplacer-1.1.alpha19/pplacer_src/guppy_squash.ml000066400000000000000000000176121303154601500216230ustar00rootroot00000000000000(* This is where squash clustering actually gets used. * * Note that in the definition below, the objects being clustered are * pairs of a number list and a pre. This means that identical pres * don't get lost when we use them as keys. *) open Ppatteries open Subcommand open Guppy_cmdobjs open Squashfunc let round_sig_figs = 3 let round_cutoff = 0.01 let cluster_tree_name = "cluster.tre" let mass_trees_dirname = "mass_trees" module NPreBlob = struct type t = int list * Mass_map.Pre.t let compare = Pervasives.compare let merge (l1, p1) (l2, p2) = (l1 @ l2, p1 @ p2) end module NPreSquash = Squash (NPreBlob) let classify_mode_str = function | "unit" -> Tax_gtree.of_refpkg_unit | "inv" -> Tax_gtree.of_refpkg_inverse | s -> failwith ("unknown tax cluster mode: "^s) let t_prel_of_prl weighting criterion prl = (Mokaphy_common.list_get_same_tree prl |> Newick_gtree.add_zero_root_bl, List.map (Mass_map.Pre.of_placerun weighting criterion) prl) let tax_t_prel_of_prl tgt_fun weighting criterion rp prl = let (taxt, ti_imap) = tgt_fun rp in (taxt, List.map (Mokaphy_common.make_tax_pre taxt weighting criterion ti_imap) prl) let mkdir path = try Unix.mkdir path 0o755 with | Unix.Unix_error (Unix.EEXIST, _, _) -> () (* # numberize [5;4;3];; - : (int list * int) list = [([0], 5); ([1], 4); ([2], 3)] *) let numberize l = (flip List.cons [] %> curry identity |> List.mapi) l (* Note that denom_f is a function that gives us a denominator to normalize by * when calculating branch lengths, i.e. the setting of the --normalize flag. * Called denom here to avoid confusion with the normalization of the mass. *) let make_cluster p denom_f weighting criterion refpkgo mode_str prl = let namel = List.map Placerun.get_name prl and distf denom rt ~x1 ~x2 (_,b1) (_,b2) = (Kr_distance.dist_of_pres p rt ~x1 ~x2 ~pre1:b1 ~pre2:b2) /. denom and normf (_,a) = 1. /. (Mass_map.Pre.total_mass a) in let (rt, prel) = t_prel_of_prl weighting criterion prl and prep prel = List.combine namel (numberize (List.map Mass_map.Pre.normalize_mass prel)) in let (drt, (cluster_t, numbered_blobim)) = if mode_str = "" then begin (* phylogenetic clustering *) let denom = denom_f (rt :> Newick_gtree.t) in (Decor_gtree.of_newick_gtree rt, NPreSquash.of_named_blobl (distf denom rt) normf (prep prel)) end else (* taxonomic clustering *) match refpkgo with | None -> failwith "taxonomic clustering requested but no reference package supplied" | Some rp -> begin let (taxt, tax_prel) = tax_t_prel_of_prl (classify_mode_str mode_str) weighting criterion rp prl in let denom = denom_f (taxt :> Newick_gtree.t) in (taxt, NPreSquash.of_named_blobl (distf denom taxt) normf (prep tax_prel)) end in (drt, cluster_t, IntMap.map snd numbered_blobim) class cmd () = object (self) inherit subcommand () as super inherit mass_cmd () as super_mass inherit refpkg_cmd ~required:false as super_refpkg inherit rng_cmd () as super_rng inherit fat_cmd () as super_fat inherit placefile_cmd () as super_placefile inherit output_cmd ~show_fname:false () as super_output inherit kr_cmd () as super_kr inherit normalization_cmd () as super_normalization val nboot = flag "--bootstrap" (Plain (0, "the number of bootstrap replicates to run")) val children = flag "-j" (Formatted (2, "The number of processes to spawn to do bootstrapping. default: %d")) val tax_cluster_mode = flag "--tax-cluster" (Plain ("", "Perform taxonomic clustering rather than phylogenetic.\ Specify \"unit\" or \"inv\" for the two different modes.")) val round = flag "--pre-round" (Plain (false, Printf.sprintf "Apply rounding with %d sig figs and cutoff %g to each placerun before clustering" round_sig_figs round_cutoff)) val unitize = flag "--unitize" (Plain (false, "Unitize masses after bootstrap resampling")) method specl = super_mass#specl @ super_refpkg#specl @ super_rng#specl @ super_fat#specl @ super_output#specl @ super_kr#specl @ super_normalization#specl @ [ int_flag nboot; int_flag children; string_flag tax_cluster_mode; toggle_flag round; toggle_flag unitize; ] method desc = "performs squash clustering" method usage = "usage: squash [options] placefiles" method private write_pre_tree prefix infix drt pre = let tot = Mass_map.Pre.total_mass pre in assert(tot > 0.); let tree_name = prefix^"."^infix in let massm = (Mass_map.By_edge.of_pre ~factor:(1. /. tot) pre) in Phyloxml.named_gtree_to_file (tree_name ^ ".fat.xml") (tree_name ^ ".fat") (self#fat_tree_of_massm drt massm) method private placefile_action prl = let weighting, criterion = self#mass_opts and refpkgo = self#get_rpo and mode_str = fv tax_cluster_mode and zero_pad_int width i = String_matrix.pad_to_width '0' width (string_of_int i) and p = fv p_exp and denom_f = self#get_normalization in let our_make_cluster refpkgo mode_str prl = let maybe_round pr = if fv round then Guppy_round.round_placerun round_cutoff round_sig_figs pr.Placerun.name pr else pr in make_cluster p denom_f weighting criterion refpkgo mode_str (List.map maybe_round prl) in let path = (^) (self#single_prefix ()) in let nboot = fv nboot and unitize = fv unitize in self#check_placerunl prl; if 0 = nboot then begin (* bootstrap turned off *) let (drt, cluster_t, blobim) = our_make_cluster refpkgo mode_str prl in Newick_gtree.to_file cluster_t (path cluster_tree_name); let outdir = path mass_trees_dirname in mkdir outdir; let pad_width = find_zero_pad_width (IntMap.cardinal blobim) in let prefix_of_int i = Filename.concat outdir (zero_pad_int pad_width i) in (* make a tax tree here then run mimic on it *) let wpt infix t i = self#write_pre_tree (prefix_of_int i) infix t in let run_non_tax () = IntMap.iter (wpt "phy" (self#maybe_numbered drt)) blobim in match refpkgo with | None -> run_non_tax () | Some rp -> try (* use a tax-labeled ref tree. Note that we've already run check_refpkgo_tree *) let tdrt = Refpkg.get_tax_ref_tree rp in IntMap.iter (wpt "phy" (self#maybe_numbered tdrt)) blobim; let (taxt, tax_prel) = tax_t_prel_of_prl Tax_gtree.of_refpkg_unit weighting criterion rp prl in let tax_blobim = IntMap.map snd (NPreSquash.mimic cluster_t (numberize tax_prel)) in IntMap.iter (wpt "tax" taxt) tax_blobim with | Placement.No_classif -> begin print_endline "Warning: taxonomic squash tree skipped because \ some placements missing taxonomic information."; run_non_tax () end end else begin let pad_width = find_zero_pad_width nboot and rng = self#rng and children = fv children and boots = List.of_enum (1--nboot) in let boot_placerun = match unitize with | true -> Bootstrap.boot_placerun rng |- Placerun.unitize | false -> Bootstrap.boot_placerun rng in let run_boot i = let boot_prl = List.map boot_placerun prl in let (_, cluster_t, _) = our_make_cluster refpkgo mode_str boot_prl in Newick_gtree.to_file cluster_t (path ("cluster."^(zero_pad_int pad_width i)^".tre")); dprintf "Finished bootstrap %s/%d\n" (zero_pad_int pad_width i) (List.length boots); in match children with | 1 -> List.iter run_boot boots | _ -> Multiprocessing.iter ~children run_boot boots end end pplacer-1.1.alpha19/pplacer_src/guppy_to_csv.ml000066400000000000000000000025031303154601500216050ustar00rootroot00000000000000open Ppatteries open Subcommand open Guppy_cmdobjs class cmd () = object (self) inherit subcommand () as super inherit placefile_cmd () as super_placefile inherit tabular_cmd ~default_to_csv:true () as super_tabular inherit mass_cmd () as super_mass method specl = super_tabular#specl @ super_mass#specl method desc = "turns a placefile into a csv file" method usage = "usage: to_csv [options] placefile[s]" method private placefile_action prl = let weighting, criterion = self#mass_opts and format = Printf.sprintf "%g" in flip List.map prl (fun pr -> let pr_name = Placerun.get_name pr in Placerun.get_pqueries pr |> List.map (fun pq -> (match weighting with | Mass_map.Spread -> Pquery.place_list pq | Mass_map.Point -> [Pquery.best_place criterion pq]) |> List.cartesian_product (Pquery.namlom pq) |> List.map (fun ((name, weight), pq) -> [pr_name; name; format weight] @ (Placement.to_csv_strl pq))) |> List.flatten) |> List.flatten |> List.cons ["origin"; "name"; "multiplicity"; "edge_num"; "like_weight_ratio"; "post_prob"; "likelihood"; "marginal_like"; "distal_length"; "pendant_length"; "classification"; "map_ratio"; "map_overlap"; "map_identity"] |> self#write_ll_tab end pplacer-1.1.alpha19/pplacer_src/guppy_to_json.ml000066400000000000000000000007331303154601500217660ustar00rootroot00000000000000open Subcommand open Guppy_cmdobjs class cmd () = object (self) inherit subcommand () as super inherit placefile_cmd () as super_placefile method specl = [] method desc = "converts old-style .place files to .jplace placement files" method usage = "usage: to_json placefile[s]" method private placefile_action prl = List.iter (fun pr -> let out_name = (pr.Placerun.name ^ ".jplace") in self#write_placefile out_name pr) prl end pplacer-1.1.alpha19/pplacer_src/guppy_to_rdp.ml000066400000000000000000000053751303154601500216110ustar00rootroot00000000000000open Ppatteries open Subcommand open Guppy_cmdobjs let gap_regexp = Str.regexp "-" let tax_name_regexp = Str.regexp "[ ;()]" let get_mothur_name td tid = let name = Tax_taxonomy.get_tax_name td tid in Printf.sprintf "%s_%s" (Tax_id.to_string tid) (Str.global_replace tax_name_regexp "_" name) class cmd () = object (self) inherit subcommand () as super inherit output_cmd ~prefix_required:true () as super_output inherit refpkg_cmd ~required:true as super_refpkg val included_ranks = flag "-r" (Plain ([], "Ranks to include in the annotated fasta file. Can be comma-separated.")) method specl = super_output#specl @ super_refpkg#specl @ [delimited_list_flag included_ranks] method desc = "convert a reference package to a format RDP wants" method usage = "usage: to_rdp -c my.refpkg -o prefix" method private action _ = let rp = self#get_rp in let tax = Refpkg.get_taxonomy rp in let included = fv included_ranks |> List.map (fun rk -> Array.findi ((=) rk) tax.Tax_taxonomy.rank_names) |> List.sort compare in if List.is_empty included then failwith "to_rdp must be passed at least one rank"; let prefix = self#single_prefix ~requires_user_prefix:true () in let seqinfo = Refpkg.get_seqinfom rp and aln = Refpkg.get_aln_fasta rp and out_ch = open_out (prefix ^ ".tax") in Array.filter_map (fun (name, seq) -> let tax_id = Tax_seqinfo.tax_id_by_node_label seqinfo name and get_rank = Tax_taxonomy.get_tax_rank tax in let rec aux tax_pairs backlog tax_ids ranks = match tax_ids, ranks, backlog with | i :: il, j :: jl, _ when get_rank i = j -> aux ((i, j) :: tax_pairs) [] il jl | i :: il, (j :: _ as jl), _ when get_rank i < j -> aux tax_pairs (i :: backlog) il jl | (i :: _ as il), j :: jl, top :: backlog when get_rank i > j -> aux ((top, j) :: tax_pairs) backlog il jl | _, _, _ -> tax_pairs in let tax_pairs = aux [] [] (Tax_taxonomy.get_lineage tax tax_id) included in if List.length tax_pairs <> List.length included then begin Printf.printf "warning: %s was excluded because it can't be classified \ at all the specified ranks\n" name; None end else begin Printf.fprintf out_ch "%s\t" name; List.iter (fst |- get_mothur_name tax |- Printf.fprintf out_ch "%s;") (List.rev tax_pairs); Printf.fprintf out_ch "\n"; Some (name, Str.global_replace gap_regexp "" seq) end) aln; |> flip Alignment.to_fasta (prefix ^ ".fasta") end pplacer-1.1.alpha19/pplacer_src/guppy_tog.ml000066400000000000000000000053021303154601500211010ustar00rootroot00000000000000open Subcommand open Guppy_cmdobjs open Ppatteries open Visualization (* tog tree *) let tog_tree criterion ref_tree placed_map = tree_by_map (fun _ -> List.map (fun pquery -> let best = Pquery.best_place criterion pquery in let n_names = List.length (Pquery.namel pquery) in let addition = if n_names = 1 then make_zero_leaf [ Decor.red ] (Placement.pendant_bl best) (String.concat "_" (Pquery.namel pquery)) else let tree = Stree.node n_names (0 --^ n_names |> Enum.map Stree.leaf |> List.of_enum) in let decor_map = IntMap.add n_names (new Decor_bark.decor_bark (`Of_bl_node_edge_label_decor (Some (Placement.pendant_bl best), None, None, [Decor.red]))) IntMap.empty in let decor_map = Enum.fold2 (fun i name -> IntMap.add i (new Decor_bark.decor_bark (`Of_bl_node_edge_label_decor (Some 0.0, Some name, None, [Decor.red])))) decor_map (0 --^ n_names) (Pquery.namel pquery |> List.enum) in Gtree.Subtree (Gtree.gtree tree decor_map) in Placement.distal_bl best, addition, decor_bark_of_bl)) ref_tree placed_map class cmd () = object (self) inherit subcommand () as super inherit output_cmd () as super_output inherit mass_cmd ~point_choice_allowed:false () as super_mass inherit placefile_cmd () as super_placefile inherit classic_viz_cmd () as super_classic_viz method specl = super_mass#specl @ super_output#specl @ super_classic_viz#specl method desc = "makes a tree with each of the reads represented as a pendant edge" method usage = "usage: tog [options] placefile[s]" method private placefile_action prl = let criterion = self#criterion in let trees = List.map (fun pr -> let _, placed_map = Pquery.make_map_by_best_loc criterion (Placerun.get_pqueries pr) in Placerun.get_name pr, [ tog_tree criterion (self#decor_ref_tree pr) placed_map ]) prl in self#write_trees ".tog" trees (self#out_file_or_dir ()) end pplacer-1.1.alpha19/pplacer_src/guppy_trim.ml000066400000000000000000000100771303154601500212700ustar00rootroot00000000000000open Subcommand open Guppy_cmdobjs open Ppatteries module I = Mass_map.Indiv let translate_pendant_pql transm pql = List.map (let open Placement in Pquery.apply_to_place_list (List.map (fun p -> match IntMap.Exceptionless.find p.location transm with | None -> p | Some (None, _) -> invalid_arg "translate_pendant_bl" | Some (Some location, bl_boost) -> {p with location; distal_bl = 0.; pendant_bl = bl_boost -. p.distal_bl +. p.pendant_bl}))) pql let trim min_mass rewrite_discarded_mass weighting criterion gt pql = let mass = pql |> Mass_map.Pre.of_pquery_list weighting criterion |> Mass_map.Indiv.of_pre |> IntMap.map (List.fold_left (fun accum {I.mass} -> accum +. mass) 0.) and bl = Gtree.get_bl gt in let rec aux mass_above t = let open Stree in let i = top_id t in let mass_above' = mass_above +. IntMap.get i 0. mass in match t with | Leaf _ when mass_above' >= min_mass -> Some t, IntMap.empty | Leaf _ -> None, IntMap.singleton i (None, bl i) | Node (_, subtrees) -> match List.map (aux mass_above') subtrees |> List.split |> (Tuple2.map (List.filter_map identity) (List.reduce IntMap.union)) with | [], transm -> None, IntMap.map (Tuple.Tuple2.map2 ((+.) (bl i))) transm |> IntMap.add i (None, bl i) | subtrees', transm -> Some (node i subtrees'), IntMap.map (Tuple.Tuple2.map1 (function None -> Some i | x -> x)) transm in let st', pre_transm = Gtree.get_stree gt |> aux 0. in let pql = if not rewrite_discarded_mass then pql else translate_pendant_pql pre_transm pql in let gt', transm = Option.get st' |> Gtree.set_stree gt |> Newick_gtree.consolidate and discarded_reads = RefList.empty () in let add_discarded = List.iter (RefList.add discarded_reads) in List.filter_map (fun pq -> Pquery.place_list pq |> List.filter_map (fun p -> if IntMap.mem (Placement.location p) transm then Some p else None) |> junction List.is_empty (fun _ -> add_discarded (Pquery.namel pq); None) (fun place_list -> Some {pq with Pquery.place_list})) pql |> Pquery.translate_pql transm |> List.map Pquery.renormalize_log_like |> Placerun.make ~transm gt' "", discarded_reads class cmd () = object (self) inherit subcommand () as super inherit mass_cmd () as super_mass inherit placefile_cmd () as super_placefile inherit output_cmd () as super_output val min_path_mass = flag "--min-path-mass" (Formatted (0.001, "The minimum mass which must be on the path to a leaf to keep it. default: %g")) val discarded = flag "--discarded" (Needs_argument ("", "A file to write discarded pqueries to.")) val rewrite_discarded_mass = flag "--rewrite-discarded-mass" (Plain (false, "Move placements which were on discarded leaves to the nearest non-discarded node.")) method specl = super_mass#specl @ super_output#specl @ [ float_flag min_path_mass; string_flag discarded; toggle_flag rewrite_discarded_mass; ] method desc = "trims placefiles down to only containing an informative subset of the mass" method usage = "usage: trim [options] placefile[s]" method private placefile_action prl = let gt = Mokaphy_common.list_get_same_tree prl |> Newick_gtree.add_zero_root_bl and weighting, criterion = self#mass_opts in let pr, discarded_reads = prl |> List.map (Placerun.unitize %> Placerun.get_pqueries) |> List.flatten |> trim (fv min_path_mass) (fv rewrite_discarded_mass) weighting criterion gt in self#write_placefile (self#single_file ()) pr; match fvo discarded with | Some fname -> RefList.enum discarded_reads |> File.write_lines fname | None when RefList.is_empty discarded_reads -> () | None -> dprint "Discarded reads:\n"; RefList.iter (dprintf "%s\n") discarded_reads end pplacer-1.1.alpha19/pplacer_src/guppy_unifrac.ml000066400000000000000000000055311303154601500217430ustar00rootroot00000000000000open Ppatteries open Subcommand open Guppy_cmdobjs let only_one a b = (a && not b) || (b && not a) let unifrac_uptri founds bl = Uptri.init (Array.length founds) (fun i j -> (if only_one founds.(i) founds.(j) then bl else 0.), (if founds.(i) || founds.(j) then bl else 0.)) let pair_sum ut1 ut2 = Uptri.apply_pairwise (fun (a, b) (c, d) -> a +. c, b +. d) ut1 ut2 let update_found founds masses = Array.iteri (fun i m -> if approx_compare m 0. > 0 then founds.(i) <- true) masses let unifrac ref_tree ml = let open Kr_distance in let starter_vec = Array.make (List.length ml) false in let starter_uptri = Uptri.create (Array.length starter_vec) (0., 0.) and kr_map = make_n_kr_map ml in let kr_edge_total id = general_total_along_edge ~merge_r:pair_sum unifrac_uptri (Gtree.get_bl ref_tree id) (IntMap.get id [] kr_map) update_found and merge_founds fl = let ret = Array.copy starter_vec in List.iter (Array.iteri (fun i v -> if v then ret.(i) <- true)) fl; ret in general_total_over_tree kr_edge_total (const ()) ~r_list_sum:(List.fold_left pair_sum starter_uptri) merge_founds ~starter_r_factory:(const starter_uptri) (fun () -> Array.copy starter_vec) (Gtree.get_stree ref_tree) |> Uptri.map (uncurry (/.)) class cmd () = object (self) inherit subcommand () as super inherit placefile_cmd () as super_placefile inherit mass_cmd () as super_mass inherit tabular_cmd () as super_tabular val list_output = flag "--list-out" (Plain (false, "Output the KR results as a list rather than a matrix.")) method specl = super_mass#specl @ super_tabular#specl @ [toggle_flag list_output] method desc = "calculates unifrac on two or more placefiles" method usage = "usage: unifrac 1.jplace 2.jplace [3.jplace [...]]" method private nontrivial_placefile_action prl = let gt = Mokaphy_common.list_get_same_tree prl |> Newick_gtree.add_zero_root_bl and weighting, criterion = self#mass_opts in let ml = List.map (Mass_map.Indiv.of_placerun weighting criterion) prl and names = List.map Placerun.get_name prl |> Array.of_list in let uptri = unifrac gt ml in if fv list_output then begin let res = RefList.empty () in RefList.push res ["sample_1"; "sample_2"; "unifrac"]; Uptri.iterij (fun i j x -> RefList.push res [names.(i); names.(j); Printf.sprintf "%g" x]) uptri; RefList.to_list res |> List.rev |> self#write_ll_tab end else Mokaphy_common.write_named_float_uptri self#out_channel names uptri method private placefile_action prl = match List.length prl with | (0 | 1) as n -> Printf.sprintf "unifrac requires two or more placefiles (%d given)" n |> failwith | _ -> self#nontrivial_placefile_action prl end pplacer-1.1.alpha19/pplacer_src/indep_contrasts.ml000066400000000000000000000140451303154601500222670ustar00rootroot00000000000000(* * Code implementing independent contrasts, a la J Felsenstein, American * Naturalist, 1985. * * The goal is to pre-calculate enough information on a branch such that one can * easily infer a value for a placement. To do this, we will build up maps for * the distal and proxmimal sides of each edge. * * Felsenstein describes a trick on p.10 to add "extra" branch length to the * tree in order to describe an increase of uncertainty brought on by estimating * values rather than having them on hand. Because we will effectively need to * "re-root" easily, we need to separate out the "extra" branch length computed * by his procedure and the original branch length. We will call this extra * branch length "virtual branch length." We will be talking about IC pairs * (x, vbl), where x is the value of interest, and vbl is the virtual branch * length. These IC pairs will be denoted pi, pj, etc. According to (3) of * Felsenstein, and the sentence after, the combination is done as follows * (note that we don't add in the distal branch length $v_k$ in his notation): *) open Ppatteries module IME = IntMap.Exceptionless let actual_combo (xi, vbli) (xj, vblj) = (xi /. vbli +. xj /. vblj) /. (1. /. vbli +. 1. /. vblj), (vbli *. vblj) /. (vbli +. vblj) (* There is also the case of missing values. If a value is missing we can simply * ignore it. *) let binary_opt_extend f oa ob = match (oa, ob) with | (Some a, Some b) -> Some (f a b) | (Some _, None) -> oa | (None, Some _) -> ob | (None, None) -> None let combo = binary_opt_extend actual_combo (* Having extra branch length leaves None as None. *) let bl_sum p bl = match p with | Some (x, bvl) -> Some (x, bvl +. bl) | None -> None (* px is a pair, as above, and bx is a branch length.*) let join_two_subsolns pi bi pj bj = let no_bl b = function | Some (_, vb) -> b +. vb =~ 0. | None -> false in if no_bl bi pi then pi else if no_bl bj pj then pj else combo (bl_sum pi bi) (bl_sum pj bj) (* l is a list of pairs (p1, b1), ..., (pk, bk) that come up from a * multifurcation. Note that we simply consider a multifurcation to be an * internal node of length zero. * * 0 /\ * / \ * /\ \ * / \ \ * p1 p2 p3 * * We don't have to extend the join of p1 and p2 with any branch length before * combining with p3, so this ends up just being * combo (combo (bl_sum p1 b1) (bl_sum p2 b2)) (bl_sum p3 b3) * noting that we didn't have to add anything to the internal combo before the * next step because of the zero branch length. In general, it's just a fold. * *) let join_subsoln_list l = List.enum l |> Enum.map (uncurry bl_sum) |> Enum.reduce combo (* So, to get all of the distal p's, just do a DF recursion across the tree. * The base case for something that is not labeled with a character (e.g. a copy * number) is None, whereas if there is something x given then the base case is * Some (x,0). At every internal node, do a join_subsoln_list. *) let build_distal_map gt leaf_values = let bl = Gtree.get_bl gt in let open Stree in let rec aux = function | Leaf i -> begin match IME.find i leaf_values with | Some x -> (Some (x, 0.), bl i), IntMap.singleton i (x, 0.) | None -> (None, bl i), IntMap.empty end | Node (i, subtrees) -> match List.map aux subtrees |> List.split |> Tuple2.map join_subsoln_list (List.reduce IntMap.union) with | Some sol, map -> (Some sol, bl i), IntMap.add i sol map | None, map -> (None, bl i), map in Gtree.get_stree gt |> aux |> snd |> tap (fun m -> if IntMap.is_empty m then invalid_arg "no relevant leaf values given; check your leaf names") (* Now build a proximal_map using this distal map. * This will be a recursion as follows: say we are at an internal node such that * pp is the proximal pair coming from the previous step of the recursion, and bp * is the branch length connecting this internal node to the proximal part of * the tree. Now, say (p1, b1), ..., (pk, bk) are the distal pairs below us. * * ASCII art, with v and ^ representing subtrees: * * pp * v * | * /|\ * / | \ * ^ ^ ^ * p1 pi pk * proximal p for edge i will skip i and add d at the end: * join_subsoln_list [p1, b1; ...; p(i-1), b(i-1); p(i+1), b(i+1); ...; pk, bk; pp, bp] *) let build_proximal_map gt distal_map = let bl = Gtree.get_bl gt in let open Stree in let top = Gtree.top_id gt in let rec aux accum = function | [] -> accum | Leaf _ :: rest -> aux accum rest | Node (i, subtrees) :: rest -> let prox_edge = if i = top then None else Some (IME.find i accum, bl i) in let accum' = List.fold_left (fun accum t -> let j = top_id t in let sol = List.remove subtrees t |> List.map (top_id |- (flip IME.find distal_map &&& bl)) |> maybe_cons prox_edge |> join_subsoln_list in IntMap.add j (Option.get sol) accum) accum subtrees in aux accum' (List.append rest subtrees) in aux IntMap.empty [Gtree.get_stree gt] let of_criterion_map criterion leaf_copy_map pr = let gt = Placerun.get_ref_tree pr in let dist_cm = Newick_gtree.label_to_leaf_map gt leaf_copy_map |> build_distal_map gt in let prox_cm = build_proximal_map gt dist_cm in let copy_of_placement p = let loc = Placement.location p and length = Placement.distal_bl p in let bl = Gtree.get_bl gt loc in join_two_subsolns (IME.find loc dist_cm) length (IME.find loc prox_cm) (bl -. length) |> Option.get |> fst in List.map (fun pq -> pq, List.map ((criterion &&& copy_of_placement) |- uncurry ( *.)) (Pquery.place_list pq) |> List.fsum) (Placerun.get_pqueries pr) let scale_placerun criterion leaf_copy_map pr = of_criterion_map criterion leaf_copy_map pr |> List.map (fun (pq, x) -> Pquery.namlom pq |> List.map (fun (n, m) -> n, m /. x) |> Pquery.set_namlom pq) |> Placerun.set_pqueries pr pplacer-1.1.alpha19/pplacer_src/integration.ml000066400000000000000000000026541303154601500214160ustar00rootroot00000000000000(* from http://www.gnu.org/software/gsl/manual/gsl-ref.html#Numerical-Integration ... Each algorithm computes an approximation to a definite integral of the form, I = \int_a^b f(x) w(x) dx where w(x) is a weight function (for general integrands w(x)=1). The user provides absolute and relative error bounds (epsabs, epsrel) which specify the following accuracy requirement, |RESULT - I| <= max(epsabs, epsrel |I|) where RESULT is the numerical approximation obtained by the algorithm. The algorithms attempt to estimate the absolute error ABSERR = |RESULT - I| in such a way that the following inequality holds, |RESULT - I| <= ABSERR <= max(epsabs, epsrel |I|) In short, the routines return the first approximation which has an absolute error smaller than epsabs or a relative error smaller than epsrel. Note that this is an either-or constraint, not simultaneous. To compute to a specified absolute error, set epsrel to zero. To compute to a specified relative error, set epsabs to zero. The routines will fail to converge if the error bounds are too stringent, but always return the best approximation obtained up to that stage. *) let value_of_triple (v, _, _) = v (* non-adaptive Gauss-Kronrod integration *) let integrate f a b ~abs_err ~rel_err = Gsl_integration.qng f ~a:a ~b:b ~epsabs:abs_err ~epsrel:rel_err let value_integrate f a b ~abs_err ~rel_err = value_of_triple (integrate f a b ~abs_err ~rel_err) pplacer-1.1.alpha19/pplacer_src/kr_distance.ml000066400000000000000000000176131303154601500213620ustar00rootroot00000000000000(* Here we have the core agorithm, which takes two placement collection lists * and calculates their weighted KR distance. * * Each query is allocated 1/(num queries), and this get broken up by the * different placements according to their weight. Note that if a placement * collection has only one entry (list of length one) then all of the weight * will go onto that placement. This will be true when we are not doing the * weighted version. * * These KR info vectors get totalled as we proceed up the tree, and their * exponentiated difference gets multiplied by the length of the segment without * any placements. This gives the total KR distance. *) open Ppatteries exception Invalid_place_loc of float exception Total_kr_not_zero of float let tol = 1e-10 (* "zero" *) (* the KR exponent is 1/p unless p is less than 1, in which case it's 1 *) let outer_exponent p = if p < 1. then 1. else 1. /. p (* exp_kr_diff is the difference of the two prob dists to the pth pow *) let exp_kr_diff_times_bl p kr_v bl = ((abs_float (kr_v.(0) -. kr_v.(1))) ** p) *. bl (* add v2 to v1 (which is modified in place) *) let v_addto v1 v2 = for i=0 to (Array.length v1)-1 do v1.(i) <- v1.(i) +. v2.(i) done (* take the vector sum of a float array list. no side effects. *) let v_list_sum = function | hd::tl -> let v = Array.copy hd in List.iter (v_addto v) tl; v | [] -> invalid_arg "v_list_sum" (* Total up the info from the previous step. * note that data_sofar will be modified in place. * data_to_r: takes the kr info vector and turns it into a result * merge_r: combine two results * data_info_list: list of (distal_bl, data) *) let general_total_along_edge: ('a -> float -> 'b) -> merge_r:('b -> 'b -> 'b) -> float -> (float * 'c) list -> ('a -> 'c -> unit) -> 'b -> 'a -> 'b * 'a = fun data_to_r ~merge_r bl data_info_list update_data prev_subtot start_data -> let rec aux ~subtotal ~prev_a data_sofar data_info_list = (* next_subtotal actually adds on the segment length times data_to_r of the * kr vector *) let next_subtotal a = let seg_len = a -. prev_a in assert(seg_len >= 0.); data_to_r data_sofar seg_len |> merge_r subtotal in match data_info_list with (* a is the location of the location of the data along the edge *) | (a, data)::rest -> (* we pull this out so that we do the next total, then add on the data * onto the data_sofar *) if a < 0. || a > bl then raise (Invalid_place_loc a); let the_next_subtotal = next_subtotal a in aux ~subtotal:the_next_subtotal ~prev_a:a (update_data data_sofar data; data_sofar) rest | [] -> (* sum things up on final segment to the next node *) (next_subtotal bl, data_sofar) in aux prev_subtot 0. start_data data_info_list (* total some data over the tree, which can be combined from subtrees using * data_list_sum, and can be totaled across edges using curried_edge_total, and * starts at leaves with starter_data_factory. the result starts at * starter_r_factory and is passed to curried_edge_total and totalled across * nodes using r_list_sum. * the reason why we use starter_data_factory rather than doing a fully * functional approach is that then the number of allocations is linear in only * the size of the tree, rather than depending on the number of placements. * *) let general_total_over_tree: (int -> 'b -> 'a -> 'b * 'a) -> ('a -> unit) -> r_list_sum:('b list -> 'b) -> ('a list -> 'a) -> starter_r_factory:(unit -> 'b) -> (unit -> 'a) -> Stree.t -> 'b = fun curried_edge_total check_final_data ~r_list_sum data_list_sum ~starter_r_factory starter_data_factory ref_tree -> let (grand_total, final_data) = Stree.recur (fun id below_list -> (* the node recurrence *) curried_edge_total id (r_list_sum (List.map fst below_list)) (* prev subtot *) (data_list_sum (List.map snd below_list))) (* total of below kr_infos *) (fun id -> (* the leaf recurrence *) curried_edge_total id (starter_r_factory ()) (starter_data_factory ())) ref_tree in check_final_data final_data; grand_total (* woooo eta expansion *) let total_along_edge a b c d e f = general_total_along_edge ~merge_r:(+.) a b c d e f let total_over_tree a b c d e = general_total_over_tree ~r_list_sum:(List.fold_left (+.) 0.) ~starter_r_factory:(const 0.) a b c d e module I = Mass_map.Indiv (* N Indiv.v list IntMaps -> (float * float N-array) list IntMap. * The latter is the input for the KR distance function. *) let make_n_kr_map ml = let ll = List.length ml in let arr e v = let a = Array.make ll 0. in a.(e) <- v; a in List.fold_left (fun (e, accum) cur -> succ e, IntMap.merge (fun _ ao bo -> Option.map_default (List.map (fun {I.distal_bl; I.mass} -> distal_bl, arr e mass)) [] bo |> List.merge (comparing fst) (Option.default [] ao) |> some) accum (I.sort cur)) (0, IntMap.empty) ml |> snd (* Z_p distance between two Indiv mass maps *) let dist ?(normalization=1.) ref_tree p m1 m2 = let starter_kr_v = [|0.; 0.|] and kr_map = make_n_kr_map [m1; m2] in let kr_edge_total id = total_along_edge (exp_kr_diff_times_bl p) (Gtree.get_bl ref_tree id) (IntMap.get id [] kr_map) v_addto (* make sure that the kr_v totals to zero *) and check_final_kr final_kr_v = let final_kr_diff = final_kr_v.(0) -. final_kr_v.(1) in if abs_float final_kr_diff > tol then raise (Total_kr_not_zero final_kr_diff) in ((total_over_tree kr_edge_total check_final_kr v_list_sum (fun () -> Array.copy starter_kr_v) (Gtree.get_stree ref_tree)) /. normalization) ** (outer_exponent p) (* x1 and x2 are factors which get multiplied by the mass before calculation. * By pulling them out like so, we don't have to make new Pres. *) let dist_of_pres ?x1 ?x2 ?(normalization=1.) p t ~pre1 ~pre2 = dist ~normalization t p (Mass_map.Indiv.of_pre ?factor:x1 pre1) (Mass_map.Indiv.of_pre ?factor:x2 pre2) let scaled_dist_of_pres ?(normalization=1.) p t pre1 pre2 = dist_of_pres ~normalization p t ~x1:(1. /. Mass_map.Pre.total_mass pre1) ~x2:(1. /. Mass_map.Pre.total_mass pre2) ~pre1 ~pre2 let uptri_exp_kr_diff_times_bl p kr_v bl = Uptri.init (Array.length kr_v) (fun i j -> ((abs_float (kr_v.(i) -. kr_v.(j))) ** p) *. bl) (* Z_p distance between any number of Indiv mass maps *) let multi_dist ?(normalization=1.) ref_tree p ml = let starter_kr_v = Array.make (List.length ml) 0. in let starter_kr_uptri = Uptri.create (Array.length starter_kr_v) 0. and kr_map = make_n_kr_map ml in let kr_edge_total id = general_total_along_edge ~merge_r:(Uptri.apply_pairwise (+.)) (uptri_exp_kr_diff_times_bl p) (Gtree.get_bl ref_tree id) (IntMap.get id [] kr_map) v_addto (* make sure that every pair of kr_v totals are equal *) and check_final_kr final_kr_v = Array.to_list final_kr_v |> ListFuns.list_iter_over_pairs_of_single (fun x y -> if not (approx_equal x y) then raise (Total_kr_not_zero (x -. y))) in general_total_over_tree kr_edge_total check_final_kr ~r_list_sum:(List.fold_left (Uptri.apply_pairwise (+.)) starter_kr_uptri) v_list_sum ~starter_r_factory:(fun () -> Uptri.copy starter_kr_uptri) (fun () -> Array.copy starter_kr_v) (Gtree.get_stree ref_tree) |> Uptri.map (fun v -> (v /. normalization) ** (outer_exponent p)) let scaled_multi_dist_of_pres ?(normalization=1.) p t prel = multi_dist ~normalization t p (List.map (fun pre -> Mass_map.Indiv.of_pre ~factor:(1. /. Mass_map.Pre.total_mass pre) pre) prel) pplacer-1.1.alpha19/pplacer_src/libpplacercside.clib000066400000000000000000000000321303154601500225050ustar00rootroot00000000000000linear_c.o unix_support.o pplacer-1.1.alpha19/pplacer_src/like_stree.ml000066400000000000000000000114731303154601500212200ustar00rootroot00000000000000(* calculate the distal and proximal likelihood vectors at each site of the * reference tree. *) open Ppatteries open Stree (* below 2^-50 = 1e-15 we pull out the exponent into the int *) let min_allowed_twoexp = -50 module Make (Model: Glvm.Model) = struct module Glv = Model.Glv module Glv_arr = Glv_arr.Make(Model) (* make a map which goes from node number to the associated likelihood vector * for each named node (generally these are assumed to be the leaves) *) let like_aln_map_of_data seq_type align tree = let like_aln = Alignment.like_aln_of_align seq_type align in IntMap.map (Array.get like_aln) (Alignment.make_aln_index_map (Newick_gtree.leaf_label_map tree) (Array.map fst align)) let glv_arr_for model tree n_sites = Glv_arr.make model ~n_glvs:(1 + Gtree.n_edges tree) ~n_sites let mmap_glv_arrays_for model fd shared tree n_arrays n_sites = Model.mmap_glv_arrays model fd shared n_arrays (1 + Gtree.n_edges tree) ~n_sites let size_of_glv_arrays_for model tree n_arrays n_sites = Model.size_of_glv_arrays model n_arrays (1 + Gtree.n_edges tree) ~n_sites let calc_distal_and_evolv_dist model tree like_aln_map ~distal_glv_arr ~evolv_dist_glv_arr = (* calc returns the evolv_dist for each subtree in a list *) let rec calc t = let id = Stree.top_id t in let distal = Glv_arr.get distal_glv_arr id and evolv_dist = Glv_arr.get evolv_dist_glv_arr id in (* first calculate distal *) let () = match t with | Stree.Node(_, tL) -> begin (* take the product of the below *) Glv.listwise_prod distal (List.map calc tL); Glv.perhaps_pull_exponent min_allowed_twoexp distal end | Stree.Leaf _ -> (* for a leaf, distal is just the LV from the aln for each rate *) Glv.prep_constant_rate_glv_from_lv_arr distal (IntMap.find id like_aln_map) in (* now calculate evolv_dist *) Model.evolve_into model ~dst:evolv_dist ~src:distal (Gtree.get_bl tree id); evolv_dist in let _ = calc (Gtree.get_stree tree) in () (* pull out the glv corresponding to the id of the given tree *) let glv_from_stree glv_arr t = Glv_arr.get glv_arr (Stree.top_id t) let calc_proximal model tree evolved_prox ~evolv_dist_glv_arr ~proximal_glv_arr = (* calc calculates the proximal vectors. in contrast to the previous calc, the * recursion step is actually calculating the proximal vectors for the edges * below the given edge. *) let rec calc = function | Stree.Node(id, tL) -> let proximal = Glv_arr.get proximal_glv_arr id in Model.evolve_into model ~dst:evolved_prox ~src:proximal (Gtree.get_bl tree id); List.iter (fun (chosen, rest) -> let prox_below = glv_from_stree proximal_glv_arr chosen in Glv.listwise_prod prox_below (evolved_prox:: (List.map (glv_from_stree evolv_dist_glv_arr) rest)); Glv.perhaps_pull_exponent min_allowed_twoexp prox_below) (ListFuns.pull_each_out tL); List.iter calc tL | Stree.Leaf _ -> () in let stree = Gtree.get_stree tree in let top_prox = glv_from_stree proximal_glv_arr stree in Glv.set_unit top_prox; calc stree (* Get all of the internal partial likelihood vectors. The utils are just data * structures of the same size as the rest we can use for storing things. *) let calc_distal_and_proximal model tree like_aln_map util_glv ~distal_glv_arr ~proximal_glv_arr ~util_glv_arr = calc_distal_and_evolv_dist model tree like_aln_map ~distal_glv_arr ~evolv_dist_glv_arr:util_glv_arr; calc_proximal model tree util_glv ~evolv_dist_glv_arr:util_glv_arr ~proximal_glv_arr; () (* Calculate the likelihood of the tree given the model and the data. *) let site_log_like_arr model tree like_aln_map util_glv_arr_1 util_glv_arr_2 = let almost_top_node_ids = function | Stree.Node(_,tL) -> List.map Stree.top_id tL | _ -> failwith "can't calculatate likelihood of a leaf!" in calc_distal_and_evolv_dist model tree like_aln_map ~distal_glv_arr:util_glv_arr_1 ~evolv_dist_glv_arr:util_glv_arr_2; let ed = util_glv_arr_2 and util_glv = util_glv_arr_1.(0) in match almost_top_node_ids (Gtree.get_stree tree) with | [i; j] -> Glv.set_unit util_glv; Model.site_log_like_arr3 model ed.(i) ed.(j) util_glv | [i; j; k] -> Model.site_log_like_arr3 model ed.(i) ed.(j) ed.(k) | i::j::l -> Glv.listwise_prod util_glv (List.map (fun k -> ed.(k)) l); Model.site_log_like_arr3 model ed.(i) ed.(j) util_glv | _ -> failwith "site_log_like_arr: degree two node" end pplacer-1.1.alpha19/pplacer_src/linear.ml000066400000000000000000000070451303154601500203440ustar00rootroot00000000000000(* just the calls for linear_c. *) module BA = Bigarray module BA1 = BA.Array1 module BA2 = BA.Array2 type uint16_vector = (int, BA.int16_unsigned_elt, BA.c_layout) BA1.t (* *** Matrices, used for transformation. *** *) (* dst = a * b *) external gemmish : Gsl_matrix.matrix -> Gsl_matrix.matrix -> Gsl_matrix.matrix -> unit = "gemmish_c" (* dst u lambda uit * where uit is u inverse transpose * dst_ij = sum_k (lambda_k *. u_ik *. uit_jk) * *) external dediagonalize : Gsl_matrix.matrix -> Gsl_matrix.matrix -> Gsl_vector.vector -> Gsl_matrix.matrix -> unit = "dediagonalize" (* *** Matrices, that are used for gcat. *** *) (* print *) external mat_print : Gsl_matrix.matrix -> unit = "mat_print_c" (* statd x y z util *) external mat_log_like3 : Gsl_vector.vector -> Gsl_matrix.matrix -> Gsl_matrix.matrix -> Gsl_matrix.matrix -> float = "mat_log_like3_c" (* dst x y *) external mat_pairwise_prod : Gsl_matrix.matrix -> Gsl_matrix.matrix -> Gsl_matrix.matrix -> unit = "mat_pairwise_prod_c" (* statd dst a b *) external mat_statd_pairwise_prod : Gsl_vector.vector -> Gsl_matrix.matrix -> Gsl_matrix.matrix -> Gsl_matrix.matrix -> unit = "mat_statd_pairwise_prod_c" (* x y mask * Take the across-sites sum of the logarithm of the per-site dot products of x * and y restricted to the sites that have a nonzero value in the mask. * *) external mat_masked_logdot : Gsl_matrix.matrix -> Gsl_matrix.matrix -> uint16_vector -> float = "mat_masked_logdot_c" (* x y first last * take the logarithm of the dot product of x and y restricted to the interval * [start, last]. start and last are 0-indexed, of course. * *) external mat_bounded_logdot : Gsl_matrix.matrix -> Gsl_matrix.matrix -> int -> int -> float = "mat_bounded_logdot_c" (* *** Tensors, that are used for gmix. *** *) (* print *) external ten_print : Tensor.tensor -> unit = "ten_print_c" (* statd x y z util *) external ten_log_like3 : Gsl_vector.vector -> Tensor.tensor -> Tensor.tensor -> Tensor.tensor -> Gsl_vector.vector -> float = "ten_log_like3_c" (* dst x y *) external ten_pairwise_prod : Tensor.tensor -> Tensor.tensor -> Tensor.tensor -> unit = "ten_pairwise_prod_c" (* statd dst a b *) external ten_statd_pairwise_prod : Gsl_vector.vector -> Tensor.tensor -> Tensor.tensor -> Tensor.tensor -> unit = "ten_statd_pairwise_prod_c" (* x y mask util * Take the logarithm of the dot product of x and y restricted to the sites * that have a nonzero value in the mask. * *) external ten_masked_logdot : Tensor.tensor -> Tensor.tensor -> uint16_vector -> Gsl_vector.vector -> float = "ten_masked_logdot_c" (* x y first last util * take the logarithm of the dot product of x and y restricted to the interval * [start, last]. start and last are 0-indexed, of course. * *) external ten_bounded_logdot : Tensor.tensor -> Tensor.tensor -> int -> int -> Gsl_vector.vector -> float = "ten_bounded_logdot_c" (* vec_pairwise_prod dst x y *) external vec_pairwise_prod : Gsl_vector.vector -> Gsl_vector.vector -> Gsl_vector.vector -> unit = "vec_pairwise_prod_c" (* int_vec_tot x * The total of an integer vector. *) external int_vec_tot : uint16_vector -> int = "int_vec_tot_c" (* int_vec_pairwise_prod dst x y *) external int_vec_pairwise_prod : uint16_vector -> uint16_vector -> uint16_vector -> unit = "int_vec_pairwise_prod_c" (* float_mat_int_vec_mul dest mat vec * Left multiply the integer vector by the float matrix. This routine * specializes in being fast when the integer is sparse. * *) external float_mat_int_vec_mul : Gsl_vector.vector -> Gsl_matrix.matrix -> uint16_vector -> unit = "float_mat_int_vec_mul_c" pplacer-1.1.alpha19/pplacer_src/linear_c.c000066400000000000000000000472141303154601500204620ustar00rootroot00000000000000/* * Roll up your bell-bottoms, boys and girls, it's time for some retro pointer * arithmetic! * * To understand the pointer arithmetic below, it's important to understand * the layout of the Glv's. they are row-major and indexed in terms of rate, * then site, then state. Thus the rate-blocks are n_sites*n_states in size. * * Also, the c_layout used by bigarray means that by incrementing a pointer, * we first go across the array in the farthest right index, then increment * the next index when we go past the end on that index. E.g., we go from * (i,n-1) to (i+1,0). */ #include #include #include #include #include #include #include #include #include /* *** Matrices, used for transformation. *** */ /* stores a times b^T in dst */ CAMLprim value gemmish_c(value dst_value, value a_value, value b_value) { CAMLparam3(dst_value, a_value, b_value); double *dst = Data_bigarray_val(dst_value); double *a = Data_bigarray_val(a_value); double *b = Data_bigarray_val(b_value); int n_states = Bigarray_val(a_value)->dim[0]; int n_sites = Bigarray_val(b_value)->dim[0]; int site, i, j; double *a_start = a; if( n_states != Bigarray_val(a_value)->dim[1] || n_sites != Bigarray_val(dst_value)->dim[0] || n_states != Bigarray_val(dst_value)->dim[1] ) { printf("bad input dimensions!"); }; if(n_states == 4) { for(site=0; site < n_sites; site++) { // start back at the top of the matrix a = a_start; // going down the matrix a and across dst for(i=0; i < 4; i++) { *dst = 0; // going across a for(j=0; j < 4; j++) { *dst += a[j] * b[j]; } a += 4; dst++; } b += n_states; } } else if(n_states == 20) { for(site=0; site < n_sites; site++) { // start back at the top of the matrix a = a_start; // going down the matrix a and across dst for(i=0; i < 20; i++) { *dst = 0; // going across a for(j=0; j < 20; j++) { *dst += a[j] * b[j]; } a += 20; dst++; } b += n_states; } } else { for(site=0; site < n_sites; site++) { // start back at the top of the matrix a = a_start; // going down the matrix a and across dst for(i=0; i < n_states; i++) { *dst = 0; // going across a for(j=0; j < n_states; j++) { *dst += a[j] * b[j]; } a += n_states; dst++; } b += n_states; } } CAMLreturn(Val_unit); } CAMLprim value dediagonalize (value dst_value, value u_value, value lambda_value, value uit_value) { CAMLparam4(dst_value, u_value, lambda_value, uit_value); double *dst = Data_bigarray_val(dst_value); double *u = Data_bigarray_val(u_value); double *lambda = Data_bigarray_val(lambda_value); double *uit = Data_bigarray_val(uit_value); double *uit_p; int n = Bigarray_val(lambda_value)->dim[0]; int i, j, k; /* dst.{i,j} <- dst.{i,j} +. (lambda.{k} *. u.{i,k} *. uit.{j,k}) */ if(n == 4) { for(i=0; i < 4; i++) { uit_p = uit; for(j=0; j < 4; j++) { *dst = 0; for(k=0; k < 4; k++) { *dst += lambda[k] * u[k] * uit_p[k]; } dst++; // dst.{i,j} uit_p += 4; // uit.{j,k} } u += 4; // u.{i,k} } } else if(n == 20) { for(i=0; i < 20; i++) { uit_p = uit; for(j=0; j < 20; j++) { *dst = 0; for(k=0; k < 20; k++) { *dst += lambda[k] * u[k] * uit_p[k]; } dst++; // dst.{i,j} uit_p += 20; // uit.{j,k} } u += 20; // u.{i,k} } } else { for(i=0; i < n; i++) { uit_p = uit; for(j=0; j < n; j++) { *dst = 0; for(k=0; k < n; k++) { *dst += lambda[k] * u[k] * uit_p[k]; } dst++; // dst.{i,j} uit_p += n; // uit.{j,k} } u += n; // u.{i,k} } } CAMLreturn(Val_unit); } /* *** Matrices, that are used for gcat. *** */ CAMLprim value mat_print_c(value x_value) { CAMLparam1(x_value); double *x = Data_bigarray_val(x_value); int n_sites = (Bigarray_val(x_value)->dim[0]); int n_states = (Bigarray_val(x_value)->dim[1]); double *loc = x; int site, state; for(site=0; site < n_sites; site++) { for(state=0; state < n_states; state++) { printf("%g\t",*loc); loc++; } printf("\n"); } CAMLreturn(Val_unit); } CAMLprim value mat_log_like3_c(value statd_value, value x_value, value y_value, value z_value) { CAMLparam4(statd_value, x_value, y_value, z_value); CAMLlocal1(ml_ll_tot); double *statd = Data_bigarray_val(statd_value); double *x = Data_bigarray_val(x_value); double *y = Data_bigarray_val(y_value); double *z = Data_bigarray_val(z_value); int n_sites = Bigarray_val(x_value)->dim[0]; int n_states = Bigarray_val(x_value)->dim[1]; int site, state; double util, ll_tot=0; // here we hard code in the limits for some popular choices // so that loops can get unrolled if(n_states == 4) { for(site=0; site < n_sites; site++) { util=0; for(state=0; state < 4; state++) { util += statd[state] * x[state] * y[state] * z[state]; } ll_tot += log(util); x += 4; y += 4; z += 4; } } else if(n_states == 20) { for(site=0; site < n_sites; site++) { util=0; for(state=0; state < 20; state++) { util += statd[state] * x[state] * y[state] * z[state]; } ll_tot += log(util); x += 20; y += 20; z += 20; } } else { for(site=0; site < n_sites; site++) { util=0; for(state=0; state < n_states; state++) { util += statd[state] * (*x) * (*y) * (*z); x++; y++; z++; } ll_tot += log(util); } } ml_ll_tot = caml_copy_double(ll_tot); CAMLreturn(ml_ll_tot); } CAMLprim value mat_pairwise_prod_c(value dst_value, value x_value, value y_value) { CAMLparam3(dst_value, x_value, y_value); double *dst = Data_bigarray_val(dst_value); double *x = Data_bigarray_val(x_value); double *y = Data_bigarray_val(y_value); int size = (Bigarray_val(x_value)->dim[0]) * (Bigarray_val(x_value)->dim[1]); int i; for(i=0; i < size; i++) { dst[i] = x[i] * y[i]; } CAMLreturn(Val_unit); } CAMLprim value mat_statd_pairwise_prod_c(value statd_value, value dst_value, value a_value, value b_value) { CAMLparam4(statd_value, dst_value, a_value, b_value); double *statd = Data_bigarray_val(statd_value); double *dst = Data_bigarray_val(dst_value); double *a = Data_bigarray_val(a_value); double *b = Data_bigarray_val(b_value); int n_sites = Bigarray_val(a_value)->dim[0]; int n_states = Bigarray_val(a_value)->dim[1]; int site, state; for(site=0; site < n_sites; site++) { for(state=0; state < n_states; state++) { *dst = statd[state] * (*a) * (*b); dst++; a++; b++; } } CAMLreturn(Val_unit); } CAMLprim value mat_masked_logdot_c(value x_value, value y_value, value mask_value) { CAMLparam3(x_value, y_value, mask_value); CAMLlocal1(ml_ll_tot); double *x = Data_bigarray_val(x_value); double *y = Data_bigarray_val(y_value); uint16_t *mask = Data_bigarray_val(mask_value); int n_sites = (Bigarray_val(x_value)->dim[0]); int n_states = (Bigarray_val(x_value)->dim[1]); if(n_sites != Bigarray_val(mask_value)->dim[0]) { printf("mat_masked_logdot_c: Mask length doesn't match!"); }; int site, state; double util, ll_tot=0; if(n_states == 4) { for(site=0; site < n_sites; site++) { if(mask[site]) { util=0; for(state=0; state < 4; state++) { util += x[state] * y[state]; } ll_tot += log(util); } x += n_states; y += n_states; } } else if(n_states == 20) { for(site=0; site < n_sites; site++) { if(mask[site]) { util=0; for(state=0; state < 20; state++) { util += x[state] * y[state]; } ll_tot += log(util); } x += n_states; y += n_states; } } else { for(site=0; site < n_sites; site++) { if(mask[site]) { util=0; for(state=0; state < n_states; state++) { util += x[state] * y[state]; } ll_tot += log(util); } x += n_states; y += n_states; } } ml_ll_tot = caml_copy_double(ll_tot); CAMLreturn(ml_ll_tot); } CAMLprim value mat_bounded_logdot_c(value x_value, value y_value, value first_value, value last_value) { CAMLparam4(x_value, y_value, first_value, last_value); CAMLlocal1(ml_ll_tot); double *x = Data_bigarray_val(x_value); double *y = Data_bigarray_val(y_value); int first = Int_val(first_value); int last = Int_val(last_value); int n_used = 1 + last - first; int n_states = Bigarray_val(x_value)->dim[1]; int site, state; double util, ll_tot=0; // start at the beginning x += first * n_states; y += first * n_states; // calculate if(n_states == 4) { for(site=0; site < n_used; site++) { util=0; for(state=0; state < 4; state++) { util += x[state] * y[state]; } x += n_states; y += n_states; ll_tot += log(util); } } else if(n_states == 20) { for(site=0; site < n_used; site++) { util=0; for(state=0; state < 20; state++) { util += x[state] * y[state]; } x += n_states; y += n_states; ll_tot += log(util); } } else { for(site=0; site < n_used; site++) { util=0; for(state=0; state < n_states; state++) { util += x[state] * y[state]; } x += n_states; y += n_states; ll_tot += log(util); } } ml_ll_tot = caml_copy_double(ll_tot); CAMLreturn(ml_ll_tot); } /* *** Tensors, that are used for gmix. *** */ CAMLprim value ten_print_c(value x_value) { CAMLparam1(x_value); double *x = Data_bigarray_val(x_value); int n_rates = (Bigarray_val(x_value)->dim[0]); int n_sites = (Bigarray_val(x_value)->dim[1]); int n_states = (Bigarray_val(x_value)->dim[2]); double *loc = x; int rate, site, state; for(rate=0; rate < n_rates; rate++) { for(site=0; site < n_sites; site++) { for(state=0; state < n_states; state++) { printf("%g\t",*loc); loc++; } printf("\n"); } printf("--\n"); } CAMLreturn(Val_unit); } CAMLprim value ten_log_like3_c(value statd_value, value x_value, value y_value, value z_value, value util_value) { CAMLparam5(statd_value, x_value, y_value, z_value, util_value); CAMLlocal1(ml_ll_tot); double *statd = Data_bigarray_val(statd_value); double *x = Data_bigarray_val(x_value); double *y = Data_bigarray_val(y_value); double *z = Data_bigarray_val(z_value); double *util = Data_bigarray_val(util_value); int n_rates = Bigarray_val(x_value)->dim[0]; int n_sites = Bigarray_val(x_value)->dim[1]; int n_states = Bigarray_val(x_value)->dim[2]; int rate, site, state; double *util_v; for(site=0; site < n_sites; site++) { util[site] = 0.0; } for(rate=0; rate < n_rates; rate++) { // for each rate, start at the top of the util vector util_v = util; // here we hard code in the limits for some popular choices // so that loops can get unrolled if(n_states == 4) { for(site=0; site < n_sites; site++) { for(state=0; state < 4; state++) { *util_v += statd[state] * x[state] * y[state] * z[state]; } x += 4; y += 4; z += 4; util_v++; } } else if(n_states == 20) { for(site=0; site < n_sites; site++) { for(state=0; state < 20; state++) { *util_v += statd[state] * x[state] * y[state] * z[state]; } x += 20; y += 20; z += 20; util_v++; } } else { for(site=0; site < n_sites; site++) { for(state=0; state < n_states; state++) { *util_v += statd[state] * (*x) * (*y) * (*z); x++; y++; z++; } util_v++; } } } // now total up the likes from the util vector double ll_tot=0; for(site=0; site < n_sites; site++) { ll_tot += log(util[site]); } // subtract once rather than perform division by n_rates n_sites times ll_tot -= ((float) n_sites) * log ((float) n_rates); ml_ll_tot = caml_copy_double(ll_tot); CAMLreturn(ml_ll_tot); } CAMLprim value ten_pairwise_prod_c(value dst_value, value x_value, value y_value) { CAMLparam3(dst_value, x_value, y_value); double *dst = Data_bigarray_val(dst_value); double *x = Data_bigarray_val(x_value); double *y = Data_bigarray_val(y_value); int size = (Bigarray_val(x_value)->dim[0]) * (Bigarray_val(x_value)->dim[1]) * (Bigarray_val(x_value)->dim[2]); int i; for(i=0; i < size; i++) { dst[i] = x[i] * y[i]; } CAMLreturn(Val_unit); } CAMLprim value ten_statd_pairwise_prod_c(value statd_value, value dst_value, value a_value, value b_value) { CAMLparam4(statd_value, dst_value, a_value, b_value); double *statd = Data_bigarray_val(statd_value); double *dst = Data_bigarray_val(dst_value); double *a = Data_bigarray_val(a_value); double *b = Data_bigarray_val(b_value); int n_rates = Bigarray_val(a_value)->dim[0]; int n_sites = Bigarray_val(a_value)->dim[1]; int n_states = Bigarray_val(a_value)->dim[2]; int rate, site, state; for(rate=0; rate < n_rates; rate++) { for(site=0; site < n_sites; site++) { for(state=0; state < n_states; state++) { *dst = statd[state] * (*a) * (*b); dst++; a++; b++; } } } CAMLreturn(Val_unit); } CAMLprim value ten_masked_logdot_c(value x_value, value y_value, value mask_value, value util_value) { CAMLparam4(x_value, y_value, mask_value, util_value); CAMLlocal1(ml_ll_tot); double *x = Data_bigarray_val(x_value); double *y = Data_bigarray_val(y_value); uint16_t *mask = Data_bigarray_val(mask_value); double *util = Data_bigarray_val(util_value); int n_rates = Bigarray_val(x_value)->dim[0]; int n_sites = Bigarray_val(x_value)->dim[1]; int n_states = Bigarray_val(x_value)->dim[2]; if(n_sites != Bigarray_val(mask_value)->dim[0]) { printf("ten_masked_logdot_c: Mask length doesn't match!"); }; if(n_sites != Bigarray_val(util_value)->dim[0]) { printf("ten_masked_logdot_c: Util length doesn't match!"); }; int rate, site, state; double *x_p, *y_p, *util_v; // Util will be used to accumulate results across rates. for(site=0; site < n_sites; site++) { util[site] = 0.0; } for(rate=0; rate < n_rates; rate++) { // for each rate, start at the top of the util vector util_v = util; // and start at the appropriate place in x and y x_p = x + rate * n_sites * n_states; y_p = y + rate * n_sites * n_states; if(n_states == 4) { for(site=0; site < n_sites; site++) { if(mask[site]) { for(state=0; state < 4; state++) { *util_v += x_p[state] * y_p[state]; } } x_p += n_states; y_p += n_states; util_v++; } } else if(n_states == 20) { for(site=0; site < n_sites; site++) { if(mask[site]) { for(state=0; state < 20; state++) { *util_v += x_p[state] * y_p[state]; } } x_p += n_states; y_p += n_states; util_v++; } } else { for(site=0; site < n_sites; site++) { if(mask[site]) { for(state=0; state < n_states; state++) { *util_v += x_p[state] * y_p[state]; } } x_p += n_states; y_p += n_states; util_v++; } } } // now total up the likes from the util vector double ll_tot=0; int n_used=0; for(site=0; site < n_sites; site++) { if (mask[site]) { ll_tot += log(util[site]); n_used++; } } // subtract once rather than perform division by n_rates n_sites times ll_tot -= ((float) n_used) * log ((float) n_rates); ml_ll_tot = caml_copy_double(ll_tot); CAMLreturn(ml_ll_tot); } CAMLprim value ten_bounded_logdot_c(value x_value, value y_value, value first_value, value last_value, value util_value) { CAMLparam5(x_value, y_value, first_value, last_value, util_value); CAMLlocal1(ml_ll_tot); double *x = Data_bigarray_val(x_value); double *y = Data_bigarray_val(y_value); int first = Int_val(first_value); int last = Int_val(last_value); double *util = Data_bigarray_val(util_value); int n_rates = Bigarray_val(x_value)->dim[0]; int n_sites = Bigarray_val(x_value)->dim[1]; int n_states = Bigarray_val(x_value)->dim[2]; int rate, site, state; int n_used = 1 + last - first; /* we make pointers to x, y, and util so that we can do pointer arithmetic * and then return to where we started. */ double *x_p, *y_p, *util_v; // Clear util out to n_used. for(site=0; site < n_used; site++) { util[site] = 0.0; } for(rate=0; rate < n_rates; rate++) { // for each rate, start at the top of the util vector util_v = util; // 1st term: gets us at top of correct rate cat // 2nd term: gets us "first" entries down that rate cat int boost = rate * n_sites * n_states + first * n_states; x_p = x + boost; y_p = y + boost; if(n_states == 4) { for(site=0; site < n_used; site++) { for(state=0; state < 4; state++) { *util_v += x_p[state] * y_p[state]; } x_p += 4; y_p += 4; util_v++; } } else if(n_states == 20) { for(site=0; site < n_used; site++) { for(state=0; state < 20; state++) { *util_v += x_p[state] * y_p[state]; } x_p += 20; y_p += 20; util_v++; } } else { for(site=0; site < n_used; site++) { for(state=0; state < n_states; state++) { *util_v += x_p[state] * y_p[state]; } x_p += n_states; y_p += n_states; util_v++; } } } // now total up the likes from the util vector double ll_tot=0; for(site=0; site < n_used; site++) { ll_tot += log(util[site]); } // subtract once rather than perform division by n_rates n_sites times ll_tot -= ((float) n_used) * log ((float) n_rates); ml_ll_tot = caml_copy_double(ll_tot); CAMLreturn(ml_ll_tot); } CAMLprim value vec_pairwise_prod_c(value dst_value, value x_value, value y_value) { CAMLparam3(dst_value, x_value, y_value); double *dst = Data_bigarray_val(dst_value); double *x = Data_bigarray_val(x_value); double *y = Data_bigarray_val(y_value); int i; for(i=0; i < Bigarray_val(x_value)->dim[0]; i++) { dst[i] = x[i] * y[i]; } CAMLreturn(Val_unit); } CAMLprim value int_vec_tot_c(value x_value) { CAMLparam1(x_value); uint16_t *x = Data_bigarray_val(x_value); CAMLlocal1(ml_tot); int i, tot = 0; for(i=0; i < Bigarray_val(x_value)->dim[0]; i++) tot += *x++; ml_tot = Val_int(tot); CAMLreturn(ml_tot); } CAMLprim value int_vec_pairwise_prod_c(value dst_value, value x_value, value y_value) { CAMLparam3(dst_value, x_value, y_value); uint16_t *dst = Data_bigarray_val(dst_value); uint16_t *x = Data_bigarray_val(x_value); uint16_t *y = Data_bigarray_val(y_value); uint16_t *dst_end = dst + Bigarray_val(dst_value)->dim[0]; while (dst < dst_end) *dst++ = *x++ * *y++; CAMLreturn(Val_unit); } CAMLprim value float_mat_int_vec_mul_c(value dst_value, value mat_value, value vec_value) { CAMLparam3(dst_value, mat_value, vec_value); double *dst = Data_bigarray_val(dst_value); double *mat = Data_bigarray_val(mat_value); uint16_t vec_j, *vec = Data_bigarray_val(vec_value); int j; int n = Bigarray_val(mat_value)->dim[0], k = Bigarray_val(mat_value)->dim[1]; double *dst_start = dst, *dst_end = dst + k; if (Bigarray_val(vec_value)->dim[0] != n) caml_failwith("dim_0 vec != dim_0 mat"); if (Bigarray_val(dst_value)->dim[0] != k) caml_failwith("dim_0 dst != dim_1 mat"); for (j = 0; j < n; ++j) { /* skip a whole row if we are multiplying by zero */ if (!(vec_j = vec[j])) { mat += k; continue; } for (dst = dst_start; dst < dst_end;) { *dst++ += *mat++ * vec_j; } } CAMLreturn(Val_unit); } pplacer-1.1.alpha19/pplacer_src/lpca.ml000066400000000000000000000245531303154601500200140ustar00rootroot00000000000000(* The primary source for length PCA. The code is designed to be read in parallel with the length_pca tex document. A couple of "gotchas": - F is not a matrix of f's. Indeed F is a scaled and centered version of the matrix of f's: F_{i,k} := \frac{1}{s^{1/2}} (f_k(x_i) - \bar f(x_i)), - The vectors are indexed a bit differently than in the tex document. In the code, f is a vector indexed by the samples. The location x is typically implicit, so f.{j} is $f_j(x)$. However, when x is not implicit it is indexed by i. *) open Ppatteries open Linear_utils (* Compute the mean of a vector v. *) let vec_mean v = (vec_fold_left (+.) 0. v) /. (float (Gsl_vector.length v)) (* Compute the mean of a vector v and subtract it from each element, i.e. apply * a centering matrix: http://en.wikipedia.org/wiki/Centering_matrix *) let vec_center v = let v_bar = vec_mean v in vec_map (fun vi -> vi -. v_bar) v (* Replicate the upper triangle of a matrix m to the lower triangle. *) let mat_rep_uptri m = let (n_rows, _) = Gsl_matrix.dims m in for i=1 to n_rows-1 do for j=0 to i-1 do m.{i, j} <- m.{j, i} done; done type lpca_result = { eval: float array; evect: float array array; edge_evect: float array array } (* An intermediate edge result record with the following meanings in terms of the length_pca writeup. *) type lpca_data = { f: Gsl_vector.vector; (* $f_k$, the proximal minus the distal mass * (WRT current position). *) ufl: Gsl_matrix.matrix; (* $uFL$, an s x s accumulator matrix of partial inner products * later used in projecting a sample $u$ onto $Fw$. See * eq:ufl. *) af: Gsl_vector.vector IntMap.t; (* $AF$, which is an e x s matrix, here encoded as a map * (edges) to a vector indexed by sample number. See * eq:f_tilde. *) fplf: Gsl_matrix.matrix } (* $F'LF$, which is the "proxy" that we use to avoid computing * the eigenvectors of the full matrix GL. See prop:gl_fplf * and eq:fplf. *) (* A repackaged placement record which includes the sample id. *) type lpca_placement = { distal_bl: float; sample_id: int; mass: float } (* Compute the union of two (disjoint) maps. If the maps are not disjoint, raise an invalid argument error. *) let map_union m1 m2 = IntMap.merge (fun _ l r -> match l, r with | Some x, None | None, Some x -> Some x | Some _, Some _ -> invalid_arg "map_union: maps intersect" | _ -> invalid_arg "map_union: Something Bad happened") m1 m2 (* Aggregate a list of intermediate results from subtrees. The first result is used to initialize the accumulator to which the other results are added. Raise an invalid argument error if we're passed an empty list, as that shouldn't happen. *) let lpca_agg_data l = (* Rearranging the definition of f_k(x) and noting that all the mass on the tree for a given sample sums to one, we see that the amount of mass m distal to a (massless) point x is (1 - f_k(x)) / 2. This relation does not hold if there is a placement precisely at x, which is why we assert in lpca_tot_edge_nz that no placements occurred precisely at the proximal node of the edge. Here b is used for the contribution of a branch. *) let attached_mass b = let m = Gsl_vector.copy b.f in Gsl_vector.scale m (-1.); Gsl_vector.add_constant m 1.; Gsl_vector.scale m (1. /. 2.); m in match l with | b::bs -> let a = List.fold_left (fun a bj -> (* axpy is y := a*x + y, so the below means a.f += -2 m, where m is the amount of mass attached to subtree bj. This accomplishes the update described by eq:node_crossing, *) Gsl_blas.axpy (-2.) (attached_mass bj) a.f; Gsl_matrix.add a.ufl bj.ufl; (* Add the sibling branch's contribution to F'LF, as in eq:piecewise_edge. *) Gsl_matrix.add a.fplf bj.fplf; { a with af = map_union a.af bj.af }) b bs in a | [] -> invalid_arg "lpca_agg_data: empty list" (* Process the placements along an edge of non-zero length from distal to proximal, given the initial values data_0 "just beyond" the distal node of the edge. *) let lpca_tot_edge_nz sm edge_id bl data_0 = let pl = try IntMap.find edge_id sm with | Not_found -> [] in let n_samples = Gsl_vector.length data_0.f in (* af_e is an accumulator for this edge's row in the $\tilde{F} = AF$ matrix, defined in eq:f_tilde and later used in computing edge-averaged eigenvectors as described in the text. *) let af_e = Gsl_vector.create ~init:0. n_samples in (* In aux, i counts the number of "constant regions" along the edge. *) let rec aux i pl prev_distal_bl data = let update_data sample_id mass len = (* f_cen is a convenient alias for the "centered" vector { f_1(x) - \bar{f}(x), ..., f_s(x) - \bar{f}(x) } the elements of which are used frequently in the tex. *) let f_cen = vec_center data.f in (* syr is symmetric rank-1 update A = \alpha x x^T + A of the symmetric * matrix A. The computation of the update term \sigma_i from eq:sigma_i * is "hidden" in this call as the outer product f_cen * f_cen^T, which is * then weighted by the region length and added to the F'LF accumulator, * as in eq:fplf_update. *) Gsl_blas.syr Gsl_blas.Upper ~alpha:len ~x:f_cen ~a:data.fplf; (* Add this region's contribution to \tilde{F}, as in eq:f_tilde. *) Gsl_vector.add af_e f_cen; (* dger is rank-1 update A = \alpha x y^T + A of the matrix A. This is the update computation for the inner term of eq:ufl, but for all the samples at once. *) Gsl_blas.dger ~alpha:len ~x:data.f ~y:f_cen ~a:data.ufl; (* Terminate this region and update f_k as we pass. *) data.f.{sample_id} <- data.f.{sample_id} -. (2. *. mass) in match pl with | p::ps -> let len = p.distal_bl -. prev_distal_bl in (* Make sure we're processing the placements on the edge in the right order (i.e. distal to proximal), and that we're not processing zero-mass placements. *) assert(p.distal_bl >= prev_distal_bl); assert(p.distal_bl < bl); assert(p.mass > 0.); update_data p.sample_id p.mass len; aux (succ i) ps p.distal_bl data | [] -> let len = bl -. prev_distal_bl in (* We should never be dealing with a zero-length edge, nor should we have processed a placement exactly at the proximal node of the edge, so len must always be greater than zero. *) assert(len > 0.); update_data 0 0. len; (* Multiplying on left by averaging matrix as just before eq:f_tilde. *) Gsl_vector.scale af_e (1. /. (float (succ i))); { data with af = IntMap.add edge_id af_e data.af } in aux 0 pl 0. data_0 (* Process the placements along an edge, given the initial values data_0 "just beyond" the distal node of the edge. If the edge is of zero length, simply return data_0. *) let lpca_tot_edge sm edge_id bl data_0 = if bl > 0. then (lpca_tot_edge_nz sm edge_id bl data_0) else data_0 (* Accumulate a function f across a list of samples into the accumulator a. *) let fold_samples_listwise f a sl = List.fold_left (fun (sample_id, a) s -> succ sample_id, IntMap.fold (fun edge_id pl a -> f sample_id edge_id a pl) s a) (0, a) sl |> snd (* Repackage the list of samples into a map indexed by edge where the placements are sorted in increasing order of distal length along that edge, so that lpca can walk the edge from distal to proximal and process the placements as they're encountered. Also filter out any placements of zero mass, because we don't care about them. *) let make_n_lpca_map sl = let repkg_p sample_id { Mass_map.Indiv.distal_bl; Mass_map.Indiv.mass } = { distal_bl; sample_id; mass } and cmp_p pa pb = compare pa.distal_bl pb.distal_bl in (* TODO: check for placements where distal_bl = bl -- should those be moved to a parent edge? *) fold_samples_listwise (fun sample_id edge_id a pl -> IntMap.modify_def [] (* If edge_id not a key of the map, insert []. *) edge_id (* Key to modify. *) (List.merge cmp_p (List.map (repkg_p sample_id) (List.filter (fun { Mass_map.Indiv.mass } -> mass > 0.) pl))) (* Function to apply to the value of edge_id in the map. *) a) IntMap.empty sl (* The heart of the lpca algorithm. First we initialize an intermediate result record data_0 which can be used to initialize the algorithm at any leaf on the tree, then we process each edge from distal to proximal and update the intermediate results via lpca_tot_edge and aggregate those results across subtrees via lpca_agg_data. Once the tree has been traversed, we scale the final result record's components appropriately and return it. *) let gen_data sl ref_tree = let sm = make_n_lpca_map sl in let tot_edge = lpca_tot_edge sm in let n_samples = List.length sl in let data_0 = { f = Gsl_vector.create ~init:1. n_samples; (* prox - distal *) ufl = Gsl_matrix.create ~init:0. n_samples n_samples; af = IntMap.empty; fplf = Gsl_matrix.create ~init:0. n_samples n_samples } in let data = Stree.recur (fun edge_id dl -> (* internal nodes *) tot_edge edge_id (Gtree.get_bl ref_tree edge_id) (lpca_agg_data dl)) (fun edge_id -> (* leaves *) tot_edge edge_id (Gtree.get_bl ref_tree edge_id) { data_0 with f = Gsl_vector.copy data_0.f; ufl = Gsl_matrix.copy data_0.ufl; fplf = Gsl_matrix.copy data_0.fplf }) (Gtree.get_stree ref_tree) in let inv_smo = 1. /. (float (n_samples - 1)) in (* Samples Minus One. *) let inv_sqrt_smo = sqrt inv_smo in Gsl_matrix.scale data.fplf inv_smo; Gsl_matrix.scale data.ufl inv_sqrt_smo; mat_rep_uptri data.fplf; IntMap.iter (fun _ v -> Gsl_vector.scale v inv_sqrt_smo) data.af; data pplacer-1.1.alpha19/pplacer_src/map_seq.ml000066400000000000000000000037611303154601500205200ustar00rootroot00000000000000(* For calculating Maximum A Posteriori sequences for internal locations on the * tree. For us, these internal locations will be mrcams. *) open Ppatteries (* Given * u1 and u2: utility Glvs * model t darr parr: as usual * m: map with internal node keys K * cutoff: posterior probability below which we don't mark base as known * * we make a map from each k in K to the MAP sequence for the Proximal side of * that internal node. * *) let of_map (type a) (type b) m (u1: b) (u2: b) (model: a) t ~(darr: b array) ~(parr: b array) k_map cutoff = let module Model = (val m: Glvm.Model with type t = a and type glv_t = b) in let module Seq_post = Seq_post.Make(Model) in let bounded_max_index vec = let idx = Gsl_vector.max_index vec in if vec.{idx} /. (Linear_utils.l1_norm vec) < cutoff then -1 else idx and code = Model.seq_type model |> Glvm.code in IntMap.mapi (fun id _ -> Glvm.to_sym_str code (Seq_post.get_summary Seq_post.Proximal bounded_max_index (-1) u1 u2 model t ~darr ~parr id)) k_map (* Given a map of tree locations to a list of something, the MRCA map of the * tree, and the tree itself, build map of MRCA locations to the combined list * of things below that MRCA. * 'a list IntMap.t -> 'b IntMap.t -> stree -> 'a list IntMap.t *) let mrca_map_seq_map locmap mrcam tree = let rec aux accum = function | [] -> accum | (top_mrca, tree) :: rest -> let i = Stree.top_id tree in let accum' = List.fold_left (flip (IntMap.add_listly top_mrca)) accum (IntMap.get i [] locmap) and top_mrca' = if IntMap.mem i mrcam then i else top_mrca in let rest' = match tree with | Stree.Node (_, subtrees) -> List.fold_left (fun accum subtree -> (top_mrca', subtree) :: accum) rest subtrees | Stree.Leaf _ -> rest in aux accum' rest' in aux IntMap.empty [Stree.top_id tree, tree] pplacer-1.1.alpha19/pplacer_src/mass_compress.ml000066400000000000000000000102361303154601500217440ustar00rootroot00000000000000open Ppatteries (* Compress pqueries. From the associated github issue: A cutoff c is specified via a command line flag. We will be merging pairs of pqueries that have KR distance between them less than c. The pqueries are put in an array so that they can be referred to by index instead of trying to make an OrderedPquery module. In all of the following description, these indices and the pqueries are interchangeable. To compress the pqueries: * divide the pqueries into islands (see mass_islands.ml). * for each island, calculate all of the pairwise distances between the pqueries for that island and put them in a matrix * build a graph such that the nodes are pqueries, and there is an edge between them if their distance is less than c (note that this can be a binary matrix that is 1 if the distance is less than c and 0 otherwise, an easy component-wise application of a function to the pairwise distance matrix) * merge pqueries according to this graph as described below. == Merging the pqueries == Each original pquery (=node) will get merged into one of the the selected pqueries. This will happen as follows. Maintain a set of unmerged pqueries, and a set of pairs (w, d(w)), where w is a selected pquery and d(w) is the degree of w in the graph. * find the (w, d(w)) pair with the greatest d(w) and remove it from the set * find all of the unmerged pqueries that are adjacent to w in the graph, and merge their mass into w. Remove w and all of the adjacent pqueries from the unmerged pquery set. * repeat! * Stop when the unmerged pquery set is empty. If the pair-set is exhausted but the unmerged pquery set is not, that's reason for an error. *) let of_placerun ?(p = 1.) cluster_fn ~c weighting criterion pr = let mass_of_pq pq = (* Recall that of_pquery_list normalizes out the mass, so that we get a * single unit of mass for each pquery. *) Mass_map.Pre.of_pquery_list weighting criterion [pq] |> Mass_map.Indiv.of_pre and gt = Placerun.get_ref_tree pr |> Newick_gtree.add_zero_root_bl and length = ref 0 in Placerun.get_pqueries pr |> tap (fun _ -> dprint "Splitting pqueries into islands... ") |> cluster_fn criterion |> tap (fun l -> length := List.length l; dprint "done.\n") |> List.mapi (fun i (_, pql) -> dprintf "Compressing island %d/%d (%d pqueries)... " (succ i) !length (List.length pql); (* For each mass island, make a graph between each pair of pqueries with a * KR distance below the `c` threshold. *) dprint "kr-dist "; let uptri = List.map mass_of_pq pql |> Kr_distance.multi_dist gt p and pqa = Array.of_list pql and nodem = ref IntMap.empty in dprint "graph-walk "; Uptri.iterij (fun i j v -> if i = j || v > c then () else (* ... *) IntMap.add_listly i j !nodem |> IntMap.add_listly j i |> (:=) nodem) uptri; (* ... and collect the nodes in the graph with no edges, since they won't * be affected by compression. *) let rec singletons = Array.filteri (fun i _ -> not (IntMap.mem i !nodem)) pqa |> Array.to_list and aux accum nodem = if IntMap.is_empty nodem then accum else (* ... *) (* As long as there are nodes in the graph, find the node with the most * edges and all of the adjacent nodes. *) let w, xs = IntMap.enum nodem |> Enum.arg_max (snd %> IntSet.cardinal) in let all_touched = IntSet.add w xs in (* The compressed pquery is the pquery corresponding to the originally * selected node with all of the mass from the pqueries corresponding to * the adjacent nodes added to it. *) let accum' = IntSet.elements xs |> List.map (Array.get pqa) |> Pquery.merge_into pqa.(w) |> flip List.cons accum (* And then remove the node and all adjacent nodes from the graph. *) and nodem' = IntSet.fold IntMap.remove all_touched nodem |> IntMap.map (flip IntSet.diff all_touched) in aux accum' nodem' in IntMap.map IntSet.of_list !nodem |> aux singletons |> tap (fun _ -> dprint "done.\n")) |> List.flatten pplacer-1.1.alpha19/pplacer_src/mass_islands.ml000066400000000000000000000036701303154601500215520ustar00rootroot00000000000000open Ppatteries (* Mass islands. From the associated github issue: Say that two pqueries overlap if there is an edge such that the two pqueries both put mass on that edge. Define the overlap graph to be the graph with nodes being pqueries and edges signifying overlap. Call the connected components of the overlap graph "islands". The algorithms works as follows: * think of islands as pairs of (E, P), P is a set of pqueries that are in the same island, and E is the set of edges that have mass assigned to them in the island. * proceed recursively, with the island set starting as empty * when given a new pquery p, first get the set of edges F that have mass for that pquery * if F does not intersect any of the E's from the list of islands, add a new island (F, {p}) * if it intersects some set of islands, merge them and add in p. *) (* Output is a list of IntSet.t, Pquery.t list pairs which represent (E, P) as * described above. *) let of_pql ?(discard_below = 0.) criterion pql = List.fold_left (fun accum pq -> let pq_edges = Pquery.place_list pq |> List.enum |> Enum.filter_map (fun p -> if criterion p < discard_below then None else Some (Placement.location p)) |> IntSet.of_enum in if IntSet.is_empty pq_edges then accum else (* ... *) List.fold_left (fun (matches, accum') (edges, pqs) -> if IntSet.disjoint pq_edges edges then matches, (edges, pqs) :: accum' else Some (match matches with | None -> IntSet.union pq_edges edges, pq :: pqs | Some (prev_edges, prev_pqs) -> IntSet.union prev_edges edges, List.append prev_pqs pqs), accum') (None, []) accum |> Tuple.Tuple2.map1 (Option.default (pq_edges, [pq])) |> uncurry List.cons) [] pql pplacer-1.1.alpha19/pplacer_src/mass_map.ml000066400000000000000000000163161303154601500206730ustar00rootroot00000000000000(* We keep track of the multiplicities so that we can use them in bootstrapping. * Note that one option would be to make the Pres have a float multiplicity, * which would mean that we could decide on a transform once and then have that * be fixed for the life of the Pre. That would be convenient, but would make * bootstrapping, etc, impossible. * * Bootstraping, etc, is also the reason why we have mass_units and multimuls * not squashed into a single data type. *) open Ppatteries type point_spread = Point | Spread (* we just return the top one if unweighted *) let place_list_of_pquery point_spread criterion pquery = match point_spread with | Spread -> Pquery.place_list pquery | Point -> [ Pquery.best_place criterion pquery ] (* the L_1 norm of a float list *) let normalized_prob fl = let sum = List.fold_left ( +. ) 0. fl in List.map (fun x -> x /. sum) fl (* Pre as in pre-mass-map *) module Pre = struct type mass_unit = { loc: int; distal_bl: float; pendant_bl: float; mass: float; } let scale_mu scalar mu = {mu with mass = scalar *. mu.mass} type multimul = { (* multiplicity *) multi: float; (* mul is Mass Unit List *) (* list across mass for a given placement. *) mul: mass_unit list; } let mul_total_mass = List.fold_left (fun x mu -> x +. mu.mass) 0. let multimul_total_mass mumu = mumu.multi *. (mul_total_mass mumu.mul) let scale_multimul scalar mumu = {mumu with mul = List.map (scale_mu scalar) mumu.mul} let unit_mass_scale mumu = scale_multimul (1. /. (multimul_total_mass mumu)) mumu (* list across pqueries *) type t = multimul list (* will raise Pquery.Unplaced_pquery if finds unplaced pqueries. *) let multimul_of_pquery point_spread criterion mass_per_read pq = let pc = place_list_of_pquery point_spread criterion pq in { multi = Pquery.multiplicity pq; mul = List.map2 (fun place weight -> { loc = Placement.location place; distal_bl = Placement.distal_bl place; pendant_bl = Placement.pendant_bl place; mass = mass_per_read *. weight }) pc (normalized_prob (List.map criterion pc)); } let of_pquery_list point_spread criterion pql = let mass_per_read = 1. /. (Pquery.total_multiplicity pql) in List.map (multimul_of_pquery point_spread criterion mass_per_read) pql (* A unit of mass spread across the tree according to pr. *) let of_placerun point_spread criterion pr = try of_pquery_list point_spread criterion (Placerun.get_pqueries pr) with | Pquery.Unplaced_pquery s -> invalid_arg ((String.concat " " s)^" unplaced in "^ (Placerun.get_name pr)) let total_mass = List.fold_left (fun x mm -> x +. multimul_total_mass mm) 0. let scale_mass scalar pre = List.map (scale_multimul scalar) pre let normalize_mass pre = scale_mass (1. /. (total_mass pre)) pre let unitize_mass pre = List.map unit_mass_scale pre (* Pretty printing. *) let ppr_mass_unit ff mu = Format.fprintf ff "@[{loc = %d; distal_bl = %f; mass = %f}@]" mu.loc mu.distal_bl mu.mass let ppr_mul ff mul = Ppr.ppr_list ppr_mass_unit ff mul let ppr_multimul ff mmul = Format.fprintf ff "@[{multi = %g; mul = %a}@]" mmul.multi ppr_mul mmul.mul let ppr ff pre = Ppr.ppr_list ppr_multimul ff pre end (* Indiv meanins that each unit of mass is considered individually on the tree. * Indiv makes the weighting for a given edge as a list of (distal_bl, mass) * for each placement. *) module Indiv = struct type v = {distal_bl: float; mass: float} type t = v list IntMap.t let of_pair (distal_bl, mass) = {distal_bl; mass} let to_pair {distal_bl; mass} = distal_bl, mass (* factor is a multiplicative factor to multiply the mass by. *) let of_pre ?factor pmm = let factorf = match factor with | None -> 1. | Some x -> x in List.fold_left (fun m' multimul -> let scalar = factorf *. multimul.Pre.multi in (List.fold_left (fun m mu -> IntMap.add_listly mu.Pre.loc {distal_bl = mu.Pre.distal_bl; mass = scalar *. mu.Pre.mass} m) m' multimul.Pre.mul)) IntMap.empty pmm let of_placerun point_spread criterion pr = of_pre (Pre.of_placerun point_spread criterion pr) (* sort the placements along a given edge according to their location on * the edge in an increasing manner. *) let sort m = IntMap.map (List.sort (comparing (fun {distal_bl} -> distal_bl))) m let total_mass m = IntMap.fold (fun _ mass_l accu -> List.fold_right (fun {mass} -> ( +. ) mass) mass_l accu) m 0. let scale_mass scalar = IntMap.map (List.map (fun v -> {v with mass = v.mass *. scalar})) let work_moving_to vl pos = List.fold_left (fun tot {distal_bl; mass} -> abs_float (distal_bl -. pos) *. mass +. tot) 0. vl let v_mass = List.fold_left (fun tot {mass} -> tot +. mass) 0. let ppr = IntMap.ppr_gen (fun ff l -> List.iter (fun {distal_bl; mass} -> Format.fprintf ff "@[{d = %g; m = %g}@]" distal_bl mass) l) end (* By_edge just considers the weight per edge *) module By_edge = struct type t = float IntMap.t let of_indiv = IntMap.map (List.fold_left (fun tot {Indiv.mass = weight} -> tot +. weight) 0.) (* SPEED * * a faster version would be like * let h = Hashtbl.create ((IntMap.nkeys ti_imap)/3) in let addto ti x = Hashtbl.replace h ti (x+.(hashtbl_find_zero h ti)) in List.iter (fun pq -> List.iter (fun p -> addto (tax_id_of_place p) (criterion p)) (Pquery.place_list pq)) (Placerun.get_pqueries pr); Mass_map.By_edge.normalize_mass (IntMap.map (hashtbl_find_zero h) ti_imap) * *) let of_pre ?factor pre = of_indiv (Indiv.of_pre ?factor pre) let of_placerun point_spread criterion pr = of_indiv (Indiv.of_placerun point_spread criterion pr) (* we add zeroes in where things are empty *) let fill_out_zeroes mass_map ref_tree = let rec aux accu = function | loc::rest -> aux (if IntMap.mem loc accu then accu else IntMap.add loc 0. accu) rest | [] -> accu in aux mass_map (Stree.node_ids (Gtree.get_stree ref_tree)) let of_placerun_with_zeroes point_spread criterion pr = fill_out_zeroes (of_placerun point_spread criterion pr) (Placerun.get_ref_tree pr) let total_mass m = IntMap.fold (fun _ v -> ( +. ) v) m 0. let normalize_mass m = let tot = total_mass m in IntMap.map (fun x -> x /. tot) m end (* multiplicity transforms for of_pre *) let no_transform = identity let unit_transform _ = 1. let log_transform x = log x let asinh_transform x = Gsl_math.asinh x let transform_map = StringMap.of_pairlist [ "", no_transform; "no_trans", no_transform; "unit", unit_transform; "log", log_transform; "asinh", asinh_transform; ] let transform_of_str s = try StringMap.find s transform_map with | Not_found -> failwith ("Transform "^s^" not known.") pplacer-1.1.alpha19/pplacer_src/mass_overlap.ml000066400000000000000000000022511303154601500215570ustar00rootroot00000000000000(* The overlap of a pair of pqueries is defined to be the inner product of their likelihood weight ratios (or posterior probabilities) as indexed by tree edges. *) open Ppatteries (* SAMR is for Real-valued string algebraic map. *) module SAMR = AlgMapR (StringMap) let sorted_tuple ?(cmp = compare) (a, b) = if cmp a b < 0 then b, a else a, b let of_pql criterion pql = let map = ref Map.empty in List.fold_left (fun accum pq -> let name = Pquery.name pq in List.fold_left (fun accum p -> IntMap.modify_def SAMR.empty (Placement.location p) (SAMR.add_by name (criterion p)) accum) accum (Pquery.place_list pq)) IntMap.empty pql |> IntMap.iter (fun _ samr -> let names, weights = SAMR.enum samr |> Enum.uncombine |> Tuple2.map Array.of_enum Array.of_enum in Uptri.init (Array.length names) (fun i j -> weights.(i) *. weights.(j)) |> Uptri.iterij (fun i j w -> let k = sorted_tuple (names.(i), names.(j)) in map := Map.modify_def 0. k ((+.) w) !map)); Map.enum !map |> Enum.map (fun ((n1, n2), v) -> n1, n2, v) pplacer-1.1.alpha19/pplacer_src/matrix.ml000066400000000000000000000013611303154601500203710ustar00rootroot00000000000000open Ppatteries include Bigarray.Array2 include Gsl_matrix let create a b = Bigarray.Array2.create Bigarray.float64 Bigarray.c_layout a b let mimic a = create (dim1 a) (dim2 a) (* Get the "worst" floating point classification in the tensor. * Note: # max FP_normal FP_subnormal;; - : fpclass = FP_subnormal * *) let fp_classify x = enum x |> Enum.fold (fun worst flt -> max worst (classify_float flt)) FP_normal let ppr ff m = let last = dim1 m - 1 in Format.fprintf ff "@[{"; for i=0 to last do Linear_utils.ppr_gsl_vector ff (row m i); if i < last then Format.fprintf ff ";@ " done; Format.fprintf ff "}@]" let rect_transpose m = let m' = create (dim2 m) (dim1 m) in modifyij (fun i j _ -> get m j i) m'; m' pplacer-1.1.alpha19/pplacer_src/matrix.mli000066400000000000000000000032431303154601500205430ustar00rootroot00000000000000type double_mat_bigarr = (float, Bigarray.float64_elt, Bigarray.c_layout) Bigarray.Array2.t type matrix = double_mat_bigarr val dims: matrix -> int * int val of_arrays: float array array -> matrix val to_arrays: matrix -> float array array val set_all: matrix -> float -> unit val set_zero: matrix -> unit val set_id: matrix -> unit val memcpy: src:matrix -> dst:matrix -> unit val copy: matrix -> matrix val row: matrix -> int -> Gsl_vector.vector val add: matrix -> matrix -> unit val sub: matrix -> matrix -> unit val mul_elements: matrix -> matrix -> unit val div_elements: matrix -> matrix -> unit val scale: matrix -> float -> unit val add_constant: matrix -> float -> unit val add_diagonal: matrix -> float -> unit val is_null: matrix -> bool val swap_rows: matrix -> int -> int -> unit val swap_columns: matrix -> int -> int -> unit val swap_rowcol: matrix -> int -> int -> unit val rect_transpose: matrix -> matrix val transpose: matrix -> matrix -> unit val transpose_in_place: matrix -> unit val create: int -> int -> matrix val mimic: matrix -> matrix val dim1: matrix -> int val dim2: matrix -> int val get: matrix -> int -> int -> float val set: matrix -> int -> int -> float -> unit val blit: matrix -> matrix -> unit val fill: matrix -> float -> unit val enum: matrix -> float BatEnum.t val modify: (float -> float) -> matrix -> unit val modifyij: (int -> int -> float -> float) -> matrix -> unit val unsafe_get: matrix -> int -> int -> float val unsafe_set: matrix -> int -> int -> float -> unit val fp_classify: matrix -> fpclass val ppr: Format.formatter -> matrix -> unit val slice_left: matrix -> int -> (float, Bigarray.float64_elt, Bigarray.c_layout) Bigarray.Array1.t pplacer-1.1.alpha19/pplacer_src/matrix_sig.ml000066400000000000000000000114531303154601500212360ustar00rootroot00000000000000(* To get significance values using eigenvalues of the common ancestry matrix. * * This code is not practically useful (matrices get too big), so is not exposed * to the outside except for unit testing. * * mtilde = \int_u G_i(u) G_j(u) \lambda(du) * * see scans: matrix_sig.pdf *) open Bigarray open Ppatteries open Linear_utils let rooted_qform m v = sqrt(qform m v) (* *** Unit test code *** * * This code uses a different (matrix based) way of calculating KR, and so is a * nice way to verify that our calculations are correct. *) let matrix_of_pqueries weighting criterion t pqueryl = let pquerya = Array.of_list pqueryl in let n = Array.length pquerya and ca_info = Edge_rdist.build_ca_info t in let m = Gsl_matrix.create n n in let dist_fun = (Pquery_distances.dist_fun_of_point_spread weighting) criterion ca_info in for i=0 to n-1 do for j=i to n-1 do let x = dist_fun pquerya.(i) pquerya.(j) in Array2.unsafe_set m i j x; if i <> j then Array2.unsafe_set m j i x; done done; m (* could be made faster by improving the way the matrices are accessed *) let build_mtilde weighting criterion pr1 pr2 = let t = Placerun.get_same_tree pr1 pr2 in let mt = matrix_of_pqueries weighting criterion t ((Placerun.get_pqueries pr1)@(Placerun.get_pqueries pr2)) in Gsl_matrix.scale mt (1. /. (Gtree.tree_length t)); mt let vec_tot = vec_fold_left (+.) 0. (* The distance calculated by using matrices rather than by using integration * along edges. *) let matrix_distance weighting criterion pr1 pr2 = let n1 = Placerun.n_pqueries pr1 and n2 = Placerun.n_pqueries pr2 in let inv_n1 = 1. /. (float_of_int n1) and neg_inv_n2 = -. 1. /. (float_of_int n2) in let indicator = vec_init (n1+n2) (fun i -> if i < n1 then inv_n1 else neg_inv_n2) in let mtilde = build_mtilde weighting criterion pr1 pr2 in rooted_qform mtilde indicator (* *** Research Code *** * * This code isn't used for anything in guppy, but implements some interesting * directions in the KR paper. * *) let max_iter = 100 let tol = 1e-5 let sq v = v *. v (* given an f which takes a vector and gives a float, make a vector out of * applying f to each of the rows of m *) let map_rows_to_vector f m = let n_rows = Array2.dim1 m in let v = Gsl_vector.create n_rows in for i=0 to n_rows-1 do Array1.unsafe_set v i (f (Gsl_matrix.row m i)) done; v (* the average of each of the rows *) let row_avg m = let (_, n_cols) = Gsl_matrix.dims m and ra = map_rows_to_vector vec_tot m in Gsl_vector.scale ra (1. /. (float_of_int n_cols)); ra (* if m is mtilde then convert it to an m. n1 and n2 are the number of pqueries * in pr1 and pr2 *) let m_of_mtilde m n1 n2 = (* it's mtilde so far *) let (n,_) = Gsl_matrix.dims m in assert(n = n1+n2); let ra = row_avg m in let avg = (vec_tot ra) /. (float_of_int n) in let coeff = 1. /. (float_of_int (n1*n2)) in for i=0 to n-1 do for j=0 to n-1 do Array2.unsafe_set m i j (coeff *. ((Array2.unsafe_get m i j) -. (Array1.unsafe_get ra i) -. (Array1.unsafe_get ra j) +. avg)) done done (* get expectation of w within some tolerance *) let w_expectation rng tol m = let n = mat_dim_asserting_square m in let v = Gsl_vector.create n in let n_samples = ref 0 and sample_total = ref 0. in let next_expectation () = for i=0 to n-1 do v.{i} <- Gsl_randist.gaussian rng ~sigma:1. done; incr n_samples; sample_total := !sample_total +. rooted_qform m v; (!sample_total) /. (float_of_int (!n_samples)) in (* make sure we get at least 10 (one more below) *) for i=1 to 10 do let _ = next_expectation () in () done; (* continue until the expectation changes less than tol *) let rec get_expectation prev = let ew = next_expectation () in if abs_float (ew -. prev) > tol then get_expectation ew else ew in get_expectation (next_expectation ()) let write_matrix_normal_dist rng name1 name2 m w n_samples = let n = Array2.dim1 m in let v = Gsl_vector.create n in let normal_ws = List.init n_samples (fun _ -> for i=0 to n-1 do v.{i} <- Gsl_randist.gaussian rng ~sigma:1. done; rooted_qform m v) in R_plots.write_density 2. "matrix_normal" name1 name2 w normal_ws let matrix_distribution weighting criterion rng pr1 pr2 = let n1 = Placerun.n_pqueries pr1 and n2 = Placerun.n_pqueries pr2 in (* first m is mtilde *) let m = build_mtilde weighting criterion pr1 pr2 in (* then it actually becomes mtilde *) m_of_mtilde m n1 n2; let w = matrix_distance weighting criterion pr1 pr2 in let ew = w_expectation rng tol m in Printf.printf "W: %g\t E[W]: %g\n" w ew; write_matrix_normal_dist rng (Placerun.get_name pr1) (Placerun.get_name pr2) m w 1000 pplacer-1.1.alpha19/pplacer_src/minimization.ml000066400000000000000000000121671303154601500216020ustar00rootroot00000000000000open Ppatteries exception ExceededMaxIter exception FindStartFailure exception InvalidStartValues of float * float * float (* (left, start, right) *) exception FoundMin of float exception FoundStart of float (* A little bit of prep work for our start_finders - DRY *) let start_finder_prep f left raw_start right = if left >= raw_start || raw_start >= right then raise (InvalidStartValues (left, raw_start, right)); let lefty, righty = f left, f right in let smaller = if lefty < righty then left else right and miny = min lefty righty in (smaller, miny) (* This function attempts to find a starting point through bisection in the * direction of the boundary (right, left) which has the lower value. This is a * safe assumption for likehood functions, but not for the multimin work. *) let bisection_start_finder ?(max_iters=100) f raw_start left right tolerance = let smaller, miny = start_finder_prep f left raw_start right in let rec finder prevStart iterNum = let prevVal = f prevStart in if prevVal < miny then (* we have found an appropriate starting point *) prevStart else if abs_float (prevStart -. smaller) < tolerance then (* we are already within the specified tolerance via bisection *) if prevVal < miny then raise (FoundMin prevStart) else raise (FoundMin smaller) else if iterNum > max_iters then raise FindStartFailure else (* bisect *) finder ((prevStart +. smaller) /. 2.) (iterNum+1) in finder raw_start 1 (* This start finder tries to avoid the assumptions inherent in the * bisection_start_finder by searching uniformly throughout the the bounding * interval, jumping back and forth on either side of the raw_start. *) let robust_start_finder ?(max_iters=100) f raw_start left right _ = try let _, miny = start_finder_prep f left raw_start right in if f raw_start < miny then raise (FoundStart raw_start) else (* This chunk of code jumps back and forth on either side of the raw_start * by a constant increment to try and find a suitable start that is as * close as possible to the raw start. This is helpful for preserving the * sign of coefficients in SOM. *) let finder samples = let incr_ratio i = (right -. left) *. (float i) /. (float samples +. 1.) (* jump back and forth between negative and positive integers *) and jump_indices = Enum.init (2 * samples) (fun i -> (Int.pow (-1) i) * ((i+2)/2)) and check_start x = if (f x) < miny then raise (FoundStart x) in (* map those integers to their input values, and filter to make sure in * left right*) let jump_enum = Enum.filter (fun x -> left < x && x < right) (Enum.map (fun i -> raw_start +. (incr_ratio i)) jump_indices) in Enum.iter check_start jump_enum in finder max_iters; raise FindStartFailure with | FoundStart start -> start (* run the GSL Brent algorithm - the Ggsl_min algorithms require that the * starting point satisfy f(x) < min(f(left), f(right)). * value evaluate to a lower value than the evaluation at the bounding points, * and this function has an argument for how you want to do that. *) let brent ?(max_iters=100) ?(start_finder=bisection_start_finder) f raw_start left right tolerance = try let start = start_finder ~max_iters f raw_start left right tolerance in let iterator = Gsl_min.make Gsl_min.BRENT f start left right in let rec run whichStep = if whichStep > max_iters then raise ExceededMaxIter else begin Gsl_min.iterate iterator; let interLow, interHigh = Gsl_min.interval iterator in if interHigh -. interLow < tolerance then Gsl_min.minimum iterator else run (whichStep+1) end in run 1 with | FoundMin minLoc -> minLoc (* Minimize an objective function of a number of variables. * index_order: order in which dimensions should be optimized * start: starting vector * bounds: bounding vectors * tolerance: tolerance *) let multimin ?index_order ?(max_iters=100) obj_fun start lower_bounds upper_bounds tolerance = let dim = Array.length start in assert(dim = Array.length lower_bounds); assert(dim = Array.length upper_bounds); let indices = match index_order with | Some a -> assert(dim = Array.length a); a | None -> Array.init dim (fun i -> i) in (* Optimizes dimension i starting at start' *) let opt_one_dim start' i = let pos = Array.copy start' in let obj_part x = Array.set pos i x; obj_fun pos in Array.set pos i (brent ~max_iters ~start_finder:robust_start_finder obj_part start'.(i) lower_bounds.(i) upper_bounds.(i) tolerance); pos in let opt_all_dims start' = (start', Array.fold_left opt_one_dim start' indices) in let rec run (pos1, pos2) step = if (step > max_iters) then raise ExceededMaxIter else if ((obj_fun pos1) -. (obj_fun pos2) > tolerance) then run (opt_all_dims pos2) (step+1) else pos2 in run (opt_all_dims start) 1 pplacer-1.1.alpha19/pplacer_src/mokaphy_common.ml000066400000000000000000000013721303154601500221070ustar00rootroot00000000000000open Ppatteries let write_named_float_uptri ch names u = String_matrix.write_named_padded ch names (MatrixFuns.init (Uptri.get_dim u) (Uptri.get_dim u) (fun i j -> if i < j then (Printf.sprintf "%g" (Uptri.get u i j)) else "")) (* make sure all the trees in the placerun list are the same *) let list_get_same_tree = function | [] -> invalid_arg "list_get_same_tree" | [x] -> Placerun.get_ref_tree x | hd::tl -> List.hd (List.map (Placerun.get_same_tree hd) tl) let cat_names prl = String.concat "." (List.map Placerun.get_name prl) (* *** making pres *** *) let make_tax_pre taxt weighting criterion ti_imap pr = Tax_mass.pre (Gtree.top_id taxt) Placement.classif weighting criterion ti_imap pr pplacer-1.1.alpha19/pplacer_src/multiprocessing.ml000066400000000000000000000245061303154601500223220ustar00rootroot00000000000000(* Run embarrassingly parallel computation in multiple processes. This module implements an event loop and some classes that operate on top of the event loop in order to fork, compute things in the new processes, and transfer ocaml values between processes. Basic example classes are provided which implement map, iter, and fold. For more complicated processes, the classes provided can be extended. *) external quiet_close: int -> unit = "quiet_close" external fd_of_file_descr: Unix.file_descr -> int = "%identity" module OrderedFileDescr = struct type t = Unix.file_descr let compare a b = compare (fd_of_file_descr a) (fd_of_file_descr b) end module FDM = Map.Make(OrderedFileDescr) type handler = { ch: in_channel; pid: int; handler: handler -> unit; } type 'a message = | Ready | Data of 'a | Exception of exn | Fatal_exception of exn (* The main functionality for multiprocessing. Collects handlers from a group * of children, then dispatches incoming data from these children until every * incoming channel has been closed. *) let event_loop children = Sys.set_signal Sys.sigchld Sys.Signal_ignore; let pipe_map = List.fold_left (fun m proc -> List.fold_left (fun m handler -> FDM.add (Unix.descr_of_in_channel handler.ch) handler m) m proc#handlers) FDM.empty children in let rec aux pipe_map = let pipes = FDM.fold (fun pipe _ l -> pipe :: l) pipe_map [] in let rr, _, _ = Unix.select pipes [] [] 0.5 in let pipe_map' = List.fold_left (fun pipes p -> let handler = FDM.find p pipe_map in try handler.handler handler; pipes with | End_of_file -> FDM.remove p pipes) pipe_map rr in if FDM.is_empty pipe_map' then () else aux pipe_map' in aux pipe_map type buffer = { buf: string; mutable pos: int; length: int; } let buffer n = {buf = String.create n; pos = 0; length = n} type buffer_state = | Needs_more | Done of string let fill_buffer b ch = let ch = Unix.descr_of_in_channel ch in match Unix.read ch b.buf b.pos (b.length - b.pos) with | 0 -> raise End_of_file | n -> let n_read = b.pos + n in if n_read = b.length then Done b.buf else begin b.pos <- n_read; Needs_more end let marshal ch x = Marshal.to_channel ch x []; flush ch type marshal_recv_phase = | Needs_header of buffer | Needs_data of string * buffer let rec range = function | 0 -> [] | x -> (x - 1) :: range (x - 1) (* Most of the important implementation bits for multiprocessing live in the * process class. It's responsible for doing the actual fork as well as handling * the IO. *) class virtual ['a] process child_func = let child_rd, child_wr = Unix.pipe () and parent_rd, parent_wr = Unix.pipe () and progress_rd, progress_wr = Unix.pipe () in let _ = Unix.set_nonblock progress_rd in (* Only these descriptors are used in the child. The parent has no use for * them, so it closes them. The child has no use for anything but them, so * it closes everything but them. *) let child_only = [child_rd; parent_wr; progress_wr] in let () = flush_all () in let pid = match Unix.fork () with | 0 -> (* Do the actual closing of the irrelevant descriptors. *) begin let ignored = List.map fd_of_file_descr child_only in let ignored = match Ppatteries.memory_stats_ch with | None -> ignored | Some ch -> fd_of_file_descr (Unix.descr_of_out_channel ch) :: ignored in List.iter (fun fd -> if not (List.mem fd ignored) then quiet_close fd) (range 256) end; (* Make writing to stdout instead write to the progress channel. *) Unix.dup2 progress_wr Unix.stdout; Unix.close progress_wr; let rd = Unix.in_channel_of_descr child_rd and wr = Unix.out_channel_of_descr parent_wr in begin try child_func rd wr with exn -> Printexc.print_backtrace stderr; marshal wr (Fatal_exception exn) end; (* The child should only execute its function and not return control to * where the parent spawned it. *) exit 0 | pid -> List.iter Unix.close child_only; pid in object (self) val rd = Unix.in_channel_of_descr parent_rd val wr = Unix.out_channel_of_descr child_wr val progress = Unix.in_channel_of_descr progress_rd val pid = pid method rd = rd method wr = wr method progress = progress method pid = pid method handlers = [ {pid; ch = rd; handler = self#marshal_recv}; {pid; ch = progress; handler = self#progress_recv}; ] method close = close_out wr (* Reading an incoming object has two parts: * (a) reading the marshal header. * (b) reading the marshal contents. * Once a whole cycle of this has been completed, call obj_received. *) method virtual obj_received: 'a message -> unit val mutable marshal_state = Needs_header (buffer 20) method private marshal_recv h = let b = match marshal_state with | Needs_header b -> b | Needs_data (_, b) -> b in match fill_buffer b h.ch, marshal_state with | Needs_more, _ -> () | Done header, Needs_header _ -> marshal_state <- Needs_data (header, buffer (Marshal.data_size header 0)) | Done body, Needs_data (header, _) -> let obj = Marshal.from_string (header ^ body) 0 in self#obj_received obj; marshal_state <- Needs_header (buffer 20) (* By setting the progress channel to work in nonblocking mode, we can use * ocaml's existing line buffering implementation instead of writing our * own. Reading an incomplete line raises Sys_blocked_io but otherwise keeps * the buffer intact. *) method virtual progress_received: string -> unit method private progress_recv h = match begin try Some (input_line h.ch) with | Sys_blocked_io -> None end with | None -> () | Some "" -> raise End_of_file | Some line -> self#progress_received line end exception Child_error of exn let default_progress_handler = Printf.printf "> %s\n" (* The rest of this module is reference implementations of map and fold which * use the multiprocessing infrastructure. *) class ['a, 'b] map_process ?(progress_handler = default_progress_handler) (f: 'a -> 'b) (q: 'a Queue.t) = (* In the case of map, the child sends a ready signal, then repeatedly reads * objects from its input channel until there are no more objects to read. The * read objects are applied to the supplied function, and then written back to * the parent. *) let child_func rd wr = marshal wr Ready; let rec aux () = match begin try Some (Marshal.from_channel rd) with | End_of_file -> None end with | Some x -> marshal wr begin try Data (f x) with exn -> Printexc.print_backtrace stderr; Exception exn end; aux () | None -> close_in rd; close_out wr in aux () in object (self) inherit ['b] process child_func as super val q = q val mutable ret = [] method ret = ret (* The parent halves of the children all share a Queue from which new objects * are taken in order to fairly distribute work. *) method push = match begin try Some (Queue.pop q) with | Queue.Empty -> None end with | Some x -> marshal wr x | None -> self#close method obj_received = function | Ready -> self#push | Data x -> ret <- x :: ret; self#push | Exception exn | Fatal_exception exn -> raise (Child_error exn) method progress_received = progress_handler end let queue_of_list l = let q = Queue.create () in List.iter (fun x -> Queue.push x q) l; q let try_fork n f x = List.fold_left (fun accum _ -> try f x :: accum with Unix.Unix_error (e, "fork", _) -> Ppatteries.dprintf "error (%s) when trying to fork\n" (Unix.error_message e); accum) [] (range n) let map ?(children = 4) ?progress_handler f l = let q = queue_of_list l in match try_fork children (new map_process ?progress_handler f) q with | [] -> List.map f l | children -> event_loop children; List.flatten (List.map (fun c -> c#ret) children) let iter ?(children = 4) ?progress_handler f l = let q = queue_of_list l in match try_fork children (new map_process ?progress_handler f) q with | [] -> List.iter f l | children -> event_loop children class ['a, 'b] fold_process ?(progress_handler = default_progress_handler) (f: 'a -> 'b -> 'b) (q: 'a Queue.t) (initial: 'b) = (* fold is similar to map, except that there are no intermediate results. To * signal that it needs another object, it writes back None, and when the * parent closes the child's input channel, sends the final result. *) let child_func rd wr = marshal wr Ready; let rec aux prev = match begin try Some (Marshal.from_channel rd) with | End_of_file -> None end with | Some x -> marshal wr (Data None); aux (f x prev) | None -> Data (Some prev) in let res = try aux initial with exn -> Printexc.print_backtrace stderr; Exception exn in marshal wr res; close_in rd; close_out wr in object (self) inherit ['b option] process child_func as super val q = q val mutable ret = initial method ret = ret method push = match begin try Some (Queue.pop q) with | Queue.Empty -> None end with | Some x -> marshal wr x | None -> self#close method obj_received = function | Ready -> self#push | Data Some x -> ret <- x; self#close | Data None -> self#push | Exception exn | Fatal_exception exn -> raise (Child_error exn) method progress_received = progress_handler end let fold ?(children = 4) ?progress_handler f l initial = let q = queue_of_list l in match try_fork children (new fold_process ?progress_handler f q) initial with | [] -> [List.fold_left (Ppatteries.flip f) initial l] | children -> event_loop children; List.map (fun c -> c#ret) children pplacer-1.1.alpha19/pplacer_src/multiprocessing.mli000066400000000000000000000016721303154601500224720ustar00rootroot00000000000000exception Child_error of exn type handler type 'a message = | Ready | Data of 'a | Exception of exn | Fatal_exception of exn class virtual ['a] process: (in_channel -> out_channel -> unit) -> object method rd: in_channel method wr: out_channel method progress: in_channel method pid: int method handlers: handler list method close: unit method virtual obj_received: 'a message -> unit method virtual progress_received: string -> unit end val map: ?children:int -> ?progress_handler:(string -> unit) -> ('a -> 'b) -> 'a list -> 'b list val iter: ?children:int -> ?progress_handler:(string -> unit) -> ('a -> unit) -> 'a list -> unit val fold: ?children:int -> ?progress_handler:(string -> unit) -> ('a -> 'b -> 'b) -> 'a list -> 'b -> 'b list val event_loop: 'a process list -> unit val queue_of_list: 'a list -> 'a Queue.t val marshal: out_channel -> 'a -> unit val try_fork: int -> ('a -> 'b) -> 'a -> 'b list pplacer-1.1.alpha19/pplacer_src/myxml.ml000066400000000000000000000003061303154601500202310ustar00rootroot00000000000000type tag = { name: string; attrs: (string * string) list; contents: string; children: tag list; } let tag name ?(attrs = []) ?(children = []) contents = {name; attrs; contents; children} pplacer-1.1.alpha19/pplacer_src/nbc.ml000066400000000000000000000351631303154601500176360ustar00rootroot00000000000000(* The Naive Bayes taxonomic classifier of Wang et. al. *) open Ppatteries module BA = Bigarray module BA1 = BA.Array1 module BA2 = BA.Array2 (* We bootstrap on columns rather than on words of a read. Because of this, the * number of actual words used in a given bootstrap sample for a read (the * number of "occupied" words) will often deviate from the expected number for * that read. In order to make sure that these have the right number of occupied * words, we throw out the bootstrap sample if the number of occupied words is * not within `boot_range_pct` of the expected number. * * For this reason, our bootstrap matrix has `n_boot` times `extra_boot_factor` * rows. The bootstrap function will not provde a reasonable value if we throw * out `(extra_boot_factor-1)*n_boot` values; it is not hard to see using the * CDF of the negative binomal distribution that the probability of this * happening for the values below is essentially zero. *) let extra_boot_factor = 5 let boot_range_pct = 15 let in_boot_range expected actual = abs (actual - expected) <= expected * boot_range_pct / 100 let bases = "ACGT" let informative = function | 'A' | 'C' | 'G' | 'T' -> true | _ -> false let word_uninformative s = String.enum s |> Enum.for_all informative |> not exception Invalid_base of char (* get an index of a base *) let base_idx base = try String.of_char base |> String.find bases with Not_found -> raise (Invalid_base base) (* convert from a word to an int. Successive base indices are packed into the * integer using left shifts. *) let word_to_int = String.fold_left (fun accum c -> base_idx c |> (lor) (accum lsl 2)) 0 (* convert from an int to a word, with optional padding *) let int_to_word ?word_length i = Enum.unfold i (function 0 -> None | x -> Some (bases.[x land 3], x lsr 2)) |> (match word_length with | None -> identity | Some l -> flip Enum.append (Enum.repeat bases.[0]) |- Enum.take l) |> String.of_backwards (* the max word length is (log_4 max_int) - 1 *) let max_word_length = log (float_of_int max_int) /. log 4. |> int_of_float |> pred (* generalized count something by words in a sequence. generalized because we * are able to specify a modify function specifying action. *) let gen_count_by_seq word_length modify seq = 0 -- (String.length seq - word_length) |> Enum.map (flip (String.sub seq) word_length) |> Enum.iter (junction word_uninformative (const ()) (word_to_int |- modify)) let rank_tax_map_of_refpkg rp = let td = Refpkg.get_taxonomy rp in Refpkg.get_seqinfom rp |> StringMap.enum |> Enum.map (Tuple.Tuple2.map2 (fun {Tax_seqinfo.tax_id} -> tax_id)) |> Convex.gen_build_rank_tax_map StringMap.empty StringMap.add td some (* The preclassifier accumulates reference sequences before classification. When * we add sequences to a preclassifier we update the various counts, which will * allow us to generate the priors as well as allocate the correct size of * taxid_word_counts matrix in the classifier. *) let random_winner_max_index vec = 0 --^ BA1.dim vec |> flip Enum.fold None (fun accum idx -> let x = vec.{idx} in match accum with | Some (_, prev_x, _) when x < prev_x -> accum | Some (prev_winner, prev_x, count) when x = prev_x -> let count' = succ count in let winner = if Random.int count' = 0 then idx else prev_winner in Some (winner, prev_x, count') | _ -> Some (idx, x, 1)) |> Option.get |> Tuple3.first (* the thing that accumulates reference sequences before classification *) module Preclassifier = struct type base = { word_length: int; n_words: int; tax_ids: Tax_id.t array; } type 'a t = { base: base; freq_table: (int, 'a, BA.c_layout) BA2.t; taxid_counts: int array; word_counts: int array; seq_count: int ref; } exception Tax_id_not_found of Tax_id.t (* make a preclassifier, given kind, word_length, and tax_ids *) let make kind word_length tax_ids = if word_length > max_word_length then failwith (Printf.sprintf "max_word_length is %d (given word_length %d)" max_word_length word_length); let n_words = 1 lsl (word_length * 2) and n_taxids = Array.length tax_ids in let freq_table = BA2.create kind BA.c_layout n_taxids n_words and taxid_counts = Array.make n_taxids 0 and word_counts = Array.make n_words 0 and seq_count = ref 0 in BA2.fill freq_table 0; {base = {word_length; n_words; tax_ids}; word_counts; taxid_counts; freq_table; seq_count} (* find the index of a tax_id in the tax_ids array *) let tax_id_idx c tid = try Array.findi ((=) tid) c.base.tax_ids with Not_found -> raise (Tax_id_not_found tid) (* add a sequence to the counts for a particular tax_id *) let add_seq c tax_id seq = let i = tax_id_idx c tax_id and word_seen = Array.make c.base.n_words false in incr c.seq_count; c.taxid_counts.(i) <- c.taxid_counts.(i) + 1; gen_count_by_seq c.base.word_length (fun j -> word_seen.(j) <- true) seq; Array.iteri (fun j seen -> if seen then begin c.freq_table.{i, j} <- succ c.freq_table.{i, j}; c.word_counts.(j) <- succ c.word_counts.(j) end) word_seen let to_taxid_word_counts c dest = let n = float_of_int (succ !(c.seq_count)) in let prior_counts = Array.init c.base.n_words (fun j -> (* w_j is the prior for seeing word j *) let w_j = float_of_int c.word_counts.(j) in (* (n(w_j) + 0.5) / (N + 1) *) (w_j +. 0.5) /. n) in BA2.modifyij (fun j i _ -> let m = c.freq_table.{i, j} and denom = log (float_of_int c.taxid_counts.(i) +. 1.) in (* log (m(w_j) + prior_counts[j]) - denom *) log (float_of_int m +. prior_counts.(j)) -. denom) dest end (* The classifier: the thing that actually holds the data for classification. * The most important component is taxid_word_counts, which is indexed on the * rows by the words and on the columns by the taxids. *) module Classifier = struct type t = { pc: Preclassifier.base; (* The matrix used for NBC classification. *) taxid_word_counts: Matrix.matrix; (* The matrix of randomly-generated bootstraps. *) boot_matrix: (int, BA.int16_unsigned_elt, BA.c_layout) BA2.t; (* A vector to hold the results of a classification multiplication. *) classify_vec: Gsl_vector.vector; } type rank = Rank of int | Auto_rank | All_ranks (* make a classifier from a preclassifier *) let make ?(n_boot = 100) ?map_file ?rng c = let open Preclassifier in let n_taxids = Array.length c.base.tax_ids and rng = Option.default (Random.get_state ()) rng and boot_rows = n_boot * extra_boot_factor in let taxid_word_counts, fill_counts = match map_file with | Some (fd, also_write) -> BA2.map_file fd BA.float64 BA.c_layout also_write c.base.n_words n_taxids, also_write | None -> Matrix.create c.base.n_words n_taxids, true and fill_boot_row vec = Random.State.enum_int rng c.base.n_words (* boot with 1/word_length of the words. this number of bootstrapped * columns is assumed below in the definition of `expected` in the * bootstrap function. *) |> Enum.take (c.base.n_words / c.base.word_length) |> Enum.iter (fun i -> vec.{i} <- succ vec.{i}) and boot_matrix = BA2.create BA.int16_unsigned BA.c_layout boot_rows c.base.n_words and classify_vec = Gsl_vector.create ~init:0. n_taxids in if fill_counts then Preclassifier.to_taxid_word_counts c taxid_word_counts; BA2.fill boot_matrix 0; 0 --^ boot_rows |> Enum.iter (fun i -> BA2.slice_left boot_matrix i |> fill_boot_row); {pc = c.base; taxid_word_counts; boot_matrix; classify_vec} (* Find the tax_id associated with a count vector using the classifier cf. *) let classify_vec ?(random_tie_break = false) cf vec = let open Preclassifier in let dest = cf.classify_vec in Gsl_vector.set_zero dest; Linear.float_mat_int_vec_mul dest cf.taxid_word_counts vec; (if random_tie_break then random_winner_max_index dest else Gsl_vector.max_index dest) |> Array.get cf.pc.tax_ids (* fill a vector with counts for a sequence *) let count_seq cf ?(like_rdp = false) seq = let open Preclassifier in let vec = BA1.create BA.int16_unsigned BA.c_layout cf.pc.n_words in let counter_fn = if like_rdp then fun i -> vec.{i} <- 1 else fun i -> vec.{i} <- succ vec.{i} in BA1.fill vec 0; gen_count_by_seq cf.pc.word_length counter_fn seq; vec (* classify a sequence, returning a tax_id *) let classify cf ?like_rdp ?random_tie_break seq = count_seq cf ?like_rdp seq |> classify_vec ?random_tie_break cf (* Bootstrap a sequence, returning a map from tax_ids to a float on the range * (0, 1] representing the percentage of bootstrappings done that produced a * particular tax_id. As you can read about at the top of this file, we do * bootstrapping a little differently than is traditional. We keep on * sampling resamplings (that are effectively just determined once) until we * get n_boot samples that are within the proper range. *) let bootstrap cf ?like_rdp ?random_tie_break seq = let open Preclassifier in let module TIM = Tax_id.TaxIdMap in let seq_word_counts = count_seq cf ?like_rdp seq in let boot_rows = BA2.dim1 cf.boot_matrix in let n_boot = boot_rows / extra_boot_factor in if n_boot = 0 then TIM.singleton (classify_vec ?random_tie_break cf seq_word_counts) 1. else (* ... *) let booted_word_counts = BA1.create BA.int16_unsigned BA.c_layout cf.pc.n_words (* the expected number of occupied columns under bootstrapping *) and expected = (Linear.int_vec_tot seq_word_counts) / cf.pc.word_length (* n_successes is the number of times we've gotten a re-sample that is * within the proper range. *) and n_successes = ref 0 in let counts = 0 --^ boot_rows |> Enum.fold (fun accum i -> if !n_successes >= n_boot then accum (* done *) else begin let boot_row = BA2.slice_left cf.boot_matrix i in Linear.int_vec_pairwise_prod booted_word_counts boot_row seq_word_counts; if in_boot_range expected (Linear.int_vec_tot booted_word_counts) then begin (* the number of occupied columns for this bootstrap resample is * within the desired range *) let ti = classify_vec ?random_tie_break cf booted_word_counts in incr n_successes; TIM.modify_def 0 ti succ accum end else accum end) TIM.empty in let total = TIM.values counts |> Enum.sum |> float_of_int in TIM.map (fun c -> float_of_int c /. total) counts let find_auto_rank td rank_tax_map = let n_all_seqs = IntMap.values rank_tax_map |> Enum.map StringMap.keys |> Enum.flatten |> StringSet.of_enum |> StringSet.cardinal and highest_rank, _ = IntMap.max_binding rank_tax_map in let rec is_viable rank_map = (StringMap.cardinal rank_map * 100 / n_all_seqs) > 80 and aux rank = match IntMap.Exceptionless.find rank rank_tax_map with | _ when rank = -1 -> failwith "no rank could be automatically determined" | Some rank_map when is_viable rank_map -> rank | _ -> aux (rank - 1) in aux highest_rank |> tap (Tax_taxonomy.get_rank_name td |- dprintf "automatically determined best rank: %s\n") let _of_refpkg ?ref_aln ?n_boot ?map_file ?rng word_length rank_idx rp = let td = Refpkg.get_taxonomy rp and rank_tax_map = rank_tax_map_of_refpkg rp in let rank_idx = if rank_idx = -1 then find_auto_rank td rank_tax_map else rank_idx in let preclassif = IntMap.find rank_idx rank_tax_map |> StringMap.values |> Tax_id.TaxIdSet.of_enum |> Tax_id.TaxIdSet.enum |> Array.of_enum |> Preclassifier.make Bigarray.int word_length and rp_name = Refpkg.get_name rp in begin match map_file with | Some (_, false) -> dprintf "using stored reference counts for refpkg %s.\n" rp_name | _ -> dprintf "counting sequences from refpkg %s.\n" rp_name; (* a map from reference sequence names to chosen-rank tax_ids *) let seq_tax_ids = IntMap.find rank_idx rank_tax_map and filter m (k, seq) = match StringMap.Exceptionless.find k m with | Some v -> Some (v, Alignment.ungap seq) | None -> None in let ref_aln = Option.default (Refpkg.get_aln_fasta rp) ref_aln in let progress_fn = progress_displayer "counting reference sequence %s (%d/%d)..." (Array.length ref_aln) in Array.enum ref_aln |> Enum.map (tap (fst |- progress_fn)) |> Enum.filter_map (filter seq_tax_ids) |> Enum.iter (uncurry (Preclassifier.add_seq preclassif)) end; make ?map_file ?n_boot ?rng preclassif (* Take each sequence and put it in the classifier at every rank of its * lineage. *) let _all_ranks_of_refpkg ?ref_aln ?n_boot ?rng word_length rp = let td = Refpkg.get_taxonomy rp and seqinfo = Refpkg.get_seqinfom rp in let preclassif = Tax_id.TaxIdMap.keys td.Tax_taxonomy.tax_rank_map |> Array.of_enum |> Preclassifier.make Bigarray.int word_length in dprintf "counting sequences from refpkg %s.\n" (Refpkg.get_name rp); let ref_aln = Option.default (Refpkg.get_aln_fasta rp) ref_aln in let progress_fn = progress_displayer "counting reference sequence %s (%d/%d)..." (Array.length ref_aln) and expand_lineage (ti, seq) = Tax_taxonomy.get_lineage td ti |> List.enum |> Enum.map (fun ti' -> ti', seq) in Array.enum ref_aln |> Enum.map (tap (fst |- progress_fn) |- (Tuple2.map (Tax_seqinfo.tax_id_by_node_label seqinfo) (Alignment.ungap)) |- expand_lineage) |> Enum.flatten |> Enum.iter (uncurry (Preclassifier.add_seq preclassif)); make ?n_boot ?rng preclassif let of_refpkg ?ref_aln ?n_boot ?map_file ?rng word_length rank rp = let td = Refpkg.get_taxonomy rp and rank_tax_map = rank_tax_map_of_refpkg rp in match begin match rank with | Rank rank_idx -> Some rank_idx | Auto_rank -> Some (find_auto_rank td rank_tax_map) | All_ranks -> None end with | Some rank_idx -> _of_refpkg ?ref_aln ?n_boot ?map_file ?rng word_length rank_idx rp | None -> _all_ranks_of_refpkg ?ref_aln ?n_boot ?rng word_length rp end pplacer-1.1.alpha19/pplacer_src/nbc.mli000066400000000000000000000021331303154601500177760ustar00rootroot00000000000000open Ppatteries exception Invalid_base of char val bases: string val informative: char -> bool val word_to_int: string -> int val int_to_word: ?word_length:int -> int -> string val gen_count_by_seq: int -> (int -> unit) -> string -> unit val max_word_length: int val random_winner_max_index: ('a, 'b, 'c) Bigarray.Array1.t -> int module Preclassifier: sig type 'a t exception Tax_id_not_found of Tax_id.t val make: (int, 'a) Bigarray.kind -> int -> Tax_id.t array -> 'a t val tax_id_idx: 'a t -> Tax_id.t -> int val add_seq: 'a t -> Tax_id.t -> string -> unit end module Classifier: sig type t type rank = Rank of int | Auto_rank | All_ranks val make: ?n_boot:int -> ?map_file:(Unix.file_descr * bool) -> ?rng:Random.State.t -> 'a Preclassifier.t -> t val classify: t -> ?like_rdp:bool -> ?random_tie_break:bool -> string -> Tax_id.t val bootstrap: t -> ?like_rdp:bool -> ?random_tie_break:bool -> string -> float Tax_id.TaxIdMap.t val of_refpkg: ?ref_aln:Alignment.t -> ?n_boot:int -> ?map_file:(Unix.file_descr * bool) -> ?rng:Random.State.t -> int -> rank -> Refpkg.t -> t end pplacer-1.1.alpha19/pplacer_src/newick_bark.ml000066400000000000000000000110361303154601500213440ustar00rootroot00000000000000(* The bark for newick gtrees, i.e. trees that only have bl, name, and boot. *) open Ppatteries exception No_bl exception No_node_label exception No_edge_label let ppr_opt_node_labeld node_label ppr_val ff = function | Some x -> Format.fprintf ff " %s = %a;@," node_label ppr_val x | None -> () let write_something_opt write_it ch = function | Some x -> write_it ch x | None -> () let needs_quotes = Str.regexp "\\(\\([ \t\n(){}:;,]\\|\\[\\|]\\)\\|\\(['\\\\]\\)\\)" let quote_label s = let replaced = ref false in let s' = Str.global_substitute needs_quotes (fun s -> replaced := true; match Sparse.first_match [2; 3] s with | 2, s -> s | 3, s -> "\\" ^ s | _, _ -> invalid_arg "quote_label") s in if !replaced then Printf.sprintf "'%s'" s' else s' let maybe_float = flip Option.bind (Result.catch float_of_string %> Result.to_option) class newick_bark arg = let (bl, node_label, edge_label) = match arg with | `Empty -> (None, None, None) | `Of_bl_node_edge_label (bl, node_label, edge_label) -> (bl, node_label, edge_label) in object (self) val bl = bl val node_label = node_label val edge_label = edge_label method get_bl_opt = bl method get_bl = match bl with | Some x -> x | None -> raise No_bl method set_bl_opt xo = {< bl = xo >} method set_bl (x:float) = {< bl = Some x >} method get_node_label_opt = node_label method get_node_label = match node_label with | Some s -> s | None -> raise No_node_label method set_node_label_opt so = {< node_label = so >} method set_node_label s = {< node_label = Some s >} method get_edge_label_opt = edge_label method get_edge_label = match edge_label with | Some x -> x | None -> raise No_edge_label method set_edge_label_opt xo = {< edge_label = xo >} method set_edge_label x = {< edge_label = Some x >} method get_confidence_name_opt is_leaf = match maybe_float edge_label with | None when is_leaf -> None, node_label | None -> begin match maybe_float node_label with | None -> None, node_label | c -> c, None end | c -> c, node_label method to_newick_string node_number = Printf.sprintf "%s%s%s%s" (Option.map_default quote_label "" node_label) (Option.map_default (Printf.sprintf ":%g") "" bl) (Option.map_default (Printf.sprintf "{%d}") "" node_number) (Option.map_default (quote_label %> Printf.sprintf "[%s]") "" edge_label) method private ppr_inners ff = ppr_opt_node_labeld "bl" Format.pp_print_float ff bl; ppr_opt_node_labeld "node_label" Format.pp_print_string ff node_label; ppr_opt_node_labeld "edge_label" Format.pp_print_string ff edge_label method ppr ff = Format.fprintf ff "@[{%a}@]" (fun ff () -> self#ppr_inners ff) () method to_xml is_leaf = begin let confidence, name = self#get_confidence_name_opt is_leaf in [] |> maybe_map_cons (Myxml.tag "name") name |> maybe_map_cons (Printf.sprintf "%g" %> Myxml.tag "branch_length") bl |> maybe_map_cons (Printf.sprintf "%g" %> Myxml.tag "confidence" ~attrs:["type", "confidence"]) confidence |> List.rev end method to_numbered id = {< node_label = Some (Option.map_default (Printf.sprintf "@%s") "" node_label); edge_label = Some (string_of_int id); >} end type t = newick_bark let empty = new newick_bark `Empty let float_approx_compare epsilon x y = let diff = x -. y in if abs_float diff <= epsilon then 0 else if diff < 0. then -1 else 1 let floato_approx_compare epsilon a b = match (a, b) with | (Some x, Some y) -> float_approx_compare epsilon x y | (a, b) -> Pervasives.compare a b let compare ?epsilon:(epsilon=0.) ?cmp_edge_label:(cmp_edge_label=true) b1 b2 = let fc = floato_approx_compare epsilon in try raise_if_different fc b1#get_bl_opt b2#get_bl_opt; raise_if_different compare b1#get_node_label_opt b2#get_node_label_opt; if cmp_edge_label then raise_if_different compare b1#get_edge_label_opt b2#get_edge_label_opt; 0 with | Different c -> c let map_find_loose id m = if IntMap.mem id m then IntMap.find id m else new newick_bark `Empty let map_set_bl id bl m = IntMap.add id ((map_find_loose id m)#set_bl bl) m let map_set_node_label id node_label m = IntMap.add id ((map_find_loose id m)#set_node_label node_label) m let map_set_edge_label id edge_label m = IntMap.add id ((map_find_loose id m)#set_edge_label edge_label) m pplacer-1.1.alpha19/pplacer_src/newick_gtree.ml000066400000000000000000000203121303154601500215300ustar00rootroot00000000000000open Ppatteries type t = Newick_bark.newick_bark Gtree.gtree (* use *) (* epsilon is the "error" allowed in the floating point comparisons, and * cmp_boot determines if the comparison should compare bootstraps. *) let compare ?epsilon:(epsilon=0.) ?(cmp_edge_label = true) t1 t2 = Gtree.compare (Newick_bark.compare ~epsilon ~cmp_edge_label) t1 t2 let to_numbered t = Gtree.mapi_bark_map (fun i x -> x#to_numbered i) t let make_edge_label_id t = Gtree.mapi_bark_map (fun i x -> x#set_edge_label (string_of_int i)) t let node_labels_of_ids t = List.enum |- Enum.filter_map (Result.catch (identity &&& Gtree.get_node_label t) |- Result.to_option) |- IntMap.of_enum (* Make a list of the names on the tree, including the internal nodes. *) let node_label_map t = Gtree.node_ids t |> node_labels_of_ids t (* The same, but only the leaves on the tree. *) let leaf_label_map t = Gtree.leaf_ids t |> node_labels_of_ids t let label_to_leaf_map gt map = let labels = leaf_label_map gt |> IntMap.enum |> Enum.map swap |> StringMap.of_enum in StringMap.enum map |> Enum.filter_map (fun (label, x) -> match StringMap.Exceptionless.find label labels with | Some i -> Some (i, x) | None -> None) |> IntMap.of_enum let has_zero_bls t = List.fold_left (fun accum id -> accum || Gtree.get_bl t id = 0.) false (Stree.nonroot_node_ids (Gtree.get_stree t)) (* output *) let string_of_bark ?(with_node_numbers = false) t id = match Gtree.get_bark_opt t id with | Some b -> b#to_newick_string (if with_node_numbers then Some id else None) | None when with_node_numbers -> Printf.sprintf "{%d}" id | None -> "" let to_string_gen f t = (Gtree.recur (fun id below -> "("^(String.concat "," below)^")"^(f t id)) (f t) t)^";" let to_string ?with_node_numbers t = to_string_gen (string_of_bark ?with_node_numbers) t let write ?with_node_numbers ch t = Printf.fprintf ch "%s\n" (to_string ?with_node_numbers t) let tree_list_to_file ?with_node_numbers trees fname = let ch = open_out fname in List.iter (write ?with_node_numbers ch) trees; close_out ch let to_file ?with_node_numbers t fname = tree_list_to_file ?with_node_numbers [t] fname let ppr ff t = let ppr_bark ff id = Format.pp_print_string ff (string_of_bark t id) in let rec aux ff = function | Stree.Node(id, tL) -> Format.fprintf ff "@[(%a)%a@]" (Ppr.ppr_gen_list_inners "," aux) tL ppr_bark id | Stree.Leaf(id) -> ppr_bark ff id in Format.fprintf ff "%a;" aux (Gtree.get_stree t) (* input *) (* count the number of occurrences of char c in str *) let count_n_occurrences c str = let count = ref 0 in String.iter (fun d -> if c = d then incr count) str; !count let check_string s = let n_open = count_n_occurrences '(' s and n_closed = count_n_occurrences ')' s in if n_open <> n_closed then dprintf "warning: %d open parens and %d closed parens\n" n_open n_closed; () let of_lexbuf ?(legacy_format = false) ?fname lexbuf = Newick_parse_state.node_num := (-1); Newick_parse_state.legacy_format := legacy_format; Sparse.wrap_of_fname_opt fname (Newick_parser.tree Newick_lexer.token) lexbuf let of_string ?legacy_format ?fname s = check_string s; try of_lexbuf ?fname ?legacy_format (Lexing.from_string s) with | Failure s -> failwith("problem parsing tree: "^s) let of_file ?legacy_format fname = match List.filter (fun line -> not (Str.string_match (Str.regexp "^[ \t]*$") line 0)) (File_parsing.string_list_of_file fname) with | [] -> failwith ("empty file in "^fname) | [s] -> of_string ?legacy_format ~fname s | _ -> failwith ("expected a single tree on a single line in "^fname) let of_refpkg_contents = Refpkg_parse.of_file_or_string of_file (of_string ?legacy_format:None) let list_of_file fname = List.map (of_string ~fname) (File_parsing.string_list_of_file fname) let gen_add_zero_root_bl empty gt = let bm = Gtree.get_bark_map gt and i = Gtree.top_id gt in let bark = IntMap.get i empty bm in let bark' = match bark#get_bl_opt with | None -> bark#set_bl 0. | Some _ -> bark in IntMap.add i bark' bm |> Gtree.set_bark_map gt let add_zero_root_bl = gen_add_zero_root_bl (new Newick_bark.newick_bark `Empty) (* Given a newick gtree, collapse all nodes with only one child, so that the * resulting tree is always at least bifurcating. The result is also * renumbered through Gtree.renumber. The translation map returned is similar * to that returned by Gtree.renumber, except that it maps from the node * number to a pair of (new node number, increased distal branch length). *) let consolidate gt = let gt = add_zero_root_bl gt in let bl = Gtree.get_bl gt in let open Stree in let rec aux parent = function | Node (i, [t]) -> aux (Some ((i, bl i) :: Option.default [] parent)) t | t -> let t', transm, barkm = match t with | Leaf _ -> t, IntMap.empty, IntMap.empty | Node (i, subtrees) -> List.fold_left (fun (ta, ba, ma) x -> let tx, bx, mx = aux None x in tx :: ta, IntMap.union bx ba, IntMap.union mx ma) ([], IntMap.empty, IntMap.empty) subtrees |> Tuple3.map1 (List.rev |- node i) in let i = top_id t' in let bark = Gtree.get_bark gt i in let transm', bl' = List.fold_left (fun (tma, bla) (j, jbl) -> IntMap.add j (i, bla) tma, bla +. jbl) (IntMap.add i (i, 0.) transm, bl i) (Option.default [] parent) in t', transm', IntMap.add i (bark#set_bl bl') barkm in let stree, transm, bark_map = Gtree.get_stree gt |> aux None in let gt', transm' = Gtree.gtree stree bark_map |> Gtree.renumber in gt', IntMap.map (flip IntMap.find transm' |> Tuple.Tuple2.map1) transm let prune_to_pql should_prune ?(placement_transform = const identity) gt = let open Stree in let st = Gtree.get_stree gt and bl = Gtree.get_bl gt and name = Gtree.get_node_label gt in let rec aux attachment_opt = function | Leaf i when should_prune i -> let loc, pend_bl = Option.get attachment_opt |> Tuple.Tuple2.map2 ((+.) (bl i)) in let pq = Pquery.make_ml_sorted ~namlom:[name i, 1.] ~seq:Pquery_io.no_seq_str [Placement.make_ml loc ~ml_ratio:1. ~log_like:0. ~dist_bl:0. ~pend_bl |> Placement.add_pp ~post_prob:1. ~marginal_prob:1. |> placement_transform i] in None, [pq] | Leaf _ as l -> Some l, [] | Node (i, subtrees) -> let pruned = should_prune i in let attachment_opt' = match attachment_opt with | _ when not pruned -> Some (i, 0.) | Some (loc, pend_bl) -> Some (loc, pend_bl +. bl i) | None -> failwith "whole tree pruned" in List.fold_left (fun (st_accum, pql_accum) t -> let t_opt, pql = aux attachment_opt' t in maybe_cons t_opt st_accum, List.append pql pql_accum) ([], []) subtrees |> Tuple.Tuple2.map1 (if pruned then const None else node i |- some) in let gt', pql = aux None st |> Tuple.Tuple2.map1 (Option.get |- Gtree.set_stree gt) in let replace_root_placement = let open Placement in let top, location = match Gtree.get_stree gt' with | Node (top, subtree :: _) -> top, top_id subtree | _ -> failwith "trimmed tree's root is not a node with >1 subtree" in let distal_bl = Gtree.get_bl gt' location in fun p -> if p.location = top then {p with location; distal_bl} else p in gt', List.map (Pquery.apply_to_place_list (List.map replace_root_placement)) pql let expand_multifurcation_to_bifurcation ?(fresh_bark = const (Newick_bark.empty#set_bl 0.)) gt = let open Stree in let st = Gtree.get_stree gt and bm = ref (Gtree.get_bark_map gt) in let last_id = ref (max_id st) in let next () = incr last_id; bm := IntMap.add !last_id (fresh_bark !last_id) !bm; !last_id in let rec aux = function | Node (i, top :: (_ :: _ :: _ as rest)) -> node i [aux top; aux (node (next ()) rest)] | Node (i, subtrees) -> node i (List.map aux subtrees) | Leaf _ as l -> l in let st' = aux st in Gtree.gtree st' !bm pplacer-1.1.alpha19/pplacer_src/newick_lexer.mll000066400000000000000000000024461303154601500217250ustar00rootroot00000000000000(* the lex file for newick parsing. *) (* this stuff gets evaluated automatically *) { open Ppatteries open Newick_parser open Lexing let escapes = Str.regexp "\\\\\\(['\\\\]\\)" let unquote s = let s = String.sub s 1 ((String.length s) - 2) in Str.global_replace escapes "\\1" s } (* Unquoted labels may not contain blanks, parentheses, square brackets, * braces, single quotes, colons, semicolons, or commas. *) let unquotedchar = [^ ' ' '\t' '\n' '(' ')' '[' ']' '{' '}' '\'' ':' ';' ','] let unquotedlabel = unquotedchar+ let escape = '\\' ['\'' '\\'] let nonescape = [^ ' ' '\''] let quotedlabel = '\'' (escape | nonescape)* '\'' rule token = parse | [' ' '\t'] { token lexbuf } | '\n' { Sparse.incr_lineno lexbuf; token lexbuf } | unquotedlabel { LABEL (Lexing.lexeme lexbuf) } | quotedlabel { LABEL (unquote (Lexing.lexeme lexbuf)) } | ':' { COLON } | ';' { SEMICOLON } | ',' { COMMA } | '(' { LPAREN } | ')' { RPAREN } | '[' { LBRACK } | ']' { RBRACK } | '{' { LBRACE } | '}' { RBRACE } | eof { EOF } | _ { raise (Sparse.parse_error_of_positions "syntax error lexing" lexbuf.lex_start_p lexbuf.lex_curr_p) } pplacer-1.1.alpha19/pplacer_src/newick_parse_state.ml000066400000000000000000000000661303154601500227400ustar00rootroot00000000000000let node_num = ref (-1) let legacy_format = ref false pplacer-1.1.alpha19/pplacer_src/newick_parser.mly000066400000000000000000000072221303154601500221140ustar00rootroot00000000000000%token EOF COLON SEMICOLON COMMA LPAREN RPAREN LBRACK RBRACK LBRACE RBRACE %token LABEL %start tree %type tree %% %{ open Ppatteries open Newick_parse_state (* parse state *) type ps = { stree: Stree.stree; bark: Newick_bark.newick_bark IntMap.t; my_bark: Newick_bark.newick_bark IntMap.t; } (* list parse state *) type lps = { stree_l: Stree.stree list; bark_l: Newick_bark.newick_bark IntMap.t; my_bark_l: Newick_bark.newick_bark IntMap.t; } let combine = IntMap.fold IntMap.add let empty_lps = {stree_l = []; bark_l = IntMap.empty; my_bark_l = IntMap.empty} let lps_append lp lps = {lps with stree_l = lp.stree :: lps.stree_l; bark_l = combine lp.bark lp.my_bark |> combine lps.bark_l} let add_bark add_fun x s = {s with my_bark = add_fun (Stree.top_id s.stree) x s.my_bark} let add_bl = add_bark Newick_bark.map_set_bl let add_node_label = add_bark Newick_bark.map_set_node_label let add_edge_label = add_bark Newick_bark.map_set_edge_label let add_id id lp = {lp with stree = Stree.of_id id lp.stree; my_bark = try let value, bark' = Stree.top_id lp.stree |> flip IntMap.extract lp.my_bark in IntMap.add id value bark' with Not_found -> lp.my_bark } let add_leaf () = incr node_num; { stree = Stree.leaf !node_num; bark = IntMap.empty; my_bark = IntMap.empty; } let add_internal ls = incr node_num; { stree = Stree.node !node_num ls.stree_l; bark = combine ls.bark_l ls.my_bark_l; my_bark = IntMap.empty; } let bl x tok = Sparse.try_map float_of_string x tok "branch lengths must be floats" let node_number x tok = Sparse.try_map int_of_string x tok "node numbers must be integers" let check_legacy tok = if !legacy_format then Sparse.parse_error tok "braced node numbers not allowed in legacy format" let add_id_or_edge_label x tok = if !legacy_format then add_id (node_number x tok) else add_edge_label x %} node_labeled_leaf: | LABEL { add_leaf () |> add_node_label $1 } lengthy_leaf: | COLON LABEL { add_leaf () |> add_bl (bl $2 2) } | node_labeled_leaf COLON LABEL { add_bl (bl $3 3) $1 } | node_labeled_leaf { $1 } node_numbered_leaf: | LBRACE LABEL RBRACE { check_legacy 1; add_leaf () |> add_id (node_number $2 2) } | lengthy_leaf LBRACE LABEL RBRACE { check_legacy 2; add_id (node_number $3 3) $1 } | lengthy_leaf { $1 } leaf: | LBRACK LABEL RBRACK { add_leaf () |> add_id_or_edge_label $2 2 } | node_numbered_leaf LBRACK LABEL RBRACK { add_id_or_edge_label $3 3 $1 } | node_numbered_leaf { $1 } subtree_list: | subtree COMMA subtree_list { lps_append $1 $3 } | subtree { lps_append $1 empty_lps } bare_subtree_group: | LPAREN subtree_list RPAREN { add_internal $2 } node_labeled_subtree_group: | bare_subtree_group LABEL { add_node_label $2 $1 } | bare_subtree_group { $1 } lengthy_subtree_group: | node_labeled_subtree_group COLON LABEL { add_bl (bl $3 3) $1 } | node_labeled_subtree_group { $1 } node_numbered_subtree_group: | lengthy_subtree_group LBRACE LABEL RBRACE { check_legacy 2; add_id (node_number $3 3) $1 } | lengthy_subtree_group { $1 } subtree_group: | node_numbered_subtree_group LBRACK LABEL RBRACK { add_id_or_edge_label $3 3 $1 } | node_numbered_subtree_group { $1 } subtree: /* empty */ { add_leaf () } | subtree_group { $1 } | leaf { $1 } bare_tree: | subtree SEMICOLON { $1 } | subtree { $1 } tree: | bare_tree EOF { Gtree.gtree $1.stree (combine $1.bark $1.my_bark) } | error EOF { Sparse.parse_error 1 "syntax error parsing" } pplacer-1.1.alpha19/pplacer_src/nuc_models.ml000066400000000000000000000047141303154601500212220ustar00rootroot00000000000000(* translating nucleotide sequences into likelihood vectors * *) open Ppatteries (* Adenine A A Cytosine C C Guanine G G Thymine T T Purine G or A R Pyrimidine T or C Y Amino A or C M Keto G or T K Strong (3H bonds) G or C S Weak (2H bonds) A or T W Not G A or C or T H Not A G or T or C B Not T G or C or A V Not C G or A or T D Any G or C or T or A N *) let nuc_map = CharMap.of_pairlist ( List.map (fun (c, v) -> (c, Gsl_vector.of_array v)) ( (* A C G T *) ['A', [|1.; 0.; 0.; 0.|]; 'C', [|0.; 1.; 0.; 0.|]; 'G', [|0.; 0.; 1.; 0.|]; 'T', [|0.; 0.; 0.; 1.|]; 'R', [|1.; 0.; 1.; 0.|]; (* G or A *) 'Y', [|0.; 1.; 0.; 1.|]; (* T or C *) 'M', [|1.; 1.; 0.; 0.|]; (* A or C *) 'K', [|0.; 0.; 1.; 1.|]; (* G or T *) 'S', [|0.; 1.; 1.; 0.|]; (* G or C *) 'W', [|1.; 0.; 0.; 1.|]; (* A or T *) 'H', [|1.; 1.; 0.; 1.|]; (* A or C or T *) 'B', [|0.; 1.; 1.; 1.|]; (* G or T or C *) 'V', [|1.; 1.; 1.; 0.|]; (* G or C or A *) 'D', [|1.; 0.; 1.; 1.|]; (* G or A or T *) 'N', [|1.; 1.; 1.; 1.|]; (* G or C or T or A *) '-', [|1.; 1.; 1.; 1.|]; '?', [|1.; 1.; 1.; 1.|]; 'X', [|1.; 1.; 1.; 1.|];])) let nuc_code = [|'A';'C';'G';'T'|] let lv_of_nuc nuc = try CharMap.find nuc nuc_map with | Not_found -> invalid_arg (Printf.sprintf "%c not a known nucleotide!" nuc) (* * um, am i over-coding here? * coordinates of upper triangular matrix * # List.map transform 3 [0;1;2;3;4;5];; - : (int * int) list = [(0, 1); (0, 2); (0, 3); (1, 2); (1, 3); (2, 3)] * *) let transform dim x = let rec aux k i j = if j >= k then aux (k-1) (i+1) (j-k) else (i,i+j+1) in aux dim 0 x let set_both m (i,j) x = m.(i).(j) <- x; m.(j).(i) <- x (* make a symmetric matrix out of a vector which is assumed to be * ac ag at cg ct gt *) let b_of_trans_vector v = assert(Array.length v = 6); let m = Array.make_matrix 4 4 0. in for i=0 to 5 do set_both m (transform 3 i) v.(i) done; Gsl_matrix.of_arrays m pplacer-1.1.alpha19/pplacer_src/ocaml_linear.ml000066400000000000000000000063761303154601500215250ustar00rootroot00000000000000(* just the calls for linear_c. *) open Bigarray let mdims m = (Array2.dim1 m, Array2.dim2 m) let get_common f = function | x::l -> let fx = f x in List.iter (fun y -> assert(fx = f y)) l; fx | [] -> invalid_arg "get_common" let get_common_mdims l = get_common mdims l let get_common_tdims l = get_common Tensor.dims l let pairwise_prod dst x y = let (n_rates, n_sites, n_states) = get_common_tdims [dst;x;y] in for rate=0 to n_rates-1 do for site=0 to n_sites-1 do for state=0 to n_states-1 do dst.{rate,site,state} <- x.{rate,site,state} *. y.{rate,site,state} done done done let statd_pairwise_prod statd dst a b = let (n_rates, n_sites, n_states) = get_common_tdims [dst;a;b] in assert(n_states = Array1.dim statd); for rate=0 to n_rates-1 do for site=0 to n_sites-1 do for state=0 to n_states-1 do dst.{rate,site,state} <- statd.{state} *. a.{rate,site,state} *. b.{rate,site,state} done done done (* total up the likes from the util vector *) let ll_of_util util ~n_rates ~n_sites = let ll_tot = ref 0. in for site=0 to n_sites-1 do ll_tot := !ll_tot +. log(util.{site}) done; (* subtract once rather than perform division by n_rates n_sites times *) ll_tot := !ll_tot -. (float_of_int n_sites) *. (log (float_of_int n_rates)); !ll_tot let log_like3 statd x y z util = let (n_rates, n_sites, n_states) = get_common_tdims [x;y;z] in assert(n_states <= Array1.dim util); for site=0 to n_sites-1 do util.{site} <- 0.0 done; for rate=0 to n_rates-1 do for site=0 to n_sites-1 do for state=0 to n_states-1 do util.{site} <- util.{site} +. statd.{state} *. x.{rate,site,state} *. y.{rate,site,state} *. z.{rate,site,state} done done done; ll_of_util util ~n_rates ~n_sites (* take the logarithm of the dot product of x and y restricted to the interval * [first, last] (inclusive). first and last are 0-indexed, of course. * *) let bounded_logdot x y first last util = let (n_rates, n_sites, n_states) = get_common_tdims [x;y] and n_used = 1 + last - first in assert(0 <= first && last > first && last <= n_sites); assert(n_used <= Array1.dim util); for site=0 to n_used-1 do util.{site} <- 0.0 done; for rate=0 to n_rates-1 do for site=first to last do for state=0 to n_states-1 do let util_site = site-first in util.{util_site} <- util.{util_site} +. x.{rate,site,state} *. y.{rate,site,state} done done done; ll_of_util util ~n_rates ~n_sites:n_used let gemmish dst a b = let (a_rows,a_cols) = mdims a and (n_sites, n_states) = get_common_mdims [dst;b] in assert(a_rows = a_cols); assert(a_rows = n_states); for site=0 to n_sites-1 do for dst_col=0 to n_states-1 do dst.{site,dst_col} <- 0.; for i=0 to n_states-1 do dst.{site,dst_col} <- dst.{site,dst_col} +. a.{dst_col,i} *. b.{site,i} done done done let dediagonalize dst u lambda uit = let n = Gsl_vector.length lambda in for i=0 to n-1 do for j=0 to n-1 do dst.{i,j} <- 0.; for k=0 to n-1 do dst.{i,j} <- dst.{i,j} +. lambda.{k} *. u.{i,k} *. uit.{j,k} done done done pplacer-1.1.alpha19/pplacer_src/parse_stats.ml000066400000000000000000000275251303154601500214270ustar00rootroot00000000000000(* parse statistics files from RAxML and Phyml * * Both of these parsing routines return a float array option. Protein models * correspond to a return value of None, and the array if it is given is an * array of transition frequencies. *) open Ppatteries exception Stats_parsing_error of string let str_match rex s = Str.string_match rex s 0 let white_rex = Str.regexp "[ \n\t\r]*" let remove_whitespace s = Str.global_replace white_rex "" s let safe_float_of_string s = let no_white = remove_whitespace s in try float_of_string no_white with | Failure _ -> raise (Stats_parsing_error ("float_of_string failed on: '"^no_white^"'")) let check_version program version known_versions = if not (List.mem version known_versions) then dprintf "WARNING: your stats file is from %s %s; %s has been tested with the following versions: %s\n" program version program (String.concat "; " known_versions) let rec find_version_line rex = function | hd :: tl -> if str_match rex hd then Some (Str.matched_group 1 hd) else find_version_line rex tl | [] -> None (* # list_split [1;2;3;4;5] 2;; - : int list * int list = ([1; 2], [3; 4; 5]) *) let list_split l to_pull = let rec aux tp left = function | hd::tl as right -> if tp > 0 then aux (tp-1) (hd::left) tl else (List.rev left, right) | [] -> (List.rev left, []) in aux to_pull [] l let assert_and_extract_float beginning s = let beginning_len = String.length beginning in for i=0 to beginning_len - 1 do if beginning.[i] <> s.[i] then raise (Stats_parsing_error "assert_and_extract_float: didn't match template!") done; safe_float_of_string (String.sub s beginning_len ((String.length s) - beginning_len)) (* ************ RAXML ************* *) let raxml_header_rex = Str.regexp ".* RAxML version \\([^ ]+\\)" let known_raxml_versions = [ "7.0.4"; "7.2.3"; "7.2.5"; "7.2.6"; "7.2.7"; ] let parse_raxml_7_2_3_info lines prefs = let partition_rex = Str.regexp "^Partition:" and subst_matrix_rex = Str.regexp "^Substitution Matrix: \\(.*\\)" and alpha_rex = Str.regexp ".*alpha\\[0\\]: \\([^ ]*\\) \\(.*\\)" and rates_rex = Str.regexp "^rates\\[0\\] ac ag at cg ct gt: \\(.*\\)" in match (File_parsing.partition_list (str_match partition_rex) lines) with | [] | [_] -> raise (Stats_parsing_error "couldn't find a partition line") | _::partitions -> begin if List.length partitions > 1 then raise (Stats_parsing_error "too many partitions. Only one is allowed.") else begin try let (subs_line, rest) = try File_parsing.find_beginning (str_match subst_matrix_rex) (List.hd partitions) with | Not_found -> raise (Stats_parsing_error "couldn't find substitution matrix line") in prefs.Prefs.model_name := Str.matched_group 1 subs_line; let (alpha_line,_) = try File_parsing.find_beginning (str_match alpha_rex) rest with | Not_found -> raise (Stats_parsing_error "couldn't find alpha line") in (* raxml gamma always 4 categories *) let alpha_str = Str.matched_group 1 alpha_line and rate_info = Str.matched_group 2 alpha_line in prefs.Prefs.gamma_n_cat := 4; prefs.Prefs.gamma_alpha := safe_float_of_string alpha_str; if str_match rates_rex rate_info then begin if Prefs.model_name prefs <> "GTR" then raise (Stats_parsing_error ("have rates but model is not GTR! GTR is only allowed nucleotide model.")); Some (Array.of_list (List.map safe_float_of_string (Str.split (Str.regexp "[ ]") (Str.matched_group 1 rate_info)))) end else if Prefs.model_name prefs == "GTR" then raise (Stats_parsing_error "GTR model specified, but no rates found.") else None with | Not_found -> raise (Stats_parsing_error "problem parsing ") | Invalid_argument s -> raise (Stats_parsing_error ("problem parsing: "^s)) end end (* parse re-estimated RAxML info file *) let parse_raxml_re_estimated_info lines prefs = let partition_rex = Str.regexp "^Partition:" and data_type_rex = Str.regexp "^DataType: \\(.*\\)" and subst_matrix_rex = Str.regexp "^Substitution Matrix: \\(.*\\)" and alpha_rex = Str.regexp "^alpha: \\(.*\\)" in match (File_parsing.partition_list (str_match partition_rex) lines) with | [] | [_] -> raise (Stats_parsing_error "couldn't find a partition line") | _::partitions -> begin if List.length partitions > 1 then raise (Stats_parsing_error "too many partitions. Only one is allowed.") else begin try let (data_type_line, rest) = try File_parsing.find_beginning (str_match data_type_rex) (List.hd partitions) with | Not_found -> raise (Stats_parsing_error "couldn't find data type line") in let data_type_str = Str.matched_group 1 data_type_line and () = match rest with | subst_matrix_line::_ -> if str_match subst_matrix_rex subst_matrix_line <> true then raise (Stats_parsing_error "couldn't match substitution matrix line"); prefs.Prefs.model_name := Str.matched_group 1 subst_matrix_line; | [] -> raise (Stats_parsing_error "unexpected end of file after subs matrix line") in let (alpha_line, final_lines) = try File_parsing.find_beginning (str_match alpha_rex) rest with | Not_found -> raise (Stats_parsing_error "couldn't find alpha line") in (* raxml gamma always 4 categories *) prefs.Prefs.gamma_n_cat := 4; prefs.Prefs.gamma_alpha := safe_float_of_string (Str.matched_group 1 alpha_line); match data_type_str with | "DNA" -> begin match final_lines with | _::rate_lines -> Some (Array.map2 assert_and_extract_float [| "rate A <-> C:"; "rate A <-> G:"; "rate A <-> T:"; "rate C <-> G:"; "rate C <-> T:"; "rate G <-> T:"; |] (Array.of_list (fst (list_split rate_lines 6)))) | [] -> raise (Stats_parsing_error "unexpected end of file after alpha line") end | "AA" -> None | s -> raise (Stats_parsing_error ("data type unknown: "^s)) with | Not_found -> raise (Stats_parsing_error "problem parsing ") end end let parse_raxml_info version lines prefs = (* -f e is re-estimate branch lengths, makes a different info file *) let invocation_line_rex = Str.regexp ".*raxmlHPC.*-f e \\(.*\\)" in check_version "RAxML" version known_raxml_versions; match version with | "7.0.4" | "7.2.3" | "7.2.5" | "7.2.6" | "7.2.7" -> begin match find_version_line invocation_line_rex lines with | Some _ -> begin dprint ("parsing a re-estimated RAxML info file."); parse_raxml_re_estimated_info lines prefs end | None -> parse_raxml_7_2_3_info lines prefs end | _ -> dprint "I'm going to try parsing as if this was version 7.2.3"; parse_raxml_7_2_3_info lines prefs (* ************ PHYML ************* *) let phyml_header_rex = Str.regexp "[ \t]*--- PhyML v\\([^ ]+\\)" let known_phyml_versions = [ "3.0"; "3.0_246M"; ] let parse_phyml_stats version lines prefs = let model_rex = Str.regexp ". Model of .* substitution:[ \t]+\\([A-Z]+\\)" and gamma_rex = Str.regexp ". Discrete gamma model:[ \t]*\\(.*\\)" and gamma_n_cats_rex = Str.regexp " - Number of categories:[ \t]*\\([0-9]*\\)" and gamma_alpha_rex = Str.regexp " - Gamma shape parameter:[ \t]*\\([0-9\\.]*\\)" and nuc_freqs_rex = Str.regexp ". Nucleotides frequencies:" in check_version "phyml" version known_phyml_versions; let (m_line, after_m) = try File_parsing.find_beginning (str_match model_rex) lines with | Not_found -> raise (Stats_parsing_error "couldn't find model line!") in prefs.Prefs.model_name := Str.matched_group 1 m_line; let (g_line, after_g) = File_parsing.find_beginning (str_match gamma_rex) after_m in if "Yes" = Str.matched_group 1 g_line then begin match after_g with | cats_str::alpha_str::_ -> begin if Str.string_match gamma_n_cats_rex cats_str 0 then prefs.Prefs.gamma_n_cat := int_of_string (Str.matched_group 1 cats_str); if Str.string_match gamma_alpha_rex alpha_str 0 then prefs.Prefs.gamma_alpha := safe_float_of_string (Str.matched_group 1 alpha_str); end | _ -> raise (Stats_parsing_error "not enough lines after gamma!") end; try let (_,nuc_f_lines) = File_parsing.find_beginning (str_match nuc_freqs_rex) after_g in (* if we get here then we did find some nucleotide freq info *) if Prefs.model_name prefs <> "GTR" then raise (Stats_parsing_error "model must be GTR if we are using nucleotides"); let (_, after_freq) = list_split (List.tl nuc_f_lines) 4 in Some (ArrayFuns.map2 assert_and_extract_float [|" A <-> C"; " A <-> G"; " A <-> T"; " C <-> G"; " C <-> T"; " G <-> T"|] (Array.of_list (fst (list_split (snd (list_split after_freq 3)) 6)))) with | Not_found -> if Prefs.model_name prefs == "GTR" then raise (Stats_parsing_error "GTR model specified but I couldn't parse the frequency and rate information."); None (* JSON! *) open Simple_json exception Unknown_ras_model of string exception Wrong_field_type of string exception Unknown_datatype of string exception Unsupported_model of string let parse_json prefs path = let root = of_file path in let subs_model = find_string root "subs_model" in prefs.Prefs.model_name := subs_model; let () = match (find root "ras_model") with | Jsontype.Null -> () | Jsontype.String "gamma" -> begin let gamma_obj = find root "gamma" in prefs.Prefs.gamma_n_cat := find_int gamma_obj "n_cats"; prefs.Prefs.gamma_alpha := find_float gamma_obj "alpha"; end | Jsontype.String ras_string -> raise (Unknown_ras_model ras_string) | _ -> raise (Wrong_field_type "ras_model") in match (find_string root "datatype") with | "DNA" -> begin match subs_model with | "GTR" as name -> begin prefs.Prefs.model_name := name; let subs_rates = find root "subs_rates" in Some (Array.map (find_float subs_rates) [|"ac";"ag";"at";"cg";"ct";"gt"|]) end | s -> raise (Unsupported_model s) end | "AA" -> begin match subs_model with | "WAG" -> None | s -> begin Printf.printf "We don't currently support %s. If you want it incorporated, email Erick." s; raise (Unsupported_model s) end end | s -> raise (Unknown_datatype s) (* ************ main fun ************* *) let parse_stats ref_dir_complete prefs = let path = ref_dir_complete^(Prefs.stats_fname prefs) in if Filename.check_suffix path ".json" then parse_json prefs path else try let lines = File_parsing.string_list_of_file (ref_dir_complete^(Prefs.stats_fname prefs)) in match find_version_line raxml_header_rex lines with | Some v -> parse_raxml_info v lines prefs | None -> begin match find_version_line phyml_header_rex lines with | Some v -> parse_phyml_stats v lines prefs | None -> raise (Stats_parsing_error "is this a RAxML v7 info or PHYML v3 statistics file? The header didn't match.") end with | ex -> print_endline ("Problem parsing info or stats file"^(Prefs.stats_fname prefs)); raise ex pplacer-1.1.alpha19/pplacer_src/pca.ml000066400000000000000000000056741303154601500176430ustar00rootroot00000000000000open Ppatteries let tol = 1e-14 let max_iter = 100000 (* *** general PCA stuff *** *) let dot = ArrayFuns.fold_left2 (fun s x1 x2 -> s +. (x1 *. x2)) 0. (* Returns array of values, and then array of GSL vectors (i.e. left * eigenmatrix if considered as a matrix). Just keep the top n_keep * eigenpairs. * Eigenvalues returned as a float array, and eigenvects as an array of GSL * vectors. *) let power_eigen n_keep m = let open Power_iteration in let eiga = top_eigs m tol max_iter n_keep in (Array.map (fun e -> e.l) eiga, Array.map (fun e -> e.v) eiga) (* Alternative version that uses symmv rather than power iteration. *) let symmv_eigen n_keep m = let (evalv, evectm) = Gsl_eigen.symmv (`M (m)) in Gsl_eigen.symmv_sort (evalv, evectm) Gsl_eigen.ABS_DESC; (* GSL makes nice column vectors *) Gsl_matrix.transpose_in_place evectm; (Array.sub (Gsl_vector.to_array evalv) 0 n_keep, Array.init n_keep (Gsl_matrix.row evectm)) (* Pass in an n by p array of arrays, and make the corresponding p by p * sample covariance matrix (i.e. such that divisor is n-1). Scale determines * if entries should be divided by the product of the standard deviations to * get a matrix of sample correlation coefficients. * Eigenvalues returned as a float array, and eigenvects as an array of GSL * vectors. *) let covariance_matrix ?scale faa = let x = Gsl_matrix.of_arrays faa and inv k = 1./.(float_of_int k) in let (n, p) = Gsl_matrix.dims x in let h = Linear_utils.mat_init n n (fun i j -> if i=j then 1.-.(inv n) else -.(inv n)) and a = Gsl_matrix.create n p and cov = Gsl_matrix.create p p in Linear_utils.mat_mat_mul a h x; Gsl_blas.syrk Gsl_blas.Upper Gsl_blas.Trans ~alpha:(inv (n-1)) ~a:a ~beta:0. ~c:cov; let scale_f = match scale with | None | Some false -> (fun x _ _ -> x) | Some true -> let scalefact = Linear_utils.vec_init p (fun i -> 1./.sqrt(cov.{i,i})) in (fun x i j -> x *. scalefact.{i} *. scalefact.{j}) in for i=0 to p-1 do for j=i to p-1 do cov.{i,j} <- scale_f cov.{i,j} i j; cov.{j,i} <- cov.{i,j}; done; done; cov (* Return (evals, evects), where only the top n_keep are kept. * Optionally, scale the eigenvalues by the trace of the covariance matrix. * Don't forget that the covariance matrix is positive definite, thus the * eigenvalues are positive, so eigenvalue divided by the trace is the * "fraction" of the variance "explained" by that principal component. * Eigenvects returned as a float array array. * *) let gen_pca ?(symmv=false) ?(use_raw_eval=false) ?scale n_keep faa = let eigen = if symmv then symmv_eigen else power_eigen in let cov = covariance_matrix ?scale faa in let (raw_evals, raw_evects) = eigen n_keep cov in let evects = Array.map Gsl_vector.to_array raw_evects in if use_raw_eval then (raw_evals, evects) else (let tr = Linear_utils.trace cov in Array.map (fun eval -> assert(eval < tr); eval /. tr) raw_evals, evects) pplacer-1.1.alpha19/pplacer_src/phyloxml.ml000066400000000000000000000040341303154601500207410ustar00rootroot00000000000000open Ppatteries open Myxml let phyloxml_ns = "http://www.phyloxml.org" let xsi_ns = "http://www.w3.org/2001/XMLSchema-instance" let phyns s = phyloxml_ns, s let root_tag = phyns "phyloxml", [(Xmlm.ns_xmlns, "xmlns"), phyloxml_ns; (Xmlm.ns_xmlns, "xsi"), xsi_ns; (xsi_ns, "schemaLocation"), "http://www.phyloxml.org/1.10/phyloxml.xsd"] let ns_prefix = function | x when x = phyloxml_ns -> Some "" | x when x = xsi_ns -> Some "xsi" | _ -> None let rec emit_tag out {name; attrs; contents; children} = out (`El_start (phyns name, List.map (Tuple.Tuple2.map1 phyns) attrs)); if contents <> "" then out (`Data contents); List.iter (emit_tag out) children; out `El_end let rec emit_stree out bark_map stree = out (`El_start (phyns "clade", [])); let top, is_leaf = match stree with | Stree.Leaf i -> i, true | Stree.Node (i, _) -> i, false in IntMap.Exceptionless.find top bark_map |> Option.may (fun b -> List.iter (emit_tag out) (b#to_xml is_leaf)); begin match stree with | Stree.Node (_, subtrees) -> List.iter (emit_stree out bark_map) subtrees | _ -> () end; out `El_end let emit_gtree out (name, gtree) = out (`El_start (phyns "phylogeny", [phyns "rooted", "true"])); Option.may (tag "name" %> emit_tag out) name; emit_stree out (Gtree.get_bark_map gtree) (Gtree.get_stree gtree); out `El_end let named_gtrees_to_output l out = out (`Dtd None); out (`El_start root_tag); List.iter (emit_gtree out) l; out `El_end let output_of_channel ch = Xmlm.make_output ~ns_prefix (`Fun (IO.write_byte ch)) let named_gtrees_to_channel ch l = output_of_channel ch |> Xmlm.output |> named_gtrees_to_output l let named_gtrees_to_file fname l = open_out fname |> with_dispose ~dispose:close_out (flip named_gtrees_to_channel l) let named_gtree_to_file ~fname ~tree_name t = named_gtrees_to_file fname [Some tree_name, t] let gtrees_to_file fname l = named_gtrees_to_file fname (List.map ((const None) &&& identity) l) let gtree_to_file fname t = named_gtrees_to_file fname [None, t] pplacer-1.1.alpha19/pplacer_src/placement.ml000066400000000000000000000154031303154601500210370ustar00rootroot00000000000000(* * care and feeding of placements. * *) open Ppatteries open Stree exception No_PP exception No_classif exception No_map_identity let () = Printexc.register_printer (function | No_PP -> Some "no posterior probability present" | No_classif -> Some "no classification information present" | _ -> None) let get_some except = function | Some pp -> pp | None -> raise except type placement = { location: int; ml_ratio: float; post_prob: float option; log_like: float; marginal_prob: float option; distal_bl: float; pendant_bl: float; classif: Tax_id.tax_id option; map_identity: (float * int) option; } type t = placement let location p = p.location let ml_ratio p = p.ml_ratio let post_prob_opt p = p.post_prob let post_prob p = get_some No_PP p.post_prob let log_like p = p.log_like let marginal_prob_opt p = p.marginal_prob let marginal_prob p = get_some No_PP p.marginal_prob let distal_bl p = p.distal_bl let pendant_bl p = p.pendant_bl let classif_opt p = p.classif let classif p = get_some No_classif p.classif let map_identity_opt p = p.map_identity let map_identity p = get_some No_map_identity p.map_identity let make_ml loc ~ml_ratio ~log_like ~dist_bl ~pend_bl = { location = loc; ml_ratio = ml_ratio; log_like = log_like; distal_bl = dist_bl; pendant_bl = pend_bl; marginal_prob = None; post_prob = None; classif = None; map_identity = None; } let add_pp p ~marginal_prob ~post_prob = {p with post_prob = Some post_prob; marginal_prob = Some marginal_prob} let add_classif p c = {p with classif = Some c} let add_map_identity p i = {p with map_identity = Some i} let sort_placecoll criterion pc = List.sort (comparing criterion |> flip) pc let filter_place_list criterion cutoff pc = List.filter (fun p -> criterion p > cutoff) pc let by_name_map_of_place_hash place_hash = Hashtbl.fold ( fun _ (name, place) name_map -> if StringMap.mem name name_map then failwith(name^" appears multiply in name_map!") else StringMap.add name place name_map ) place_hash StringMap.empty let make_ml_ratio_filter cutoff placement = placement.ml_ratio > cutoff let make_post_prob_filter cutoff placement = match placement.post_prob with | Some x -> x > cutoff | None -> invalid_arg "make_post_prob_filter" (* *** READING *** *) let float_opt_of_string s = if s = "-" then None else Some (float_of_string s) let taxid_opt_of_string s = if s = "-" then None else Some (Tax_id.of_old_string s) (* we allow either 7 entry lines (no classification) or 9 entry lines *) let placement_of_str str = let strs = Array.of_list (Str.split (Str.regexp "[ \t]+") str) in let len = Array.length strs in if len <> 7 && len <> 9 then failwith ("placement_of_str : wrong number of entries in "^str) else begin let basic = { location = int_of_string strs.(0); ml_ratio = float_of_string strs.(1); post_prob = float_opt_of_string strs.(2); log_like = float_of_string strs.(3); marginal_prob = float_opt_of_string strs.(4); distal_bl = float_of_string strs.(5); pendant_bl = float_of_string strs.(6); classif = None; map_identity = None; } in if len = 7 then basic else { basic with classif = taxid_opt_of_string strs.(7); } end (* *** WRITING *** *) (* usual output *) let string_of_8gfloat = Printf.sprintf "%8g" let string_of_gfloat = Printf.sprintf "%g" let to_strl_gen fint ffloat ftaxid default place = let map_ratio, map_overlap = Option.map_default (Tuple2.map some some) (None, None) place.map_identity (* eta expansion !! *) and fopt f xo = Option.map_default f default xo and fidentity x = ffloat (fst x) in [ fint place.location; ffloat place.ml_ratio; fopt ffloat place.post_prob; ffloat place.log_like; fopt ffloat place.marginal_prob; ffloat place.distal_bl; ffloat place.pendant_bl; fopt ftaxid place.classif; fopt ffloat map_ratio; fopt fint map_overlap; fopt fidentity place.map_identity; ] let to_strl = to_strl_gen string_of_int string_of_8gfloat Tax_id.to_string "-" let to_str place = String.concat "\t" (to_strl place) let to_json p = StringMap.of_pairlist [ "edge_num", Jsontype.Int p.location; "likelihood", Jsontype.Float p.log_like; "like_weight_ratio", Jsontype.Float p.ml_ratio; "distal_length", Jsontype.Float p.distal_bl; "pendant_length", Jsontype.Float p.pendant_bl; ] |> begin match p.post_prob, p.marginal_prob with | Some a, Some b -> StringMap.add "post_prob" (Jsontype.Float a) |- StringMap.add "marginal_like" (Jsontype.Float b) | _, _ -> identity end |> begin match p.classif with | Some c -> StringMap.add "classification" (Tax_id.to_json c) | _ -> identity end |> begin match p.map_identity with | Some (f, d) -> StringMap.add "map_ratio" (Jsontype.Float f) |- StringMap.add "map_overlap" (Jsontype.Int d) | _ -> identity end let of_json fields a = let a = Jsontype.array a in let map = List.fold_left2 (fun m k v -> StringMap.add k v m) StringMap.empty fields a in let get k = StringMap.find k map and maybe_get f k = match StringMap.Exceptionless.find k map with | Some Jsontype.Null -> None | Some x -> Some (f x) | None -> None and map_identity = function | Jsontype.Array [Jsontype.Float f; Jsontype.Int d] -> f, d | Jsontype.Array [Jsontype.Int f; Jsontype.Int d] -> float_of_int f, d | _ -> failwith "malformed map_identity in json" in { location = Jsontype.int (get "edge_num"); log_like = Jsontype.float (get "likelihood"); ml_ratio = Jsontype.float (get "like_weight_ratio"); distal_bl = Jsontype.float (get "distal_length"); pendant_bl = Jsontype.float (get "pendant_length"); post_prob = maybe_get Jsontype.float "post_prob"; marginal_prob = maybe_get Jsontype.float "marginal_like"; classif = maybe_get Tax_id.of_json "classification"; map_identity = match maybe_get identity "map_ratio", maybe_get identity "map_overlap" with | Some Jsontype.Float x, Some Jsontype.Int y -> Some (x, y) | Some Jsontype.Int x, Some Jsontype.Int y -> Some (float_of_int x, y) | None, None -> maybe_get map_identity "map_identity" | _, _ -> failwith "malformed map_identity in json"; } (* CSV *) let to_csv_strl = to_strl_gen string_of_int string_of_gfloat Tax_id.to_string "NA" pplacer-1.1.alpha19/pplacer_src/placerun.ml000066400000000000000000000070261303154601500207020ustar00rootroot00000000000000(* * a placerun is a data structure representing a single pplacer run. *) open Ppatteries type 'a placerun = { ref_tree : 'a Gtree.gtree; name : string; pqueries : Pquery.pquery list; transm : (int * float) IntMap.t option; } type 'a t = 'a placerun let make ?transm ref_tree name pqueries = {ref_tree; name; pqueries; transm} let get_ref_tree p = p.ref_tree let get_name p = p.name let get_pqueries p = p.pqueries let get_transm_opt p = p.transm let get_transm p = Option.get p.transm let set_ref_tree p ref_tree = {p with ref_tree} let set_name p name = {p with name} let set_pqueries p pqueries = {p with pqueries} let set_transm p tro = {p with transm = Some tro} let set_transm_opt p transm = {p with transm} let n_pqueries p = List.length p.pqueries let total_multiplicity p = Pquery.total_multiplicity p.pqueries let apply_to_pqueries f p = {p with pqueries = f p.pqueries} let apply_to_each_placement f = List.map f |> Pquery.apply_to_place_list |> List.map |> apply_to_pqueries let make_map_by_best_loc criterion pr = Pquery.make_map_by_best_loc criterion (get_pqueries pr) let contains_unplaced_queries p = try List.iter (fun pquery -> if not (Pquery.is_placed pquery) then raise Exit) (get_pqueries p); false with | Exit -> true let get_same cmp get_thing thing_name pr1 pr2 = let x = get_thing pr1 in if 0 = cmp x (get_thing pr2) then x else failwith (Printf.sprintf "%ss for %s and %s not the same! Were these run with the same reference tree and model parameters (e.g. statistics files?)" thing_name (get_name pr1) (get_name pr2)) let get_same_tree pr1 pr2 = get_same Newick_gtree.compare get_ref_tree "Reference tree" pr1 pr2 let combine name pr1 pr2 = let ref_tree = get_same_tree pr1 pr2 in make ref_tree name ((get_pqueries pr1) @ (get_pqueries pr2)) let warn_about_duplicate_names placerun = let _ = List.fold_left (fun accu name -> if StringSet.mem name accu then dprintf "Warning: query name %s appears multiple times.\n" name; StringSet.add name accu) StringSet.empty (List.flatten (List.map Pquery.namel (get_pqueries placerun))) in () let filter_unplaced pr = let (placed_l, unplaced_l) = List.partition Pquery.is_placed (get_pqueries pr) in if unplaced_l <> [] then dprintf "Warning: Ignoring %d unplaced sequences from %s...\n" (List.length unplaced_l) (get_name pr); { pr with pqueries = placed_l } let redup ?(as_mass = false) sequence_tbl pr = let namlom_transform (n, m) = if not (Hashtbl.mem sequence_tbl n) then [n, m] else let names = Hashtbl.find_all sequence_tbl n in if as_mass then [n, List.length names |> float_of_int |> ( *.) m] else List.map (Tuple.Tuple2.map2(( *.) m)) names in apply_to_pqueries (List.map (fun pq -> Pquery.namlom pq |> List.map namlom_transform |> List.flatten |> Pquery.set_namlom pq)) pr let transform func pr = apply_to_pqueries (List.map (fun pq -> Pquery.multiplicity pq |> func |> Pquery.set_mass pq)) pr let unitize pr = let tot_mass = get_pqueries pr |> Pquery.total_multiplicity in apply_to_pqueries (List.map (fun pq -> Pquery.multiplicity pq /. tot_mass |> Pquery.set_mass pq)) pr let duplicate_pqueries_by_count pr = get_pqueries pr |> List.enum |> Enum.map Pquery.duplicate_by_count |> Enum.flatten |> List.of_enum |> set_pqueries pr pplacer-1.1.alpha19/pplacer_src/placerun_io.ml000066400000000000000000000224451303154601500213730ustar00rootroot00000000000000open Ppatteries let compatible_versions = [ "v0.3"; "v1.0"; "v1.1"; ] let bifurcation_warning = "Warning: pplacer results make the most sense when the \ given tree is multifurcating at the root. See manual for details." (* ***** WRITING ***** *) let output_fmt_str = "# output format: location, ML weight ratio, PP, ML likelihood, marginal likelihood, attachment location (distal length), pendant branch length, containment classification, classification" let write_unplaced ch unplaced_list = if unplaced_list <> [] then Printf.fprintf ch "# unplaced sequences\n"; List.iter (Pquery_io.write ch) unplaced_list let write_placed_map ch placed_map = IntMap.iter (fun loc npcl -> Printf.fprintf ch "# location %d\n" loc; List.iter (Pquery_io.write ch) npcl) placed_map let write_by_best_loc criterion ch placerun = let (unplaced_l, placed_map) = Placerun.make_map_by_best_loc criterion placerun in write_unplaced ch unplaced_l; write_placed_map ch placed_map let pre_fname out_dir pr = out_dir^"/"^(Placerun.get_name pr) let to_legacy_file invocation out_fname placerun = Placerun.warn_about_duplicate_names placerun; let ch = open_out out_fname and ref_tree = Placerun.get_ref_tree placerun in Printf.fprintf ch "# pplacer %s run, %s\n" Version.version (date_time_str ()); Printf.fprintf ch "# invocation: %s\n" invocation; Printf.fprintf ch "%s\n" output_fmt_str; if not (Stree.multifurcating_at_root (Gtree.get_stree ref_tree)) then Printf.fprintf ch "# %s\n" bifurcation_warning; (* we do the following to write a tree with the node numbers in place of * the bootstrap values, and at @ at the end of the taxon names *) Printf.fprintf ch "# numbered reference tree: %s\n" (Newick_gtree.to_string (Newick_gtree.to_numbered ref_tree)); Printf.fprintf ch "# reference tree: %s\n" (Newick_gtree.to_string ref_tree); write_by_best_loc Placement.ml_ratio ch placerun; close_out ch let json_versions = [1; 2; 3] let current_json_version = 3 let to_json_file ?invocation out_fname placerun = let invocation = match invocation with | Some s -> s | None -> Array.to_list Sys.argv |> String.concat " " and ret = Hashtbl.create 8 and meta = Hashtbl.create 16 and ref_tree = Placerun.get_ref_tree placerun and pqueries = Placerun.get_pqueries placerun in Hashtbl.add meta "invocation" (Jsontype.String invocation); begin match Placerun.get_transm_opt placerun with | None -> () | Some transm -> IntMap.enum transm |> Enum.map (fun (k, (v1, v2)) -> Jsontype.Array [Jsontype.Int k; Jsontype.Int v1; Jsontype.Float v2]) |> List.of_enum |> (fun l -> Jsontype.Array l) |> Hashtbl.add meta "transm" end; Hashtbl.add ret "metadata" (Jsontype.Object meta); let fields, thunks = List.map Pquery_io.to_json pqueries |> List.split in let all_fields = List.fold_left StringSet.union StringSet.empty fields |> StringSet.elements in Jsontype.Array (List.map (flip identity all_fields) thunks) |> Hashtbl.add ret "placements"; Jsontype.Array (List.map (fun s -> Jsontype.String s) all_fields) |> Hashtbl.add ret "fields"; Hashtbl.add ret "tree" (Jsontype.String (Newick_gtree.to_string ~with_node_numbers:true ref_tree)); Hashtbl.add ret "version" (Jsontype.Int current_json_version); Json.to_file out_fname (Jsontype.Object ret) (* ***** READING ***** *) (* read the header, i.e. the first set of lines in the placefile *) let rt_of_header hlines = let reftree_rex = Str.regexp "^# reference tree: \\(.*\\)" and invocation_rex = Str.regexp "^# invocation:" and str_match rex str = Str.string_match rex str 0 in try match hlines with | [] -> failwith ("Place file missing header!") | version_line::header_tl -> begin (* make sure we have appropriate versions *) Scanf.sscanf version_line "# pplacer %s run" (fun file_vers -> if not (List.mem (String.sub file_vers 0 4) compatible_versions) then failwith (Printf.sprintf "This file is from version %s which is incompatible with the present version of %s" file_vers Version.version)); let _, post_invocation = File_parsing.find_beginning (str_match invocation_rex) header_tl in (* get the ref tree *) let tree_line,_ = File_parsing.find_beginning (str_match reftree_rex) post_invocation in Newick_gtree.of_string (Str.matched_group 1 tree_line) end with | Scanf.Scan_failure s -> failwith ("problem with the place file: "^s) | Not_found -> failwith "couldn't find ref tree line!" (* returns a placerun * conventions for placement files: * first line is # pplacer [version] run ... * then whatever. last line before placements is # reference tree: [ref tre] *) let of_file ?load_seq:(load_seq=true) place_fname = let fastaname_rex = Str.regexp "^>" and ch = Legacy.open_in place_fname in let next_batch () = File_parsing.read_lines_until ch fastaname_rex in let ref_tree = try rt_of_header (next_batch ()) with | End_of_file -> failwith (place_fname^" empty place file!") in let rec get_pqueries accu = try get_pqueries ((Pquery_io.parse_pquery ~load_seq (File_parsing.filter_comments (next_batch ())))::accu) with | End_of_file -> List.rev accu in (* parse the header, getting a ref tree *) Placerun.make ref_tree (Filename.chop_extension (Filename.basename place_fname)) (get_pqueries []) exception Invalid_placerun of string let transm_of_json j = Jsontype.array j |> List.enum |> Enum.map (function | Jsontype.Array [k; v1; v2] -> Jsontype.int k, (Jsontype.int v1, Jsontype.float v2) | _ -> failwith "malformed transm in jplace file") |> IntMap.of_enum let of_json_file fname = let json = Jsontype.obj (Json.of_file fname) in if not (Hashtbl.mem json "version") then raise (Invalid_placerun "no 'version' field"); let version = Hashtbl.find json "version" |> Jsontype.int in if not (List.mem version json_versions) then raise (Invalid_placerun (Printf.sprintf "invalid version: %d" version)); let ref_tree = Hashtbl.find json "tree" |> Jsontype.string |> Newick_gtree.of_string ~fname:(Printf.sprintf "the tree in %s" fname) ~legacy_format:(version = 1) and fields = Hashtbl.find json "fields" |> Jsontype.array |> List.map (Jsontype.string |- (function "marginal_prob" when version = 1 -> "marginal_like" | x -> x)) and meta = Hashtbl.find_option json "metadata" |> Option.map Jsontype.obj in let pql = List.map (Pquery_io.of_json fields) (Jsontype.array (Hashtbl.find json "placements")) and transm = meta |> (flip Option.bind (flip Hashtbl.find_option "transm")) |> Option.map transm_of_json in Placerun.make ?transm ref_tree (MaybeZipped.chop_extension (Filename.basename fname)) pql let ppr_placerun ff pr = Format.fprintf ff "Placerun %s" pr.Placerun.name let split_file_regexp = Str.regexp "^\\(.+\\):\\(.+?\\)$" let split_file s = if not (Str.string_match split_file_regexp s 0) then failwith "csv file provided with no jplace to split"; Str.matched_group 1 s, Str.matched_group 2 s (* load in a .place or .jplace file. *) let of_any_file fname = if MaybeZipped.check_suffix fname ".place" then of_file fname else if MaybeZipped.check_suffix fname ".json" || MaybeZipped.check_suffix fname ".jplace" then of_json_file fname else failwith ("unfamiliar suffix on " ^ fname) (* take a (filename -> placerun) function, some file, and a csv file, then * split the resulting placerun into a placerun list according to the csv * file. *) let of_split_file ?(getfunc = of_any_file) fname = let to_split, to_split_with = split_file fname in let to_split' = getfunc to_split and split_data = Csv.load to_split_with in let split_map = List.fold_left (fun accum -> function | [seq_name; group_name] -> StringMap.add seq_name group_name accum | _ -> failwith "malformed row in csv file") StringMap.empty split_data in let split_pqueries = List.fold_left (fun accum pq -> let groups = List.fold_left (fun accum ((name, _) as namlom) -> match begin try Some (StringMap.find name split_map) with Not_found -> None end with | Some group -> StringMap.add_listly group namlom accum | None -> accum) StringMap.empty (Pquery.namlom pq) in StringMap.fold (Pquery.set_namlom pq |- flip StringMap.add_listly |> flip) groups accum) StringMap.empty (Placerun.get_pqueries to_split') in StringMap.fold (fun name pqueries accum -> Placerun.make ?transm:(Placerun.get_transm_opt to_split') (Placerun.get_ref_tree to_split') name pqueries :: accum) split_pqueries [] let maybe_of_split_file ?(getfunc = of_any_file) fname = if Filename.check_suffix fname ".csv" then of_split_file ~getfunc fname else if Filename.check_suffix fname ".biom" then Biom.of_tree_and_biom fname else [getfunc fname] let filtered_of_file fname = Placerun.filter_unplaced (of_any_file fname) pplacer-1.1.alpha19/pplacer_src/pplacer.ml000066400000000000000000000016621303154601500205170ustar00rootroot00000000000000(* "main" *) open Ppatteries let parse_args () = let files = ref [] in let prefs = Prefs.defaults () and anon_arg arg = files := arg :: !files in Arg.parse (Prefs.specl prefs) anon_arg Prefs.usage; (List.rev !files, prefs) let () = if not !Sys.interactive then begin exn_wrap (fun () -> let (files, prefs) = parse_args () in if Prefs.version prefs then begin print_endline Version.version; exit 0; end; Prefs.check prefs; Check.directory (Prefs.out_dir prefs); if List.length files = 0 then print_endline "Warning: pplacer couldn't find any sequences to place. Please supply \ an alignment with sequences to place as an argument at the end of \ the command line." else if List.length files > 1 && Prefs.out_file prefs <> "" then failwith "`-o` may not be specified with multiple alignments."; List.iter (Pplacer_run.run_file prefs) files) end pplacer-1.1.alpha19/pplacer_src/pplacer_run.ml000066400000000000000000000632351303154601500214070ustar00rootroot00000000000000open Ppatteries open Multiprocessing exception Finished class ['a, 'b] pplacer_process (f: 'a -> 'b) gotfunc nextfunc progressfunc = (* The pplacer process borrows a lot of its implementation from the the * reference implementation of Multiprocessing.map, because the core of * pplacer is a pure function that takes sequences and yields results. The * difference comes from being able to decide per-sequence whether or not it * should be sent to the child at all. *) let child_func rd wr = marshal wr Ready; let rec aux () = match begin try Some (Legacy.Marshal.from_channel rd) with | End_of_file -> None end with | Some x -> marshal wr begin try Data (f x) with exn -> Printexc.print_backtrace stderr; Exception exn end; aux () | None -> Legacy.close_in rd; Legacy.close_out wr in aux () in object (self) inherit ['b] process child_func as super method private push = match begin try Some (nextfunc ()) with | Finished -> None end with | Some x -> marshal self#wr x | None -> self#close method obj_received = function | Ready -> self#push | Data x -> List.iter gotfunc x; self#push | Exception exn | Fatal_exception exn -> raise (Child_error exn) method progress_received = progressfunc end let premask ?(discard_nonoverlapped = false) seq_type ref_align query_list = let base_map = match seq_type with | Alignment.Nucleotide_seq -> Nuc_models.nuc_map | Alignment.Protein_seq -> Prot_models.prot_map and n_sites = Alignment.length ref_align in let check_seq (name, seq) = String.iter (fun c -> if not (CharMap.mem c base_map) then failwith (Printf.sprintf "%c is not a known base in %s" c name)) seq and initial_mask = Array.make n_sites false in (* Turn an alignment enum into a bool array mask which represents if any * site seen in the alignment was informative. *) let mask_of_enum enum = let mask = Array.copy initial_mask in Enum.iter (tap check_seq %> snd %> String.iteri (fun i c -> if Alignment.informative c then mask.(i) <- true)) enum; mask in let ref_mask = Array.enum ref_align |> mask_of_enum in (* This function takes a sequence string and returns if it overlaps any * informative column of the reference sequence. *) let overlaps_mask s = String.enum s |> Enum.map Alignment.informative |> curry Enum.combine (Array.enum ref_mask) |> Enum.exists (uncurry (&&)) in let query_list = List.filter (fun (name, seq) -> let overlaps = overlaps_mask seq in if not discard_nonoverlapped && not overlaps then failwith (Printf.sprintf "Sequence %s doesn't overlap any reference sequences." name); overlaps) query_list in (* Mask out sites that are either all gap in the reference alignment or * all gap in the query alignment. *) let mask = Array.map2 (&&) ref_mask (List.enum query_list |> mask_of_enum) in let masklen = Array.fold_left (fun accum -> function true -> accum + 1 | _ -> accum) 0 mask in let cut_from_mask (name, seq) = let seq' = String.create masklen and pos = ref 0 in Array.iteri (fun e not_masked -> if not_masked then (seq'.[!pos] <- seq.[e]; incr pos)) mask; name, seq' in dprintf "sequence length cut from %d to %d.\n" n_sites masklen; let effective_length = match seq_type with | Alignment.Nucleotide_seq -> masklen | Alignment.Protein_seq -> 3*masklen in if effective_length = 0 then (print_endline "Sequence length cut to 0 by pre-masking; can't proceed with no information."; exit 1) else if effective_length <= 10 then dprintf "WARNING: you have %d sites after pre-masking. \ That means there is very little information in these sequences for placement.\n" masklen else if effective_length <= 100 then dprintf "Note: you have %d sites after pre-masking. \ That means there is rather little information in these sequences for placement.\n" masklen; let query_list' = List.map cut_from_mask query_list and ref_align' = Array.map cut_from_mask ref_align in query_list', ref_align', masklen, Some mask let check_query n_sites query_list = begin match begin try Some (List.find (fun (_, seq) -> (String.length seq) != n_sites) query_list) with | Not_found -> None end with | Some (name, seq) -> Printf.printf "query %s is not the same length as the reference alignment (got %d; expected %d)\n" name (String.length seq) n_sites; exit 1; | None -> () end let run_placements prefs rp query_list from_input_alignment placerun_name placerun_cb = let timings = ref StringMap.empty in let orig_ref_tree = Refpkg.get_ref_tree rp in let ref_tree = Newick_gtree.add_zero_root_bl orig_ref_tree in let ref_align = try Refpkg.get_aln_fasta rp with Refpkg.Missing_element "aln_fasta" -> failwith "Please specify a reference alignment with -r or -c, or include all \ reference sequences in the primary alignment." in if !verbosity >= 2 then begin print_endline "found in reference alignment: "; Ppr.print_string_array (Alignment.get_name_arr ref_align) end; let _ = try Refpkg.get_model rp with Refpkg.Missing_element "tree_stats" -> failwith "please specify a tree model with -s or -c" in if Newick_gtree.has_zero_bls ref_tree then dprint "WARNING: your tree has zero pendant branch lengths. \ This can lead to zero likelihood values which will keep you from being \ able to place sequences. You can remove identical sequences with \ seqmagick.\n"; let n_sites = Alignment.length ref_align in check_query n_sites query_list; let m, i = Refpkg.get_model rp in let module Model = (val m: Glvm.Model) in let module Glv = Model.Glv in let module Glv_arr = Glv_arr.Make(Model) in let module Like_stree = Like_stree.Make(Model) in let model = Model.build ref_align i in (* *** pre masking *** *) let query_list, ref_align, n_sites, mask = if Prefs.no_pre_mask prefs then query_list, ref_align, n_sites, None else begin dprint "Pre-masking sequences... "; premask ~discard_nonoverlapped:(Prefs.discard_nonoverlapped prefs) (Model.seq_type model) ref_align query_list end in if Option.is_some mask && (Prefs.pre_masked_file prefs) <> "" then begin let ch = open_out (Prefs.pre_masked_file prefs) in let write_line = Alignment.write_fasta_line ch in Array.iter write_line ref_align; List.iter write_line query_list; close_out ch; end; (* *** deduplicate sequences *** *) (* seq_tbl maps from sequence to the names that correspond to that seq. *) let seq_tbl = Hashtbl.create 1024 in List.iter (fun (name, seq) -> Hashtbl.replace seq_tbl seq (name :: try Hashtbl.find seq_tbl seq with | Not_found -> [])) query_list; (* redup_tbl maps from the first entry of namel to the rest of the namel. *) let redup_tbl = Hashtbl.create 1024 in (* query_list is now deduped. *) let query_list = Hashtbl.fold (fun seq namel accum -> let hd = List.hd namel in List.iter (Hashtbl.add redup_tbl hd) (Pquery.uniform_namel namel); (hd, seq) :: accum) seq_tbl [] in if !verbosity >= 1 && not (Stree.multifurcating_at_root ref_tree.Gtree.stree) then print_endline Placerun_io.bifurcation_warning; (* *** make the likelihood vectors *** *) (* the like data from the alignment *) let like_aln_map = Like_stree.like_aln_map_of_data (Model.seq_type model) ref_align ref_tree in (* pretending *) if Prefs.pretend prefs then begin dprint "everything looks OK.\n"; dprintf "%0.2f MB would be allocated for internal nodes.\n" (Like_stree.size_of_glv_arrays_for model ref_tree 3 n_sites |> float_of_int |> flip (/.) (1024. *. 1024.)); exit 0; end; dprint "Determining figs... "; let figs = Fig.figs_of_gtree (Prefs.fig_cutoff prefs) ref_tree in begin match Prefs.fig_cutoff prefs with | 0. -> dprint "figs disabled.\n" | _ -> dprintf "%d figs.\n" (Fig.length figs); if Prefs.fig_tree prefs <> "" then Decor_gtree.of_newick_gtree orig_ref_tree |> flip Fig.onto_decor_gtree figs |> Phyloxml.gtree_to_file (Prefs.fig_tree prefs) end; let curr_time = Sys.time () in (* calculate like on ref tree *) dprint "Allocating memory for internal nodes... "; (* allocate our memory *) let mmap_file = Prefs.mmap_file prefs in let darr, parr, snodes = if mmap_file = "" then let darr = Like_stree.glv_arr_for model ref_tree n_sites in darr, Glv_arr.mimic darr, Glv_arr.mimic darr else let fd = try Unix.openfile mmap_file [Unix.O_RDWR; Unix.O_CREAT] 0o666 with Unix.Unix_error (Unix.EISDIR, _, _) -> let filename = Filename.temp_file ~temp_dir:mmap_file "pplacer" ".mmap" in let fd = Unix.openfile filename [Unix.O_RDWR; Unix.O_CREAT] 0o600 in Unix.unlink filename; fd in let arrays = Like_stree.mmap_glv_arrays_for model fd true ref_tree 3 n_sites in arrays.(0), arrays.(1), arrays.(2) in let util_glv = Glv.mimic (Glv_arr.get_one snodes) in dprint "done.\n"; Option.may (Model.mask_sites model) mask; (* Refine the model if it's not coming directly from the reference package or * if the user wants it. *) if from_input_alignment || Prefs.always_refine prefs then Model.refine model n_sites ref_tree like_aln_map darr parr; Model.check model ref_align; if !verbosity >= 2 then Model.write stdout model; dprint "Caching likelihood information on reference tree... "; Like_stree.calc_distal_and_proximal model ref_tree like_aln_map util_glv ~distal_glv_arr:darr ~proximal_glv_arr:parr ~util_glv_arr:snodes; dprint "done.\n"; timings := StringMap.add_listly "tree likelihood" ((Sys.time ()) -. curr_time) (!timings); (* pull exponents *) dprint "Pulling exponents... "; List.iter (Glv_arr.iter (Glv.perhaps_pull_exponent (-10))) [darr; parr;]; dprint "done.\n"; (* baseball calculation *) let half_bl_fun loc = (Gtree.get_bl ref_tree loc) /. 2. in dprint "Preparing the edges for baseball... "; Glv_arr.prep_supernodes model ~dst:snodes darr parr half_bl_fun; dprint "done.\n"; (* *** check tree likelihood *** *) if Prefs.check_like prefs then begin let fp_check g str = let fpc = Glv.fp_classify g in if fpc > FP_zero then Printf.printf "%s is a %s\n" str (string_of_fpclass fpc) in let utilv_nsites = Gsl_vector.create n_sites and util_d = Glv.mimic darr.(0) and util_p = Glv.mimic parr.(0) and util_one = Glv.mimic darr.(0) in Glv.set_unit util_one; Array.mapi (fun i d -> let p = parr.(i) and sn = snodes.(i) in fp_check d (Printf.sprintf "distal %d" i); fp_check p (Printf.sprintf "proximal %d" i); fp_check sn (Printf.sprintf "supernode %d" i); Model.evolve_into model ~src:d ~dst:util_d (half_bl_fun i); Model.evolve_into model ~src:p ~dst:util_p (half_bl_fun i); Array.map (Printf.sprintf "%g") [| float_of_int i; Model.log_like3 model utilv_nsites util_d util_p util_one; Model.slow_log_like3 model util_d util_p util_one; Glv.logdot utilv_nsites sn util_one; |]) darr |> Array.append [|[|"node"; "tree_likelihood"; "slow_tree_like"; "supernode_like"|]|] |> String_matrix.pad |> Array.iter (Array.iter (dprintf "%s ") %> tap (fun () -> dprint "\n")) end; (* *** analyze query sequences *** *) let prior = if Prefs.uniform_prior prefs then Core.Uniform_prior else if Prefs.informative_prior prefs then (* Below: add on the prior lower bound onto the top branch length. *) Core.Informative_exp_prior (Core.prior_mean_map ((+.) (Prefs.prior_lower prefs)) ref_tree) else Core.Flat_exp_prior (* exponential with mean = average branch length *) ((Gtree.tree_length ref_tree) /. (float_of_int (Gtree.n_edges ref_tree))) in let partial = Core.pplacer_core (module Model: Glvm.Model with type t = Model.t and type glv_t = Model.glv_t) prefs figs prior model ref_align ref_tree ~darr ~parr ~snodes in let show_query = progress_displayer "working on %s (%d/%d)..." (List.length query_list) and n_done = ref 0 in let progressfunc msg = if String.rcontains_from msg 0 '>' then begin incr n_done; let query_name = String.sub msg 1 ((String.length msg) - 1) in show_query query_name end else dprintf "%s\n" msg in let q = Queue.create () in List.iter (fun (name, seq) -> Queue.push (name, (String.uppercase seq)) q) query_list; (* functions called respectively: when a result is received from a child * process, to determine if a sequence should be send to a child process, and * when all child processes have finished. *) let gotfunc, cachefunc, donefunc = if Prefs.fantasy prefs <> 0. then begin (* fantasy baseball *) let fantasy_mat = Fantasy.make_fantasy_matrix ~max_strike_box:(int_of_float (Prefs.strike_box prefs)) ~max_strikes:(Prefs.max_strikes prefs) and fantasy_mod = round (100. *. (Prefs.fantasy_frac prefs)) and n_fantasies = ref 0 in let rec gotfunc = function | Core.Fantasy f -> Fantasy.add_to_fantasy_matrix f fantasy_mat; incr n_fantasies; | _ -> failwith "expected fantasy result" and cachefunc _ = (* if cachefunc returns true, the current thing is skipped; modulo * division will be 0 for every N things *) let res = (!n_done) mod fantasy_mod <> 0 in incr n_done; res and donefunc () = Fantasy.results_to_file placerun_name fantasy_mat (!n_fantasies); Fantasy.print_optimum fantasy_mat (Prefs.fantasy prefs) (!n_fantasies); in gotfunc, cachefunc, donefunc end else begin (* not fantasy baseball *) let map_fasta_file = Prefs.map_fasta prefs in let do_map = map_fasta_file <> "" || Prefs.map_identity prefs in (* similar to gotfunc/donefunc, but called respectively when a pquery is * received and after all pqueries have been received. *) let pquery_gotfunc, pquery_donefunc = if do_map then begin (* start: build the Maximum A Posteriori sequences *) let mrcam = Refpkg.get_mrcam rp and td = Refpkg.get_taxonomy rp and glvs = Glv_arr.make model ~n_glvs:2 ~n_sites in let map_map = Map_seq.of_map (module Model: Glvm.Model with type t = Model.t and type glv_t = Model.glv_t) glvs.(0) glvs.(1) model ref_tree ~darr ~parr mrcam (Prefs.map_cutoff prefs) and result_map = ref IntMap.empty in let gotfunc pq = let best_placement = Pquery.best_place Placement.ml_ratio pq in result_map := IntMap.add_listly (Placement.location best_placement) ((List.hd (Pquery.namel pq)), (Pquery.seq pq)) (!result_map); if not (Prefs.map_identity prefs) then pq else let placement_map = List.fold_left (fun accum p -> IntMap.add_listly (Placement.location p) p accum) IntMap.empty (Pquery.place_list pq) in let placement_map' = Map_seq.mrca_map_seq_map placement_map mrcam (ref_tree.Gtree.stree) in let identity = Alignment.identity (Pquery.seq pq) in let placements' = IntMap.fold (fun mrca pl accum -> List.fold_left (fun accum p -> let map_seq = IntMap.find mrca map_map in (Placement.add_map_identity p (identity map_seq)) :: accum) accum pl) placement_map' [] in {pq with Pquery.place_list = placements'} and donefunc = if map_fasta_file = "" then identity else fun () -> let seq_map = Map_seq.mrca_map_seq_map (!result_map) mrcam (ref_tree.Gtree.stree) and space = Str.regexp " " in let map_fasta = IntMap.fold (fun i mrca accum -> if not (IntMap.mem i seq_map) then accum else let tax_name = match mrca with | Tax_id.NoTax -> "none" | _ -> Tax_taxonomy.get_tax_name td mrca in List.rev_append (IntMap.find i seq_map) (((Printf.sprintf "%d_%s" i (Str.global_replace space "_" tax_name)), IntMap.find i map_map) :: accum)) mrcam [] in Alignment.to_fasta (Array.of_list (List.rev map_fasta)) map_fasta_file in gotfunc, donefunc (* end: build the Maximum A Posteriori sequences *) end else (identity, identity) in let classify = if Refpkg.tax_equipped rp then Prefs.mrca_class prefs |> Classif_map.of_refpkg_mrca_class rp |> Classif_map.classify |> Tax_classify.classify_pr Placement.add_classif else identity and queries = ref [] in let rec gotfunc = function | Core.Pquery pq when not (Pquery.is_placed pq) -> dprintf "warning: %d sequence(s) (including %s) were \ not placed and will be omitted.\n" (Pquery.namel pq |> List.length) (Pquery.name pq); | Core.Pquery pq -> let pq = pquery_gotfunc pq in queries := pq :: (!queries) | _ -> failwith "expected pquery result" and cachefunc _ = false and donefunc () = pquery_donefunc (); Placerun.make orig_ref_tree placerun_name (!queries) |> Placerun.redup redup_tbl |> classify |> placerun_cb in gotfunc, cachefunc, donefunc end in let gotfunc = function | Core.Timing (name, value) -> timings := StringMap.add_listly name value (!timings); | x -> gotfunc x in let gotfunc, donefunc = if Prefs.evaluate_all prefs then let evaluations = RefList.empty () and total_logdots = ref 0 in (function | Core.Evaluated_best (seq, logdots, blc, bls) -> RefList.push evaluations (seq, blc, bls); total_logdots := logdots + !total_logdots | x -> gotfunc x), (fun () -> dprint ~l:2 "Sequences without their best location chosen:\n"; dprintf "Evaluation: %g%% from %d logdots.\n" (* count the percentage of sequences where the best seen location was * also the complete best *) (if RefList.is_empty evaluations then 0. else RefList.fold_left (fun (count, total) (seq, blc, bls) -> if blc <> bls then dprintf ~l:2 " - %s (%d vs. %d)\n" seq blc bls; (if blc = bls then 1. +. count else count), total +. 0.01) (0., 0.) evaluations |> uncurry (/.)) !total_logdots; if Prefs.evaluation_discrepancy prefs <> "" then begin let dt = Fig.onto_decor_gtree (Decor_gtree.of_newick_gtree orig_ref_tree) figs in RefList.to_list evaluations |> List.filter_map (* also decorate a fig tree with the best seen and complete best * locations if they're not the same *) (function | _, blc, bls when blc = bls -> None | seq, blc, bls -> Gtree.get_bark_map dt |> Decor_gtree.map_add_decor_listly blc [Decor.Taxinfo (Tax_id.of_string "complete", "complete")] |> Decor_gtree.map_add_decor_listly bls [Decor.Taxinfo (Tax_id.of_string "seen", "seen")] |> Gtree.set_bark_map dt |> (fun t -> Some (Some seq, t))) |> Phyloxml.named_gtrees_to_file (Prefs.evaluation_discrepancy prefs) end; donefunc ()) else gotfunc, donefunc in let rec nextfunc () = let x = try Queue.pop q with | Queue.Empty -> raise Finished in if cachefunc x then nextfunc () else x in begin match Multiprocessing.try_fork (Prefs.children prefs) (new pplacer_process partial gotfunc nextfunc) progressfunc with | [] -> dprint "couldn't fork any children; falling back to a single process.\n"; let rec aux () = match begin try Some (nextfunc ()) with Finished -> None end with | None -> () | Some query -> partial ~show_query query |> List.iter gotfunc; aux () in aux () | children -> event_loop children end; donefunc (); if Prefs.timing prefs then begin Printf.printf "\ntiming data:\n"; StringMap.iter (fun name values -> Printf.printf " %s: %0.4fs\n" name (List.fsum values)) (!timings) end let partition_queries ref_name_set aln = let ref_aln, query_aln = Array.partition (fun (name,_) -> StringSet.mem name ref_name_set) aln in query_aln, if Array.length ref_aln = 0 then begin dprint "Didn't find any reference sequences in given alignment file. \ Using supplied reference alignment.\n"; None end else if Array.length ref_aln <> StringSet.cardinal ref_name_set then failwith "Some, but not all reference sequences found in provided alignment file. \ Are there overlaps between query and reference sequence IDs?" else begin dprint "Found reference sequences in given alignment file. \ Using those for reference alignment.\n"; Some ref_aln end let run_file prefs query_fname = dprintf "Running pplacer %s analysis on %s...\n" Version.version query_fname; let ref_dir_complete = match Prefs.ref_dir prefs with | "" -> "" | s -> begin Check.directory s; if s.[(String.length s)-1] = '/' then s else s^"/" end in (* string map which represents the elements of the reference package; these * may be actually a reference package or specified on the command line. *) let file_path = Refpkg_parse.file_path in let rp_strmap = List.fold_right (* only set if the option string is non empty. * override the contents of the reference package. *) (fun (k,v) m -> if v = "" then m else StringMap.add k (ref_dir_complete^v |> file_path) m) [ "tree", Prefs.tree_fname prefs; "aln_fasta", Prefs.ref_align_fname prefs; "tree_stats", Prefs.stats_fname prefs; ] (match Prefs.refpkg_path prefs with | "" -> StringMap.add "name" (Prefs.ref_align_fname prefs |> safe_chop_extension |> Refpkg_parse.metadata) StringMap.empty | path -> Refpkg_parse.strmap_of_path path) in if not (StringMap.mem "tree" rp_strmap) then if Prefs.refpkg_path prefs = "" then failwith "please specify a reference tree with -t or -c" else failwith "the reference package provided does not contain a tree"; let rp = Refpkg.of_strmap ~ignore_version:(Prefs.refpkg_path prefs = "") prefs rp_strmap in let ref_tree = Refpkg.get_ref_tree rp in (* *** split the sequences into a ref_aln and a query_list *** *) let ref_name_map = Newick_gtree.leaf_label_map ref_tree in let ref_name_set = IntMap.values ref_name_map |> StringSet.of_enum in if IntMap.cardinal ref_name_map <> StringSet.cardinal ref_name_set then failwith("Repeated names in reference tree!"); let query_align, ref_align = Alignment.upper_aln_of_any_file query_fname |> partition_queries ref_name_set in let _ = Array.fold_left (fun seen (seq, _) -> if StringSet.mem seq seen then failwith (Printf.sprintf "duplicate reference sequence '%s' in query file %s" seq query_fname); StringSet.add seq seen) StringSet.empty (Option.default [||] ref_align) in (); let rp = Option.map_default (flip Refpkg.set_aln_fasta rp) rp ref_align and query_bname = Filename.basename (MaybeZipped.chop_extension query_fname) and from_input_alignment = Option.is_some ref_align in let jplace_name = match Prefs.out_file prefs with | "" -> ((Prefs.out_dir prefs) ^ "/" ^ query_bname ^ ".jplace") | x -> x in let placerun_cb pr = Placerun_io.to_json_file jplace_name pr and query_list = Array.to_list query_align and n_groups = Prefs.groups prefs in if n_groups > 1 then begin dprintf "Splitting query alignment into %d groups... " n_groups; let groups = Seq_group.group n_groups query_list in let prl = RefList.empty () in dprint "done.\n"; Array.iteri (fun i ql -> dprintf "Running sequence group %d of %d.\n" (succ i) n_groups; if not (List.is_empty ql) then run_placements prefs rp ql from_input_alignment query_bname (RefList.push prl)) groups; RefList.to_list prl |> List.reduce (Placerun.combine query_bname) |> placerun_cb end else begin run_placements prefs rp query_list from_input_alignment query_bname placerun_cb end pplacer-1.1.alpha19/pplacer_src/pquery.ml000066400000000000000000000107261303154601500204170ustar00rootroot00000000000000(* pquery stands for placed query. *) open Ppatteries exception Unplaced_pquery of string list let sort_placement_list criterion pl = List.sort (comparing criterion |> flip) pl let rec is_decreasing criterion = function | x::y::l -> if criterion x >= criterion y then is_decreasing criterion l else false | _ -> true exception Name_list_needed (* namlom is now a list of name, mass pairs *) type pquery = { namlom: (string * float) list; seq: string; place_list: Placement.placement list; } type t = pquery let seq p = p.seq let place_list p = p.place_list let namlom p = p.namlom let name p = match p.namlom with | (n, _) :: _ -> n | _ -> failwith "no name" let namel p = List.map fst p.namlom let force_namel = namel let multiplicity p = List.map snd p.namlom |> List.fsum let total_multiplicity = List.fold_left (multiplicity %> (+.) |> flip) 0. let opt_best_something thing criterion pq = match place_list pq with | h::t -> let best = ref h and best_val = ref (criterion h) in List.iter (fun x -> let v = criterion h in if v > !best_val then begin best := x; best_val := v; end;) t; Some (thing (!best)) | [] -> None let opt_best_place criterion pq = opt_best_something (fun p -> p) criterion pq let opt_best_location criterion pq = opt_best_something Placement.location criterion pq let opt_place_by_location pq loc = match List.filter (fun p -> loc = Placement.location p) (place_list pq) with | [] -> None | [ x ] -> Some x | _ -> failwith "multiple placements in a single location" let best_something thing criterion pq = match opt_best_place criterion pq with | Some place -> thing place | None -> raise (Unplaced_pquery (namel pq)) let best_place criterion pq = best_something (fun p -> p) criterion pq let best_location criterion pq = best_something Placement.location criterion pq let is_placed pq = match place_list pq with | [] -> false | _ -> true let make criterion ~namlom ~seq pl = { seq; namlom; place_list = sort_placement_list criterion pl; } let make_ml_sorted = make Placement.ml_ratio let make_pp_sorted = make Placement.post_prob let uniform_namel namel = List.map (identity &&& const 1.) namel let set_mass pq m = let names = List.length pq.namlom |> float_of_int in { pq with namlom = List.map (Tuple.Tuple2.map2 (const (m /. names))) pq.namlom } let set_namlom pq nm = { pq with namlom = nm } let apply_to_place_list f pq = { pq with place_list = f (pq.place_list) } let sort criterion pq = if is_decreasing criterion (place_list pq) then pq else { pq with place_list = sort_placement_list criterion (place_list pq) } let make_map_by_best_loc criterion pquery_list = let (placed_l, unplaced_l) = List.partition is_placed pquery_list in (unplaced_l, IntMap.of_f_list_listly ~key_f:(best_location criterion) ~val_f:(fun x -> x) placed_l) let merge_two pq pq' = { pq with namlom = List.append pq.namlom pq'.namlom } let merge_into pq pql = List.fold_left merge_two pq pql let merge pql = List.reduce merge_two pql (* From a translation map produced by Newick_gtree.consolidate and a list of * pqueries, renumber and boost the location of each placement in the pqueries * according to the translation map. *) let translate_pql transm pql = List.map (let open Placement in apply_to_place_list (List.map (fun p -> let location, bl_boost = IntMap.find p.location transm in {p with location; distal_bl = p.distal_bl +. bl_boost}))) pql let renormalize_log_like = let open Placement in let update getter setter pl = pl |> List.map (getter &&& identity) |> List.partition (fst %> Option.is_some) |> Tuple2.map (List.split %> Tuple.Tuple2.map1 (List.map Option.get %> ll_normalized_prob) %> uncurry (List.map2 setter)) (List.map snd) |> uncurry List.append in update (ml_ratio %> some) (fun ml_ratio p -> {p with ml_ratio}) |- update post_prob_opt (fun pp p -> {p with post_prob = Some pp}) |> apply_to_place_list let is_inty f = mod_float f 1. =~ 0. let duplicate_by_count pq = namlom pq |> List.enum |> Enum.map (fun (name, count) -> if not (is_inty count) then failwith "duplicate_by_count requires integer counts on pqueries"; Enum.repeat ~times:(round count) {pq with namlom = [name, 1.]}) |> Enum.flatten pplacer-1.1.alpha19/pplacer_src/pquery_distances.ml000066400000000000000000000033011303154601500224430ustar00rootroot00000000000000open Ppatteries (* This builds a matrix of distances between pqueries. * In fact, it does the following. * Say pquery x has placements x_i, with weights P(x_i). * Say pquery y has placements y_i, with weights P(y_i). * Assume we have a distance metric d on the tree. * In the weighted case this computes * \sum_{ij} d(x_i, x_j) P(x_i) P(x_j) * and in the unweighted case it's simply the distance between the placements * with the highest P's. * * Build the ca_info to avoid tree traversal in the main loop. *) let exponentiate_function exponent f = if exponent = 1. then f else (fun crit cai a b -> (f crit cai a b) ** exponent) (* take the weighted average over placements of the pquery *) let spread_pquery_dist criterion ca_info pqa pqb = let total = ref 0. in ListFuns.list_iter_over_pairs_of_two (fun p1 p2 -> total := !total +. ((criterion p1) *. (criterion p2) *. ((Edge_rdist.find_ca_dist ca_info (Placement.location p1, Placement.distal_bl p1) (Placement.location p2, Placement.distal_bl p2))))) (Pquery.place_list pqa) (Pquery.place_list pqb); !total (* distance between the best placements *) let point_pquery_dist criterion ca_info pqa pqb = let p1 = Pquery.best_place criterion pqa and p2 = Pquery.best_place criterion pqb in Edge_rdist.find_ca_dist ca_info (Placement.location p1, Placement.distal_bl p1) (Placement.location p2, Placement.distal_bl p2) let dist_fun_of_point_spread = function | Mass_map.Spread -> spread_pquery_dist | Mass_map.Point -> point_pquery_dist let dist_fun_of_expon_weight exponent point_spread = exponentiate_function exponent (dist_fun_of_point_spread point_spread) pplacer-1.1.alpha19/pplacer_src/pquery_io.ml000066400000000000000000000050321303154601500211000ustar00rootroot00000000000000(* reading and writing pqueries. *) open Ppatteries let no_seq_str = "" let space_split = Str.split (Str.regexp "[ \t]+") (* ***** WRITING ***** *) let write ch pq = Printf.fprintf ch ">%s\n" (String.concat " " (Pquery.namel pq)); Printf.fprintf ch "%s\n" (Pquery.seq pq); List.iter (fun p -> Printf.fprintf ch "%s\n" (Placement.to_str p)) (Pquery.place_list pq) (* convert to a string list list appropriate for using with the Csv module. *) let to_csv_strl pq = let qname = String.concat " " (Pquery.namel pq) in List.mapi (fun i p -> qname::(string_of_int i)::(Placement.to_csv_strl p)) (Pquery.place_list pq) let to_json pq = let tbl = Hashtbl.create 4 in Hashtbl.add tbl "nm" (Jsontype.Array (List.map (fun (n, m) -> Jsontype.Array [Jsontype.String n; Jsontype.Float m]) (Pquery.namlom pq))); let maps = Pquery.place_list pq |> List.map Placement.to_json in List.enum maps |> Enum.map StringMap.keys |> Enum.flatten |> StringSet.of_enum, fun fields -> flip List.map maps (fun m -> Jsontype.Array (List.map (fun k -> StringMap.get k Jsontype.Null m) fields)) |> (fun x -> Jsontype.Array x) |> Hashtbl.add tbl "p"; Jsontype.Object tbl (* ***** READING ***** *) let remove_fasta_gt s = assert(s.[0] == '>'); String.sub s 1 ((String.length s)-1) let parse_pquery ?load_seq:(load_seq=true) = function | header::seq::places -> let my_seq = if load_seq then seq else no_seq_str in Pquery.make_ml_sorted ~namlom:(Pquery.uniform_namel (space_split (remove_fasta_gt header))) ~seq:my_seq (List.map Placement.placement_of_str places) | _ -> invalid_arg "problem with place file. missing sequence data?" let of_json fields o = let tbl = Jsontype.obj o in let namlom = if Hashtbl.mem tbl "n" then begin match Hashtbl.find tbl "n" with | Jsontype.String s -> [s, Hashtbl.find_option tbl "m" |> Option.map_default Jsontype.float 1.] | Jsontype.Array arr -> List.map (Jsontype.string &&& const 1.) arr | x -> Jsontype.unexpected x "string or string array" end else (* ... *) Hashtbl.find tbl "nm" |> Jsontype.array |> List.map (function | Jsontype.Array [Jsontype.String n; m] -> n, Jsontype.float m | _ -> failwith "malformed namlom in jplace file") in List.map (Placement.of_json fields) (Hashtbl.find tbl "p" |> Jsontype.array) |> Pquery.make_ml_sorted ~namlom ~seq:no_seq_str pplacer-1.1.alpha19/pplacer_src/prefs.ml000066400000000000000000000271621303154601500202130ustar00rootroot00000000000000(* preferences data type and functions. *) open Ppatteries type prefs = { (* basics *) refpkg_path : string ref; tree_fname : string ref; ref_align_fname : string ref; stats_fname : string ref; ref_dir : string ref; out_dir : string ref; out_file : string ref; (* tree calc *) start_pend : float ref; max_pend : float ref; initial_tolerance : float ref; calc_pp : bool ref; uniform_prior : bool ref; informative_prior : bool ref; prior_lower : float ref; pp_rel_err : float ref; (* playing ball *) fig_cutoff : float ref; evaluate_all : bool ref; evaluation_discrepancy: string ref; fig_tree : string ref; max_strikes : int ref; strike_box : float ref; max_pitches : int ref; fantasy : float ref; fantasy_frac : float ref; (* model *) empirical_freqs : bool ref; model_name : string ref; gamma_n_cat : int ref; gamma_alpha : float ref; (* reading and writing *) write_masked : bool ref; only_write_best : bool ref; (* other *) pretend : bool ref; check_like : bool ref; children : int ref; version : bool ref; timing : bool ref; no_pre_mask : bool ref; pre_masked_file : string ref; map_fasta : string ref; map_cutoff : float ref; map_identity : bool ref; keep_at_most : int ref; keep_factor : float ref; mrca_class : bool ref; groups : int ref; always_refine : bool ref; mmap_file : string ref; discard_nonoverlapped : bool ref; } (* default values *) let defaults () = { (* basics *) refpkg_path = ref ""; tree_fname = ref ""; ref_align_fname = ref ""; stats_fname = ref ""; ref_dir = ref ""; (* empty is the correct default; it gets some special handling *) out_dir = ref "."; out_file = ref ""; (* tree calc *) start_pend = ref 0.1; max_pend = ref 2.; initial_tolerance = ref 0.01; calc_pp = ref false; uniform_prior = ref false; informative_prior = ref false; prior_lower = ref 0.; pp_rel_err = ref 0.01; (* playing ball *) fig_cutoff = ref 0.; evaluate_all = ref false; evaluation_discrepancy = ref ""; fig_tree = ref ""; max_strikes = ref 6; strike_box = ref 3.; max_pitches = ref 40; fantasy = ref 0.; fantasy_frac = ref 0.1; (* model *) empirical_freqs = ref true; model_name = ref "LG"; gamma_n_cat = ref 1; gamma_alpha = ref 1.; (* reading and writing *) write_masked = ref false; only_write_best = ref false; (* other *) pretend = ref false; check_like = ref false; children = ref 2; version = ref false; timing = ref false; no_pre_mask = ref false; pre_masked_file = ref ""; map_fasta = ref ""; map_cutoff = ref 0.8; map_identity = ref false; keep_at_most = ref 7; keep_factor = ref 0.01; mrca_class = ref false; groups = ref 0; always_refine = ref false; mmap_file = ref ""; discard_nonoverlapped = ref false; } type mut_param = | MutBool of bool ref | MutFloat of float ref | MutInt of int ref | MutString of string ref (* yay visual block! *) let refpkg_path p = !(p.refpkg_path) let tree_fname p = !(p.tree_fname) let ref_align_fname p = !(p.ref_align_fname) let stats_fname p = !(p.stats_fname) let start_pend p = !(p.start_pend) let max_pend p = !(p.max_pend) let initial_tolerance p = !(p.initial_tolerance) let calc_pp p = !(p.calc_pp) let uniform_prior p = !(p.uniform_prior) let informative_prior p = !(p.informative_prior) let prior_lower p = !(p.prior_lower) let pp_rel_err p = !(p.pp_rel_err) let fig_cutoff p = !(p.fig_cutoff) let evaluate_all p = !(p.evaluate_all) let evaluation_discrepancy p = !(p.evaluation_discrepancy) let fig_tree p = !(p.fig_tree) let max_strikes p = !(p.max_strikes) let strike_box p = !(p.strike_box) let max_pitches p = !(p.max_pitches) let fantasy p = !(p.fantasy) let fantasy_frac p = !(p.fantasy_frac) let empirical_freqs p = !(p.empirical_freqs) let model_name p = !(p.model_name) let gamma_n_cat p = !(p.gamma_n_cat) let gamma_alpha p = !(p.gamma_alpha) let write_masked p = !(p.write_masked) let only_write_best p = !(p.only_write_best) let ref_dir p = !(p.ref_dir) let out_dir p = !(p.out_dir) let out_file p = !(p.out_file) let pretend p = !(p.pretend) let check_like p = !(p.check_like) let children p = !(p.children) let version p = !(p.version) let timing p = !(p.timing) let no_pre_mask p = !(p.no_pre_mask) let pre_masked_file p = !(p.pre_masked_file) let map_fasta p = !(p.map_fasta) let map_cutoff p = !(p.map_cutoff) let map_identity p = !(p.map_identity) let keep_at_most p = !(p.keep_at_most) let keep_factor p = !(p.keep_factor) let mrca_class p = !(p.mrca_class) let groups p = !(p.groups) let always_refine p = !(p.always_refine) let mmap_file p = !(p.mmap_file) let discard_nonoverlapped p = !(p.discard_nonoverlapped) (* arguments and preferences *) let spec_with_default symbol setfun p help = (symbol, setfun p, Printf.sprintf help !p) let specl prefs = align_with_space [ (* short *) "-c", Arg.Set_string prefs.refpkg_path, "Specify the path to the reference package."; "-t", Arg.Set_string prefs.tree_fname, "Specify the reference tree filename."; "-r", Arg.Set_string prefs.ref_align_fname, "Specify the reference alignment filename."; "-s", Arg.Set_string prefs.stats_fname, "Supply a phyml stats.txt or a RAxML info file giving the model parameters."; "-d", Arg.Set_string prefs.ref_dir, "Specify the directory containing the reference information."; "-p", Arg.Unit (fun () -> prefs.calc_pp := true; prefs.keep_at_most := 20; prefs.keep_factor := 0.001; prefs.max_strikes := 20), "Calculate posterior probabilities."; "-m", Arg.Set_string prefs.model_name, "Substitution model. Protein: LG, WAG, or JTT. Nucleotides: GTR."; (* model *) "--model-freqs", Arg.Clear prefs.empirical_freqs, "Use model frequencies instead of reference alignment frequencies."; "--gamma-cats", Arg.Set_int prefs.gamma_n_cat, "Number of categories for discrete gamma model."; "--gamma-alpha", Arg.Set_float prefs.gamma_alpha, "Specify the shape parameter for a discrete gamma model."; (* like calc parameters *) spec_with_default "--ml-tolerance" (fun o -> Arg.Set_float o) prefs.initial_tolerance "1st stage branch len optimization tolerance (2nd stage to 1e-5). Default: %g."; spec_with_default "--pp-rel-err" (fun o -> Arg.Set_float o) prefs.pp_rel_err "Relative error for the posterior probability calculation. Default is %g."; "--unif-prior", Arg.Set prefs.uniform_prior, "Use a uniform prior rather than exponential."; "--inform-prior", Arg.Set prefs.informative_prior, "Use an informative exponential prior based on rooted distance to leaves."; spec_with_default "--prior-lower" (fun o -> Arg.Set_float o) prefs.prior_lower "Lower bound for the informative prior mean. Default is %g."; spec_with_default "--start-pend" (fun o -> Arg.Set_float o) prefs.start_pend "Starting pendant branch length. Default is %g."; spec_with_default "--max-pend" (fun o -> Arg.Set_float o) prefs.max_pend "Set the maximum ML pendant branch length. Default is %g."; (* baseball *) spec_with_default "--fig-cutoff" (fun o -> Arg.Set_float o) prefs.fig_cutoff "The cutoff for determining figs. Default is %g; specify 0 to disable."; "--fig-eval-all", Arg.Set prefs.evaluate_all, "Evaluate all likelihoods to ensure that the best location was selected."; "--fig-eval-discrepancy-tree", Arg.Set_string prefs.evaluation_discrepancy, "Write out a tree showing the discrepancies between the best complete and observed locations."; "--fig-tree", Arg.Set_string prefs.fig_tree, "Write out a tree showing the figs on the tree."; spec_with_default "--max-strikes" (fun o -> Arg.Set_int o) prefs.max_strikes "Maximum number of strikes for baseball. 0 -> no ball playing. Default is %d."; spec_with_default "--strike-box" (fun o -> Arg.Set_float o) prefs.strike_box "Set the size of the strike box in log likelihood units. Default is %g."; spec_with_default "--max-pitches" (fun o -> Arg.Set_int o) prefs.max_pitches "Set the maximum number of pitches for baseball. Default is %d."; "--fantasy", Arg.Set_float prefs.fantasy, "Desired likelihood cutoff for fantasy baseball mode. 0 -> no fantasy."; spec_with_default "--fantasy-frac" (fun o -> Arg.Set_float o) prefs.fantasy_frac "Fraction of fragments to use when running fantasy baseball. Default is %g."; (* other *) "--write-masked", Arg.Set prefs.write_masked, "Write alignment masked to the region without gaps in the query."; spec_with_default "--verbosity" (fun o -> Arg.Set_int o) Ppatteries.verbosity "Set verbosity level. 0 is silent, and 2 is quite a lot. Default is %d."; "--out-dir", Arg.Set_string prefs.out_dir, "Specify the directory to write place files to."; "-o", Arg.Set_string prefs.out_file, "Specify the output file name"; "--pretend", Arg.Set prefs.pretend, "Only check out the files then report. Do not run the analysis."; "--check-like", Arg.Set prefs.check_like, "Write out the likelihood of the reference tree, calculated two ways."; spec_with_default "-j" (fun o -> Arg.Set_int o) prefs.children "The number of child processes to spawn when doing placements. Default is %d."; "--timing", Arg.Set prefs.timing, "Display timing information after the pplacer run finishes."; "--no-pre-mask", Arg.Set prefs.no_pre_mask, "Don't pre-mask sequences before placement."; "--write-pre-masked", Arg.Set_string prefs.pre_masked_file, "Write out the pre-masked sequences to the specified fasta file before placement."; "--map-mrca", Arg.Set_string prefs.map_fasta, "Specify a file to write out MAP sequences for MRCAs and corresponding placements."; spec_with_default "--map-mrca-min" (fun o -> Arg.Set_float o) prefs.map_cutoff "Specify cutoff for inclusion in MAP sequence file. Default is %g."; "--map-identity", Arg.Set prefs.map_identity, "Add the percent identity of the query sequence to the nearest MAP sequence to each placement."; spec_with_default "--keep-at-most" (fun o -> Arg.Set_int o) prefs.keep_at_most "The maximum number of placements we keep. Default is %d."; spec_with_default "--keep-factor" (fun o -> Arg.Set_float o) prefs.keep_factor "Throw away anything that has ml_ratio below keep_factor times (best ml_ratio). Default is %g."; "--mrca-class", Arg.Set prefs.mrca_class, "Classify with MRCAs instead of a painted tree."; "--groups", Arg.Set_int prefs.groups, "Split query alignment into the specified number of groups."; "--always-refine", Arg.Set prefs.always_refine, "Always refine the model before placing."; "--mmap-file", Arg.Set_string prefs.mmap_file, "Instead of doing large allocations, mmap the given file. It will be created if it doesn't exist."; "--discard-nonoverlapped", Arg.Set prefs.discard_nonoverlapped, "When pre-masking, silently discard sequences which don't overlap the mask."; "--version", Arg.Set prefs.version, "Write out the version number and exit."; ] (* do a sanity check on the preferences *) let check p = if start_pend p <= 0. then failwith "Starting pendant branch length must be strictly positive."; if start_pend p >= max_pend p then failwith "Starting pendant branch length must be strictly less than maximum pendant branch length."; () let usage = "pplacer [options] [alignment]" (* for the time being just to generate documentation *) class pplacer_cmd () = object inherit Subcommand.subcommand () method desc = "performs phylogenetic placement" method usage = usage method specl = specl (defaults ()) method action _ = () end pplacer-1.1.alpha19/pplacer_src/prot_models.ml000066400000000000000000000176241303154601500214250ustar00rootroot00000000000000open Ppatteries (* *** translating protein sequences *** *) let prot_code = [|'A'; 'R'; 'N'; 'D'; 'C'; 'Q'; 'E'; 'G'; 'H'; 'I'; 'L'; 'K'; 'M'; 'F'; 'P'; 'S'; 'T'; 'W'; 'Y'; 'V'|] let prot_map = begin let pm = ref CharMap.empty in Array.iteri ( fun i c -> let v = Gsl_vector.create ~init:0. 20 in v.{i} <- 1.; pm := CharMap.add c v !pm; ) prot_code; let any = Gsl_vector.create ~init:1. 20 and b_vector = Gsl_vector.create ~init:0. 20 and j_vector = Gsl_vector.create ~init:0. 20 and z_vector = Gsl_vector.create ~init:0. 20 in (* B is D or N. *) Gsl_vector.add b_vector (CharMap.find 'D' !pm); Gsl_vector.add b_vector (CharMap.find 'N' !pm); (* J is I or L. *) Gsl_vector.add j_vector (CharMap.find 'I' !pm); Gsl_vector.add j_vector (CharMap.find 'L' !pm); (* Z is E or Q. *) Gsl_vector.add z_vector (CharMap.find 'E' !pm); Gsl_vector.add z_vector (CharMap.find 'Q' !pm); (* Format.print_char 'B'; Format.printf " %a@\n" Linear_utils.ppr_gsl_vector b_vector; Format.print_char 'J'; Format.printf " %a@\n" Linear_utils.ppr_gsl_vector j_vector; Format.print_char 'Z'; Format.printf " %a@\n" Linear_utils.ppr_gsl_vector z_vector; *) CharMap.add '-' any ( CharMap.add 'B' b_vector ( CharMap.add 'J' j_vector ( CharMap.add 'Z' z_vector ( CharMap.add '?' any ( CharMap.add 'X' any !pm))))) end let lv_of_aa aa = try CharMap.find aa prot_map with | Not_found -> invalid_arg (Printf.sprintf "%c not a known amino acid!" aa) (* *** MODELS *** *) let parseLine line = Array.of_list (List.map float_of_string (Str.split (Str.regexp "[ \t]+") line)) let parseProtModel stringArr = let lowerTriMat = Array.map parseLine stringArr in let nEntries = 1 + Array.length lowerTriMat in let qMat = Linear_utils.mat_init nEntries nEntries ( fun i j -> if i = j then 0. (* filled in later *) else lowerTriMat.((max i j)-1).(min i j)) in qMat let parseFreq str = Gsl_vector.of_array (parseLine str) let littleWag = parseProtModel [| "0.551571"; "0.509848 0.635346"; "0.738998 0.147304 5.429420"; "1.027040 0.528191 0.265256 0.0302949"; |] let wag_trans = parseProtModel [| "0.551571"; "0.509848 0.635346"; "0.738998 0.147304 5.429420"; "1.027040 0.528191 0.265256 0.0302949"; "0.908598 3.035500 1.543640 0.616783 0.0988179"; "1.582850 0.439157 0.947198 6.174160 0.021352 5.469470"; "1.416720 0.584665 1.125560 0.865584 0.306674 0.330052 0.567717"; "0.316954 2.137150 3.956290 0.930676 0.248972 4.294110 0.570025 0.249410"; "0.193335 0.186979 0.554236 0.039437 0.170135 0.113917 0.127395 0.0304501 0.138190"; "0.397915 0.497671 0.131528 0.0848047 0.384287 0.869489 0.154263 0.0613037 0.499462 3.170970"; "0.906265 5.351420 3.012010 0.479855 0.0740339 3.894900 2.584430 0.373558 0.890432 0.323832 0.257555"; "0.893496 0.683162 0.198221 0.103754 0.390482 1.545260 0.315124 0.174100 0.404141 4.257460 4.854020 0.934276"; "0.210494 0.102711 0.0961621 0.0467304 0.398020 0.0999208 0.0811339 0.049931 0.679371 1.059470 2.115170 0.088836 1.190630"; "1.438550 0.679489 0.195081 0.423984 0.109404 0.933372 0.682355 0.243570 0.696198 0.0999288 0.415844 0.556896 0.171329 0.161444"; "3.370790 1.224190 3.974230 1.071760 1.407660 1.028870 0.704939 1.341820 0.740169 0.319440 0.344739 0.967130 0.493905 0.545931 1.613280"; "2.121110 0.554413 2.030060 0.374866 0.512984 0.857928 0.822765 0.225833 0.473307 1.458160 0.326622 1.386980 1.516120 0.171903 0.795384 4.378020"; "0.113133 1.163920 0.0719167 0.129767 0.717070 0.215737 0.156557 0.336983 0.262569 0.212483 0.665309 0.137505 0.515706 1.529640 0.139405 0.523742 0.110864"; "0.240735 0.381533 1.086000 0.325711 0.543833 0.227710 0.196303 0.103604 3.873440 0.420170 0.398618 0.133264 0.428437 6.454280 0.216046 0.786993 0.291148 2.485390"; "2.006010 0.251849 0.196246 0.152335 1.002140 0.301281 0.588731 0.187247 0.118358 7.821300 1.800340 0.305434 2.058450 0.649892 0.314887 0.232739 1.388230 0.365369 0.314730"; |] let wag_statd = parseFreq "0.0866279 0.043972 0.0390894 0.0570451 0.0193078 0.0367281 0.0580589 0.0832518 0.0244313 0.048466 0.086209 0.0620286 0.0195027 0.0384319 0.0457631 0.0695179 0.0610127 0.0143859 0.0352742 0.0708956" (* Le and Gascuel's matrix *) let lg_trans = parseProtModel [| "0.425093"; "0.276818 0.751878"; "0.395144 0.123954 5.076149"; "2.489084 0.534551 0.528768 0.062556"; "0.969894 2.807908 1.695752 0.523386 0.084808"; "1.038545 0.363970 0.541712 5.243870 0.003499 4.128591"; "2.066040 0.390192 1.437645 0.844926 0.569265 0.267959 0.348847"; "0.358858 2.426601 4.509238 0.927114 0.640543 4.813505 0.423881 0.311484"; "0.149830 0.126991 0.191503 0.010690 0.320627 0.072854 0.044265 0.008705 0.108882"; "0.395337 0.301848 0.068427 0.015076 0.594007 0.582457 0.069673 0.044261 0.366317 4.145067"; "0.536518 6.326067 2.145078 0.282959 0.013266 3.234294 1.807177 0.296636 0.697264 0.159069 0.137500"; "1.124035 0.484133 0.371004 0.025548 0.893680 1.672569 0.173735 0.139538 0.442472 4.273607 6.312358 0.656604"; "0.253701 0.052722 0.089525 0.017416 1.105251 0.035855 0.018811 0.089586 0.682139 1.112727 2.592692 0.023918 1.798853"; "1.177651 0.332533 0.161787 0.394456 0.075382 0.624294 0.419409 0.196961 0.508851 0.078281 0.249060 0.390322 0.099849 0.094464"; "4.727182 0.858151 4.008358 1.240275 2.784478 1.223828 0.611973 1.739990 0.990012 0.064105 0.182287 0.748683 0.346960 0.361819 1.338132"; "2.139501 0.578987 2.000679 0.425860 1.143480 1.080136 0.604545 0.129836 0.584262 1.033739 0.302936 1.136863 2.020366 0.165001 0.571468 6.472279"; "0.180717 0.593607 0.045376 0.029890 0.670128 0.236199 0.077852 0.268491 0.597054 0.111660 0.619632 0.049906 0.696175 2.457121 0.095131 0.248862 0.140825"; "0.218959 0.314440 0.612025 0.135107 1.165532 0.257336 0.120037 0.054679 5.306834 0.232523 0.299648 0.131932 0.481306 7.803902 0.089613 0.400547 0.245841 3.151815"; "2.547870 0.170887 0.083688 0.037967 1.959291 0.210332 0.245034 0.076701 0.119013 10.649107 1.702745 0.185202 1.898718 0.654683 0.296501 0.098369 2.188158 0.189510 0.249313"; |] let lg_statd = parseFreq "0.079066 0.055941 0.041977 0.053052 0.012937 0.040767 0.071586 0.057337 0.022355 0.062157 0.099081 0.064600 0.022951 0.042302 0.044040 0.061197 0.053287 0.012066 0.034155 0.069147" (* JTT *) let jtt_trans = parseProtModel [| "58"; "54 45"; "81 16 528"; "56 113 34 10"; "57 310 86 49 9"; "105 29 58 767 5 323"; "179 137 81 130 59 26 119"; "27 328 391 112 69 597 26 23"; "36 22 47 11 17 9 12 6 16"; "30 38 12 7 23 72 9 6 56 229"; "35 646 263 26 7 292 181 27 45 21 14"; "54 44 30 15 31 43 18 14 33 479 388 65"; "15 5 10 4 78 4 5 5 40 89 248 4 43"; "194 74 15 15 14 164 18 24 115 10 102 21 16 17"; "378 101 503 59 223 53 30 201 73 40 59 47 29 92 285"; "475 64 232 38 42 51 32 33 46 245 25 103 226 12 118 477"; "9 126 8 4 115 18 10 55 8 9 52 10 24 53 6 35 12"; "11 20 70 46 209 24 7 8 573 32 24 8 18 536 10 63 21 71"; "298 17 16 31 62 20 45 47 11 961 180 14 323 62 23 38 112 25 16"; |] let jtt_statd = parseFreq "0.076748 0.051691 0.042645 0.051544 0.019803 0.040752 0.061830 0.073152 0.022944 0.053761 0.091904 0.058676 0.023826 0.040126 0.050901 0.068765 0.058565 0.014261 0.032102 0.066005" let trans_and_statd_of_model_name = function | "LG" -> (lg_trans, lg_statd) | "WAG" -> (wag_trans, wag_statd) | "JTT" -> (jtt_trans, jtt_statd) | model_name -> failwith ("unknown model: "^model_name) pplacer-1.1.alpha19/pplacer_src/r_plots.ml000066400000000000000000000023751303154601500205550ustar00rootroot00000000000000 open Ppatteries (* open Multiset *) (* the percent extra to stretch the x limits *) let relax_factor = 0.05 let int_div x y = (float_of_int x) /. (float_of_int y) let min_list l = List.reduce min l let max_list l = List.reduce max l let min_x all_dists = (1. -. relax_factor) *. (min_list all_dists) let max_x all_dists = (1. +. relax_factor) *. (max_list all_dists) (* density shows where the sample sits in the shuffled distances *) let write_density p type_str name1 name2 sample_dist null_dists = (* the data *) let prefix = type_str^"."^name1^".VS."^name2 in let dat_name = prefix^".dat" in let dat_ch = open_out dat_name in List.iter (fun x -> Printf.fprintf dat_ch "%g\n" x) null_dists; close_out dat_ch; (* the r file *) let r_ch = open_out (prefix^".R") in Printf.fprintf r_ch "pdf(\"%s\")\n" (prefix^".pdf"); Printf.fprintf r_ch "data <- read.table(\"%s\")\n" dat_name; let all_dists = sample_dist::null_dists in Printf.fprintf r_ch "plot(density(data[,1]), main=\"d(%s,%s) = %f\", xlab=expression(KR~Z[%g]~distance), xlim=c(%g,%g))\n" name1 name2 sample_dist p (min_x all_dists) (max_x all_dists); Printf.fprintf r_ch "abline(v=%g, col=\"red\")\n" sample_dist; Printf.fprintf r_ch "dev.off()\n"; close_out r_ch; () pplacer-1.1.alpha19/pplacer_src/rarefaction.ml000066400000000000000000000165551303154601500213750ustar00rootroot00000000000000open Ppatteries let merge = const incr |> flip let lmerge = List.fold_left ((!) |- (+) |> flip) 0 |- ref module I = Mass_map.Indiv (* Convenience wrapper around the functions in Kr_distance for specifying just * a callback with parameters for the count of edge segments below the current * edge segment and the branch length. The return values of the callbacks are * summed across the tree. *) let count_along_mass gt mass cb = let partial_total id = Kr_distance.total_along_edge cb (Gtree.get_bl gt id) (IntMap.get id [] mass |> List.map I.to_pair |> List.sort compare) merge in Kr_distance.total_over_tree partial_total (const ()) lmerge (fun () -> ref 0) (Gtree.get_stree gt) let k_maps_of_placerun: int -> Newick_bark.t Placerun.t -> float IntMap.t IntMap.t = fun k_max pr -> let n = Placerun.get_pqueries pr |> List.length in let n' = float_of_int n and base_k_map = 0 -- n |> Enum.map (identity &&& const 1.) |> IntMap.of_enum |> IntMap.singleton 0 in Enum.fold (fun k_maps k -> let prev_map = IntMap.find k k_maps and diff = n' -. float_of_int k in let q_k r = (diff -. float_of_int r) /. diff *. IntMap.find r prev_map in 0 -- n |> Enum.map (identity &&& q_k) |> IntMap.of_enum |> flip (IntMap.add (k + 1)) k_maps) base_k_map (0 --^ k_max) (* Compute the rarefaction curve of a placerun, given a placement criterion and * optionally the highest X value for the curve. *) let of_placerun: (Placement.t -> float) -> ?k_max:int -> Newick_bark.t Placerun.t -> (int * float * float * float) Enum.t = fun criterion ?k_max pr -> let gt = Placerun.get_ref_tree pr |> Newick_gtree.add_zero_root_bl and mass = I.of_placerun Mass_map.Point criterion pr in let n = Placerun.get_pqueries pr |> List.length in let n' = float_of_int n in let k_max = match k_max with | Some k when k < n -> k | _ -> n in let k_maps = k_maps_of_placerun k_max pr in let count k = let q_k = IntMap.find k k_maps |> flip IntMap.find in let count_fn = count_along_mass gt mass in count_fn (fun d bl -> let d = !d in let p = n - d in (1. -. (q_k d) -. (q_k p)) *. bl), count_fn (fun d bl -> (1. -. (q_k !d)) *. bl), count_fn (fun d bl -> let d' = float_of_int !d in bl *. d' *. (n' -. d')) in 2 -- k_max |> Enum.map (fun k -> let u, r, q = count k in let k' = float_of_int k in let q' = q *. (k' -. 1.) /. (k' *. n' *. (n' -. 1.)) in k, u, r, q') let mass_induced_tree gt mass = let edge = ref 0 and bark_map = ref IntMap.empty and mass_counts = ref IntMap.empty in let next_edge mass_count bl = let x = !edge in incr edge; bark_map := Newick_bark.map_set_bl x bl !bark_map; if mass_count > 0 then mass_counts := IntMap.add x mass_count !mass_counts; x in let open Stree in let rec aux t = let i, below = match t with | Leaf i -> i, None | Node (i, subtrees) -> i, Some (List.map aux subtrees) in let ml = IntMap.get i [] mass |> List.map (fun {I.distal_bl} -> distal_bl) |> List.cons 0. |> List.group approx_compare |> List.map (function | hd :: tl when hd =~ 0. -> hd, List.length tl | hd :: tl -> hd, List.length tl + 1 | [] -> invalid_arg "ml") and bl = Gtree.get_bl gt i in let rec snips tree pl = let j, tl = match pl with | (p1, c1) :: ((p2, _) :: _ as tl) -> next_edge c1 (p2 -. p1), tl | [p, c] -> next_edge c (bl -. p), [] | [] -> invalid_arg "snips" in let tree' = Some [match tree with | None -> leaf j | Some subtrees -> node j subtrees] in match tl with | [] -> tree' | tl -> snips tree' tl in snips below ml |> Option.get |> List.hd in let st' = aux (Gtree.get_stree gt) in !mass_counts, Gtree.gtree st' !bark_map let distal_proximal_maps st marks_map = let open Stree in let rec aux = function | Leaf i -> IntMap.singleton i (IntMap.get i 0 marks_map) | Node (i, subtrees) -> let distal_marks = List.map aux subtrees |> List.reduce IntMap.union in let marks = List.enum subtrees |> Enum.map (top_id |- flip IntMap.find distal_marks) |> Enum.sum |> (+) (IntMap.get i 0 marks_map) in IntMap.add i marks distal_marks in let distal_map = aux st in let total_marks = IntMap.values marks_map |> Enum.sum in let proximal_map = IntMap.map ((-) total_marks) distal_map in distal_map, proximal_map let distal_edges_map st = let open Stree in let rec aux = function | Leaf i -> IntMap.singleton i IntSet.empty | Node (i, subtrees) -> let distal_edges = List.map aux subtrees |> List.reduce IntMap.union in let subtree_edges = List.map top_id subtrees in let edges = List.enum subtree_edges |> Enum.map (flip IntMap.find distal_edges) |> Enum.reduce IntSet.union |> IntSet.union (IntSet.of_list subtree_edges) in IntMap.add i edges distal_edges in aux st exception What of (int * int * int * int) let auto_cache ?(count = 1024 * 1024) f = curry (Cache.make_ht ~gen:(uncurry f) ~init_size:count).Cache.get let variance_of_placerun criterion ?k_max pr = let gt = Placerun.get_ref_tree pr |> Newick_gtree.add_zero_root_bl and mass = I.of_placerun Mass_map.Point criterion pr in let n = Placerun.get_pqueries pr |> List.length in let k_max = match k_max with | Some k when k < n -> k | _ -> n in let k_maps = k_maps_of_placerun k_max pr in let marks_map, gt' = mass_induced_tree gt mass in let bl = Gtree.get_bl gt' in let st' = Gtree.get_stree gt' in let distal_marks, proximal_marks = distal_proximal_maps st' marks_map in let distal_edges = distal_edges_map st' in (* is i proximal to j? *) let _is_proximal i j = IntSet.mem j (IntMap.find i distal_edges) in let is_proximal = auto_cache _is_proximal in let d i = IntMap.find i distal_marks and c i = IntMap.find i proximal_marks in let _o i j = if is_proximal i j then c i else d i and _s i j = if is_proximal i j then d i else c i and _q k x = IntMap.find k k_maps |> IntMap.find x in let o = auto_cache _o and s = auto_cache _s and q = auto_cache _q in let cov_without_root k i j = let q_k = q k in if i = j then let cov = 1. -. q_k (d i) -. q_k (c i) in cov -. cov ** 2. else q_k (o i j + o j i) -. q_k (o i j) *. q_k (o j i) +. (1. -. q_k (o i j)) *. q_k (s j i) +. (1. -. q_k (o j i)) *. q_k (s i j) -. q_k (s i j) *. q_k (s j i) and cov_with_root k i j = let q_k = q k in if i = j then let cov = 1. -. q_k (d i) in cov -. cov ** 2. else let union = if is_proximal i j then d i else if is_proximal j i then d j else d i + d j in q_k union -. q_k (d i) *. q_k (d j) in let n_edges = Stree.top_id st' in let var cov_fn k = let cov_times_bl k i j = cov_fn k i j *. bl i *. bl j in let diag = 0 --^ n_edges |> Enum.map (fun i -> cov_times_bl k i i) |> Enum.fold (+.) 0. in Uptri.init n_edges (cov_times_bl k) |> Uptri.fold_left (+.) 0. |> ( *.) 2. |> (+.) diag in 2 -- k_max |> Enum.map (fun k -> k, var cov_without_root k, var cov_with_root k) pplacer-1.1.alpha19/pplacer_src/refpkg.ml000066400000000000000000000203121303154601500203400ustar00rootroot00000000000000open Ppatteries exception Missing_element of string (* Refpkg.t *) type t = { (* specified *) ref_tree : Newick_bark.newick_bark Gtree.gtree Delayed.t; model : Glvm.t Delayed.t; aln_fasta : Alignment.t Delayed.t; taxonomy : Tax_taxonomy.t Delayed.t; seqinfom : Tax_seqinfo.seqinfo_map Delayed.t; name : string; (* inferred *) mrcam : Tax_id.tax_id IntMap.t Delayed.t; uptree_map : int IntMap.t Delayed.t; get : string -> Refpkg_parse.contents; get_opt : string -> Refpkg_parse.contents option; prefs : Prefs.prefs; } (* *** basics *** *) let get_ref_tree rp = Delayed.reify rp.ref_tree (fun () -> rp.get "tree" |> Newick_gtree.of_refpkg_contents) let get_aln_fasta rp = Delayed.reify rp.aln_fasta (fun () -> let aln = match rp.get_opt "aln_fasta" with | Some fa -> Fasta.of_refpkg_contents fa | None -> rp.get "aln_sto" |> Stockholm.of_refpkg_contents in Alignment.uppercase (Array.of_list aln)) let get_model rp = Delayed.reify rp.model (fun () -> let aln = get_aln_fasta rp in match rp.get_opt "phylo_model" with | Some v -> let j = Refpkg_parse.json_of_contents v |> Jsontype.obj in begin match Hashtbl.find j "ras_model" |> Jsontype.string with | "gamma" -> (module Gmix_model.Model: Glvm.Model), Gmix_model.init_of_json j aln | "Price-CAT" -> (module Gcat_model.Model: Glvm.Model), Gcat_model.init_of_json j aln | x -> failwith ("invalid ras_model: " ^ x) end | None -> print_endline "Warning: using a statistics file directly is now deprecated. \ We suggest using a reference package. If you already are, then \ please use the latest version of taxtastic."; (module Gmix_model.Model: Glvm.Model), Gmix_model.init_of_stats_fname rp.prefs (rp.get "tree_stats" |> Refpkg_parse.as_file_path) aln) let get_taxonomy rp = Delayed.reify rp.taxonomy (fun () -> rp.get "taxonomy" |> Refpkg_parse.csv_of_contents |> with_dispose ~dispose:Csv.close_in Tax_taxonomy.of_ncbi_file) let get_seqinfom rp = Delayed.reify rp.seqinfom (fun () -> rp.get "seq_info" |> Refpkg_parse.csv_of_contents |> with_dispose ~dispose:Csv.close_in Tax_seqinfo.of_csv) let get_name rp = rp.name let get_mrcam rp = Delayed.reify rp.mrcam (fun () -> Tax_map.mrcam_of_data (get_seqinfom rp) (get_taxonomy rp) (get_ref_tree rp)) let get_uptree_map rp = Delayed.reify rp.uptree_map (fun () -> get_ref_tree rp |> Gtree.get_stree |> Stree.parent_map) let set_ref_tree gt rp = {rp with ref_tree = Delayed.init gt} let set_aln_fasta aln rp = {rp with aln_fasta = Delayed.init aln} let refpkg_versions = ["1.1"] let show_supported_versions () = Printf.printf "Supported versions: %s.\n" (String.concat ", " refpkg_versions) (* This is the primary builder. We have the option of specifying an actual * alignment and a tree if we have them already. *) let of_strmap ?ref_tree ?ref_align ?(ignore_version = false) prefs m = let get what = try StringMap.find what m with | Not_found -> raise (Missing_element what) in if not ignore_version then begin if StringMap.mem "format_version" m then begin let format_version = StringMap.find "format_version" m |> Refpkg_parse.as_metadata in if not (List.mem format_version refpkg_versions) then begin Printf.printf "This reference package's format is version %s, which is not supported.\n" format_version; show_supported_versions (); invalid_arg "of_strmap" end end else begin print_endline "This reference package has no version information specified in it, \ which most likely means it is an older, incompatible format."; show_supported_versions (); invalid_arg "of_strmap" end; end; { ref_tree = Delayed.of_option ref_tree; model = Delayed.create (); aln_fasta = Delayed.of_option ref_align; taxonomy = Delayed.create (); seqinfom = Delayed.create (); name = get "name" |> Refpkg_parse.as_metadata; mrcam = Delayed.create (); uptree_map = Delayed.create (); get; get_opt = flip StringMap.Exceptionless.find m; prefs; } let of_path ?ref_tree path = of_strmap ?ref_tree (Prefs.defaults ()) (Refpkg_parse.strmap_of_path path) (* *** ACCESSORIES *** *) let tax_decor_map_of_mrcam td mrcam = IntMap.filter_map (fun _ -> function | Tax_id.NoTax -> None | ti -> Some (Decor.Taxinfo (ti, Tax_taxonomy.get_tax_name td ti))) mrcam let tax_ref_tree_of_gtree td mrcam gt = Decor_gtree.add_decor_by_map (Decor_gtree.of_newick_gtree gt) (IntMap.map (fun x -> [x]) (tax_decor_map_of_mrcam td mrcam)) (* mrca tax decor, that is *) let get_tax_decor_map rp = tax_decor_map_of_mrcam (get_taxonomy rp) (get_mrcam rp) (* tax ref tree is the usual ref tree with but with taxonomic annotation *) let get_tax_ref_tree ?alt_gt rp = let td = get_taxonomy rp in let mrcam, gt = match alt_gt with | Some gt -> Tax_map.mrcam_of_data (get_seqinfom rp) td gt, gt | None -> get_mrcam rp, get_ref_tree rp in tax_ref_tree_of_gtree td mrcam gt (* if the rp is equipped with a taxonomy *) let tax_equipped rp = try let _ = get_taxonomy rp and _ = get_seqinfom rp in true with | Missing_element _ -> false let mrca_classify rp pr = Tax_classify.classify_pr Placement.add_classif (Tax_classify.mrca_classify (get_mrcam rp) (get_uptree_map rp)) pr let print_OK start rp = dprintf "%s%s checks OK!\n" start (get_name rp) (* make sure all of the tax maps etc are set up *) let check_refpkg_classification rp = dprint "Checking MRCA map...\n"; let mrcam = get_mrcam rp in dprint "Checking uptree map...\n"; let utm = get_uptree_map rp in dprint "Trying classifications...\n"; let _ = List.map (Tax_classify.mrca_classify_loc mrcam utm) (Gtree.nonroot_node_ids (get_ref_tree rp)) in () let check rp name what = dprintf "Checking %s...\n" name; let _ = what rp in () let check_tree_and_aln_names tree aln = let tns = Newick_gtree.leaf_label_map tree |> IntMap.values |> StringSet.of_enum and ans = StringSet.of_list (Array.to_list (Alignment.get_name_arr aln)) in let test (s1, n1) (s2, n2) = let d = StringSet.diff s1 s2 in if not (StringSet.is_empty d) then begin Format.fprintf Format.str_formatter "present in %s but not %s: %a" n1 n2 StringSet.ppr d; failwith (Format.flush_str_formatter ()) end in test (tns, "tree") (ans, "alignment"); test (ans, "alignment") (tns, "tree"); () let check_refpkg rp = dprintf "Checking refpkg %s...\n" (get_name rp); check rp "tree" get_ref_tree; check rp "model" get_model; check rp "alignment" get_aln_fasta; check_tree_and_aln_names (get_ref_tree rp) (get_aln_fasta rp); try check rp "taxonomy" get_taxonomy; check rp "seqinfom" get_seqinfom; check_refpkg_classification rp; print_OK "Taxonomically-informed reference package " rp with | Missing_element _ -> print_OK "Non-taxonomically-informed reference package " rp (* check that a given tree t is the same as the ref tree in the refpkg rp. * Note that we don't check bootstraps. *) let check_tree_identical ?epsilon:(epsilon=0.) rp title t = if 0 <> Newick_gtree.compare ~epsilon ~cmp_edge_label:false t (get_ref_tree rp) then failwith (title^" and the tree from "^(get_name rp)^" are not the same.") let check_tree_approx = check_tree_identical ~epsilon:1e-5 let pr_check_tree_approx rp pr = check_tree_approx rp (pr.Placerun.name^" reference tree") (Placerun.get_ref_tree pr) let check_tree_subset rp name gt = let leaves = Newick_gtree.leaf_label_map %> IntMap.values %> StringSet.of_enum in let ref_leaves = get_ref_tree rp |> leaves and subset_leaves = leaves gt in let non_overlapped = StringSet.diff subset_leaves ref_leaves in if not (StringSet.is_empty non_overlapped) then failwith (Printf.sprintf "%s is not a subset of %s. mismatched leaves include: %s" name (get_name rp) (StringSet.elements non_overlapped |> String.join ", " )) pplacer-1.1.alpha19/pplacer_src/refpkg_parse.ml000066400000000000000000000054441303154601500215430ustar00rootroot00000000000000open Ppatteries let refpkg_str = "CONTENTS.json" let sstringMap_of_Sjobj obj = Hashtbl.fold (fun k v -> StringMap.add k (Simple_json.get_string v)) obj StringMap.empty (* *** parsing *** *) type contents = | File_path of string | File_contents of string * string Lazy.t | Metadata of string let file_path s = File_path s let metadata s = Metadata s let as_metadata = function | Metadata s -> s | _ -> invalid_arg "as_metadata" let as_file_path = function | File_path p -> p | _ -> invalid_arg "as_file_path" let of_file_or_string of_file (of_string: ?fname:string -> string -> 'a) = function | File_path p -> of_file p | File_contents (fname, s) -> of_string ~fname (Lazy.force s) | _ -> invalid_arg "of_file_or_string" let json_of_contents = of_file_or_string Json.of_file Json.of_string let csv_of_contents c = (match c with | File_path p -> open_in p | File_contents (_, s) -> IO.input_string (Lazy.force s) | _ -> invalid_arg "csv_of_contents") |> csv_in_channel |> Csv.of_in_obj let remove_terminal_slash s = let len = String.length s in if s.[len - 1] <> '/' then s else String.sub s 0 (len-1) let maybe_add_version contents map = try StringMap.add "format_version" (Jsontype.string (Hashtbl.find (Jsontype.obj (Hashtbl.find contents "metadata")) "format_version") |> metadata) map with Not_found -> map let strmap_of_zipfile path = let z = Zip.open_in path in let dirent = match List.filter (fun e -> e.Zip.is_directory) (Zip.entries z) with | [e] -> e | _ -> failwith "reference package zipfiles must contain exactly one directory" in let dirname = dirent.Zip.filename in let fname = dirname ^ refpkg_str in let contents = fname |> Zip.find_entry z |> Zip.read_entry z |> Json.of_string ~fname |> Jsontype.obj and read_contents ent = File_contents (ent.Zip.filename, (lazy (Zip.read_entry z ent))) in Hashtbl.find contents "files" |> Jsontype.obj |> sstringMap_of_Sjobj |> StringMap.map ((^) dirname |- Zip.find_entry z |- read_contents) |> maybe_add_version contents |> StringMap.add "name" (safe_chop_suffix (Filename.basename path) ".refpkg" |> metadata) let strmap_of_dir path = let noslash = remove_terminal_slash path in let dirize fname = noslash^"/"^fname in let contents = Jsontype.obj (Json.of_file (dirize refpkg_str)) in Hashtbl.find contents "files" |> Jsontype.obj |> sstringMap_of_Sjobj |> StringMap.map (dirize |- file_path) |> maybe_add_version contents |> StringMap.add "name" (safe_chop_suffix (Filename.basename noslash) ".refpkg" |> metadata) let strmap_of_path path = if Sys.is_directory path then strmap_of_dir path else strmap_of_zipfile path pplacer-1.1.alpha19/pplacer_src/rppr.ml000066400000000000000000000003371303154601500200520ustar00rootroot00000000000000let () = if !Sys.interactive then () else Ppatteries.exn_wrap (fun () -> Subcommand.inner_loop ~prg_name:"rppr" ~version:Version.version (Subcommand.cmd_map_of_list (Rppr_commands.command_list ()))) pplacer-1.1.alpha19/pplacer_src/rppr_check.ml000066400000000000000000000004561303154601500212110ustar00rootroot00000000000000open Subcommand open Guppy_cmdobjs class cmd () = object (self) inherit subcommand () as super inherit refpkg_cmd ~required:true as super_refpkg method desc = "checks a reference package" method usage = "usage: check -c my.refpkg" method action _ = Refpkg.check_refpkg self#get_rp end pplacer-1.1.alpha19/pplacer_src/rppr_commands.ml000066400000000000000000000014011303154601500217240ustar00rootroot00000000000000let command_list () = [ "rppr", [ "prep_db", (fun () -> new Rppr_prep_db.cmd ()); "check", (fun () -> new Rppr_check.cmd ()); "convexify", (fun () -> new Rppr_convexify.cmd ()); "ref_tree", (fun () -> new Rppr_ref_tree.cmd ()); "min_adcl", (fun () -> new Rppr_min_adcl.cmd ()); "pdprune", (fun () -> new Rppr_pdprune.cmd ()); "info", (fun () -> new Rppr_info.cmd ()); "reroot", (fun () -> new Rppr_reroot.cmd ()); "infer", (fun () -> new Rppr_infer.cmd ()); "reclass", (fun () -> new Rppr_reclass.cmd ()); "prepsim", (fun () -> new Rppr_prepsim.cmd ()); "min_adcl_tree", (fun () -> new Rppr_min_adcl_tree.cmd ()); "convex_taxids", (fun () -> new Rppr_convex_taxids.cmd ()); ]; ] pplacer-1.1.alpha19/pplacer_src/rppr_convex_taxids.ml000066400000000000000000000032121303154601500230030ustar00rootroot00000000000000open Subcommand open Guppy_cmdobjs open Ppatteries open Convex let of_refpkg rp = let gt = Refpkg.get_ref_tree rp and td = Refpkg.get_taxonomy rp in let st = Gtree.get_stree gt and top_id = Gtree.top_id gt in rank_tax_map_of_refpkg rp |> IntMap.enum |> Enum.map (fun (rank, taxmap) -> let sizemim, cutsetim = build_sizemim_and_cutsetim (taxmap, st) in let top_sizem = IntMap.find top_id sizemim in let cutsetim = IntMap.add (Stree.top_id st) ColorSet.empty cutsetim in let unconvex_colors = IntMap.fold (fun _ colors unconvex -> if ColorSet.cardinal colors < 2 then unconvex else ColorSet.union unconvex colors) cutsetim ColorSet.empty and all_colors = ColorMap.keys top_sizem |> ColorSet.of_enum and rank_name = Tax_taxonomy.get_rank_name td rank in ColorSet.diff all_colors unconvex_colors |> ColorSet.enum |> Enum.map (fun c -> rank_name, c, ColorMap.find c top_sizem)) |> Enum.flatten class cmd () = object (self) inherit subcommand () as super inherit refpkg_cmd ~required:true as super_refpkg inherit tabular_cmd ~default_to_csv:true () as super_tabular method specl = super_refpkg#specl @ super_tabular#specl method desc = "determines convex tax_ids per-rank in a refpkg" method usage = "usage: convex_taxids -c my.refpkg" method action _ = of_refpkg self#get_rp |> Enum.map (fun (a, b, c) -> [a; Tax_id.to_string b; string_of_int c]) |> List.of_enum |> List.cons ["rank"; "tax_id"; "leaf_count"] |> self#write_ll_tab end pplacer-1.1.alpha19/pplacer_src/rppr_convexify.ml000066400000000000000000000304021303154601500221400ustar00rootroot00000000000000open Ppatteries open Subcommand open Guppy_cmdobjs open Convex open Stree let leafset tree = let rec aux accum = function | Leaf i :: rest -> aux (IntSet.add i accum) rest | Node (_, subtrees) :: rest -> aux accum (List.rev_append subtrees rest) | [] -> accum in aux IntSet.empty [tree] type data = { stree: stree; rank: int; rankname: string; taxmap: Tax_id.tax_id IntMap.t; rank_tax_map: Tax_id.tax_id IntMap.t IntMap.t; not_cut: IntSet.t; cut_leaves: IntSet.t; rank_cutseqs: IntSet.t IntMap.t; time_delta: float; max_badness: int; } let build_reducer f argopt lst = match argopt with | Some arg -> let init, foldf, finalize = f arg in finalize (List.fold_left foldf init lst) | None -> () class cmd () = object (self) inherit subcommand () as super inherit refpkg_cmd ~required:true as super_refpkg inherit numbered_tree_cmd () as super_numbered_tree val discord_file = flag "-t" (Needs_argument ("", "If specified, the path to write the discordance tree to.")) val cut_seqs_file = flag "--cut-seqs" (Needs_argument ("", "If specified, the path to write a CSV file of cut sequences per-rank to.")) val alternates_file = flag "--alternates" (Needs_argument ("", "If specified, the path to write a CSV file of alternate colors per-sequence to.")) val check_all_ranks = flag "--check-all-ranks" (Plain (false, "When determining alternate colors, check all ranks instead of the least recent uncut rank.")) val all_alternates = flag "--all-alternates" (Plain (false, "When determining alternate colors, ignore the taxononomy and show all alternates.")) val badness_cutoff = flag "--cutoff" (Formatted (12, "Any trees with a maximum badness over this value are skipped. Default: %d.")) val use_naive = flag "--naive" (Plain (false, "Use the naive convexify algorithm.")) val timing = flag "--timing" (Needs_argument ("", "If specified, save timing information for solved trees to a CSV file.")) val no_early = flag "--no-early" (Plain (false, "Don't terminate early when convexifying.")) val limit_ranks = flag "--limit-rank" (Plain ([], "If specified, only convexify at the given ranks. Ranks are given as a comma-delimited list of names.")) val strict = flag "--rooted" (Plain (false, "Strictly evaluate convexity; ensure that each color sits in its own rooted subtree.")) val input_tree = flag "--tree" (Needs_argument ("input tree", "A tree file in newick format to work on in place of a reference package.")) val input_colors = flag "--colors" (Needs_argument ("input colors", "A CSV file of the colors on the tree supplied with --tree.")) method specl = super_refpkg#specl @ super_numbered_tree#specl @ [ string_flag input_tree; string_flag input_colors; string_flag discord_file; string_flag cut_seqs_file; string_flag alternates_file; toggle_flag check_all_ranks; toggle_flag all_alternates; int_flag badness_cutoff; delimited_list_flag limit_ranks; string_flag timing; toggle_flag strict; toggle_flag use_naive; toggle_flag no_early; ] method desc = "identifies minimal leaf set to cut for taxonomic concordance" method usage = "usage: convexify [-c my.refpkg | --tree my.tre --colors my.csv]" method private discordance_tree fname = let rp = self#get_rp in let taxtree = Refpkg.get_tax_ref_tree rp in let foldf discord data = let gt' = Decor_gtree.color_clades_above data.cut_leaves taxtree |> self#maybe_numbered in (Some data.rankname, gt') :: discord and finalize = Phyloxml.named_gtrees_to_file fname in [], foldf, finalize method private cut_sequences fname = let rp = self#get_rp in let td = Refpkg.get_taxonomy rp and gt = Refpkg.get_ref_tree rp in let foldf cut_seqs data = let taxcounts = IntMap.fold (fun _ ti accum -> Tax_id.TaxIdMap.add ti ((Tax_id.TaxIdMap.get ti 0 accum) + 1) accum) data.taxmap Tax_id.TaxIdMap.empty in IntSet.fold (fun i accum -> let seqname = Gtree.get_node_label gt i in let ti = IntMap.find i data.taxmap in [data.rankname; seqname; Tax_id.to_string ti; (* below is okay because cut_leaves will never include a NoTax. *) Tax_taxonomy.get_tax_name td ti; string_of_int (Tax_id.TaxIdMap.find ti taxcounts)] :: accum) data.cut_leaves cut_seqs and finalize = Csv.save fname in [], foldf, finalize method private alternate_colors fname = let rp = self#get_rp and all_alternates = fv all_alternates and check_all_ranks = fv check_all_ranks in let td = Refpkg.get_taxonomy rp and gt = Refpkg.get_ref_tree rp in (* below is also okay; this is only used on things coming from * alternate_colors, which won't have NoTax fed into it. *) let tax_name = Tax_taxonomy.get_tax_name td in let foldf alternates data = let taxmap' = IntMap.filter (fun k _ -> IntSet.mem k data.not_cut) data.taxmap in let rank_alternates = alternate_colors (taxmap', data.stree) in IntSet.fold (fun i accum -> let seqname = Gtree.get_node_label gt i in ColorSet.fold (fun c_ti accum -> let lineage = Tax_taxonomy.get_lineage td c_ti in let rec aux = function | [] -> true | [ancestor] when ancestor = c_ti -> true | ancestor :: rest -> let ancestor_rank = Tax_taxonomy.get_tax_rank td ancestor in if IntMap.mem ancestor_rank data.rank_cutseqs && IntSet.mem i (IntMap.find ancestor_rank data.rank_cutseqs) then aux rest else match begin try let orig_ancestor = IntMap.find i (IntMap.find ancestor_rank data.rank_tax_map) in ancestor = orig_ancestor with | Not_found -> false end with | true when check_all_ranks -> aux rest | x -> x in if all_alternates || aux (List.rev lineage) then [data.rankname; seqname; tax_name c_ti] :: accum else accum) (IntMap.find i rank_alternates) accum) data.cut_leaves alternates and finalize = Csv.save fname in [], foldf, finalize method private timing fname = let foldf timing data = [data.rankname; string_of_int data.max_badness; Printf.sprintf "%0.6f" data.time_delta] :: timing and finalize = Csv.save fname in [], foldf, finalize method private rp_action rp = let gt = Refpkg.get_ref_tree rp in let st = gt.Gtree.stree and td = Refpkg.get_taxonomy rp in let limit_ranks = match fv limit_ranks with | [] -> None | ranks -> Some (List.enum ranks |> Enum.map (Tax_taxonomy.get_rank_index td) |> IntSet.of_enum) and cutoff = fv badness_cutoff in let leaves = leafset st in dprintf "refpkg tree has %d leaves\n" (IntSet.cardinal leaves); let rank_tax_map = rank_tax_map_of_refpkg rp in let nu_f = if fv no_early then None else Some apart_nu in let _, results = Enum.fold (fun ((rank_cutseqs, data_list) as accum) (rank, taxmap) -> let rankname = Tax_taxonomy.get_rank_name td rank in dprintf "solving %s\n" rankname; let _, cutsetim = build_sizemim_and_cutsetim (taxmap, st) in let cutsetim = IntMap.add (top_id st) ColorSet.empty cutsetim in let max_bad, tot_bad = badness cutsetim in if max_bad = 0 then begin dprint " skipping: already convex\n"; accum end else if max_bad > cutoff then begin dprintf " skipping: badness of %d above cutoff threshold\n" max_bad; accum end else begin dprintf " badness: %d max; %d tot\n" max_bad tot_bad; let not_cut, omega, time_delta = if fv use_naive then let start = Sys.time () in let not_cut = Naive.solve (taxmap, st) in let delta = (Sys.time ()) -. start in not_cut, IntSet.cardinal not_cut, delta else let extra, st' = prune_tree (taxmap, st) in let start = Sys.time () in let phi, omega = solve ~strict:(fv strict) ?nu_f (taxmap, st') in let delta = (Sys.time ()) -. start in nodeset_of_phi_and_tree phi st' |> IntSet.union extra, omega + IntSet.cardinal extra, delta in dprintf " solved omega: %d\n" omega; let cut_leaves = IntSet.diff leaves not_cut in let rank_cutseqs' = IntMap.add rank cut_leaves rank_cutseqs in let data = { stree = st; max_badness = max_bad; rank_cutseqs = rank_cutseqs'; rank; rankname; taxmap; cut_leaves; not_cut; rank_tax_map; time_delta; } in rank_cutseqs', data :: data_list end) (IntMap.empty, []) (IntMap.enum rank_tax_map |> match limit_ranks with | None -> identity | Some ranks -> fst %> flip IntSet.mem ranks |> Enum.filter) in let reducers = [ build_reducer self#discordance_tree (fvo discord_file); build_reducer self#cut_sequences (fvo cut_seqs_file); build_reducer self#alternate_colors (fvo alternates_file); build_reducer self#timing (fvo timing); ] in List.iter ((|>) results) reducers method private csv_action = let gt = fv input_tree |> Newick_gtree.of_file in let namemap = Gtree.leaf_bark_map gt |> Bark_map.to_node_label_map |> IntMap.enum |> Enum.map swap |> StringMap.of_enum in let colormap = fv input_colors |> Csv.load |> List.enum |> Enum.filter_map (function | [a; _] when not (StringMap.mem a namemap) -> failwith (Printf.sprintf "leaf '%s' not found on tree" a) | [_; "-"] -> None | [a; b] -> Some (StringMap.find a namemap, Tax_id.of_string b) | _ -> failwith "malformed colors csv file") |> IntMap.of_enum and st = gt.Gtree.stree and nu_f = if fv no_early then None else Some apart_nu in let leaves = leafset st in let _, cutsetim = build_sizemim_and_cutsetim (colormap, st) in let cutsetim = IntMap.add (top_id st) ColorSet.empty cutsetim in let max_bad, tot_bad = badness cutsetim in if max_bad = 0 then print_endline "skipped: already convex" else if max_bad > fv badness_cutoff then dprintf "skipped: badness of %d above cutoff threshold\n" max_bad else begin dprintf "badness: %d max; %d tot\n" max_bad tot_bad; let not_cut, omega = if fv use_naive then let not_cut = Naive.solve (colormap, st) in not_cut, IntSet.cardinal not_cut else let extra, st' = prune_tree (colormap, st) in let phi, omega = solve ~strict:(fv strict) ?nu_f (colormap, st') in nodeset_of_phi_and_tree phi st' |> IntSet.union extra, omega + IntSet.cardinal extra in dprintf "solved omega: %d\n" omega; let cut_leaves = IntSet.diff leaves not_cut in begin match fvo cut_seqs_file with | Some fname -> cut_leaves |> IntSet.enum |> Enum.map (Gtree.get_node_label gt %> flip List.cons []) |> List.of_enum |> Csv.save fname | None -> () end; begin match fvo discord_file with | Some fname -> Decor_gtree.of_newick_gtree gt |> Decor_gtree.color_clades_above cut_leaves |> self#maybe_numbered |> Phyloxml.gtree_to_file fname | None -> () end; end method action _ = match self#get_rpo with | Some rp -> self#rp_action rp | None -> self#csv_action end pplacer-1.1.alpha19/pplacer_src/rppr_infer.ml000066400000000000000000000147441303154601500212440ustar00rootroot00000000000000open Subcommand open Guppy_cmdobjs open Ppatteries open Convex let prune_notax sizemim st = let open Stree in let rec should_prune i = let sizem = IntMap.find i sizemim in ColorMap.cardinal sizem = 1 && ColorMap.mem Tax_id.NoTax sizem and aux = function | Leaf _ as l -> l | Node (i, subtrees) -> List.filter_map (fun t -> let j = top_id t in if should_prune j then None else Some (aux t)) subtrees |> node i in aux st let place_on_rp prefs ?placerun_cb rp gt = let td = Refpkg.get_taxonomy rp in Prefs.( prefs.informative_prior := true; prefs.keep_at_most := 20; prefs.keep_factor := 0.001; prefs.max_strikes := 20); let criterion = if Prefs.calc_pp prefs then Placement.post_prob else Placement.ml_ratio and results = RefList.empty () in let placerun_cb pr = Option.may ((|>) pr) placerun_cb; Placerun.get_pqueries pr |> List.iter (fun pq -> let classif = Pquery.place_list pq |> List.map Placement.classif |> Tax_taxonomy.list_mrca td in List.iter (Tuple3.curry identity classif (Pquery.best_place criterion pq) |- RefList.push results) (Pquery.namel pq)) and ref_name_set = Newick_gtree.leaf_label_map gt |> IntMap.values |> StringSet.of_enum in let query_align, ref_align = Pplacer_run.partition_queries ref_name_set (Refpkg.get_aln_fasta rp) in let rp' = Option.map_default (flip Refpkg.set_aln_fasta rp) rp ref_align |> Refpkg.set_ref_tree (Gtree.renumber gt |> fst) in Pplacer_run.run_placements prefs rp' (Array.to_list query_align) false "" placerun_cb; RefList.to_list results class cmd () = object (self) inherit subcommand () as super inherit refpkg_cmd ~required:true as super_refpkg inherit tabular_cmd () as super_tabular inherit placefile_cmd () as super_placefile (* required to get #write_placefile *) method private placefile_action _ = () val processes = flag "-j" (Formatted (2, "The number of processes to run pplacer with. default: %d")) val post_prob = flag "-p" (Plain (false, "Calculate posterior probabilities when doing placements.")) val placefile = flag "--placefile" (Needs_argument ("", "Save the placefile generated by running pplacer to the specified location.")) method specl = super_refpkg#specl @ super_tabular#specl @ [ int_flag processes; toggle_flag post_prob; string_flag placefile; ] method desc = "infers classifications of unclassified sequences in a reference package" method usage = "usage: infer [options] -c my.refpkg" method private prefs = let prefs = Prefs.defaults () in prefs.Prefs.refpkg_path := fv refpkg_path; Prefs.( prefs.children := fv processes; prefs.calc_pp := fv post_prob); prefs method private place_on_rp rp gt = place_on_rp self#prefs ?placerun_cb:(fvo placefile |> Option.map self#write_placefile) rp gt method action _ = let rp = self#get_rp in let gt = Refpkg.get_ref_tree rp and td = Refpkg.get_taxonomy rp and seqinfo = Refpkg.get_seqinfom rp in let leaf_labels = Newick_gtree.leaf_label_map gt in let colors = IntMap.map (Tax_seqinfo.tax_id_by_node_label seqinfo) leaf_labels and seq_nodes = IntMap.enum leaf_labels |> Enum.map swap |> StringMap.of_enum and st = Gtree.get_stree gt in let taxa_set colorm needle = IntMap.fold (fun i ti accum -> if ti = needle then IntSet.add i accum else accum) colorm IntSet.empty and sizemim, _ = build_sizemim_and_cutsetim (colors, st) in let dm = Edge_rdist.build_pairwise_dist gt and no_tax = taxa_set colors Tax_id.NoTax in let max_taxdist colorm ti = let ta = taxa_set colorm ti |> IntSet.elements |> Array.of_list in Uptri.init (Array.length ta) (fun i j -> Edge_rdist.find_pairwise_dist dm ta.(i) 0. ta.(j) 0.) |> Uptri.to_array |> Array.max and st' = prune_notax sizemim st in let gt' = Gtree.set_stree gt st' in let results = self#place_on_rp rp gt' in let colors' = List.fold_left (fun accum (tid, _, seq) -> IntMap.add (StringMap.find seq seq_nodes) tid accum) colors results and best_placements = List.fold_left (fun accum (_, p, seq) -> IntMap.add (StringMap.find seq seq_nodes) p accum) IntMap.empty results in let rankmap = IntMap.enum colors' |> build_rank_tax_map td some in let highest_rank, _ = IntMap.max_binding rankmap in IntSet.fold (fun i accum -> let p = IntMap.find i best_placements in dprintf ~l:2 "%s:\n" (Gtree.get_node_label gt i); let rec aux rank = if not (IntMap.mem rank rankmap) then aux (rank - 1) else (* ... *) let taxm = IntMap.find rank rankmap in if not (IntMap.mem i taxm) then aux (rank - 1) else (* ... *) let ti = IntMap.find i taxm in let others = taxa_set taxm ti |> flip IntSet.diff no_tax and max_pairwise = max_taxdist taxm ti in let max_placement = others |> IntSet.enum |> Enum.map (fun j -> Edge_rdist.find_pairwise_dist dm j 0. (Placement.location p) (Placement.distal_bl p)) |> Enum.reduce max |> (+.) (Placement.pendant_bl p) in dprintf ~l:2 " %s -> %s (%s): %b %g max %g max+pend\n" (Tax_taxonomy.get_rank_name td rank) (Tax_id.to_string ti) (Tax_taxonomy.get_tax_name td ti) (max_placement < max_pairwise) max_pairwise max_placement; if max_placement < max_pairwise then ti else if rank = 0 then begin dprintf "warning: no inferred taxid for %s\n" (Gtree.get_node_label gt i); Tax_id.NoTax end else aux (rank - 1) in let ti = aux highest_rank in [Gtree.get_node_label gt i; Tax_id.to_string ti; match ti with | Tax_id.NoTax -> "-" | _ -> Tax_taxonomy.get_tax_name td ti] :: accum) no_tax [] |> List.cons ["seq_name"; "new_taxid"; "new_name"] |> self#write_ll_tab end pplacer-1.1.alpha19/pplacer_src/rppr_info.ml000066400000000000000000000043631303154601500210700ustar00rootroot00000000000000open Subcommand open Guppy_cmdobjs open Ppatteries open Convex class cmd () = object (self) inherit subcommand () as super inherit refpkg_cmd ~required:true as super_refpkg inherit tabular_cmd () as super_tabular val taxonomic = flag "--taxonomic" (Plain (false, "Show by-rank taxonomic information")) method specl = super_refpkg#specl @ super_tabular#specl @ [ toggle_flag taxonomic; ] method desc = "gives information about a reference package" method usage = "usage: info -c my.refpkg" method action _ = let rp = self#get_rp in let gt = Refpkg.get_ref_tree rp in let st = gt.Gtree.stree in let top_id = Stree.top_id st in match Result.catch Refpkg.get_taxonomy rp |> Result.to_option with | Some td -> if fv taxonomic then begin rank_tax_map_of_refpkg rp |> IntMap.enum |> Enum.map (fun (rank, taxmap) -> let sizemim, cutsetim = build_sizemim_and_cutsetim (taxmap, st) in let cutsetim = IntMap.add top_id ColorSet.empty cutsetim in let unconvex_colors = IntMap.fold (fun _ colors unconvex -> if ColorSet.cardinal colors < 2 then unconvex else ColorSet.union unconvex colors) cutsetim ColorSet.empty and max_bad, tot_bad = badness cutsetim in (Tax_taxonomy.get_rank_name td rank) :: (List.map string_of_int [ColorMap.cardinal (IntMap.find top_id sizemim); ColorSet.cardinal unconvex_colors; max_bad; tot_bad])) |> List.of_enum |> List.cons ["rank"; "n_taxids"; "n_nonconvex"; "max_bad"; "tot_bad"] |> self#write_ll_tab end else Printf.printf "%s: %d leaves, %d taxids\n" (Refpkg.get_name rp) (Stree.n_taxa st) (Tax_id.TaxIdMap.cardinal td.Tax_taxonomy.tax_name_map) | _ -> if fv taxonomic then raise (Refpkg.Missing_element "taxonomy"); Printf.printf "%s: %d leaves\n" (Refpkg.get_name rp) (Stree.n_taxa st) end pplacer-1.1.alpha19/pplacer_src/rppr_min_adcl.ml000066400000000000000000000037001303154601500216750ustar00rootroot00000000000000open Ppatteries open Subcommand open Guppy_cmdobjs module I = Mass_map.Indiv class cmd () = object (self) inherit subcommand () as super inherit mass_cmd () as super_mass inherit refpkg_cmd ~required:false as super_refpkg inherit placefile_cmd () as super_placefile inherit voronoi_cmd () as super_voronoi val leaf_mass = flag "--leaf-mass" (Formatted (0.0, "Fraction of mass to be distributed uniformly across leaves. Default %g.")) method specl = super_mass#specl @ super_refpkg#specl @ super_voronoi#specl @ [ float_flag leaf_mass; ] method desc = "finds a good collection of sequences to cut from a placefile's ref tree" method usage = "usage: min_adcl [options] placefile" method private placefile_action = function | [pr] -> let weighting, criterion = self#mass_opts and gt = Placerun.get_ref_tree pr |> Newick_gtree.add_zero_root_bl and leaf_mass_fract = fv leaf_mass and _, decor_tree = self#get_rpo_and_tree pr in if 0. > leaf_mass_fract || leaf_mass_fract > 1. then failwith ("Leaf mass fraction not between 0 and 1."); (* First get the mass that is not at the leaves. *) let mass = if leaf_mass_fract = 1. then IntMap.empty else Mass_map.Indiv.scale_mass (1. -. leaf_mass_fract) (Mass_map.Indiv.of_placerun weighting criterion pr) in let mass_cb diagram = if leaf_mass_fract = 0. then mass else let n_leaves = IntSet.cardinal diagram.Voronoi.all_leaves in IntSet.fold (flip IntMap.add_listly {I.distal_bl = 0.0; I.mass = leaf_mass_fract /. (float_of_int n_leaves)}) diagram.Voronoi.all_leaves mass in self#perform_voronoi ~decor_tree gt mass_cb | l -> List.length l |> Printf.sprintf "min_adcl takes exactly one placefile (%d given)" |> failwith end pplacer-1.1.alpha19/pplacer_src/rppr_min_adcl_tree.ml000066400000000000000000000033231303154601500227150ustar00rootroot00000000000000open Ppatteries open Subcommand open Guppy_cmdobjs module I = Mass_map.Indiv class cmd () = object (self) inherit subcommand () as super inherit voronoi_cmd () as super_voronoi val query_seqs = flag "--query-seqs" (Plain ([], "A comma-separated list of leaves to turn into query sequences.")) method specl = super_voronoi#specl @ [delimited_list_flag query_seqs] method desc = "finds a good collection of sequences to cut from a tree" method usage = "usage: min_adcl_tree [options] newick.tre" method action = function | [tree] -> let gt = Newick_gtree.of_file tree |> Newick_gtree.add_zero_root_bl and queries = fv query_seqs |> StringSet.of_list in let should_prune = Newick_gtree.leaf_label_map gt |> IntMap.enum |> Enum.filter_map (function k, v when StringSet.mem v queries -> Some k | _ -> None) |> IntSet.of_enum |> flip Stree.nodes_containing (Gtree.get_stree gt) |> flip IntSet.mem in let gt', pql = Newick_gtree.prune_to_pql should_prune gt in let mass_cb = if not (StringSet.is_empty queries) then Mass_map.Pre.of_pquery_list Mass_map.Spread Placement.ml_ratio pql |> I.of_pre |> const else fun diagram -> let mass = IntSet.cardinal diagram.Voronoi.all_leaves |> float_of_int |> (/.) 1. in IntSet.fold (flip IntMap.add_listly {I.mass; I.distal_bl = 0.0}) diagram.Voronoi.all_leaves IntMap.empty in self#perform_voronoi gt' mass_cb | l -> List.length l |> Printf.sprintf "min_adcl_tree takes exactly one tree (%d given)" |> failwith end pplacer-1.1.alpha19/pplacer_src/rppr_prep_db.ml000066400000000000000000000102561303154601500215460ustar00rootroot00000000000000open Ppatteries open Subcommand open Guppy_cmdobjs class cmd () = object (self) inherit subcommand () as super inherit refpkg_cmd ~required:true as super_refpkg inherit sqlite_cmd () as super_sqlite method specl = super_refpkg#specl @ super_sqlite#specl method desc = "makes SQL enabling taxonomic querying of placement results" method usage = "usage: prep_db [options] -c " method action _ = let refpkg = self#get_rp in let db = self#get_db in let tax = Refpkg.get_taxonomy refpkg in Sql.check_exec db "BEGIN TRANSACTION"; Sql.check_exec db " CREATE TABLE ranks ( rank TEXT PRIMARY KEY NOT NULL, rank_order INTEGER ); CREATE TABLE taxa ( tax_id TEXT PRIMARY KEY NOT NULL, tax_name TEXT NOT NULL, rank TEXT REFERENCES ranks (rank) NOT NULL ); CREATE TABLE runs ( run_id INTEGER PRIMARY KEY AUTOINCREMENT, params TEXT NOT NULL ); CREATE TABLE placements ( placement_id INTEGER PRIMARY KEY AUTOINCREMENT, classifier TEXT NOT NULL, run_id INTEGER REFERENCES runs (run_id) NOT NULL ); CREATE TABLE placement_names ( placement_id INTEGER REFERENCES placements (placement_id) NOT NULL, name TEXT NOT NULL, origin TEXT NOT NULL, mass REAL NOT NULL, PRIMARY KEY (placement_id, name, origin) ); CREATE INDEX placement_names_id ON placement_names (placement_id); CREATE TABLE placement_classifications ( placement_id INTEGER REFERENCES placements (placement_id) NOT NULL, tax_id TEXT REFERENCES taxa (tax_id), likelihood REAL NOT NULL ); CREATE INDEX placement_classifications_id ON placement_classifications (placement_id); CREATE TABLE placement_nbc ( placement_id INTEGER REFERENCES placements (placement_id) NOT NULL, tax_id TEXT REFERENCES taxa (tax_id), bootstrap REAL NOT NULL ); CREATE INDEX placement_nbc_id ON placement_nbc (placement_id); CREATE TABLE placement_evidence ( placement_id INTEGER REFERENCES placements (placement_id) NOT NULL, rank TEXT REFERENCES ranks (rank) NOT NULL, evidence REAL NOT NULL, bayes_factor REAL ); CREATE INDEX placement_evidence_id ON placement_evidence (placement_id); CREATE TABLE placement_positions ( placement_id INTEGER REFERENCES placements (placement_id) NOT NULL, location INTEGER NOT NULL, ml_ratio REAL NOT NULL, log_like REAL NOT NULL, distal_bl REAL NOT NULL, pendant_bl REAL NOT NULL, tax_id TEXT REFERENCES taxa (tax_id), map_identity_ratio REAL, map_identity_denom INTEGER ); CREATE INDEX placement_positions_id ON placement_classifications (placement_id); CREATE TABLE placement_median_identities ( placement_id INTEGER REFERENCES placements (placement_id) NOT NULL, tax_id TEXT REFERENCES taxa (tax_id) NOT NULL, median_percent_identity REAL NOT NULL, PRIMARY KEY (placement_id, tax_id) ); CREATE INDEX placement_median_identities_id ON placement_median_identities (placement_id); CREATE TABLE multiclass ( placement_id INTEGER REFERENCES placements (placement_id) NOT NULL, name TEXT NOT NULL, want_rank TEXT REFERENCES ranks (rank) NOT NULL, rank TEXT REFERENCES ranks (rank) NOT NULL, tax_id TEXT REFERENCES taxa (tax_id), likelihood REAL NOT NULL ); "; let st = Sqlite3.prepare db "INSERT INTO ranks VALUES (?, ?)" in Array.iteri (fun idx name -> Sql.bind_step_reset db st [| Sql.D.TEXT name; Sql.D.INT (Int64.of_int idx) |]) tax.Tax_taxonomy.rank_names; let st = Sqlite3.prepare db "INSERT INTO taxa VALUES (?, ?, ?)" in Tax_id.TaxIdMap.iter (fun tax_id name -> let rank = Tax_taxonomy.rank_name_of_tax_id tax tax_id in Sql.bind_step_reset db st [| Tax_id.to_sql tax_id; Sql.D.TEXT name; Sql.D.TEXT rank; |]) tax.Tax_taxonomy.tax_name_map; Sql.check_exec db "COMMIT"; Sql.close db end pplacer-1.1.alpha19/pplacer_src/rppr_prepsim.ml000066400000000000000000000060321303154601500216070ustar00rootroot00000000000000open Subcommand open Guppy_cmdobjs open Ppatteries open Convex let prune_notax_to_pql sizemim colorm gt = let should_prune i = let sizem = IntMap.find i sizemim in ColorMap.cardinal sizem = 1 && ColorMap.mem Tax_id.NoTax sizem and placement_transform i p = IntMap.find i colorm |> Placement.add_classif p in Newick_gtree.prune_to_pql ~placement_transform should_prune gt class cmd () = object (self) inherit subcommand () as super inherit refpkg_cmd ~required:true as super_refpkg inherit placefile_cmd () as super_placefile inherit output_cmd ~show_fname:false ~prefix_required:true () as super_output (* required to get #write_placefile *) method private placefile_action _ = () val prune_taxids = flag "-r" (Plain ([], "Comma-delimited list of tax_ids to prune.")) method specl = super_refpkg#specl @ super_output#specl @ [delimited_list_flag prune_taxids] method desc = "makes a simulation by taking out taxids and turning them into fake placements" method usage = "usage: prepsim [options] -c my.refpkg" method action _ = let rp = self#get_rp in let pruned = fv prune_taxids |> List.map Tax_id.of_string |> Tax_id.TaxIdSet.of_list and prefix = self#single_prefix ~requires_user_prefix:true () and gt = Refpkg.get_ref_tree rp |> Newick_gtree.add_zero_root_bl and td = Refpkg.get_taxonomy rp and seqinfo = Refpkg.get_seqinfom rp in let should_keep ti = Tax_taxonomy.get_lineage td ti |> Tax_id.TaxIdSet.of_list |> Tax_id.TaxIdSet.disjoint pruned and leaf_labels = Newick_gtree.leaf_label_map gt in let colors = IntMap.map (Tax_seqinfo.tax_id_by_node_label seqinfo) leaf_labels and st = Gtree.get_stree gt in let colors_notax = IntMap.map (junction should_keep identity (const Tax_id.NoTax)) colors in let sizemim, _ = build_sizemim_and_cutsetim (colors_notax, st) in let no_tax = IntMap.fold (fun i ti accum -> if ti = Tax_id.NoTax then StringSet.add (Gtree.get_node_label gt i) accum else accum) colors_notax StringSet.empty and gt', pql = prune_notax_to_pql sizemim colors gt in if StringSet.is_empty no_tax then dprint "warning: nothing was cut off the tree\n"; let gt'', transm = Newick_gtree.consolidate gt' in Pquery.translate_pql transm pql |> Placerun.make gt'' "inferred" |> self#write_placefile (prefix ^ "inferred.jplace"); Newick_gtree.to_file gt'' (prefix ^ "cut.tre"); StringSet.elements no_tax |> List.map (flip List.cons []) |> Csv.save (prefix ^ "cut.csv"); let no_tax_aln, new_ref_aln = Refpkg.get_aln_fasta rp |> Array.partition (fst %> flip StringSet.mem no_tax) in Alignment.to_fasta no_tax_aln (prefix ^ "cut.fasta"); Alignment.to_fasta new_ref_aln (prefix ^ "new_ref.fasta"); dprintf "taxit update %S %S %S\n" (fv refpkg_path) (Printf.sprintf "tree=%scut.tre" prefix) (Printf.sprintf "aln_fasta=%snew_ref.fasta" prefix) end pplacer-1.1.alpha19/pplacer_src/rppr_reclass.ml000066400000000000000000000133071303154601500215670ustar00rootroot00000000000000open Subcommand open Guppy_cmdobjs open Ppatteries open Convex let format_float f = match classify_float f with | FP_infinite | FP_nan -> "-" | _ -> Printf.sprintf "%g" f let contained_in inner outer = ColorMap.for_all (fun k v -> ColorMap.get k 0 outer = v) inner let uninformative_nodes top_sizem sizemim st = let prelim = IntMap.fold (fun i sizem accum -> if ColorMap.cardinal sizem = 2 && contained_in sizem top_sizem then IntSet.add i accum else accum) sizemim IntSet.empty in let open Stree in let rec aux accum = function | [] -> accum | Node (i, subtrees) :: rest -> let accum' = if IntSet.mem i accum then List.fold_left (top_id %> IntSet.add |> flip) accum subtrees else accum and rest' = List.append rest subtrees in aux accum' rest' | Leaf _ :: rest -> aux accum rest in aux prelim [st] class cmd () = object (self) inherit Rppr_infer.cmd () as super_infer val suggestion_tree = flag "-t" (Needs_argument ("", "If specified, the path to write the suggestion tree to.")) method specl = super_infer#specl @ [string_flag suggestion_tree] method desc = "reclassifies nonconvex sequences in a reference package" method usage = "usage: reclass [options] -c my.refpkg" method action _ = let rp = self#get_rp in let gt = Refpkg.get_ref_tree rp in let st = Gtree.get_stree gt and leaf_labels = Newick_gtree.leaf_label_map gt and td = Refpkg.get_taxonomy rp and seqinfo = Refpkg.get_seqinfom rp in let taxa_set colorm needle = IntMap.fold (fun i ti accum -> if ti = needle then IntSet.add i accum else accum) colorm IntSet.empty and pair_dist = Edge_rdist.build_pairwise_dist gt |> Edge_rdist.find_pairwise_dist and seq_nodes = IntMap.enum leaf_labels |> Enum.map swap |> StringMap.of_enum in let med_cv_taxdist_from colorm ti j = let ts = taxa_set colorm ti in if IntSet.is_empty ts then nan, nan else (* ... *) let distances = IntSet.elements ts |> List.map (fun i -> pair_dist i 0. j 0.) and fcardinal = IntSet.cardinal ts |> float_of_int in let mean = List.fsum distances /. fcardinal in List.sort compare distances |> median, List.fold_left (fun a x -> (x -. mean) ** 2. +. a) 0. distances |> flip (/.) (fcardinal -. 1.) |> sqrt |> flip (/.) mean and rank_tax_map = rank_tax_map_of_refpkg rp in let rank, colors = Enum.find (fun (_, colors) -> let _, cutsetim = build_sizemim_and_cutsetim (colors, st) in let max_bad, _ = badness cutsetim in max_bad > 0) (IntMap.backwards rank_tax_map) in Tax_taxonomy.get_rank_name td rank |> dprintf "reclassifying at %s\n"; let phi, _ = solve (colors, st) in let not_cut = nodeset_of_phi_and_tree phi st in let cut = Stree.leaf_ids st |> IntSet.of_list |> flip IntSet.diff not_cut in let notax_colors = IntSet.fold (flip IntMap.add Tax_id.NoTax) cut colors in let uncolored_colors = IntMap.filterv ((<>) Tax_id.NoTax) notax_colors in let notax_sizemim, _ = build_sizemim_and_cutsetim (notax_colors, st) in let st' = Rppr_infer.prune_notax notax_sizemim st in let gt' = Gtree.set_stree gt st' in let results = self#place_on_rp rp gt' in dprint "finished classifying\n"; let alternate_map = alternate_colors (uncolored_colors, st) and orig_sizemim, _ = build_sizemim_and_cutsetim (colors, st) in let orig_sizem = IntMap.find (Stree.top_id st) orig_sizemim and notax_sizem = IntMap.find (Stree.top_id st) notax_sizemim and taxtree = Refpkg.get_tax_ref_tree rp in let uninformative = uninformative_nodes orig_sizem orig_sizemim st in let bm, rows = List.fold_left (fun (bm, rows) (ti, _, seq) -> let prev_ti = Tax_seqinfo.tax_id_by_node_label seqinfo seq and i = StringMap.find seq seq_nodes in let alternates = IntMap.find i alternate_map |> ColorSet.elements |> List.map (Tax_taxonomy.get_lineage td) |> List.flatten |> ColorSet.of_list and prev_count = ColorMap.get prev_ti 0 orig_sizem and new_name = Tax_taxonomy.get_tax_name td ti and prev_med, prev_cv = med_cv_taxdist_from uncolored_colors prev_ti i and new_med, new_cv = med_cv_taxdist_from uncolored_colors ti i in IntMap.modify i (fun b -> Printf.sprintf "%s -> %s" seq new_name |> b#set_node_label) bm, [seq; Tax_taxonomy.get_tax_name td prev_ti; Tax_id.to_string prev_ti; new_name; Tax_id.to_string ti; ColorSet.mem ti alternates |> string_of_bool; IntSet.mem i uninformative |> string_of_bool; prev_med |> format_float; prev_cv *. 100. |> format_float; new_med |> format_float; new_cv *. 100. |> format_float; prev_count |> string_of_int; prev_count - ColorMap.get prev_ti 0 notax_sizem |> string_of_int; ] :: rows) (Gtree.get_bark_map taxtree, []) results in rows |> List.cons ["seq_name"; "old_name"; "old_taxid"; "new_name"; "new_taxid"; "makes_convex"; "uninformative"; "old_median_dist"; "old_avg_cv"; "new_median_dist"; "new_avg_cv"; "n_with_old"; "n_nonconvex"] |> self#write_ll_tab; match fvo suggestion_tree with | None -> () | Some fname -> Gtree.set_bark_map taxtree bm |> Decor_gtree.color_clades_above cut |> Decor_gtree.color_clades_above ~color:Decor.yellow uninformative |> Decor_gtree.consolidate_colors Decor_gtree.list_color_average |> Phyloxml.gtree_to_file fname end pplacer-1.1.alpha19/pplacer_src/rppr_ref_tree.ml000066400000000000000000000051561303154601500217310ustar00rootroot00000000000000open Ppatteries open Guppy_cmdobjs open Subcommand let rank_colored_of_refpkg maybe_numbered rp = let dt = Refpkg.get_ref_tree rp |> Decor_gtree.of_newick_gtree and td = Refpkg.get_taxonomy rp in let taxinfo = function | [] -> [] | (hd :: _) as l -> [Decor.Taxinfo (hd, List.map (Tax_taxonomy.get_tax_name td) l |> String.join "|")] and st = Gtree.get_stree dt in IntMap.fold (fun rank taxmap accum -> let rankname = Tax_taxonomy.get_rank_name td rank and _, cutsetim = Convex.build_sizemim_and_cutsetim (taxmap, st) in let cutsetim = IntMap.remove (Stree.top_id st) cutsetim in let dt' = IntMap.map (Convex.ColorSet.elements |- taxinfo) cutsetim |> Decor_gtree.add_decor_by_map dt in (Some rankname, maybe_numbered dt') :: accum) (Convex.rank_tax_map_of_refpkg rp) [] let trees_of_refpkg maybe_numbered painted colored rp = let prefix = Refpkg.get_name rp and tax_name = Refpkg.get_taxonomy rp |> Tax_taxonomy.get_tax_name in let ref_tree = if painted then Edge_painting.of_refpkg rp |> IntMap.filter_map (fun _ -> function | Tax_id.NoTax -> None | t -> Some [Decor.Taxinfo (t, tax_name t)]) |> Decor_gtree.add_decor_by_map (Refpkg.get_ref_tree rp |> Decor_gtree.of_newick_gtree) else Refpkg.get_tax_ref_tree rp and (taxt, _) = Tax_gtree.of_refpkg_unit rp in [ Some (prefix^".ref"), maybe_numbered ref_tree; Some (prefix^".tax"), taxt; ] |> (if colored then List.append (rank_colored_of_refpkg maybe_numbered rp) else identity) class cmd () = object (self) inherit subcommand () as super inherit refpkg_cmd ~required:true as super_refpkg inherit output_cmd () as super_output inherit numbered_tree_cmd () as super_numbered_tree val painted = flag "--painted" (Plain (false, "Use a painted tree in place of the taxonomically annotated tree.")) val colored = flag "--rank-colored" (Plain (false, "Include a tree for each rank with taxonomic annotations on every edge.")) method specl = super_refpkg#specl @ super_output#specl @ super_numbered_tree#specl @ [ toggle_flag painted; toggle_flag colored; ] method desc = "writes a taxonomically annotated reference tree and an induced taxonomic tree" method usage = "usage: ref_tree -o my.xml -c my.refpkg" method action = function | [] -> Phyloxml.named_gtrees_to_channel self#out_channel (trees_of_refpkg self#maybe_numbered (fv painted) (fv colored) self#get_rp) | _ -> failwith "ref_tree takes no positional arguments" end pplacer-1.1.alpha19/pplacer_src/rppr_reroot.ml000066400000000000000000000104451303154601500214450ustar00rootroot00000000000000open Ppatteries open Guppy_cmdobjs open Subcommand open Tax_id open Stree exception Found_root of stree (* taxonomic rerooting of a tree, assuming all leaf labels are sequence names * in the reference packages. *) let find_root rp gt = let td = Refpkg.get_taxonomy rp and seqinfom = Refpkg.get_seqinfom rp in let st = Gtree.get_stree gt in let node_mrca node = node |> Stree.leaf_ids |> List.filter_map (fun leaf -> try Gtree.get_node_label gt leaf |> Tax_seqinfo.tax_id_by_node_label seqinfom |> junction ((=) NoTax) (const None) some with Gtree.Lacking_bark _ -> None) |> junction List.is_empty (const None) (Tax_taxonomy.list_mrca td %> some) in let rec aux: ?top_mrca:Tax_id.t -> stree -> unit = fun ?top_mrca -> function | Leaf _ -> failwith "tried to reroot at a leaf" | Node (_, subtrees) as n -> (* walk the tree, and at each node, find the MRCA of all of the leaves * below that node, then the rank of each MRCA. if we're not at the root * node, we'll also be considering the MRCA of everything above us on * the tree via top_mrca. *) let subrks = subtrees |> List.filter_map (fun node -> match node_mrca node with | Some mrca -> Some (mrca, Some node) | None -> None) |> maybe_map_cons (None |> (curry identity |> flip)) top_mrca |> List.map (Tax_taxonomy.get_tax_rank td |> Tuple.Tuple2.map1) |> List.sort compare in let at = List.at subrks %> fst in (* if the two highest ranks are equal, we've found the root. *) if List.length subrks > 1 && at 0 = at 1 then raise (Found_root n); (* otherwise, descend toward the node with the highest MRCA rank. this * will never ascend the tree, as the entry representing "the tree above * us" is None. if the highest MRCA rank is a leaf, stop here. *) match subrks with | (_, Some (Node _ as node)) :: _ -> (* find the MRCA of everything above the selected node in the entire * tree by taking the MRCA of the previous MRCA and the other * subtrees (which will then be above us at the next node). *) let top_mrca = List.remove subtrees node |> List.filter_map node_mrca |> maybe_cons top_mrca |> junction List.is_empty (const None) (Tax_taxonomy.list_mrca td %> some) in aux ?top_mrca node | _ -> raise (Found_root n) in try aux st; failwith "no root found?" with Found_root root -> top_id root class cmd () = object (self) inherit subcommand () as super inherit refpkg_cmd ~required:true as super_refpkg inherit output_cmd () as super_output method specl = super_refpkg#specl @ super_output#specl method desc = "reroots a given reference package in place" method usage = "usage: reroot -c my.refpkg" method private rerooted_tree lbl = let rp = self#get_rp in let gt = Refpkg.get_ref_tree rp in let st = gt.Gtree.stree and td = Refpkg.get_taxonomy rp in (* first, determine the highest rank that has more than one tax_id. *) let rank_tax_map = Convex.rank_tax_map_of_refpkg rp in let rank, taxmap = try Enum.find (snd %> IntMap.values %> TaxIdSet.of_enum %> TaxIdSet.cardinal %> (<) 1) (IntMap.enum rank_tax_map) with Not_found -> dprint "ref tree has <= 1 taxon; writing unmodified tree\n"; Return.return lbl gt in Tax_taxonomy.get_rank_name td rank |> dprintf "rerooting at %s\n"; (* next, find the convex subset of leaves at that rank. *) let phi, _ = Convex.solve (taxmap, st) in let not_cut = Convex.nodeset_of_phi_and_tree phi st in (* reroot after pruning the tree down to that convex subset of leaves. *) Gtree.get_bark_map gt |> IntMap.filter (flip IntSet.mem not_cut |> const |> flip) |> Gtree.set_bark_map gt |> find_root rp |> tap (dprintf "root found at node %d\n") |> Gtree.reroot gt method action = function | [] -> Newick_gtree.to_file (Return.label self#rerooted_tree) (self#single_file ()) | _ -> failwith "reroot doesn't take any positional arguments" end pplacer-1.1.alpha19/pplacer_src/rst.ml000066400000000000000000000017431303154601500177010ustar00rootroot00000000000000(* generate reStructuredText *) open Ppatteries let underline_levels = StringFuns.to_char_array "=-~`'\"" let underline_of_str s level = String.make (String.length s) underline_levels.(level) let write_section_title ch s level = Printf.fprintf ch "%s\n%s\n" s (underline_of_str s level) let write_top_title ch s = Printf.fprintf ch "%s\n" (underline_of_str s 0); write_section_title ch s 0 let write_literal_block_start ch = Printf.fprintf ch "\n::\n\n" let write_option ch flagstr description = Printf.fprintf ch "%s %s\n" flagstr description let write_table ch m = let padded = String_matrix.pad m in let widths = Array.map String.length padded.(0) in let divider = Array.map (flip String.make '=') widths in let write_divider () = String_matrix.write_row ch divider in Array.iteri (fun e row -> if e = 0 then write_divider (); String_matrix.write_row ch row; if e = 0 then write_divider ()) padded; write_divider () pplacer-1.1.alpha19/pplacer_src/seq_group.ml000066400000000000000000000025141303154601500210720ustar00rootroot00000000000000open Ppatteries type bin = { mutable lhs: int; mutable rhs: int; } let bin division i = {lhs = i * division; rhs = pred (succ i * division)} let update b l r = b.lhs <- min b.lhs l; b.rhs <- max b.rhs r let lhs {lhs} = lhs let rhs {rhs} = rhs let group n_groups sl = let sites = List.hd sl |> snd |> String.length in let division = sites / n_groups in let bins = Array.init n_groups (bin division) and grouped = Array.make n_groups [] and spanned_seqs = List.map ((snd |- Alignment.span) &&& identity) sl in let group_mv_dist l r group = let {lhs; rhs} = bins.(group) in (lhs - min l lhs) + (max r rhs - rhs) in let best_mv_dist ((l, r), _) = 0 --^ n_groups |> Enum.map (identity &&& group_mv_dist l r) |> Enum.arg_min snd in let rec aux sl = let used = List.map (best_mv_dist &&& identity) sl |> List.group (comparing (fst |- fst)) |> List.map (List.enum |- Enum.arg_min (fst |- snd)) |> List.fold_left (fun accum ((group, _), ((l, r), (name, _ as row))) -> update bins.(group) l r; grouped.(group) <- row :: grouped.(group); StringSet.add name accum) StringSet.empty in match List.filter (snd |- fst |- flip StringSet.mem used |- not) sl with | [] -> () | sl' -> aux sl' in aux spanned_seqs; grouped pplacer-1.1.alpha19/pplacer_src/seq_post.ml000066400000000000000000000020751303154601500207250ustar00rootroot00000000000000(* Functions for summarizing the site-wise posterior probability of base pairs * at given sites for internal positions on the tree. *) open Ppatteries module Make (Model: Glvm.Model) = struct module Glv = Model.Glv module Glv_arr = Glv_arr.Make(Model) (* Get the most likely vector at a chosen node id. * atarr is the Glv_arr which gives the Glv on the side we are interested in, * while neigharr is the neighbor. * u1 and u2 are utility vectors like Glv.mimic (Glv_arr.get_one darr) *) let get_posterior ~dst util model t ~atarr ~neigharr id = Model.evolve_into model ~dst:util ~src:(Glv_arr.arr_get neigharr id) (Gtree.get_bl t id); Model.statd_pairwise_prod model ~dst util (Glv_arr.arr_get atarr id) type pos = Distal | Proximal let get_summary pos summarize_f initial u1 u2 model t ~darr ~parr id = let (atarr, neigharr) = match pos with | Distal -> (darr, parr) | Proximal -> (parr, darr) in get_posterior ~dst:u1 u2 model t ~atarr ~neigharr id; Glv.summarize_post summarize_f initial u1 end pplacer-1.1.alpha19/pplacer_src/simple_json.ml000066400000000000000000000043551303154601500214150ustar00rootroot00000000000000open Jsontype exception Type_mismatch_wanted of string exception Type_mismatch of string exception Undefined_key of string exception Not_object let name_type = function | Bool _ -> "boolean" | Int _ -> "integer" | Float _ -> "float" | String _ -> "string" | Object _ -> "object" | Array _ -> "array" | Null -> "null" let _get_bool = function | Bool b -> b | _ -> raise (Type_mismatch_wanted "boolean") let _get_int = function | Int i -> i | _ -> raise (Type_mismatch_wanted "integer") let _get_float = function | Float x -> x | _ -> raise (Type_mismatch_wanted "float") let _get_string = function | String s -> s | _ -> raise (Type_mismatch_wanted "string") let _get_hashtbl = function | Object h -> h | _ -> raise (Type_mismatch_wanted "object") let _get_array = function | Array a -> a | _ -> raise (Type_mismatch_wanted "array") let _get_real = function | Int i -> float_of_int i | Float x -> x | _ -> raise (Type_mismatch_wanted "real") let of_file = Json.of_file (* "getting" something simply means that we convert to a proper ocaml type. *) let get_gen f x = try f x with | Type_mismatch_wanted wanted -> raise (Type_mismatch ("expected "^wanted^", got "^(name_type x))) let get_bool = get_gen _get_bool let get_int = get_gen _get_int let get_float = get_gen _get_float let get_string = get_gen _get_string let get_hashtbl = get_gen _get_hashtbl let get_array = get_gen _get_array let get_real = get_gen _get_real (* "finding" something means that we find it in the json object (as a * hashtable) and then convert to the corresponding ocaml type. *) let find_gen what o k = match o with | Object h -> begin try what (Hashtbl.find h k) with | Not_found -> raise (Undefined_key k) | Type_mismatch_wanted wanted -> raise (Type_mismatch ("expected "^wanted^" when looking for "^k)) end | _ -> raise Not_object let find = find_gen (fun o -> o) let find_bool = find_gen _get_bool let find_int = find_gen _get_int let find_float = find_gen _get_float let find_string = find_gen _get_string let find_hashtbl = find_gen _get_hashtbl let find_array = find_gen _get_array let find_real = find_gen _get_real let mem o k = try let _ = find o k in true with | Undefined_key _ -> false pplacer-1.1.alpha19/pplacer_src/som.ml000066400000000000000000000170251303154601500176670ustar00rootroot00000000000000(* Code to perform Support Overlap Minimzation as described in Matsen and Evans, 2013. *) open Ppatteries exception MinimizationError let trans_a_mat_mul = Gsl_blas.gemm ~ta:Gsl_blas.Trans ~tb:Gsl_blas.NoTrans ~alpha:1. ~beta:0. (* Rotation matrix in terms of Euler angles [|phi; theta; psi|] http://mathworld.wolfram.com/EulerAngles.html In[93]:= MatrixForm[Flatten[Table[{i,j},{i,0,2},{j,0,2}],1]] Out[93]//MatrixForm= 0 0 0 1 0 2 1 0 1 1 1 2 2 0 2 1 2 2 In[94]:= MatrixForm[Flatten[toMatrix[ofEulerAngles[phi,theta,psi]],1]] Out[94]//MatrixForm= Cos[phi] Cos[psi] - Cos[theta] Sin[phi] Sin[psi] Cos[psi] Sin[phi] + Cos[phi] Cos[theta] Sin[psi] Sin[psi] Sin[theta] -(Cos[psi] Cos[theta] Sin[phi]) - Cos[phi] Sin[psi] Cos[phi] Cos[psi] Cos[theta] - Sin[phi] Sin[psi] Cos[psi] Sin[theta] Sin[phi] Sin[theta] -(Cos[phi] Sin[theta]) Cos[theta] *) let rot_mat angles = let m = Gsl_matrix.create 3 3 and cos_phi = cos angles.(0) and sin_phi = sin angles.(0) and cos_theta = cos angles.(1) and sin_theta = sin angles.(1) and cos_psi = cos angles.(2) and sin_psi = sin angles.(2) in m.{0,0} <- cos_phi*.cos_psi -. cos_theta*.sin_phi*.sin_psi; m.{0,1} <- cos_psi*.sin_phi +. cos_phi*.cos_theta*.sin_psi; m.{0,2} <- sin_psi*.sin_theta; m.{1,0} <- -.(cos_psi*.cos_theta*.sin_phi) -. cos_phi*.sin_psi; m.{1,1} <- cos_phi*.cos_psi*.cos_theta -. sin_phi*.sin_psi; m.{1,2} <- cos_psi*.sin_theta; m.{2,0} <- sin_phi*.sin_theta; m.{2,1} <- -.cos_phi*.sin_theta; m.{2,2} <- cos_theta; m (* When we are doing PCA, we want to transform our samples from the usual basis * in which they are expressed to the basis of k principal components. In the * SOM case, we want to apply a rotation to the plane spanned by the principal * component vectors. If expressed in the usual way for transformations * (vectors are columns of transformation matrix) then we would multiply on the * right. However, in this case it's easier if the eigenvectors are the _rows_ * of the eigenvector matrix, so we multiply on the left by the transpose. *) let rotate_vects vects_part angles = let result = Gsl_matrix.copy vects_part in trans_a_mat_mul ~a:(rot_mat angles) ~b:vects_part ~c:result; result (* We also need to "rotate" the variances, i.e. change them such that they * actually correspond to the rotated eigenvectors. Recall that * Var(aX + bY) = a^2 Var(X) + b^2 Var(Y) when X and Y are independent. * Thus, when we are looking at a linear transformation of a vector of * whose ith component is * \sum_j a_{ij} X_j * the variance is * \sum_j a_{ij}^2 Var(X_j). * As can be seen, we do this for a maximum of three dimensions. *) let rotate_vals vals angles = let vals_part = Gsl_vector.of_array (Array.sub vals 0 3) in let vals_result = Gsl_vector.create ~init:0. 3 in let vals_rest = Array.sub vals 3 ((Array.length vals) - 3) in let rot = rot_mat angles in (* Square the elements of the rotation matrix. *) Gsl_matrix.mul_elements rot rot; (* Multiply its transpose by our vals to get the rotated vals. *) Gsl_blas.gemv Gsl_blas.Trans ~alpha:1. ~beta:0. ~a:rot ~x:vals_part ~y:vals_result; Array.append (Gsl_vector.to_array vals_result) vals_rest (* Measures the overlap between the tranform vector components when rotated * through the given angles. *) let overlap vects_part dims angles = let rotated_vects = rotate_vects vects_part angles in let row i = Gsl_matrix.row rotated_vects i and indices = match dims with | 2 -> [(0, 1)] | 3 -> [(0, 1); (0, 2); (1, 2)] | _ -> failwith "Can only rotate in 2 or 3 dimensions\n" in let rec overlapper = function | [] -> 0. | (i, j)::rest -> let mult = Gsl_vector.copy (row i) in Gsl_vector.mul mult (row j); (* asum because we want to take the absolute value dot product. *) Gsl_blas.asum mult +. overlapper rest in overlapper indices (* Performs overlap minimization using Brent. *) let min_overlap vects_part dims = let tolerance = (overlap vects_part dims [|0.; 0.; 0.|]) *. (0.0001) in match dims with | 2 -> let obj_fun phi = overlap vects_part dims [|phi; 0.; 0.|] in let min = Minimization.brent ~start_finder:Minimization.robust_start_finder obj_fun 0. (-. Gsl_math.pi_4) Gsl_math.pi_4 tolerance in [|min; 0.; 0.|] | 3 -> let obj_fun = overlap vects_part dims and start = [|0.; 0.; 0.|] and lower = Array.make 3 (-. Gsl_math.pi) and upper = Array.make 3 (Gsl_math.pi) in let run_one_3d index_order = Minimization.multimin ~index_order obj_fun start lower upper tolerance in begin match List.reduce (fun pos1o pos2o -> match (pos1o,pos2o) with | (Some pos1, Some pos2) -> if obj_fun pos1 < obj_fun pos2 then Some pos1 else Some pos2 | (Some pos, None) -> Some pos | (None, Some pos) -> Some pos | (None, None) -> None) (List.map (fun index_order -> try Some (run_one_3d index_order) with | Minimization.ExceededMaxIter | Minimization.InvalidStartValues _ (* (left, start, right) *) | Minimization.FindStartFailure -> None) [[|0;1;2|]; [|0;2;1|]; [|1;0;2|]; [|1;2;0|]; [|2;0;1|]; [|2;1;0|]]) with | Some pos -> pos | None -> raise MinimizationError (* Sadly, there is little the user can do even if they know what the * source of the error is. *) end | _ -> failwith "Can only rotate in 2 or 3 dimensions\n" (* In situations where the roation takes the variances out of order, this * reorders both the vals and the vects vectors. *) let reordered_by_vals vals vects dims = let reordered_vals = Array.copy vals and orig_var_i x = Array.findi (fun y -> y = x) vals in Array.sort (fun x y -> compare y x) reordered_vals; let reordered_vects = Array.map (fun var -> vects.(orig_var_i var)) (Array.sub reordered_vals 0 dims) in (reordered_vals, reordered_vects) (* A vector v has the same variance as -v; we would like whichever most * closely matches the original vects. This makes it easier to compare the * original to the SOM vects. *) let flip_axes ~orig_vects ~new_vects = let flip vec = Array.map (fun x -> -1. *. x) vec in let flipper i vec = let flipped = flip vec in if Pca.dot vec orig_vects.(i) > Pca.dot flipped orig_vects.(i) then vec else flipped in Array.mapi flipper new_vects (* Returns a tuple of the roated vects (as an array of arrays), the rotated * vals. *) let som_rotation vects dims vals = let vects_part = Gsl_matrix.of_arrays (Array.sub vects 0 3) in (* Where all the real work is - find min(s) *) let min = min_overlap vects_part dims in let vals = rotate_vals vals min and vects_part = Gsl_matrix.to_arrays (rotate_vects vects_part min) in let vals, vects_part = reordered_by_vals vals vects_part dims in let flipped_vects = flip_axes ~orig_vects:vects ~new_vects:vects_part in (* We want our final vects to be the same as the original but with the first * dims dimensions rotated. *) let final_vects = Array.copy vects in Array.blit flipped_vects 0 final_vects 0 dims; (vals, final_vects) pplacer-1.1.alpha19/pplacer_src/squashfunc.ml000066400000000000000000000140771303154601500212550ustar00rootroot00000000000000(* * Inner loop: * - find minimally distant pair of samples i and j * - merge them to make k, and normalize * - remove those pairs from the distance map, then add * - calcualate distances between i and k and j and k * - recalculate distances * * The main data structures are * - barkm: the bark map for the clustering tree * - bmapr: map from blobs to the trees representing their clustering sequence * - cset: set of clusterables, playing the part of a distance matrix (see below) * - blobim: records the blobs and their indices, for export *) open Ppatteries module type BLOB = sig type t val merge: t -> t -> t val compare: t -> t -> int end module Squash (B: BLOB) = struct module OrderedBlob = struct type t = B.t let compare = B.compare end module BMap = Map.Make (OrderedBlob) (* cble is short for clusterable. Such an object is maintained for every * pair of samples. *) type cble = { dist : float; small : B.t; big : B.t; } (* we require distf to be passed in here, so that we can perform some normm * fun as below *) let cble_of_blobs distf b b' = let (small, big) = if compare b b' < 0 then (b, b') else (b', b) in { dist = distf b b'; small; big; } let blob_in_cble b c = b = c.small || b = c.big (* Note: be completely sure that we sort by dist first *) let compare_cble a b = let cdist = compare a.dist b.dist in if cdist <> 0 then cdist else Pervasives.compare a b let replace_blob distf oldb newb c = if c.small = oldb then cble_of_blobs distf c.big newb else if c.big = oldb then cble_of_blobs distf c.small newb else invalid_arg "replace_blob: blob not found" let perhaps_replace_blob distf ~oldb ~newb c = if blob_in_cble oldb c then replace_blob distf oldb newb c else c module OrderedCble = struct type t = cble let compare = compare_cble end (* This is where we keep our clusterables, so that we can pluck off the * smallest one each round. *) module CSet = Set.Make (OrderedCble) let cset_map f s = CSet.fold (fun x -> CSet.add (f x)) s CSet.empty let get_only_binding m = if BMap.cardinal m <> 1 then invalid_arg "get_only_binding: more than one binding" else BMap.choose m (* Note that the blobls can be non normalized as we call normf on them from * the beginning and pass those on to distf. *) let of_named_blobl given_distf normf named_blobl = let (n_blobs, start_bmap, start_blobim, start_barkm) = List.fold_left (fun (counter, bmap, blobim, barkm) (name, b) -> (counter+1, BMap.add b (Stree.leaf counter) bmap, IntMap.add counter b blobim, Newick_bark.map_set_node_label counter name barkm)) (0, BMap.empty, IntMap.empty, IntMap.empty) named_blobl in assert (n_blobs > 0); (* we store our normf results in normm *) let start_normm = BMap.mapi (fun b _ -> normf b) start_bmap in let distf normm b b' = given_distf ~x1:(BMap.find b normm) ~x2:(BMap.find b' normm) b b' in (* Build up our set of clusterables. *) dprint "Preparing the objects to be clustered..."; flush_all (); let rec init_aux accu = function | b::l -> init_aux (List.fold_left (fun accu' b' -> CSet.add (cble_of_blobs (distf start_normm) b b') accu') accu l) l | [] -> accu in let start_cset = init_aux CSet.empty (List.map snd named_blobl) in dprint "done.\n"; (* now actually perform the clustering *) (* * Main recursion ** *) let rec merge_aux bmap cset free_index normm blobim barkm = dprintf "step %d of %d\n" (free_index - n_blobs + 1) n_blobs; flush_all (); if CSet.cardinal cset = 0 then begin let (_, stree) = get_only_binding bmap in (Gtree.gtree stree barkm, blobim) end else begin let next = CSet.min_elt cset in let tsmall = BMap.find next.small bmap and tbig = BMap.find next.big bmap and merged = B.merge next.small next.big in let new_normm = BMap.add merged (normf merged) normm in (* Calculate the proper branch length for the blob to the merged, then * add it to the given bark map. *) let add_bl b barkm = Newick_bark.map_set_bl (Stree.top_id (BMap.find b bmap)) (distf new_normm b merged) barkm in merge_aux (BMap.add merged (Stree.node free_index [tsmall; tbig]) (BMap.remove next.small (BMap.remove next.big bmap))) (cset_map (perhaps_replace_blob (distf new_normm) ~oldb:(next.small) ~newb:merged) (cset_map (perhaps_replace_blob (distf new_normm) ~oldb:(next.big) ~newb:merged) (CSet.remove next cset))) (free_index+1) new_normm (IntMap.add free_index merged blobim) (Newick_bark.map_set_node_label free_index (string_of_int free_index) (add_bl next.small (add_bl next.big barkm))) end in merge_aux start_bmap start_cset n_blobs start_normm start_blobim start_barkm (* mimic clusters blobl with the same steps as in the supplied tree, and * spit out a blobim which represents what would have resulted had we done * the clustering in that way. *) let mimic t blobl = let blobim = ref IntMap.empty in let set_blob i b = blobim := IntMap.check_add i b (!blobim) in List.iteri set_blob blobl; let _ = Gtree.recur (fun i -> function | [b1; b2] -> let m = B.merge b1 b2 in set_blob i m; m | _ -> invalid_arg "mimic: tree isn't strictly bifurcating") (fun i -> IntMap.find i (!blobim)) t in !blobim end pplacer-1.1.alpha19/pplacer_src/stockholm.ml000066400000000000000000000055131303154601500210730ustar00rootroot00000000000000open Ppatteries type sline = | Header | Footer | Markup of string | Alignment of string * string let stockholm_regexp = Str.regexp begin (* each line is either ... *) "\\(" ^ (String.concat "\\|" [ (* nothing but whitespace (matched at the end of the group), *) ""; (* the header (group 2), *) "\\(# STOCKHOLM 1.0\\)"; (* the footer (group 3), *) "\\(//\\)"; (* markup (group 4), *) "\\(#=.+\\)"; (* or a sequence alignment (group 5, containing groups 6 and 7). *) "\\(\\([^ \t\n\r#]+\\)[ \t]+\\([^ \t\n\r#]+\\)\\)"; (* and finally, strip off any trailing whitespace. For an explanation of the * hideous regexp here, see fasta.ml. *) ]) ^ "\\)[ \t]*\\(\\(\r\\|\n\\|\r\n\\)+\\|$\\)" end let sline_of_match s = match Sparse.first_match [2; 3; 4; 5] s with | 2, _ -> Header | 3, _ -> Footer | 4, s -> Markup s | 5, _ -> Alignment (Str.matched_group 6 s, Str.matched_group 7 s) | _, _ -> invalid_arg "sline_of_match" let tokenize_stockholm = Sparse.tokenize_string stockholm_regexp sline_of_match module SM = MapsSets.StringMap type phase = | Needs_header | Needs_footer of string list SM.t | Found_footer of (string * string) list let gap_regexp = Str.regexp "\\." let parse tokens = let res = Enum.fold (fun state tok -> match state, tok with | Needs_header, Header -> Needs_footer SM.empty | Needs_header, _ -> Sparse.syntax_error "something before header" | _, Header -> Sparse.syntax_error "header unexpected" | Needs_footer m, Alignment (name, seq) -> let seq = Str.global_replace gap_regexp "-" seq in Needs_footer (SM.add_listly name seq m) | Needs_footer m, Footer -> let l = SM.fold (fun name seql l -> let seq = List.rev seql |> String.concat "" in if not (List.is_empty l) then begin let _, prev_seq = List.hd l in if String.length seq <> String.length prev_seq then Printf.sprintf "%s (length %d) doesn't match the previous sequence lengths (%d)" name (String.length seq) (String.length prev_seq) |> Sparse.syntax_error end; (name, seq) :: l) m [] in Found_footer l | Needs_footer m, _ -> Needs_footer m | _, Footer -> Sparse.syntax_error "footer unexpected" | Found_footer _, _ -> Sparse.syntax_error "something after footer" ) Needs_header tokens in match res with | Found_footer l -> l | _ -> Sparse.syntax_error "didn't reach footer by EOF" let of_string, of_file = Sparse.gen_parsers tokenize_stockholm parse let of_refpkg_contents = Refpkg_parse.of_file_or_string of_file of_string pplacer-1.1.alpha19/pplacer_src/stree.ml000066400000000000000000000075331303154601500202160ustar00rootroot00000000000000(* Our basic tree data structure without information. * * *) open Ppatteries type stree = Node of int * stree list | Leaf of int type t = stree let node i tL = Node(i, tL) let leaf i = Leaf i let of_id i = function | Node(_, tL) -> Node(i, tL) | Leaf(_) -> Leaf(i) let rec n_taxa = function | Node(_,tL) -> List.fold_left ( + ) 0 (List.map n_taxa tL) | Leaf(_) -> 1 (* Number of non-root edges. *) let n_edges stree = let rec aux = function | Node(_,tL) -> List.fold_left ( + ) 1 (List.map aux tL) | Leaf(_) -> 1 in (aux stree) - 1 let rec node_ids_aux = function | Node(i,tL) -> i :: (List.flatten (List.map node_ids_aux tL)) | Leaf(i) -> [i] let node_ids stree = List.sort compare (node_ids_aux stree) let nonroot_node_ids stree = try List.sort compare (List.tl (node_ids_aux stree)) with | Failure "tl" -> invalid_arg "nonroot_node_ids" let rec leaf_ids = function | Node(_,tL) -> List.flatten (List.map leaf_ids tL) | Leaf(i) -> [i] let top_id = function | Node(i, _) -> i | Leaf(i) -> i let rec max_id = function | Node(i, tL) -> List.fold_left max i (List.map max_id tL) | Leaf(i) -> i let multifurcating_at_root = function | Node(_, tL) -> List.length tL > 2 | Leaf(_) -> false let rec plain_to_newick = function | Node(i, tL) -> "("^(String.concat "," (List.map plain_to_newick tL))^")"^(string_of_int i) | Leaf i -> string_of_int i let rec ppr ff = function | Node(i, tL) -> Format.fprintf ff "@[(%a)@]%d" (Ppr.ppr_gen_list_inners "," ppr) tL i | Leaf i -> Format.pp_print_int ff i (* the maximal outdegree of nodes in the tree *) let rec outdegree = function | Node(_,tL) -> List.fold_left max (List.length tL) (List.map outdegree tL) | Leaf _ -> 0 (* increase all of the indices of the tree by "by" *) let rec boost by = function | Node(i,tL) -> Node(i+by, List.map (boost by) tL) | Leaf(i) -> Leaf(i+by) let recur f_node f_leaf tree = let rec aux = function | Node(id, tL) -> f_node id (List.map aux tL) | Leaf id -> f_leaf id in aux tree (* for functions that don't treat leaves differently than a node with empty * leaves. *) let recur_listly f = recur f (fun id -> f id []) let find target tree = let rec aux = function | (Leaf i as x) :: _ | (Node (i, _) as x) :: _ when i = target -> x | Leaf _ :: rest -> aux rest | Node (_, subtrees) :: rest -> List.append subtrees rest |> aux | [] -> raise Not_found in aux [tree] let parent_map t = let maybe_add accum i = function | Some p -> IntMap.add i p accum | None -> accum in let rec aux accum = function | (parent, Leaf i) :: rest -> aux (maybe_add accum i parent) rest | (parent, Node (i, tL)) :: rest -> aux (maybe_add accum i parent) (List.fold_left (fun accum t -> (Some i, t) :: accum) rest tL) | [] -> accum in aux IntMap.empty [None, t] let reroot tree root = if top_id tree = root then tree else let rec aux = function | [] -> failwith "root not found (tried to reroot at leaf?)" | (Node (i, subtrees), path) :: _ when i = root -> (i, subtrees) :: path | (Leaf _, _) :: rest -> aux rest | (Node (i, subtrees), path) :: rest -> List.map (fun subtree -> let path' = (i, List.remove subtrees subtree) :: path in subtree, path') subtrees |> List.append rest |> aux in aux [tree, []] |> List.rev |> List.reduce (fun (bi, btl) (ai, atl) -> ai, node bi btl :: atl) |> uncurry node let rec nodes_containing nodes = function | Leaf _ -> nodes | Node (i, subtrees) -> let nodes' = List.fold_left (nodes_containing nodes %> IntSet.union |> flip) IntSet.empty subtrees in if List.for_all (top_id %> flip IntSet.mem nodes') subtrees then IntSet.add i nodes' else nodes' pplacer-1.1.alpha19/pplacer_src/string_matrix.ml000066400000000000000000000030061303154601500217550ustar00rootroot00000000000000(* for making and aligning matrices of strings *) open Ppatteries let range n = Array.init n (fun i -> i) let pad_to_width c width s = StringFuns.left_pad (width - String.length s) c s let column_widths m = MatrixFuns.assert_rectangular m; let widths = MatrixFuns.map String.length m and n_rows = MatrixFuns.n_rows m and n_cols = MatrixFuns.n_cols m in let all_rows = range n_rows in Array.map (fun col -> Array.fold_right (fun row -> max widths.(row).(col)) all_rows 0) (range n_cols) let pad m = let widths = column_widths m in MatrixFuns.mapij (fun _ j s -> pad_to_width ' ' widths.(j) s) m (* # add_names [|"a";"b"|] [|[|"0";"1"|];[|"2";"3"|]|];; - : string array array = [|[|""; "a"; "b"|]; [|"a"; "0"; "1"|]; [|"b"; "2"; "3"|]|] *) let add_names name_arr m = MatrixFuns.assert_rectangular m; let n_rows = MatrixFuns.n_rows m and n_cols = MatrixFuns.n_cols m in assert(n_rows = n_cols && n_cols = Array.length name_arr); MatrixFuns.init (n_rows+1) (n_cols+1) (fun i j -> if (i,j) = (0,0) then "" else if min i j = 0 then name_arr.((max i j) - 1) else m.(i-1).(j-1)) let m = add_names [|"a";"b"|] [|[|"0";"1"|];[|"2";"3"|]|] let row_to_str delim row = String.concat delim (Array.to_list row) let write_row ch row = Printf.fprintf ch "%s\n" (row_to_str " " row) let write_padded ch m = Array.iter (write_row ch) (pad m) let write_named_padded ch names m = Array.iter (write_row ch) (pad (add_names names m)) pplacer-1.1.alpha19/pplacer_src/tax_classify.ml000066400000000000000000000016631303154601500215630ustar00rootroot00000000000000open Ppatteries (* *** classification *** *) let add_classif what how p = what p (how p) let classify_pr what how pr = Placerun.apply_to_each_placement (add_classif what how) pr (* Classify a placement at a given location. * Simply bounce up the tree until we hit an MRCA. *) let mrca_classify_loc mrcam utm loc = let rec aux i = if IntMap.mem i mrcam then IntMap.find i mrcam else aux (IntMap.find i utm) in (* Note below that we start by bumping up the map one level. Thus, if we are * just distal to the MRCA of a clade, then we hit the MRCA on the nose. If * the placement is just proximal of the MRCA, we go to the ancestor of the * MRCA. * *) try aux (IntMap.find loc utm) with | Not_found -> Tax_id.NoTax let mrca_classify mrcam utm p = mrca_classify_loc mrcam utm (Placement.location p) let paint_classify paintm p = try IntMap.find (Placement.location p) paintm with | Not_found -> Tax_id.NoTax pplacer-1.1.alpha19/pplacer_src/tax_gtree.ml000066400000000000000000000076351303154601500210610ustar00rootroot00000000000000open Tax_id open Ppatteries exception Multiple_roots of tax_id * tax_id exception No_root (* get the most distal taxa in the taxonomy which are represented in til. * preserve the order of til as much as possible *) let tax_tips_of_tax_list td til = (* s is the set of things we have seen, accu is our list of tips *) let rec aux s accu = function | x::l -> if TaxIdSet.mem x s then aux s accu l else begin let lin = Tax_taxonomy.get_lineage td x in let removes = TaxIdSet.of_list lin in (* below: we add the lineage of our taxonomy * and take our ancestors from accu if present *) aux (List.fold_right TaxIdSet.add lin s) (x::(List.filter (fun x -> not (TaxIdSet.mem x removes)) accu)) l end | [] -> accu in List.rev (aux TaxIdSet.empty [] til) (* now we build a tree represented by a series of maps from ancestors to * descendants *) let build_topdown_tree td tips = (* rooto is the root of the tree, if its been found *) let rec add_ancestry rooto tt ti = match Tax_taxonomy.get_ancestor_opt td ti, rooto with | Some anc, _ -> let tt' = TaxIdMap.add_listly anc ti tt in (* if anc was already in tt then we don't have to add its lineage *) if TaxIdMap.mem anc tt then (rooto, tt') else add_ancestry rooto tt' anc | None, Some root -> if root = ti then (rooto, tt) else raise (Multiple_roots (root, ti)) | None, None -> (Some ti, tt) in let rec aux rooto tt = function | NoTax :: l -> aux rooto tt l | ti::l -> assert(not(TaxIdMap.mem ti tt)); (* should be nonredundant list *) let (rooto', tt') = add_ancestry rooto tt ti in aux rooto' (TaxIdMap.add ti [] tt') l (* add ti itself *) | [] -> (rooto, tt) in match aux None TaxIdMap.empty tips with | (Some root, tt) -> (root, TaxIdMap.map List.rev tt) | (None, _) -> raise No_root (* the map is a map from edge numbers to taxids *) let stree_and_map_of_topdown_tree root tt = let m = ref IntMap.empty in let count = ref (-1) in (* side effects heh heh *) let add ti = incr count; m := IntMap.add (!count) ti !m in (* note that the order of events below is important *) let rec aux ti = match TaxIdMap.find ti tt with | [] -> add ti; Stree.Leaf (!count) | below -> let tL = List.map aux below in add ti; Stree.Node(!count, tL) in let t = aux root in (t, !m) (* also get a map from the indices of the tree to tax_ids *) let decor_gtree_of_topdown_tree bl_of_rank td root tt = let bl_of_taxid ti = bl_of_rank (Tax_taxonomy.get_tax_rank td ti) in let (stree, ti_imap) = stree_and_map_of_topdown_tree root tt in let bark_of_taxid ti = new Decor_bark.decor_bark (`Of_bl_node_edge_label_decor (Some (bl_of_taxid ti), None, None, (* this is okay because NoTax has been excluded earlier *) [Decor.Taxinfo (ti, Tax_taxonomy.get_tax_name td ti)])) in (Gtree.gtree stree (IntMap.map bark_of_taxid ti_imap), ti_imap) (* general make a tax_gtree out of Tax_taxonomy.t and a tax_id list *) let build_gen bl_of_rank td til = let (root, tt) = build_topdown_tree td (tax_tips_of_tax_list td til) in decor_gtree_of_topdown_tree bl_of_rank td root tt let constant_bl c _ = c let unit_bl = constant_bl 1. let inverse i = 1. /. (float_of_int (i+1)) let build_unit = build_gen unit_bl let build_inverse = build_gen inverse (* *** Refpkg interface *** *) (* can be pulled out if desired later *) let of_refpkg_gen bl_of_rank rp = let td = Refpkg.get_taxonomy rp and sim = Refpkg.get_seqinfom rp and t = Refpkg.get_ref_tree rp in build_gen bl_of_rank td (List.map (Gtree.get_node_label t |- Tax_seqinfo.tax_id_by_node_label sim) (Gtree.leaf_ids t)) let of_refpkg_unit = of_refpkg_gen unit_bl let of_refpkg_inverse = of_refpkg_gen inverse pplacer-1.1.alpha19/pplacer_src/tax_id.ml000066400000000000000000000032301303154601500203320ustar00rootroot00000000000000(* The taxonomic id type * * note use of Pervasives.compare should be redone if speed needed. *) open Ppatteries exception UnknownTaxIDPrefix of char type tax_id = TaxStr of string | NoTax type t = tax_id let none_str = "none" (* *** utility *** *) let of_stro = function | Some s -> TaxStr s | None -> NoTax let of_string = function | s when s = none_str -> NoTax | s -> TaxStr s let to_string = function | TaxStr s -> s | NoTax -> none_str let to_stro = function | TaxStr s -> Some s | NoTax -> None let of_json = function | Jsontype.String s -> TaxStr s | Jsontype.Null -> NoTax | x -> Jsontype.unexpected x "string or null" let to_json = function | TaxStr s -> Jsontype.String s | NoTax -> Jsontype.Null let to_sql = function | TaxStr s -> Sql.D.TEXT s | NoTax -> Sql.D.NULL let of_old_string id_str = if id_str = none_str then NoTax else try Scanf.sscanf id_str "%c*%s" (fun c s -> match c with | 'N' -> TaxStr s | _ -> raise (UnknownTaxIDPrefix c)) with | End_of_file -> invalid_arg (id_str^" is not a valid tax id!") (* *** I/O *** *) let ppr ff ti = Format.pp_print_string ff (to_string ti) let to_xml = function | TaxStr s -> [Myxml.tag "id" ~attrs:[("provider", "ncbi_taxonomy")] s] | NoTax -> [] let print ch x = Option.print String.print ch (to_stro x) (* *** Maps and Sets *** *) module OrderedTaxId = struct type t = tax_id let compare = Pervasives.compare end module PprTaxId = struct type t = tax_id let ppr = ppr end module TaxIdMap = BetterMap (Map.Make(OrderedTaxId)) (PprTaxId) module TaxIdSet = BetterSet (Set.Make(OrderedTaxId)) (PprTaxId) pplacer-1.1.alpha19/pplacer_src/tax_map.ml000066400000000000000000000037451303154601500205260ustar00rootroot00000000000000(* Taxonomic routines for gtrees. * * The purpose of this module is to make a "mrcam". A mrcam can be thought of as * the map that generates the taxonomic annotations in pplacer. Thus, it is a * map from an internal node to the taxid that is the MRCA of the nodes distal * to that internal node. * * Thus the keys of a MRCA are the internal nodes that are MRCAs. *) open Ppatteries (* Make a map of leaf taxonomic annotations from the leaf names on the tree and * a seqinfo map (sim). *) let tips_map sim t = Gtree.fold_over_leaves (fun k newick_bark m -> match newick_bark#get_node_label_opt with | Some node_label -> IntMap.add k (Tax_seqinfo.tax_id_by_node_label sim node_label) m | None -> m) t IntMap.empty (* Propogate the taxonomic information up the tree according to common ancestry, * starting with a map that only has taxonomic information at the tips. * *) let fill_out td t tips_map = let m = ref tips_map in let _ = Gtree.recur (fun id below_tax_ids -> let mrca = Tax_taxonomy.list_mrca td below_tax_ids in m := IntMap.add id mrca (!m); mrca) (fun id -> IntMap.find id tips_map) t in !m (* Attach names to actual MRCAs in the tree given a map from the previous step. * *) let mrcam_of_full_map t full_map = let m = ref IntMap.empty in let _ = Gtree.recur (fun id below -> let our_tax_id = IntMap.find id full_map in List.iter (fun (below_id, below_tax_id) -> if our_tax_id <> below_tax_id then (* Something below is not the same tax_id as us. * Thus it is an MRCA and we label it as such. *) m := IntMap.add below_id below_tax_id (!m)) below; (id, our_tax_id)) (fun id -> (id, IntMap.find id full_map)) t and top_id = Gtree.top_id t in IntMap.add top_id (IntMap.find top_id full_map) !m let mrcam_of_data sim td t = mrcam_of_full_map t (fill_out td t (tips_map sim t)) pplacer-1.1.alpha19/pplacer_src/tax_mass.ml000066400000000000000000000021311303154601500207000ustar00rootroot00000000000000open Ppatteries open Tax_id exception Tax_id_not_in_tree of tax_id let hashtbl_find_zero h k = if Hashtbl.mem h k then Hashtbl.find h k else 0. let reverse_ti_imap start = IntMap.fold (fun k v -> TaxIdMap.check_add v k) start TaxIdMap.empty (* here we build the pre mass map which is appropriate for the tax_gtree. * ti_imap takes us from the locations on the tree to taxids *) let pre root_id tax_id_of_place weighting criterion ti_imap pr = let revm = reverse_ti_imap ti_imap in Mass_map.Pre.normalize_mass (List.map (fun pq -> {Mass_map.Pre.multi = 1.; mul = List.map (fun p -> let ti = tax_id_of_place p in try { Mass_map.Pre.loc = (if ti=Tax_id.NoTax then root_id else TaxIdMap.find ti revm); distal_bl = 0.; pendant_bl = 0.; mass = criterion p; } with | Not_found -> raise (Tax_id_not_in_tree ti)) (Mass_map.place_list_of_pquery weighting criterion pq)}) (Placerun.get_pqueries pr)) pplacer-1.1.alpha19/pplacer_src/tax_seqinfo.ml000066400000000000000000000030451303154601500214060ustar00rootroot00000000000000(* For parsing refdata files. *) open Tax_id open Ppatteries type t = { tax_id : tax_id; accession : string option; } type seqinfo_map = t StringMap.t let tax_id_by_node_label sim s = try (StringMap.find s sim).tax_id with | Not_found -> failwith ("tax_id for "^s^" not found!") (* *** reading *** *) let entry_of_str = function | "" -> None | "NA" -> None | s -> Some s (* Csv uses a non-tail-recursive List.map. the bastards. *) let associate header data = List.map (List.combine header) data (* requires "seqname" and "tax_id" columns, "accession" * "tax_name","isType","ok","i","outlier","selected","label" *) let of_csv csv = let safe_assoc k l = try List.assoc k l with | Not_found -> failwith ("couldn't find "^k^" column in seqinfo") in List.fold_left (fun sim al -> let seqname_str = safe_assoc "seqname" al in try StringMap.check_add seqname_str { tax_id = safe_assoc "tax_id" al |> entry_of_str |> Tax_id.of_stro; accession = try entry_of_str (List.assoc "accession" al) with | Not_found -> None } sim with | Failure "check_add" -> failwith (Printf.sprintf "Tax_refdata.of_csv: contradictory line for %s\n" seqname_str) | Not_found -> failwith ("seq_name and/or tax_id fields missing in seqinfo")) StringMap.empty (match Csv.input_all csv with | header :: data -> associate header data | [] -> invalid_arg ("empty refdata in seqinfo")) pplacer-1.1.alpha19/pplacer_src/tax_taxonomy.ml000066400000000000000000000134241303154601500216220ustar00rootroot00000000000000(* The tax_tree points from a tax_id to its ancestor. * * Note that taxonomic ranks decrease as one goes towards the ancestor. * * SPEED: add_lineage_to_tree_and_map could avoid use of pair-redefinitions * SPEED: mrca could be made less elegant and faster *) open Tax_id open Ppatteries exception NoAncestor of tax_id exception NoMRCA of tax_id * tax_id type tax_tree = tax_id TaxIdMap.t type tax_rank_map = int TaxIdMap.t type tax_name_map = string TaxIdMap.t type t = { rank_names : string array; tax_tree : tax_tree; tax_rank_map : tax_rank_map; tax_name_map : tax_name_map; } (* basics *) let get_rank_name td i = try td.rank_names.(i) with | Invalid_argument _ -> invalid_arg "Tax_taxonomy.get_rank_name" let get_rank_index td rk = Array.findi ((=) rk) td.rank_names let get_n_ranks td = Array.length td.rank_names let get_tax_rank td ti = try TaxIdMap.find ti td.tax_rank_map with | Not_found -> invalid_arg ("Tax_taxonomy.get_tax_rank not known: "^(Tax_id.to_string ti)) let rank_name_of_tax_id td ti = get_rank_name td (get_tax_rank td ti) let get_ancestor td ti = try TaxIdMap.find ti td.tax_tree with | Not_found -> raise (NoAncestor ti) let get_ancestor_opt td ti = TaxIdMap.Exceptionless.find ti td.tax_tree let get_tax_name td ti = try TaxIdMap.find ti td.tax_name_map with | Not_found -> invalid_arg ("Tax_taxonomy.get_tax_name not known: "^(Tax_id.to_string ti)) let get_lineage td = function | NoTax -> [] | TaxStr _ as ti -> (* ... *) let rec aux accu ti' = let accu' = ti' :: accu in match get_ancestor_opt td ti' with | Some ancestor -> aux accu' ancestor | None -> accu' in aux [] ti (* adds a lineage to the tree and the tax_rank_map *) let add_lineage_to_tree_and_map (t,m) l = let check_add format_error k v m = match begin try Some (TaxIdMap.find k m) with Not_found -> None end with | Some v' when v <> v' -> failwith (format_error k v v') | Some _ -> m | None -> TaxIdMap.add k v m in let check_add_tid = check_add (fun k v v' -> Printf.sprintf "Tax table broken: tax_id %s had established parent %s but %s is \ claiming to be the parent." (to_string k) (to_string v') (to_string v)) and check_add_rank = check_add (fun k v v' -> Printf.sprintf "Tax table broken: %s had established rank %d but was also found at \ rank %d." (to_string k) v' v) in let rec aux (t,m) = function | (i,x)::((_,y)::_ as l') -> aux (check_add_tid y x t, check_add_rank x i m) l' | [(i,x)] -> (t, check_add_rank x i m) | [] -> (t,m) in (* filter out the NoTax after adding rank numbers *) aux (t,m) (List.filter (fun (_,x) -> x <> NoTax) (List.mapi (fun i x -> (i,x)) l)) (* *** reading *** *) type tax_line = { tax_id_str : string; parent_id_str : string; rank_name : string; taxonomic_name : string; lineage : string option list; } let tax_line_of_strol = function | (Some tax_id_str)::(Some parent_id_str) ::(Some rank_name)::(Some taxonomic_name) ::lineage -> { tax_id_str; parent_id_str; rank_name; taxonomic_name; lineage; } | l -> begin Format.fprintf Format.std_formatter "Error: this tax line didn't fit expectations:@\n%a@\n" (Ppr.ppr_list (Ppr.ppr_opt Format.pp_print_string)) l; exit(0); end (* if a list list is rectangular *) let list_list_is_rectangular = function | x::l -> begin try let x_l = List.length x in List.iter (fun y -> if x_l <> List.length y then raise Exit) l; true with | Exit -> false end | [] -> true let of_ncbi_file csv = let taxid_of_stro = of_stro and full_list = List.map (List.map Tax_seqinfo.entry_of_str) (Csv.input_all csv) in if not (list_list_is_rectangular full_list) then invalid_arg "Taxonomy array not rectangular"; match List.map tax_line_of_strol full_list with | names::lineage_data -> let (tax_tree, tax_rank_map) = List.fold_left (fun tam tax_line -> add_lineage_to_tree_and_map tam (List.map taxid_of_stro tax_line.lineage)) (TaxIdMap.empty, TaxIdMap.empty) lineage_data in { tax_tree; rank_names = Array.of_list (List.map (function | Some s -> s | None -> failwith "NA in taxon rank name line!") names.lineage); tax_rank_map = TaxIdMap.add NoTax 0 tax_rank_map; tax_name_map = List.fold_right (fun tline -> TaxIdMap.add (taxid_of_stro (Some tline.tax_id_str)) tline.taxonomic_name) lineage_data TaxIdMap.empty } | _ -> invalid_arg "empty taxonomy" (* *** writing *** *) let ppr_tax_tree = TaxIdMap.ppr_gen Tax_id.ppr let sort_by_rank td ti1 ti2 = let l1 = get_tax_rank td ti1 and l2 = get_tax_rank td ti2 in if l1 < l2 then (ti1,ti2) else (ti2,ti1) (* *** using *** *) let rec mrca td ti1 ti2 = let rec aux = function | x, NoTax | NoTax, x -> x | ti1, ti2 when ti1 = ti2 -> ti1 | ti1, ti2 -> let (ti_proximal, ti_distal) = sort_by_rank td ti1 ti2 in aux (get_ancestor td ti_distal, ti_proximal) in try aux (ti1, ti2) with | NoAncestor _ -> raise (NoMRCA (ti1, ti2)) let list_mrca td = function | hd::tl -> List.fold_left (mrca td) hd tl | [] -> invalid_arg "list_mrca" (* unused and untested *) let count_entries_by_rank td = let a = Array.make (get_n_ranks td) 0 in TaxIdMap.iter (fun ti _ -> let rk = get_tax_rank td ti in a.(rk) <- a.(rk) + 1) td.tax_name_map; a pplacer-1.1.alpha19/pplacer_src/tensor.ml000066400000000000000000000022041303154601500203740ustar00rootroot00000000000000module BA = Bigarray module BA3 = BA.Array3 type tensor = (float, BA.float64_elt, BA.c_layout) BA.Array3.t let dim1 = BA3.dim1 let dim2 = BA3.dim2 let dim3 = BA3.dim3 let dims x = (dim1 x, dim2 x, dim3 x) let create a b c = BA3.create BA.float64 BA.c_layout a b c let mimic a = create (BA3.dim1 a) (BA3.dim2 a) (BA3.dim3 a) let copy a = let b = mimic a in BA3.blit a b; b let set_all (* tensor value *) = BA3.fill let of_arrays = BA3.of_array BA.float64 BA.c_layout let ppr ff x = let n = dim1 x in Format.fprintf ff "@[{"; for i=0 to n-1 do Matrix.ppr ff (BA3.slice_left_2 x i); if i < n-1 then Format.fprintf ff ";@ " done; Format.fprintf ff "}@]" let fold_left f start x = let (d1, d2, d3) = dims x in let r = ref start in for i=0 to d1 - 1 do for j=0 to d2 - 1 do let v = BA3.slice_left_1 x i j in for k=0 to d3 - 1 do r := f !r v.{k} done done done; !r (* Get the "worst" floating point classification in the tensor. * Note: # max FP_normal FP_subnormal;; - : fpclass = FP_subnormal * *) let fp_classify x = fold_left (fun worst flt -> max worst (classify_float flt)) FP_normal x pplacer-1.1.alpha19/pplacer_src/three_tax.ml000066400000000000000000000201261303154601500210500ustar00rootroot00000000000000(* a type for three-taxon trees which is useful for likelihood calculations. * we assume that the distance from the dist do the prox is fixed. see * set_dist_bl. *) open Ppatteries let n_like_calls = ref 0 module Make (Model: Glvm.Model) = struct module Glv = Model.Glv module Glv_edge = Glv_edge.Make(Model) type three_tax = { model: Model.t; util_v: Gsl_vector.vector; (* should be as long as the number of sites *) prox: Glv_edge.t; (* the proximal glv *) dist: Glv_edge.t; (* the distal glv *) pend: Glv_edge.t; (* the pendant, i.e. query glv *) } let get_pend_bl tt = Glv_edge.get_bl tt.pend let get_dist_bl tt = Glv_edge.get_bl tt.dist let get_prox_bl tt = Glv_edge.get_bl tt.prox let get_cut_bl tt = (get_dist_bl tt) +. (get_prox_bl tt) let make model util_v ~prox ~dist ~pend = {model; util_v; prox; dist; pend} let log_like tt = Model.log_like3 tt.model tt.util_v (Glv_edge.get_evolv tt.prox) (Glv_edge.get_evolv tt.dist) (Glv_edge.get_evolv tt.pend) let set_pend_bl tt pend_bl = Glv_edge.set_bl tt.model tt.pend pend_bl let set_dist_bl tt dist_bl = let prox_bl = (get_cut_bl tt) -. dist_bl in assert(prox_bl >= 0.); Glv_edge.set_bl tt.model tt.dist dist_bl; Glv_edge.set_bl tt.model tt.prox prox_bl (* we minimize the negative of the log likelihood *) let optimize_something tolerance set_fun ~start_v ~min_v ~max_v tt = if min_v = max_v then start_v else begin let opt_fun value = incr n_like_calls; set_fun value; -. (log_like tt) in Minimization.brent opt_fun start_v min_v max_v tolerance end let optimize_pend_bl tolerance max_value tt = optimize_something tolerance (set_pend_bl tt) ~start_v:(get_pend_bl tt) ~min_v:1e-8 ~max_v:max_value tt let optimize_dist_bl tolerance tt = optimize_something tolerance (set_dist_bl tt) ~start_v:(get_dist_bl tt) ~min_v:0. ~max_v:(get_cut_bl tt) tt let optimize tolerance max_pend_bl max_iter tt = let rec aux which_step prev_pend prev_dist = if which_step > max_iter then raise Minimization.ExceededMaxIter; let curr_pend = optimize_pend_bl tolerance max_pend_bl tt and curr_dist = optimize_dist_bl tolerance tt in if (abs_float (prev_pend -. curr_pend) > tolerance || abs_float (prev_dist -. curr_dist) > tolerance) then aux (which_step+1) curr_pend curr_dist else () in n_like_calls := 0; let () = aux 1 (get_pend_bl tt) (get_dist_bl tt) in !n_like_calls let get_results tt = (log_like tt, get_pend_bl tt, get_dist_bl tt) let copy_bls ~src ~dest = set_pend_bl dest (get_pend_bl src); set_dist_bl dest (get_dist_bl src) (* write out the likelihood surface, with base_ll discounted. this is what * integrate actually integrates, sampled on an integer-plus-half lattice. *) let write_like_surf prior max_pend tt fname n_samples = let base_ll = log_like tt and cut_bl = get_cut_bl tt in let dist_incr = cut_bl /. (float_of_int n_samples) and pend_incr = max_pend /. (float_of_int n_samples) and float_and_half i = 0.5 +. (float_of_int i) and ch = open_out fname in for i=0 to n_samples-1 do set_dist_bl tt (dist_incr *. (float_and_half i)); for j=0 to n_samples-1 do let pend_bl = pend_incr *. (float_and_half j) in set_pend_bl tt pend_bl; Printf.fprintf ch "%g\t" ((exp ((log_like tt) -. base_ll)) *. (prior pend_bl)); done; Printf.fprintf ch "\n"; done; close_out ch (* Find an appropriate upper limit for pendant branch length integration. If we * come up with a reasonable upper limit then we get better results than * integrating out to max_pend. * Note 1: this does change the pend_bl. * Note 2: this assumes that the likelihood function times the prior is * monotonically decreasing in the pendant branch length beyond the original * branch length, (in our applications, the original branch length is the ML * branch length, and the prior is monotonically decreasing.) * Note 3: we assume that the prior is monotonically decreasing in pendant * branch length (yes for us). *) let find_upper_limit max_pend prior orig_ll tt = let orig_pend_bl = get_pend_bl tt in if prior orig_pend_bl = 0. then begin (* Prior is zero. We just rewind to someplace reasonably small where the * prior is still below some small quantity. *) let rec aux curr_pend_bl = let next_pend_bl = curr_pend_bl /. 2. in if prior next_pend_bl > exp (-10.) then curr_pend_bl else aux next_pend_bl in aux orig_pend_bl end else begin (* Perform a binary search to the right until the ll function * drops approximately 10 ll units *) let log_prior x = log (prior x) in let target_ll = -10. +. orig_ll +. (log_prior orig_pend_bl) in (* Function to minimize - absolute difference from target log likelihood *) let f pend_bl = set_pend_bl tt pend_bl; let like = (log_like tt) +. (log_prior pend_bl) in Float.abs (target_ll -. like) (* If the likelihood is infinity (likely too high of an upper bound), * return a very large number *) |> (fun x -> if x = Float.infinity then 100000.0 else x) in let start = orig_pend_bl +. ((max_pend -. orig_pend_bl) /. 2.) in (* Minimize f with a large tolerance. We just want a rough * estimate of point where the ll has dropped by a target amount * - the exact location is unimportant *) try Minimization.brent ~max_iters:10 f start orig_pend_bl max_pend 0.02 with (* Points may not enclose a minimum when close to max_pend - * just integrate to max_pend *) | Gsl_error.Gsl_exn(Gsl_error.EINVAL, _) -> max_pend end (* The idea here is to properly integrate log likelihood functions by removing * some portion so that when we actually do the integration, we don't have * underflow problems. * We use the original branch lengths in tt to get a baseLL. * This calculates then * baseLL + \log ( cut_bl^{-1} \int \int \exp(llF - baseLL) * prior(x) dx dy ) * Note: modifies the branch lengths in tt! *) let calc_marg_prob prior rel_err max_pend tt = let abs_err = 0. (* do not specify an absolute error *) and max_n_exceptions = 10 and base_ll = log_like tt and cut_bl = get_cut_bl tt and n_exceptions = ref 0 in let rec perform upper_limit = if !n_exceptions >= max_n_exceptions then begin Printf.printf "Warning: integration did not converge after changing bounds %d times\n" max_n_exceptions; base_ll (* return the base LL *) end else let inner_integration () = Integration.value_integrate (fun pend_bl -> set_pend_bl tt pend_bl; (exp ((log_like tt) -. base_ll)) *. (prior pend_bl)) 0. upper_limit ~abs_err ~rel_err in let outer_integration () = (/.) (Integration.value_integrate (fun dist_bl -> set_dist_bl tt dist_bl; inner_integration ()) 0. cut_bl ~abs_err ~rel_err) cut_bl in try (if cut_bl =~ 0. then (set_dist_bl tt (cut_bl /. 2.); inner_integration ()) else outer_integration ()) |> log |> (+.) base_ll with | Gsl_error.Gsl_exn (Gsl_error.ETOL, _) -> (* Integration failed to reach tolerance with highest-order rule. Because * these functions are smooth, the problem is too-wide integration bounds. * We halve and try again. This is obviously pretty rough, but if we * aren't reaching tolerance then the posterior surface is dropping off * really fast compared to the size of the interval, so missing a little * of it is not going to make a difference. *) incr n_exceptions; perform (upper_limit /. 2.) in perform (find_upper_limit max_pend prior base_ll tt) end pplacer-1.1.alpha19/pplacer_src/top_tests/000077500000000000000000000000001303154601500205565ustar00rootroot00000000000000pplacer-1.1.alpha19/pplacer_src/top_tests/biggish.tre000066400000000000000000000001141303154601500227020ustar00rootroot00000000000000((A:1.3,B:1.2):0.1,((C:1.2,D:1):0.3,(E:1.5,(F:1,G:0.9):0.3):0.3):0.2):0.5; pplacer-1.1.alpha19/pplacer_src/top_tests/smallish.tre000066400000000000000000000000631303154601500231050ustar00rootroot00000000000000((C:1.2,D:1):0.3,(E:1.5,(F:1,G:0.9):0.3):0.3):0.2 pplacer-1.1.alpha19/pplacer_src/top_tests/t-clusterfunc.ml000066400000000000000000000010051303154601500237020ustar00rootroot00000000000000(* "test1.place" "test2.place" "test3.place" "test_all.place" *) open Squashfunc open Ppatteries let prl = List.map Placerun_io.of_file ["test1.place"; "test2.place"; "test3.place"] let (rt, blobl) = t_named_prel_of_prl prl open PreCluster let bm_to_pairs m = let l = BMap.fold (fun k v l -> (k,v)::l) m [] in List.rev l let (bmap, cset, barkm, free_index) = ingreds_of_named_blobl rt blobl let x = bm_to_pairs bmap let x = PreCluster.CSet.elements cset let x = of_ingreds rt bmap cset barkm free_index pplacer-1.1.alpha19/pplacer_src/top_tests/t-edge_rdist.ml000066400000000000000000000010761303154601500234660ustar00rootroot00000000000000open Edge_rdist let quartet = Newick_gtree.of_string "(((A:1,B:1):1,C:1):10,D:1):100;";; let t = Newick_gtree.of_string "((A:1,B:1):0.1,((C:1,D:1):0.3,(E:1,(F:1,G:1):0.7):0.6):0.2):0.5;";; let st = Gtree.get_stree t;; let dmq = build_pairwise_dist quartet;; let dm = build_pairwise_dist t;; let u = build_ca_info quartet;; let u = build_ca_info t;; let d = find_ca_dist u (6, 0.) (8, 0.) let d = find_ca_dist u (10, 0.3) (8, 0.9) let test_rt = Newick_gtree.of_string "((A:2,B:9):7,C:5,D:1):0;";; let u = build_ca_info test_rt;; let d = find_ca_dist u (1,7.) (2,2.) pplacer-1.1.alpha19/pplacer_src/top_tests/t-fam_matrix.ml000066400000000000000000000001331303154601500234750ustar00rootroot00000000000000open Fam_matrix;; let m = init 4 4 (fun i j -> (float_of_int (i*j)));; let t = trace m;; pplacer-1.1.alpha19/pplacer_src/top_tests/t-induced.ml000066400000000000000000000014551303154601500227710ustar00rootroot00000000000000open Induced open Ppatteries let i_of_prf fname = of_placerun Placement.ml_ratio (Placerun_io.of_file fname) let ia = i_of_prf "top_tests/test_all.place" let t = Placerun.get_ref_tree (Placerun_io.of_file "top_tests/test_all.place") let s = Gtree.get_stree t let test f pl1 pl2 = f t (IntMap.of_pairlist pl1) (IntMap.of_pairlist pl2) let () = print_endline "intersections" let at_mrca = test intersect [0, 0.5;] [1, 0.5;] let on_same_edge = test intersect [1, 1.;] [1, 3.;] let on_serial_edges = test intersect [1, 1.;] [2, 1.0;] let root_mrca = test intersect [1, 1.;] [3, 0.;] let () = print_endline "unions" let at_mrca = test union [0, 0.5;] [1, 0.5;] let on_same_edge = test union [1, 1.;] [1, 3.;] let on_serial_edges = test union [1, 1.;] [2, 1.0;] let root_mrca = test union [0, 0.5; 1, 1.;] [3, 0.;] pplacer-1.1.alpha19/pplacer_src/top_tests/t-normal_approx.ml000066400000000000000000000004521303154601500242330ustar00rootroot00000000000000open New_normal_approx let rng = Gsl_rng.make Gsl_rng.KNUTHRAN2002;; Gsl_rng.set rng (Nativeint.of_int 1);; let pr1 = Placerun_io.of_file "top_tests/test1.place";; let pr3 = Placerun_io.of_file "top_tests/test3.place";; let m = normal_pair_approx rng Mass_map.Point Placement.ml_ratio pr1 pr3;; pplacer-1.1.alpha19/pplacer_src/top_tests/t-pd.ml000066400000000000000000000006501303154601500217550ustar00rootroot00000000000000open Pd open Ppatteries (* 20/24 = .83333333333333333333 *) let pr = Placerun_io.of_file "top_tests/test_all.place" let i = Induced.of_placerun Placement.ml_ratio pr let p = of_pr Placement.ml_ratio pr let np = normalized_of_pr Placement.ml_ratio pr let t = Placerun.get_ref_tree pr let s = Gtree.get_stree t let test pl = of_induced t (IntMap.of_pairlist pl) let single_path = test [1, 3.] let mrca = test [0, 1.; 1, 3.] pplacer-1.1.alpha19/pplacer_src/top_tests/t-pdfrac.ml000066400000000000000000000011501303154601500226050ustar00rootroot00000000000000open Ppatteries open Induced open Pdfrac let i_of_prf fname = of_placerun Placement.ml_ratio (Placerun_io.of_file fname) let ia = i_of_prf "top_tests/test_all.place" let t = Placerun.get_ref_tree (Placerun_io.of_file "top_tests/test_all.place") let s = Gtree.get_stree t let test pl1 pl2 = of_induceds t (IntMap.of_pairlist pl1) (IntMap.of_pairlist pl2) (* with same calculations done by hand *) let at_mrca = test [0, 1.;] [1, 1.;] let x = 7. /. 16. let on_same_edge = test [1, 1.;] [1, 3.;] let x = 13. /. 15. let on_serial_edges = test [1, 1.;] [2, 1.;] let x = 6. /. 15. let root_mrca = test [1, 1.;] [3, 0.;] pplacer-1.1.alpha19/pplacer_src/top_tests/t-top_eig.ml000066400000000000000000000020721303154601500230000ustar00rootroot00000000000000open Top_eig;; open Gsl_blas;; let v = Gsl_vector.of_array [|1.;2.;3.|];; let n = Gsl_blas.nrm2 v;; scale_by_l2 v;; v;; (* top eigenvalue 8, with eigenvector (2,1,2) *) let m = Gsl_matrix.of_arrays [| [| 3.; 2.; 4.; |]; [| 2.; 0.; 2.; |]; [| 4.; 2.; 3.; |]; |];; let w = Fam_vector.mimic v;; gemv NoTrans ~alpha:1. ~a:m ~x:v ~beta:0. ~y:w;; w;; top_eig m 1e-9 300;; let random_symmetric n = let m = Gsl_matrix.create n n in for i=0 to n-1 do for j=i to n-1 do let x = Random.float 1. in Bigarray.Array2.unsafe_set m i j x; Bigarray.Array2.unsafe_set m j i x; done; done; m let compare size = let m = random_symmetric size in let time = Sys.time () in let ours = top_eig m 1e-3 500 in Printf.printf "ours took %g\n" ((Sys.time ()) -. time); let time = Sys.time () in let theirs = Gsl_eigen.symm (`M(m)) in Printf.printf "theirs took %g\n" ((Sys.time ()) -. time); (ours, Gsl_vector.max theirs);; let test size = let m = random_symmetric size in top_eig m 1e-10 100;; test 30;; compare 1500;; pplacer-1.1.alpha19/pplacer_src/top_tests/test_all.ML.fat.xml000066400000000000000000000016621303154601500241740ustar00rootroot00000000000000 ./test_all.ML.fat 0 5 7 1.5 2 A 2 1.5 0 B 9 1.3 1 C 5 2.5 3 D 1 4 pplacer-1.1.alpha19/pplacer_src/top_tests/test_all.ML.num.tre000066400000000000000000000001411303154601500242020ustar00rootroot00000000000000((((A:1,1_at_0:0.1):1,(B:4.5,1_at_1:0.1):4.5):3.5,1_at_2:0.1):3.5,(C:2.5,2_at_3:0.1):2.5,D:1):0; pplacer-1.1.alpha19/pplacer_src/top_tests/test_all.ML.sing.tre000066400000000000000000000003471303154601500243530ustar00rootroot00000000000000(((A:1,one_x_#0_M=0.8:10):1,B:9):7,C:5,D:1):0; ((A:2,(B:2,one_y_#0_M=0.8:10):7):7,C:5,D:1):0; (((A:2,B:9):2,three_#0_M=0.8:10):5,C:5,D:1):0; ((A:2,B:9):7,(C:4,two_x_#0_M=1:10):1,D:1):0; ((A:2,B:9):7,(C:0,two_y_#0_M=1:10):5,D:1):0; pplacer-1.1.alpha19/pplacer_src/top_tests/test_all.ML.tog.tre000066400000000000000000000001321303154601500241740ustar00rootroot00000000000000((((A:1,one_x:10):1,(B:2,one_y:10):7):2,three:10):5,((C:0,two_y:10):4,two_x:10):1,D:1):0; pplacer-1.1.alpha19/pplacer_src/unix_support.c000066400000000000000000000005241303154601500214560ustar00rootroot00000000000000#include #include #include #include #include #include CAMLprim value quiet_close(value fd_v) { CAMLparam1(fd_v); int fd = Int_val(fd_v), res; do { res = close(fd); } while (res < 0 && errno == EINTR); CAMLreturn(Val_unit); } pplacer-1.1.alpha19/pplacer_src/visualization.ml000066400000000000000000000041741303154601500217730ustar00rootroot00000000000000type tree_fmt = Newick | Phyloxml open Subcommand open Ppatteries let intmap_of_arr a = let m = ref IntMap.empty in Array.iteri (fun i x -> m := IntMap.add i x (!m)) a; !m (* writing various tree formats *) let trees_to_file ?(with_suffix = true) tree_fmt prefix trees = let fname = match tree_fmt with | _ when not with_suffix -> prefix | Newick -> prefix ^ ".tre" | Phyloxml -> prefix ^ ".xml" in match tree_fmt with | Newick -> Newick_gtree.tree_list_to_file trees fname | Phyloxml -> Phyloxml.gtrees_to_file fname trees let make_zero_leaf decor_list bl node_label = Gtree.Subtree (Gtree.gtree (Stree.leaf 0) (IntMap.add 0 (new Decor_bark.decor_bark (`Of_bl_node_edge_label_decor (Some bl, Some node_label, None, decor_list))) IntMap.empty)) let decor_bark_of_bl bl = new Decor_bark.decor_bark (`Of_bl_node_edge_label_decor (Some bl, None, None, [])) (* given a function that takes a location and a list of somethings and returns a * (where, tree) list for that location, make a tree containing those extra * subtrees given a something map *) let tree_by_map f ref_tree placed_map = Gtree.add_subtrees_by_map ref_tree (IntMap.mapi f placed_map) (* num tree *) let num_tree bogus_bl ref_tree placed_map = tree_by_map (fun loc pqueries -> [((Gtree.get_bl ref_tree loc) /. 2., make_zero_leaf [ Decor.red ] bogus_bl (Printf.sprintf "%d_at_%d" (List.length pqueries) loc), decor_bark_of_bl)]) ref_tree placed_map (* fat trees. * massm are By_edge mass maps. * *) (* make edges which have a nonzero width at least a certain length *) let spread_short_fat min_bl t = Gtree.set_bark_map t (IntMap.map (fun b -> try List.iter (function (Decor.Width _) -> raise Exit | _ -> ()) b#get_decor; b with | Exit -> begin (* it has some width *) match b#get_bl_opt with | None -> b#set_bl min_bl | Some bl -> if bl > min_bl then b else b#set_bl min_bl end) (Gtree.get_bark_map t)) pplacer-1.1.alpha19/pplacer_src/voronoi.ml000066400000000000000000000640511303154601500205650ustar00rootroot00000000000000open Ppatteries open Stree type leaf = int type ldist = { leaf: leaf; distance: float; } type ldistm = ldist IntMap.t type v = { tree: Newick_gtree.t; ldistm: ldist IntMap.t; all_leaves: IntSet.t; } type snip = { assoc_leaf: int; distal_edge: int; proximal_edge: int; start: float; finish: float; } (* qs: queue and set. An item will only be enqueued if it's not already present * in the set. *) type qs = { queue: int Queue.t; set: IntSet.t; } (* push an item on the queue if it's not in the set. *) let qs_push {queue = q; set = s} l = let s' = List.fold_left (fun accum x -> if not (IntSet.mem x accum) then Queue.push x q; IntSet.add x accum) s l in {queue = q; set = s'} (* pop an item from the queue; remove it from the set. *) let qs_pop ({queue = q; set = s} as qs) = match begin try Some (Queue.pop q) with | Queue.Empty -> None end with | None -> None, qs | Some x -> Some x, {qs with set = IntSet.remove x s} (* create a queue set from a list. *) let qs l = qs_push {queue = Queue.create (); set = IntSet.empty} l let adjacent_bls t = let bl = Gtree.get_bl t in let rec aux accum = function | [] -> accum | (above, Leaf n) :: rest -> let adj = match above with | Some above -> [above, bl n] | None -> [] in aux (IntMap.add n adj accum) rest | (above, Node (n, subtrees)) :: rest -> let adj = List.map (fun st -> let sn = top_id st in sn, bl sn) subtrees in let adj = match above with | Some above -> (above, bl n) :: adj | None -> adj in aux (IntMap.add n adj accum) (List.fold_left (fun l sn -> (Some n, sn) :: l) rest subtrees) in aux IntMap.empty [None, t.Gtree.stree] let update_ldistm ldistm all_leaves initial_leaves gt = let adjacency_map = adjacent_bls gt in let concat_adj n qs = qs_push qs (List.map fst (IntMap.find n adjacency_map)) in let rec aux ((ldistm', updated_leaves) as accum) rest = match qs_pop rest with | None, _ -> accum | Some n, rest when IntSet.mem n all_leaves -> aux ((IntMap.add n {leaf = n; distance = 0.0} ldistm'), updated_leaves) (concat_adj n rest) | Some n, rest -> let adj = List.fold_left (fun stl (sn, sbl) -> match begin try Some (IntMap.find sn ldistm') with | Not_found -> None end with | Some {leaf} when not (IntSet.mem leaf all_leaves) -> stl | Some {leaf = best_leaf; distance} -> (sbl +. distance, best_leaf) :: stl | None -> stl) [] (IntMap.find n adjacency_map) in let ldistm', updated_leaves, rest = match adj with | [] -> IntMap.remove n ldistm', updated_leaves, concat_adj n rest | adj -> let distance, best_leaf = List.min adj in let new_ldist = {leaf = best_leaf; distance} in let updated_leaves, rest = match begin try Some (IntMap.find n ldistm') with | Not_found -> None end with | None -> updated_leaves, concat_adj n rest | Some ldist when ldist = new_ldist -> updated_leaves, rest | Some prev_ldist -> (if IntSet.mem prev_ldist.leaf all_leaves then IntSet.add prev_ldist.leaf updated_leaves else updated_leaves), concat_adj n rest in IntMap.add n new_ldist ldistm', IntSet.add best_leaf updated_leaves, rest in aux (ldistm', updated_leaves) rest in aux (ldistm, IntSet.empty) (qs initial_leaves) let of_gtree_and_leaves tree all_leaves = let ldistm, _ = update_ldistm IntMap.empty all_leaves (IntSet.elements all_leaves) tree in {tree; ldistm; all_leaves} let of_gtree tree = Gtree.leaf_ids tree |> IntSet.of_list |> of_gtree_and_leaves tree let uncolor_leaves v ls = let all_leaves' = IntSet.diff v.all_leaves ls in if IntSet.is_empty all_leaves' then failwith "can't remove all leaves from a voronoi graph"; let ldistm', updated = update_ldistm v.ldistm all_leaves' (IntSet.elements ls) v.tree in {v with all_leaves = all_leaves'; ldistm = ldistm'}, updated let uncolor_leaf v l = uncolor_leaves v (IntSet.singleton l) let fold f initial {tree; ldistm} = let bl = Gtree.get_bl tree in let rec aux cur = function | [] -> cur | Leaf _ :: rest -> aux cur rest | Node (n, subtrees) :: rest -> let proximal_ldist = IntMap.find n ldistm in let cur = List.fold_left (fun cur st -> let sn = top_id st in let distal_ldist = IntMap.find sn ldistm in if proximal_ldist.leaf = distal_ldist.leaf then f cur {assoc_leaf = distal_ldist.leaf; distal_edge = sn; proximal_edge = n; start = bl sn; finish = 0.0} else let distal_split = ((bl sn) -. distal_ldist.distance +. proximal_ldist.distance) /. 2.0 in let cur = f cur {assoc_leaf = proximal_ldist.leaf; distal_edge = sn; proximal_edge = n; start = bl sn; finish = distal_split} in let cur = f cur {assoc_leaf = distal_ldist.leaf; distal_edge = sn; proximal_edge = sn; start = distal_split; finish = 0.0} in cur) cur subtrees in aux cur (List.rev_append subtrees rest) in aux initial [tree.Gtree.stree] let get_edge_snipl v l = fold (fun accum snip -> if snip.assoc_leaf = l then snip :: accum else accum) [] v let get_snipdist v = fold (fun accum snip -> IntMap.add_listly snip.distal_edge snip accum) IntMap.empty v let matching_snip snips pos = List.find (fun {start; finish} -> start >= pos && pos >= finish) snips module I = Mass_map.Indiv let partition_indiv_on_leaves v mass = let snipdist = get_snipdist v in IntMap.fold (fun n massl accum -> let snips = IntMap.find n snipdist in List.fold_left (fun accum ({I.distal_bl = pos} as unit) -> let {assoc_leaf = leaf} = matching_snip snips pos in IntMap.add leaf (IntMap.add_listly n unit (IntMap.get leaf IntMap.empty accum)) accum) accum massl) mass IntMap.empty let distribute_mass v mass = IntMap.map (fun indiv -> IntMap.fold (fun _ units accum -> List.fold_left (fun accum {I.mass} -> mass :: accum) accum units) indiv []) (partition_indiv_on_leaves v mass) let placement_distance v ?snipdist p = let snipdist = match snipdist with | Some m -> m | None -> get_snipdist v in let placement_pos = Placement.distal_bl p in let snip = matching_snip (IntMap.find (Placement.location p) snipdist) placement_pos in let maybe_min a = function | None -> Some a | Some b when a < b -> Some a | prev -> prev in let bl = Gtree.get_bl v.tree snip.distal_edge in let res = None in let res = if approx_equal snip.start bl then maybe_min ((IntMap.find snip.proximal_edge v.ldistm).distance +. (snip.start -. placement_pos)) res else res in let res = if approx_equal snip.finish 0.0 then maybe_min ((IntMap.find snip.distal_edge v.ldistm).distance +. placement_pos) res else res in match res with | Some d -> d | None -> invalid_arg "dist" (* find the work it takes to move the mass in the mass map to the specified * leaf in the voronoi diagram. *) let leaf_work ?(p_exp = 1.) v indiv_map leaf = if not (IntMap.mem leaf indiv_map) then 0.0 else let indiv = IntMap.find leaf indiv_map in let squashed_indiv = IntMap.singleton leaf [{I.distal_bl = 0.0; I.mass = I.total_mass indiv}] in Kr_distance.dist v.tree p_exp indiv squashed_indiv let adcl ?p_exp v indiv_map = IntSet.fold (leaf_work ?p_exp v indiv_map %> (+.)) v.all_leaves 0. (* voronoi' *) (* a partial solution to the full voronoi algorithm *) type partial_solution = { leaf_set: IntSet.t; cl_dist: float; wk_subtot: float; prox_mass: float option; interval: (float * float) option; } (* a solution to any variant of the voronoi algorithm *) type solution = { leaves: IntSet.t; work: float; } type solutions = solution IntMap.t let cl_dist {cl_dist} = cl_dist let leaf_set {leaf_set} = leaf_set let leaf_card {leaf_set} = IntSet.cardinal leaf_set let prox_mass {prox_mass} = Option.default 0. prox_mass let wk_subtot {wk_subtot} = wk_subtot let set_interval lhs rhs sol = {sol with interval = Some (lhs, rhs)} let clear_interval sol = {sol with interval = None} let sleaves {leaves} = leaves let swork {work} = work let is_rmd = function | {prox_mass = None} -> true | _ -> false let is_rmp = function | {prox_mass = Some _} -> true | _ -> false (* from a set of leaves and a tree, produce a map from all nodes on the tree to * a map from each leaf to the distance between that node and leaf. *) let all_dist_map all_leaves gt = let adjacency_map = adjacent_bls gt and n_leaves = IntSet.cardinal all_leaves in let concat_adj n qs = qs_push qs (List.map fst (IntMap.find n adjacency_map)) in let rec aux distm rest = match qs_pop rest with | None, _ -> distm | Some n, rest when IntMap.get n IntMap.empty distm |> IntMap.cardinal = n_leaves -> aux distm rest | Some n, rest -> let updated = ref false in let distm' = List.fold_left (fun m (sn, sbl) -> if not (IntMap.mem sn distm) then updated := true; IntMap.merge (fun _ v1 v2 -> match v1, v2 with | (Some _) as x, _ -> x | None, Some d -> updated := true; Some (d +. sbl) | None, None -> None) m (IntMap.get sn IntMap.empty distm)) (IntMap.get n IntMap.empty distm) (IntMap.find n adjacency_map) |> flip (IntMap.add n) distm in aux distm' (if !updated then concat_adj n rest else rest) in aux (IntSet.enum all_leaves |> Enum.map (identity &&& flip IntMap.singleton 0.0) |> IntMap.of_enum) (IntSet.elements all_leaves |> qs) (* from a tree, return a map from each node to a list of marks on the edge * above that node and a map from each node to the distance to both the closest * and farthest away leaves proximal to that node. *) let mark_map gt = let distm = all_dist_map (Gtree.leaf_ids gt |> IntSet.of_list) gt and parents = Gtree.get_stree gt |> parent_map and top = Gtree.top_id gt and get_bl = Gtree.get_bl gt and st = Gtree.get_stree gt in let rec aux tree = let i, (leaves_below, markm) = match tree with | Leaf i -> i, (IntSet.singleton i, IntMap.empty) | Node (i, subtrees) -> i, List.map aux subtrees |> List.split |> (Tuple2.map (List.reduce IntSet.union) (List.reduce IntMap.union)) in if i = top then leaves_below, markm else let below = IntMap.find i distm |> IntMap.enum |> Enum.filter_map (fun (k, v) -> if IntSet.mem k leaves_below then Some v else None) |> List.of_enum |> List.sort_unique compare and above = IntMap.find i parents |> flip IntMap.find distm |> IntMap.enum |> Enum.filter_map (fun (k, v) -> if IntSet.mem k leaves_below then None else Some v) |> List.of_enum |> List.sort_unique compare and bl = get_bl i in leaves_below, List.enum above |> Enum.map (fun p -> List.enum below |> Enum.filter (fun d -> abs_float (d -. p) < bl) |> Enum.map (fun d -> (bl -. d +. p) /. 2.)) |> Enum.flatten |> Enum.filter (not % approx_equal bl) |> List.of_enum |> List.sort_unique compare |> flip (IntMap.add i) markm in Gtree.get_stree gt |> aux |> snd, IntMap.mapi (fun i m -> IntMap.enum m |> Enum.filter (Stree.find i st |> Stree.leaf_ids |> IntSet.of_list |> flip (IntSet.mem |-- not) |~ fst) |> List.of_enum |> List.fold_left (snd %> fold_both min max |> flip) (infinity, neg_infinity)) distm let slope = function | {prox_mass = Some y} | {cl_dist = y} -> y let hull_cull ?(verbose = false) lower_bound upper_bound sols = if verbose then Printf.eprintf " hull cull: %g %g" lower_bound upper_bound; let keys, sola = List.map ((slope &&& wk_subtot) &&& identity) sols |> List.sort (on fst (Tuple2.compare ~cmp1:approx_compare ~cmp2:approx_compare)) |> List.fold_left (fun accum ((m, b), sol) -> match accum with | ((b_prev, _), _) :: _ when b <~> b_prev >= 0 -> accum | _ -> ((b, m), sol) :: accum) [] |> List.split |> Tuple2.map Array.of_list Array.of_list in if Array.length sola < 2 then begin if verbose then Printf.eprintf " skipped\n%!"; Array.enum sola end else begin if verbose then Printf.eprintf " culling %d\n%!" (Array.length sola); match Cdd.extreme_vertices (max lower_bound 0.) upper_bound keys with | Some culled -> let last_i = Array.length culled |> pred in Enum.init (Array.length culled) (fun i -> let sol_idx, x, _ = culled.(i) in set_interval x (if i = last_i then upper_bound else Tuple3.second culled.(succ i)) sola.(sol_idx)) | None -> if verbose then Printf.eprintf " cddlib failed.\n%!"; Array.enum sola |> Enum.map clear_interval end (* a polymorphic map for keys of int, bool *) let empty_solmap = Tuple2.compare ~cmp1:(-) ~cmp2:Bool.compare |> Map.PMap.create let solmap_key = leaf_card &&& is_rmp (* cull solutions from an enum of solutions down to a list of strictly the * best solutions per leaf set cardinality. *) let cull mass_above (minleaf, maxleaf) ?(verbose = false) sols = if verbose then Printf.eprintf "culling solutions\n%!"; let count = ref 0 in Enum.fold (fun solm sol -> incr count; Map.PMap.modify_def [] (solmap_key sol) (List.cons sol) solm) empty_solmap sols |> Map.PMap.enum |> Enum.map (junction (fst %> snd) (snd %> hull_cull ~verbose minleaf maxleaf) (snd %> hull_cull ~verbose 0. mass_above)) |> Enum.flatten (* given a mark map, a tree, and mass on the tree, remove redundant marks from * the tree. i.e. remove any mark that doesn't have mass on one side of it. *) let collapse_marks gt mass markm = let get_bl = Gtree.get_bl gt in let bubbles_from i = List.enum %> flip Enum.append (get_bl i |> Enum.singleton) in IntMap.mapi (fun i marks -> let mass_enum = IntMap.get i [] mass |> List.enum in Enum.fold (fun (delete_prev, accum) mark -> if Enum.take_while (fun {I.distal_bl} -> distal_bl < mark) mass_enum |> List.of_enum |> List.is_empty then true, mark :: (if delete_prev then List.tl accum else accum) else false, mark :: accum) (false, []) (bubbles_from i marks) |> snd |> List.tl |> List.rev) markm let map_min f l = List.map f l |> List.min let map_reduce f_map f_reduce l = List.map f_map l |> List.reduce f_reduce (* combine across the solutions below an internal node, given a solution list * for each node immediately below this node. knowing the max_leaves can help * in not having to consider every solution, as they can be pruned off * early. *) let combine_solutions ?(verbose = false) ?n_leaves ?max_adcl solsl = if verbose then begin Printf.eprintf "combining across "; List.print ~first:"" ~last:"\n" ~sep:", " Int.print stderr (List.map List.length solsl); flush_all () end; let is_invalid = (||--) (match n_leaves with | None -> const (const false) | Some max -> fun leaves _ -> IntSet.cardinal leaves > max) (match max_adcl with | None -> const (const false) | Some max -> fun _ work -> work > max) in solsl |> EnumFuns.n_cartesian_product |> Enum.map (fun sols -> let leaf_set = map_reduce leaf_set IntSet.union sols and wk_subtot = map_reduce wk_subtot (+.) sols in if is_invalid leaf_set wk_subtot then [] else (* ... *) let cl_dist = map_min cl_dist sols and tot_prox_mass = map_reduce prox_mass (+.) sols in let prox_mass = if List.for_all is_rmd sols then None else Some tot_prox_mass and addition = if List.for_all is_rmp sols then None else Some { leaf_set; cl_dist; prox_mass = None; interval = None; wk_subtot = wk_subtot +. cl_dist *. tot_prox_mass} in [{leaf_set; wk_subtot; cl_dist; prox_mass; interval = None}] |> maybe_cons addition) |> Enum.map List.enum |> Enum.flatten (* combine across the solutions, but only combine two at a time. trying to do a * full cartesian product on trees with a lot of multifurcation, even at a * single node, is _very_ slow. *) let combine_solutions_pairly ?verbose ?n_leaves ?max_adcl ~cull_fn solsl = let combine = combine_solutions ?verbose ?n_leaves ?max_adcl in List.fold_left (fun prev l -> match prev with | None -> Some (List.enum l) | Some enum -> Some (combine [List.of_enum enum; l] |> cull_fn)) None solsl |> Option.get let soln_to_info mark {leaf_set; cl_dist; prox_mass; wk_subtot; interval} = let fmt = Printf.sprintf "%g" in [Option.map_default fmt "-" mark; IntSet.cardinal leaf_set |> string_of_int; fmt cl_dist; Option.map_default fmt "RMD" prox_mass; fmt wk_subtot; Option.map_default (fst %> fmt) "-" interval; Option.map_default (snd %> fmt) "-" interval] let soln_csv_opt = ref None let csvrow ?mark i sol = match !soln_csv_opt with | None -> () | Some ch -> string_of_int i :: soln_to_info mark sol |> Csv.output_record ch let base_rmd leaf = {leaf_set = IntSet.singleton leaf; prox_mass = None; wk_subtot = 0.; cl_dist = 0.; interval = None} let base_rmp = {leaf_set = IntSet.empty; prox_mass = Some 0.; wk_subtot = 0.; cl_dist = infinity; interval = None} (* solve a tree using the full algorithm. *) let solve ?(verbose = false) ?n_leaves ?max_adcl gt mass = begin match n_leaves, max_adcl with | None, None -> failwith "voronoi full needs n_leaves or max_adcl" | _ -> () end; let markm, minmaxlm = mark_map gt and mass = I.sort mass and total_mass = I.total_mass mass in let bubbles = collapse_marks gt mass markm and get_bl = Gtree.get_bl gt and top_id = Gtree.top_id gt in let bubbles_of i = IntMap.get i [] bubbles |> List.enum |> flip Enum.append (get_bl i |> Enum.singleton) in let rec aux tree = Return.with_label (_aux tree) and _aux tree lbl = let i, mass_below, solutions = match tree with | Leaf i -> i, 0., List.enum [base_rmp; base_rmd i] | Node (i, subtrees) -> let massl, subsols = List.map aux subtrees |> List.split in let mass_below = List.fsum massl in let cull_fn = if i = top_id then identity else cull (total_mass -. mass_below) (IntMap.find i minmaxlm) ~verbose in if verbose then Printf.eprintf "node %d:\n" i; i, mass_below, List.map List.of_enum subsols |> combine_solutions_pairly ~verbose ?n_leaves ?max_adcl ~cull_fn in let solutions = Enum.map (tap (csvrow i)) solutions in if i = top_id then Return.return lbl (mass_below, solutions); let marks = bubbles_of i and masses = IntMap.get i [] mass |> List.enum in IntMap.get i [] mass |> List.fold_left (fun accum {I.mass} -> mass +. accum) mass_below, Enum.fold (fun (last_mark, solutions) mark -> let masses = Enum.take_while (fun {I.distal_bl} -> distal_bl <= mark) masses |> List.of_enum and bub_len = mark -. last_mark in let bub_mass = I.v_mass masses and wk_distal = I.work_moving_to masses last_mark and wk_prox = I.work_moving_to masses mark in mark, (* Moving through a bubble. *) (List.fold_left (fun accum -> function (* RMD solutions move all mass toward the leaves. *) | {prox_mass = None} as sol -> (* ... and maybe also start moving mass away from the leaves. *) let addition = if bub_mass =~ 0. then None else Some {sol with cl_dist = sol.cl_dist +. bub_len; prox_mass = Some bub_mass; wk_subtot = sol.wk_subtot +. wk_prox} in maybe_cons addition accum |> List.cons {sol with cl_dist = sol.cl_dist +. bub_len; wk_subtot = sol.wk_subtot +. wk_distal +. bub_mass *. sol.cl_dist} (* RMP solutions move all mass away from the leaves. *) | {prox_mass = Some prox_mass} as sol -> {sol with prox_mass = Some (prox_mass +. bub_mass); wk_subtot = sol.wk_subtot +. wk_prox +. prox_mass *. bub_len; cl_dist = sol.cl_dist +. bub_len} :: accum) [] solutions) |> tap (List.iter (csvrow ~mark i))) (0., List.of_enum solutions) marks |> snd |> List.enum |> tap (fun _ -> match Enum.get masses with | None -> () | Some _ -> failwith (Printf.sprintf "unused mass on node %d" i)) in Gtree.get_stree gt |> aux |> snd (* brute-force a voronoi solution by trying every combination of leaves, * calculating the ADCL of each, and choosing the best. *) let force ?n_leaves ?max_adcl:_ ?keep:_ ?(strict = true) ?(verbose = false) gt mass = let n_leaves = match n_leaves with | None -> failwith "voronoi force needs n_leaves" | Some x -> x in let leaves_adcl leaves = let v = of_gtree_and_leaves gt leaves in partition_indiv_on_leaves v mass |> adcl v in Gtree.leaf_ids gt |> EnumFuns.powerset |> Enum.filter_map (function | [] -> None | l when strict && List.length l <> n_leaves -> None | l when List.length l <= n_leaves -> Some (IntSet.of_list l) | _ -> None) |> Enum.group IntSet.cardinal |> Enum.map (Enum.map (identity &&& leaves_adcl) %> Enum.arg_min snd %> (if verbose then tap (fst %> IntSet.cardinal %> Printf.eprintf "solved %d\n%!") else identity) %> (fun (leaves, work) -> IntSet.cardinal leaves, {leaves; work})) |> IntMap.of_enum module type Alg = sig val solve: ?n_leaves:int -> ?max_adcl:float -> ?keep:IntSet.t -> ?strict:bool -> ?verbose:bool -> Newick_gtree.t -> Mass_map.Indiv.t -> solutions end let best_wk_subtot sol1 sol2 = if sol1.wk_subtot <= sol2.wk_subtot then sol1 else sol2 module Full = struct let csv_log = soln_csv_opt let solve ?n_leaves ?max_adcl ?keep:_ ?strict:_ ?(verbose = false) gt mass = begin match !csv_log with | None -> () | Some ch -> Csv.output_record ch ["node"; "mark"; "leaf_card"; "cl_dist"; "prox_mass"; "wk_subtot"; "oinv_lft"; "oinv_rgt"] end; solve ?n_leaves ?max_adcl ~verbose gt mass |> Enum.filter is_rmd |> Enum.fold (fun accum sol -> IntMap.modify_def sol (leaf_card sol) (best_wk_subtot sol) accum) IntMap.empty |> IntMap.values |> Enum.map (fun {leaf_set; wk_subtot} -> IntSet.cardinal leaf_set, {leaves = leaf_set; work = wk_subtot}) |> IntMap.of_enum |> tap (fun _ -> csv_log := None) end module Forced = struct let solve = force end (* update a map with what the ADCL would be if a particular leaf was removed * from the voronoi diagram. *) let update_score indiv v leaf map = let v', _ = uncolor_leaf v leaf in adcl v' (partition_indiv_on_leaves v' indiv) |> flip (IntMap.add leaf) map module Greedy = struct let solve ?n_leaves ?max_adcl:_ ?keep:_ ?strict:_ ?(verbose = false) gt mass = let n_leaves = match n_leaves with | None -> failwith "voronoi greedy needs n_leaves" | Some x -> x in let rec aux diagram accum score_map updated_leaves lbl = if IntSet.cardinal diagram.all_leaves <= n_leaves then Return.return lbl accum; let score_map' = IntSet.fold (update_score mass diagram) updated_leaves score_map in let leaf, work = IntMap.enum score_map' |> Enum.arg_min snd in if verbose then Printf.eprintf "uncoloring %d (score %g)\n" leaf work; let diagram', updated_leaves' = uncolor_leaf diagram leaf in let accum' = IntMap.add (IntSet.cardinal diagram'.all_leaves) {work = partition_indiv_on_leaves diagram' mass |> adcl diagram'; leaves = diagram'.all_leaves} accum in aux diagram' accum' (IntMap.remove leaf score_map') (IntSet.remove leaf updated_leaves') lbl in let v = of_gtree gt in aux v (IntMap.singleton (IntSet.cardinal v.all_leaves) {leaves = v.all_leaves; work = partition_indiv_on_leaves v mass |> adcl v}) IntMap.empty v.all_leaves |> Return.with_label end module PAM = struct let solve ?n_leaves ?max_adcl:_ ?keep ?strict:_ ?verbose:_ gt mass = let n_leaves = match n_leaves with | None -> failwith "voronoi PAM needs n_leaves" | Some x -> x in let gt = Newick_gtree.add_zero_root_bl gt in let leaves, work = Pam_solver.solve ?keep gt mass n_leaves in IntMap.singleton n_leaves {leaves; work} end pplacer-1.1.alpha19/pplacer_src/voronoi.mli000066400000000000000000000115141303154601500207320ustar00rootroot00000000000000(** Voronoi diagrams for phylogenetic trees with input set leaves. * * "Marks" are where colors are changed in the diagram, and colors flow up the * tree. That is, a mark sets the color of all edges proximal to that mark until * another mark is encountered. * * We only care about VDs when the set of interesting points are leaves or some * subset thereof. Thus we have at most one boundary per edge, as when the * points of interest are nodes of the phylogenetic tree. * *) open Ppatteries (* leaves are ints since the node numbers on an stree are ints. *) type leaf = int (* a leaf and the distance to that leaf. *) type ldist = { leaf: leaf; distance: float; } (* a map from nodes on a tree to the associated ldists. *) type ldistm = ldist IntMap.t (* a voronoi diagram: a tree, the leaves on the tree being considered, and the * ldistm on the tree. The set of leaves in the ldistm is a strict subset of the * all_leaves set. *) type v = { tree: Newick_gtree.t; ldistm: ldist IntMap.t; all_leaves: IntSet.t; } (* A portion of an edge defined by (id, start, finish), where id is the edge * id, start is where it starts, and finish is where it ends (both are measured * from distal side; start >= finish). *) type snip = { assoc_leaf: int; distal_edge: int; proximal_edge: int; start: float; finish: float; } val adjacent_bls: Newick_gtree.t -> (int * float) list IntMap.t (** Generate a map from each id in a Newick_gtree.t to a list of (neighbor_id, distance) pairs for every neighboring node for the given node, where the distance is the edge length between the two nodes. The parent of a node counts as a neighbor. *) val update_ldistm: ldistm -> IntSet.t -> int list -> Newick_gtree.t -> ldistm * IntSet.t (** Given an ldistm, a set of currently valid leaves, the leaves at which to start updating, and a tree on which the leaves are placed, update the ldistm to reflect only the valid leaves. *) val of_gtree: Newick_gtree.t -> v (** Compute the Voronoi diagram where points of interest are the leaves. *) val of_gtree_and_leaves: Newick_gtree.t -> IntSet.t -> v (** Compute the Voronoi diagram where points of interest are only the leaves specified. *) val uncolor_leaves: v -> IntSet.t -> v * IntSet.t (** This function returns the updated Voronoi after removing all of the leaves in the given set, as well as the set of leaves which were affected by this removal. *) val uncolor_leaf: v -> leaf -> v * IntSet.t (** uncolor_leaf v l <=> uncolor_leaves v (IntSet.singleton l) *) val fold: ('a -> snip -> 'a) -> 'a -> v -> 'a (** Effectively fold over the edge_snipl defined below, but we don't have to construct it in memory. *) val get_edge_snipl: v -> leaf -> snip list (** Get a list of the edge_snips that are of the given leaf in v. *) val matching_snip: snip list -> float -> snip (** Find the snip in the list which covers the specified position. *) val get_snipdist: v -> snip list IntMap.t (** Find all of the snips on the tree of a voronoi diagram. *) val partition_indiv_on_leaves: v -> Mass_map.Indiv.t -> Mass_map.Indiv.t IntMap.t (** Given a voronoi diagram and mass map, generate a map from leaves to mass maps containing only the mass on that leaf. *) val distribute_mass: v -> Mass_map.Indiv.t -> float list IntMap.t (** Given a voronoi diagram and mass map, distribute the mass onto all of the leaves in the diagram. The result maps leaf numbers to a lists of all mass placed onto that leaf. *) val placement_distance: v -> ?snipdist:snip list IntMap.t -> Placement.placement -> float (** Find the distance from the specified placement to the closest leaf on a voronoi diagram. If a snipdist isn't provided, it will be calculated from the specified diagram. *) val adcl: ?p_exp:float -> v -> Mass_map.Indiv.t IntMap.t -> float (** Find the ADCL of a voronoi diagram, given a mapping from leaves to mass on the tree being moved to the leaf. o*) type solution = { leaves: IntSet.t; work: float; } type solutions = solution IntMap.t val sleaves: solution -> IntSet.t val swork: solution -> float module type Alg = sig val solve: ?n_leaves:int -> ?max_adcl:float -> ?keep:IntSet.t -> ?strict:bool -> ?verbose:bool -> Newick_gtree.t -> Mass_map.Indiv.t -> solutions end module Greedy: Alg (** Greedy algorithm: at each step, remove the leaf which reduces the ADCL by the most. *) module Full: sig include Alg val csv_log: Csv.out_channel option ref (** If csv_log is Some out_channel, then a log of the solutions considered at every internal node is written out in CSV format. *) end (** Full algorithm: determine the set of leaves which produces the smallest ADCL by examining the tree. *) module Forced: Alg (** Forced algorithm: brute-force to try every combination of leaves looking for which has the smallest ADCL. *) module PAM: Alg (** PAM algorithm. *) pplacer-1.1.alpha19/scripts/000077500000000000000000000000001303154601500157245ustar00rootroot00000000000000pplacer-1.1.alpha19/scripts/add_classifications.py000077500000000000000000000064041303154601500222730ustar00rootroot00000000000000#!/usr/bin/env python import collections import itertools import argparse import logging import sqlite3 import csv import sys from taxtastic.taxtable import TaxNode from taxtastic.refpkg import Refpkg log = logging.getLogger(__name__) def group_by_name_and_mass(rows): return itertools.groupby(rows, lambda row: (row['seqname'], int(row.get('mass', 1)))) def main(): logging.basicConfig( level=logging.INFO, format="%(levelname)s: %(message)s") parser = argparse.ArgumentParser( description="Add classifications to a database.") parser.add_argument('refpkg', type=Refpkg, help="refpkg containing input taxa") parser.add_argument('classification_db', type=sqlite3.connect, help="output sqlite database") parser.add_argument('classifications', type=argparse.FileType('r'), nargs='?', default=sys.stdin, help="input query sequences") args = parser.parse_args() log.info('loading taxonomy') taxtable = TaxNode.from_taxtable(args.refpkg.open_resource('taxonomy', 'rU')) rank_order = {rank: e for e, rank in enumerate(taxtable.ranks)} def full_lineage(node): rank_iter = reversed(taxtable.ranks) for n in reversed(node.lineage()): n_order = rank_order[n.rank] yield n, list(itertools.takewhile(lambda r: rank_order[r] >= n_order, rank_iter)) def multiclass_rows(placement_id, seq, taxa): ret = collections.defaultdict(float) likelihood = 1. / len(taxa) for taxon in taxa: for node, want_ranks in full_lineage(taxtable.get_node(taxon)): for want_rank in want_ranks: ret[placement_id, seq, want_rank, node.rank, node.tax_id] += likelihood for k, v in sorted(ret.items()): yield k + (v,) curs = args.classification_db.cursor() curs.execute('INSERT INTO runs (params) VALUES (?)', (' '.join(sys.argv),)) run_id = curs.lastrowid log.info('inserting classifications') for (name, mass), rows in group_by_name_and_mass(csv.DictReader(args.classifications)): curs.execute('INSERT INTO placements (classifier, run_id) VALUES ("csv", ?)', (run_id,)) placement_id = curs.lastrowid curs.execute( 'INSERT INTO placement_names (placement_id, name, origin, mass) VALUES (?, ?, ?, ?)', (placement_id, name, args.classifications.name, mass)) taxa = [row['tax_id'] for row in rows] curs.executemany('INSERT INTO multiclass VALUES (?, ?, ?, ?, ?, ?)', multiclass_rows(placement_id, name, taxa)) log.info('cleaning up `multiclass` table') curs.execute(""" CREATE TEMPORARY TABLE duplicates AS SELECT name FROM multiclass JOIN placements USING (placement_id) GROUP BY name HAVING SUM(run_id = ?) AND COUNT(DISTINCT run_id) > 1 """, (run_id,)) curs.execute(""" DELETE FROM multiclass WHERE (SELECT run_id FROM placements p WHERE p.placement_id = multiclass.placement_id) <> ? AND name IN (SELECT name FROM duplicates) """, (run_id,)) args.classification_db.commit() main() pplacer-1.1.alpha19/scripts/check_placements.py000077500000000000000000000027601303154601500215760ustar00rootroot00000000000000#!/usr/bin/env python import logging import json import math import sys log = logging.getLogger(__name__) def parse_placements(j): fields = j['fields'] for p in j['placements']: if 'nm' in p: name = p['nm'][0][0] elif isinstance(p['n'], basestring): name = p['n'] else: name = p['n'][0] data = [dict(zip(fields, f)) for f in p['p']] yield name, data def approx_equal(f1, f2, epsilon=1e-4): return abs(f1 - f2) < epsilon def check(fname): with open(fname) as infile: j = json.load(infile) has_post_prob = 'post_prob' in j['fields'] for name, data in parse_placements(j): if has_post_prob: tot_pp = math.fsum(p['post_prob'] for p in data) if not approx_equal(1, tot_pp): if approx_equal(0, tot_pp): log.critical("%s: post_prob sums to 0", name) else: log.error("%s: post_prob doesn't sum to 1", name) if any(p['post_prob'] == 0 for p in data): log.warning("%s: some post_prob == 0", name) if not approx_equal(1, math.fsum(p['like_weight_ratio'] for p in data)): log.error("%s: like_weight_ratio doesn't sum to 1", name) if any(p['like_weight_ratio'] == 0 for p in data): log.warning("%s: some like_weight_ratio == 0", name) if __name__ == '__main__': logging.basicConfig(stream=sys.stderr, level=logging.INFO) check(sys.argv[1]) pplacer-1.1.alpha19/scripts/classif_rect.py000066400000000000000000000174401303154601500207450ustar00rootroot00000000000000#!/usr/bin/env python """ Produce rectangular matrices representing various counts in a classification database. """ import argparse import logging import sqlite3 import csv import warnings warnings.filterwarnings("always", category=DeprecationWarning) deprecation_message=""" ATTENTION!!! This script (classif_rect.py) has been deprecated in favor of the streamlined classif_table.py, and will be removed entirely in a future release. Please switch over when you are able. """ warnings.warn(deprecation_message, DeprecationWarning, 2) log = logging.getLogger(__name__) def cursor_to_csv(curs, outfile, description=None): if description is None: description = curs.description writer = csv.writer(outfile) writer.writerow([d[0] for d in description]) writer.writerows(curs) def by_taxon(args): """This one just normalizes (for the normalized_tally) by taxon""" # a bit ugly. maybe in the future we'll use sqlalchemy. specimen_join = '' if args.specimen_map: specimen_join = 'JOIN specimens USING (name)' log.info('tabulating by_taxon') curs = args.database.cursor() curs.execute(""" SELECT COALESCE(tax_name, "unclassified") tax_name, COALESCE(t.tax_id, "none") tax_id, COALESCE(t.rank, "root") rank, SUM(mass) tally, COUNT(DISTINCT placement_id) placements FROM multiclass_concat mc JOIN placement_names USING (name, placement_id) %s LEFT JOIN taxa t USING (tax_id) WHERE want_rank = ? GROUP BY t.tax_id ORDER BY tally DESC """ % (specimen_join,), (args.want_rank,)) with args.by_taxon: cursor_to_csv(curs, args.by_taxon) def by_taxon_normalized_by_specimen(args, by_specimen_results, specimens): """This one normalizes first by specimen, using the results from by_specimen, then by taxon for the normalized_tally results.""" taxa_cols = ['tax_id', 'tax_name', 'rank'] n_specimens = len(specimens) results = by_specimen_results.values() cols = taxa_cols + ['normalized_tally'] with args.by_taxon: writer = csv.writer(args.by_taxon) writer.writerow(cols) for result in results: row = [result[c] for c in taxa_cols] tax_total = sum([result[s] for s in specimens if s in result.keys()]) row.append(tax_total / n_specimens) writer.writerow(row) def by_specimen(args): log.info('tabulating total per specimen mass sums') curs = args.database.cursor() curs.execute(""" CREATE TEMPORARY TABLE specimen_mass (specimen, total_mass, PRIMARY KEY (specimen))""") curs.execute(""" INSERT INTO specimen_mass SELECT specimen, SUM(mass) FROM specimens JOIN multiclass_concat mc USING (name) JOIN placement_names USING (name, placement_id) WHERE want_rank = ? GROUP BY specimen """, (args.want_rank,)) log.info('tabulating counts by specimen') curs.execute(""" SELECT specimen, COALESCE(tax_name, "unclassified") tax_name, COALESCE(t.tax_id, "none") tax_id, COALESCE(t.rank, "root") rank, SUM(mass) tally, COUNT(DISTINCT placement_id) placements, SUM(mass) / sm.total_mass normalized_tally FROM specimens JOIN specimen_mass sm USING (specimen) JOIN multiclass_concat mc USING (name) JOIN placement_names USING (name, placement_id) LEFT JOIN taxa t USING (tax_id) WHERE want_rank = ? GROUP BY specimen, t.tax_id ORDER BY tally DESC """, (args.want_rank,)) desc = curs.description rows = curs.fetchall() if args.group_by_specimen: log.info('writing group_by_specimen') with args.group_by_specimen: cursor_to_csv(rows, args.group_by_specimen, desc) results = {} specimens = set() for specimen, tax_name, tax_id, rank, tally, placements, normalized_tally in rows: row = results.get(tax_id) if row is None: row = results[tax_id] = dict(tax_id=tax_id, tax_name=tax_name, rank=rank) row[specimen] = normalized_tally if args.normalize_by_specimen else tally specimens.add(specimen) log.info('writing by_specimen') cols = ['tax_name', 'tax_id', 'rank'] + list(specimens) with args.by_specimen: writer = csv.DictWriter(args.by_specimen, cols, restval=0) writer.writerow(dict(zip(cols, cols))) # ugh, DictWriter :( if args.metadata_map: for key in {k for data in args.metadata.itervalues() for k in data}: d = {specimen: args.metadata.get(specimen, {}).get(key) for specimen in specimens} d['tax_name'] = key d['tax_id'] = d['rank'] = '' writer.writerow(d) writer.writerows(results.itervalues()) return (results, specimens) def main(): logging.basicConfig( level=logging.INFO, format="%(asctime)s %(levelname)s: %(message)s") parser = argparse.ArgumentParser(description=__doc__) parser.add_argument('database', type=sqlite3.connect, help='sqlite database (output of `rppr prep_db` after `guppy classify`)') parser.add_argument('by_taxon', type=argparse.FileType('w'), help='output CSV file which counts results by taxon') parser.add_argument('by_specimen', type=argparse.FileType('w'), nargs='?', help='optional output CSV file which counts results by specimen (requires specimen map)') parser.add_argument('group_by_specimen', type=argparse.FileType('w'), nargs='?', help='optional output CSV file which groups results by specimen (requires specimen map)') parser.add_argument('-r', '--want-rank', default='species', metavar='RANK', help='want_rank at which to tabulate results (default: %(default)s)') parser.add_argument('-m', '--specimen-map', type=argparse.FileType('r'), metavar='CSV', help='input CSV map from sequences to specimens') parser.add_argument('--metadata-map', type=argparse.FileType('r'), metavar='CSV', help='input CSV map including a specimen column and other metadata') parser.add_argument('--normalize-by-specimen', default=False, action='store_true', help="""By taxon output has normalized_tally results be normalized by specimen first, then by taxon. Additionally, the output of by-specimen will use normalized_tally rather than tally.""") args = parser.parse_args() if args.by_specimen and not args.specimen_map: parser.error('specimen map is required for by-specimen output') if args.normalize_by_specimen and not args.by_specimen: parser.error('must compute by-specimen in order to normalize by specimen') if args.specimen_map: log.info('populating specimens table from specimen map') curs = args.database.cursor() curs.execute("CREATE TEMPORARY TABLE specimens (name, specimen, PRIMARY KEY (name, specimen))") with args.specimen_map: reader = csv.reader(args.specimen_map) curs.executemany("INSERT INTO specimens VALUES (?, ?)", reader) if args.metadata_map: log.info('reading metadata map') with args.metadata_map: reader = csv.DictReader(args.metadata_map) args.metadata = {data['specimen']: data for data in reader} if args.by_specimen: by_specimen_results, specimens = by_specimen(args) if args.normalize_by_specimen: by_taxon_normalized_by_specimen(args, by_specimen_results, specimens) else: by_taxon(args) main() pplacer-1.1.alpha19/scripts/classif_table.py000077500000000000000000000244671303154601500211110ustar00rootroot00000000000000#!/usr/bin/env python """ Produce csv tables representing various counts in a classification database. Without a specimen map, only by_taxon output is available. If a specimen map is provided, additional output options are available presenting results by specimen. This map also adds columns to by_taxon output (notably the avg_freq column, indicating average frequency of the corresponding taxon across specimens). """ import argparse import logging import sqlite3 import csv log = logging.getLogger(__name__) # Used various places taxa_cols = ['tax_id', 'tax_name', 'rank'] def cursor_to_csv(curs, outfile, description=None): "Iterate over SQL cursor and write to outfile" if description is None: description = curs.description writer = csv.writer(outfile) writer.writerow([d[0] for d in description]) writer.writerows(curs) def by_taxon(args): """This function queries for the tally and placement count totals for each taxon at the desired rank. It does not require a specimen map.""" log.info('tabulating by_taxon') curs = args.database.cursor() curs.execute(""" SELECT COALESCE(tax_name, "unclassified") tax_name, COALESCE(t.tax_id, "none") tax_id, COALESCE(t.rank, "root") rank, CAST(SUM(mass) AS INT) tally, COUNT(DISTINCT placement_id) placements FROM multiclass_concat mc JOIN placement_names USING (name, placement_id) LEFT JOIN taxa t USING (tax_id) WHERE want_rank = ? GROUP BY t.tax_id ORDER BY tally DESC """, (args.rank,)) with args.by_taxon: cursor_to_csv(curs, args.by_taxon) def by_taxon_with_specimens(args, by_specimen_results, specimens): """This function uses by_specimen results to compute, for each taxon, the average frequency of that taxon across specimens.""" log.info('tabulating by_taxon using by_specimen results') n_specimens = float(len(specimens)) cols = taxa_cols + ['tally', 'placements', 'avg_tally', 'avg_placements', 'avg_freq' ] with args.by_taxon: writer = csv.writer(args.by_taxon) writer.writerow(cols) # Iterate over taxa in the by_specimen_results for result in by_specimen_results: row = [result[c] for c in taxa_cols] tally, placements, freqs = 0, 0, 0 # For each specimen, fetch counts from the dict they map to and add to totals for spec in specimens: if spec in result.keys(): spec_result = result[spec] tally += spec_result['tally'] placements += spec_result['placements'] freqs += spec_result['freq'] # Add count data to output row, and write out row += [tally, placements, tally/n_specimens, placements/n_specimens, freqs/n_specimens] writer.writerow(row) def by_specimen(args): """This function computes results by specimen, and if --by-specimen is supplied as an arg, writes results out to the specified file. The results of this function are also used downstream in calls to by_taxon_wide and by_specimen_wide. This function returns a list of dicts, and a list of specimens. Each dict has tax_id, tax_name and rank key/value pairs. For each specimen, these dicts map the corresponding specimen name to count results for that specimen.""" log.info('tabulating total per specimen mass sums') curs = args.database.cursor() curs.execute(""" CREATE TEMPORARY TABLE specimen_mass (specimen, total_mass, PRIMARY KEY (specimen))""") curs.execute(""" INSERT INTO specimen_mass SELECT specimen, SUM(mass) FROM specimens JOIN multiclass_concat mc USING (name) JOIN placement_names USING (name, placement_id) WHERE want_rank = ? GROUP BY specimen """, (args.rank,)) log.info('tabulating counts by specimen') curs.execute(""" SELECT specimen, COALESCE(tax_name, "unclassified") tax_name, COALESCE(t.tax_id, "none") tax_id, COALESCE(t.rank, "root") rank, CAST(SUM(mass) AS INT) tally, COUNT(DISTINCT placement_id) placements, SUM(mass) / sm.total_mass freq FROM specimens JOIN specimen_mass sm USING (specimen) JOIN multiclass_concat mc USING (name) JOIN placement_names USING (name, placement_id) LEFT JOIN taxa t USING (tax_id) WHERE want_rank = ? GROUP BY specimen, t.tax_id ORDER BY freq DESC """, (args.rank,)) desc = curs.description rows = curs.fetchall() # By specimen (tall) if args.by_specimen: log.info('writing by_specimen (tall)') with args.by_specimen: cursor_to_csv(rows, args.by_specimen, desc) # This will be a dictionary mapping each tax_id to a dictionary of data for the corresponding taxon results = {} specimens = set() for specimen, tax_name, tax_id, rank, tally, placements, freq in rows: row = results.get(tax_id) if row is None: # The taxon dict will include name and rank... row = results[tax_id] = dict(tax_id=tax_id, tax_name=tax_name, rank=rank) # and for each specimen with classifications for this taxon, a dictionary of the count results row[specimen] = dict(tally=tally, placements=placements, freq=freq) specimens.add(specimen) assert len(specimens.intersection(taxa_cols)) == 0, "The following are invalid specimen names: %r" % taxa_cols return (results.values(), specimens) def by_specimen_wide(args, handle, by_specimen_results, specimens, count): """Write out the specified count (tally/freq) into a wide table where rows are taxa and cols are specimens""" if not count in ('tally', 'freq', 'placements'): raise ValueError("Invalid count specified for by_specimen_wide output: {0}".format(count)) log.info('writing wide output with {0}'.format(count)) cols = ['tax_name', 'tax_id', 'rank'] + list(specimens) with handle: writer = csv.DictWriter(handle, fieldnames=cols, restval=0) writer.writeheader() # Write in the metadata if args.metadata_map: for key in {k for data in args.metadata.itervalues() for k in data}: d = {specimen: args.metadata.get(specimen, {}).get(key) for specimen in specimens} d['tax_name'] = key d['tax_id'] = d['rank'] = '' writer.writerow(d) # Little helper for us to safely pass through the count and non-count information from each result in # by_specimen_results. def count_or_taxdata(v): try: return v[count] except TypeError: return v # Write in the specified counts for row in by_specimen_results: row_dict = dict((col, count_or_taxdata(v)) for col, v in row.iteritems()) writer.writerow(row_dict) def main(): logging.basicConfig( level=logging.INFO, format="%(asctime)s %(levelname)s: %(message)s") # INPUTS parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) parser.add_argument('database', type=sqlite3.connect, help='sqlite database (output of `rppr prep_db` after `guppy classify`)') parser.add_argument('-m', '--specimen-map', type=argparse.FileType('r'), metavar='CSV', help='input CSV map from sequences to specimens (headerless; 1st col sequence id, 2nd specimen name') parser.add_argument('-M', '--metadata-map', type=argparse.FileType('r'), metavar='CSV', help="""input CSV map including a specimen column and other metadata; if specified gets merged in with whichever of freqs_wide and tallies_wide outputs are specified (must include header)""") parser.add_argument('-r', '--rank', default='species', metavar='RANK', help='rank at which results are to be tabulated (default: %(default)s)') # OUTPUTS parser.add_argument('by_taxon', type=argparse.FileType('w'), help='output CSV file with counts by taxon') parser.add_argument('-s', '--by-specimen', type=argparse.FileType('w'), nargs='?', help='optional output CSV file with counts by specimen and taxa (requires specimen map)') parser.add_argument('-f', '--freqs-wide', type=argparse.FileType('w'), nargs='?', help="""optional output CSV file where rows are taxa, columns are specimens, and entries are frequencies (requires specimen map)""") parser.add_argument('-t', '--tallies-wide', type=argparse.FileType('w'), nargs='?', help="""optional output CSV file where rows are taxa, columns are specimens, and entries are tallies (requires specimen map)""") args = parser.parse_args() if (args.by_specimen or args.freqs_wide or args.tallies_wide) and not args.specimen_map: parser.error('specimen map is required for by_specimen, freqs_wide and tallies_wide output') if args.metadata_map: log.info('reading metadata map') with args.metadata_map: reader = csv.DictReader(args.metadata_map) args.metadata = {data['specimen']: data for data in reader} if args.specimen_map: log.info('populating specimens table from specimen map') curs = args.database.cursor() curs.execute("CREATE TEMPORARY TABLE specimens (name, specimen, PRIMARY KEY (name, specimen))") with args.specimen_map: reader = csv.reader(args.specimen_map) curs.executemany("INSERT INTO specimens VALUES (?, ?)", reader) by_specimen_results, specimens = by_specimen(args) # By specimen wide output if args.freqs_wide: by_specimen_wide(args, args.freqs_wide, by_specimen_results, specimens, "freq") if args.tallies_wide: by_specimen_wide(args, args.tallies_wide, by_specimen_results, specimens, "tally") # By taxon computed from by_specimen results by_taxon_with_specimens(args, by_specimen_results, specimens) else: by_taxon(args) if __name__ == "__main__": main() pplacer-1.1.alpha19/scripts/deduplicate_sequences.py000077500000000000000000000201521303154601500226370ustar00rootroot00000000000000#!/usr/bin/env python """ Deduplicate sequences by group """ import argparse import bz2 import collections import csv import gzip import hashlib import sys import textwrap def sha1(s): return hashlib.sha1(s).digest() class ConstantDict(object): """ Dictionary-like object which returns return_value at every lookup """ def __init__(self, return_value=None): self.return_value = return_value def __getitem__(self, key): return self.return_value class IdentityDict(object): """ Dictionary-like object which returns the key at every lookup """ def __getitem__(self, key): return key def parse_fasta(fp): """ Parse a FASTA file, yielding (seqid, sequence) tuples Based on https://github.com/lh3/readfq """ fp = (i.rstrip() for i in fp) last = None while True: if not last: # the first record or a record following a fastq for l in fp: # search for the start of the next record if l[0] == '>': # Header last = l break if not last: break name, seqs, last = last[1:].split()[0], [], None for l in fp: # read the sequence if l[0] == '>': last = l break seqs.append(l) yield name, ''.join(seqs) def write_fasta(records, fp): """ Write a FASTA file from (id, sequence) tuples """ for seq_id, sequence in records: fp.write('>{0}\n{1}\n'.format(seq_id, sequence)) class DeduplicatedSequence(object): """ Sequence seen one or more times, with maps to the splits and counts within each split """ __slots__ = ('id', 'sequence', 'sequence_ids', 'split_map', 'counts') def __init__(self, seq_id, sequence): self.id = seq_id self.sequence = sequence # Sequence IDs for dedup file self.sequence_ids = [] # Map from sample -> representative sequence ID self.split_map = dict() # Counts per sequence ID self.counts = collections.Counter() def add(self, sequence_id, split=None, count=1): """ Add a sequence, with associated split and frequency. If another sequence from the same split has been seen previously, the count for the original sequence is increased by count. Otherwise, sequence_id will be present in the output. """ if split not in self.split_map: self.split_map[split] = sequence_id self.sequence_ids.append(sequence_id) key = self.split_map[split] self.counts[key] += count def count_records(self): """ Iterator of kept_id, orig_id, frequency tuples """ for sequence_id in self.sequence_ids: count = self.counts[sequence_id] yield self.id, sequence_id, count def parse_counts(fp): """ Parse a count file, with sequence ID in first field, count in the second Returns a dictionary mapping sequence ID to count. """ reader = csv.reader(fp) return {line[0]: int(line[1]) for line in reader} def parse_splits(fp): """ Parse a split file. Returns a dictionary mapping sequence ID to split """ reader = csv.reader(fp) return {r[0]: r[1] for r in reader} def deduplicate_sequences(seqrecords, counts, split_map): """ Deduplicate based on sequence. Returns a list of DeduplicatedSequence objects. """ r = {} for seq_id, sequence in seqrecords: guid = sha1(sequence) if guid not in r: r[guid] = DeduplicatedSequence(seq_id, sequence) r[guid].add(seq_id, split_map[seq_id], counts[seq_id]) return r.values() def write_map(deduplicated_sequences, fp): """ Writes (kept_seq_id, orig_seq_id, count) lines """ rows = (row for s in deduplicated_sequences for row in s.count_records()) writer = csv.writer(fp, quoting=csv.QUOTE_MINIMAL, lineterminator='\n') writer.writerows(rows) class Opener(object): """Like `argparse.FileType`, but supports gzip and bzip2 file compression by inferring compression type from file name suffix. Example: parser.add_argument('input_file', type=Opener('r')) parser.add_argument('output_file', type=Opener('w')) """ def __init__(self, mode = 'r', bufsize = -1): self._mode = mode self._bufsize = bufsize def __call__(self, fname): if fname is sys.stdout or fname is sys.stdin: return fname elif fname == '-': return sys.stdin if 'r' in self._mode else sys.stdout elif fname.endswith('.bz2'): return bz2.BZ2File(fname, self._mode, self._bufsize) elif fname.endswith('.gz'): mode = ''.join(c for c in self._mode if c not in 'U') return gzip.open(fname, mode, self._bufsize) else: return open(fname, self._mode, self._bufsize) def __repr__(self): args = self._mode, self._bufsize args_str = ', '.join(repr(arg) for arg in args if arg != -1) return '{}({})'.format(type(self).__name__, args_str) def main(): parser = argparse.ArgumentParser(description=textwrap.dedent(""" Deduplicate sequences in `input_fasta`, writing the results to `output_fasta`, which may then be used with pplacer. A count file suitable for use with `guppy redup -m` is written to stdout, by default. Note that if you wish to use the `split' placefiles (e.g., split by sample), from sequence_id to split_id should be given with `--split-map`. Similarly, if your sequences are already deduplicated in some way, you may pass in abundance information with `--input-count-file`. Input files and output files ending with ".gz" or ".bz2" will be opened using gzip or bzip2 file compression, respectively. """), formatter_class=argparse.RawDescriptionHelpFormatter) parser.add_argument('-c', '--input-count-file', dest='count_file', type=Opener('r'), help="""CSV file with rows containing sequence_id (column 1), abundance (column 2) count. If not specified, all sequences are given a count of 1.""") split_group = parser.add_mutually_exclusive_group() split_group.add_argument('-s', '--split-map', type=Opener('r'), help="""Headerless CSV file mapping from sequence id (column 1) to sample identifier (column 2). If not specified, all sequences are assumed to be from a single sample, and are fully deduplicated.""") split_group.add_argument('--keep-ids', action='store_true', help="""When specified, all sequence IDs will be written to the output file, rather than the first ID seen and count""") parser.add_argument('input_fasta', type=Opener('r'), help="""FASTA file to deduplicate""") parser.add_argument('output_fasta', type=Opener('w'), help="""Path to write deduplicated FASTA file""") parser.add_argument('-d', '--deduplicated-sequences-file', type=Opener('w'), dest='map_out', default=sys.stdout, help="""Destination for csv file of (kept_seq_id,orig_seq_id,count) rows [default: stdout]""") a = parser.parse_args() if a.count_file: with a.count_file as fp: counts = parse_counts(fp) else: # Default to an abundance of 1 for each sequence counts = ConstantDict(1) # Handle split placefiles if a.split_map: with a.split_map as fp: split_map = parse_splits(fp) elif a.keep_ids: # Makes each sequence ID part of a split containing only that sequence # ID, so all sequence IDs will be kept split_map = IdentityDict() else: # By default, everything part of the same split split_map = ConstantDict(None) with a.input_fasta as fp: sequences = parse_fasta(fp) dedup = deduplicate_sequences(sequences, counts, split_map) deduplicated = ((i.id, i.sequence) for i in dedup) with a.output_fasta as fp: write_fasta(deduplicated, fp) with a.map_out as fp: write_map(dedup, fp) if __name__ == '__main__': main() pplacer-1.1.alpha19/scripts/extract_taxonomy_from_biom.py000077500000000000000000000043711303154601500237470ustar00rootroot00000000000000#!/usr/bin/env python import argparse import logging import json import csv from taxtastic.taxtable import TaxNode log = logging.getLogger(__name__) ranks = dict(k='kingdom', p='phylum', c='class', o='order', f='family', g='genus', s='species') rank_order = ['root', 'kingdom', 'phylum', 'class', 'order', 'family', 'genus', 'species'] root_id = 'Root' def lineages(taxonomy, root_name=root_id): """ Yields (<;-delimited lineage>, , <;-delimited parent lineage>) tuple for every entry in ``taxonomy`` """ parent = root_name cur_lineage = [root_name] for node in taxonomy: cur_lineage.append(node) tax_id = ';'.join(cur_lineage) yield tax_id, node, parent parent = tax_id def main(): logging.basicConfig(level=logging.INFO, format="%(levelname)s: %(message)s") parser = argparse.ArgumentParser( description="Turn a BIOM file with a taxonomy into a taxtable and seqinfo.") parser.add_argument( 'biom', type=argparse.FileType('r'), help='input BIOM file') parser.add_argument( 'taxtable', type=argparse.FileType('w'), help='output taxtable') parser.add_argument( 'seqinfo', type=argparse.FileType('w'), help='output seqinfo') args = parser.parse_args() log.info('loading biom') with args.biom: j = json.load(args.biom) root = TaxNode('root', root_id, name='Root') root.ranks = rank_order seqinfo = csv.writer(args.seqinfo) seqinfo.writerow(('seqname', 'tax_id')) log.info('determining tax_ids') for leaf in j['rows']: leaf_taxonomy = leaf['metadata']['taxonomy'] # Drop nodes containing only rank (e.g. `s__`) leaf_taxonomy = [i for i in leaf_taxonomy if i[3:]] leaf_lineages = list(lineages([i for i in leaf_taxonomy if i[3:]])) seqinfo.writerow((leaf['id'], leaf_lineages[-1][0])) for tax_id, node, parent in leaf_lineages: if tax_id in root.index: continue root.get_node(parent).add_child( TaxNode(ranks[node[0]], tax_id, name=node[3:] or node)) log.info('writing taxtable') with args.taxtable: root.write_taxtable(args.taxtable) if __name__ == '__main__': main() pplacer-1.1.alpha19/scripts/hrefpkg_query.py000077500000000000000000000254421303154601500211630ustar00rootroot00000000000000#!/usr/bin/env python import collections import subprocess import itertools import argparse import tempfile import logging import os.path import sqlite3 import atexit import shutil import errno import shlex import csv from taxtastic.refpkg import Refpkg from Bio import SeqIO log = logging.getLogger(__name__) def logging_check_call(cmd, *a, **kw): log.info(' '.join(cmd)) return subprocess.check_call(cmd, *a, **kw) def silently_unlink(path): try: os.unlink(path) except OSError, e: if e.errno != errno.ENOENT: raise input_suffixes = {'align-each': 'fasta', 'merge-each': 'sto', 'none': 'sto'} def main(): logging.basicConfig( level=logging.INFO, format="%(levelname)s: %(message)s") parser = argparse.ArgumentParser( description="Classify query sequences using a hrefpkg.") parser.add_argument('hrefpkg', help="hrefpkg to classify using") parser.add_argument('query_seqs', help="input query sequences") parser.add_argument('classification_db', help="output sqlite database") parser.add_argument('-j', '--ncores', default=1, type=int, metavar='CORES', help="number of cores to tell commands to use") parser.add_argument('-r', '--classification-rank', metavar='RANK', help="rank to perform the initial NBC classification at") parser.add_argument('--classifier', default='pplacer', help="which classifier to use with guppy classify") parser.add_argument('--pplacer-args', default=[], type=shlex.split, help="additional arguments for pplacer") parser.add_argument('--classification-args', default=[], type=shlex.split, help="additional arguments for guppy classification") parser.add_argument('--post-prob', default=False, action='store_true', help="place with posterior probabilities") parser.add_argument('--workdir', metavar='DIR', help=("directory to write intermediate files to " "(default: a temporary directory)")) parser.add_argument('--disable-cleanup', default=False, action='store_true', help="don't remove the work directory as the final step") parser.add_argument('--use-mpi', default=False, action='store_true', help="run refpkg_align with MPI") parser.add_argument( '--alignment', choices=['align-each', 'merge-each', 'none'], default='align-each', help=("respectively: align each input sequence; subset an input stockholm " "alignment and merge each sequence to a reference alignment; only subset " "an input stockholm alignment (default: align-each)")) parser.add_argument( '--cmscores', type=argparse.FileType('w'), metavar='FILE', help="in align-each mode, write out a file containing the cmalign scores") programs = parser.add_argument_group("external binaries") programs.add_argument( '--pplacer', default='pplacer', metavar='PROG', help="pplacer binary to call") programs.add_argument( '--guppy', default='guppy', metavar='PROG', help="guppy binary to call") programs.add_argument( '--rppr', default='rppr', metavar='PROG', help="rppr binary to call") programs.add_argument( '--refpkg-align', default='refpkg_align.py', metavar='PROG', help="refpkg_align binary to call") programs.add_argument( '--cmalign', default='cmalign', metavar='PROG', help="cmalign binary to call") args = parser.parse_args() if args.ncores < 0: args.error('ncores must be >= 0') mpi_args = [] if args.use_mpi and args.ncores > 0: mpi_args = ['--use-mpi', '--mpi-arguments', '-np %d' % (args.ncores,)] if args.workdir is None: workdir = tempfile.mkdtemp() else: workdir = args.workdir try: os.makedirs(workdir) except OSError, e: if e.errno != errno.EEXIST: raise if not args.disable_cleanup: @atexit.register def cleanup_workdir(): shutil.rmtree(workdir, ignore_errors=True) classif_db = os.path.join(workdir, 'classifications.sqlite') index_refpkg = os.path.join(args.hrefpkg, 'index.refpkg') index = Refpkg(index_refpkg) index_rank = index.metadata('index_rank') classif_rank = args.classification_rank or index_rank index_counts = os.path.join(args.hrefpkg, 'index-%s.counts' % (classif_rank,)) log.info('performing initial classification at %s', classif_rank) silently_unlink(classif_db) logging_check_call( [args.rppr, 'prep_db', '--sqlite', classif_db, '-c', index_refpkg]) logging_check_call( [args.guppy, 'classify', '--sqlite', classif_db, '-c', index_refpkg, '--classifier', 'nbc', '--nbc-rank', classif_rank, '--no-pre-mask', '--nbc-sequences', args.query_seqs, '--nbc-counts', index_counts, '-j', str(args.ncores)]) with open(os.path.join(args.hrefpkg, 'index.csv'), 'rU') as fobj: refpkg_map = dict(csv.reader(fobj)) log.info('determining bins at %s', index_rank) conn = sqlite3.connect(classif_db) curs = conn.cursor() curs.execute(""" SELECT name, tax_id FROM multiclass WHERE want_rank = ? AND rank = want_rank """, (index_rank,)) seq_bins = dict(curs) all_bins = set(seq_bins.itervalues()) & set(refpkg_map) log.info('classified into %d bins', len(all_bins)) log.debug('bins: %r', all_bins) bin_outputs = {} bin_counts = collections.Counter() input_suffix = input_suffixes[args.alignment] def binfile(bin): return os.path.join(workdir, '%s.%s' % (bin, input_suffix)) for bin in all_bins: bin_outputs[bin] = open(binfile(bin), 'w') if args.alignment == 'align-each': for seq in SeqIO.parse(args.query_seqs, 'fasta'): bin = seq_bins.get(seq.id) if bin is None or bin not in bin_outputs: continue SeqIO.write([seq], bin_outputs[bin], 'fasta') bin_counts[bin] += 1 # Gross ad-hoc stockholm parser. This is only necessary because biopython # can't handle the metadata that cmalign adds to the file. else: def write_all(lines): for line in lines: for fobj in bin_outputs.itervalues(): fobj.write(line) with open(args.query_seqs, 'r') as fobj: # Copy the stockholm header, write_all(itertools.islice(fobj, 3)) # then partition the sequences, for line in fobj: # (stopping if we reach the metadata at the end (hopefully it's at # the end)) if line.startswith('#=GC'): break id, seq = line.split() bin = seq_bins.get(id) if bin is None or bin not in bin_outputs: continue bin_outputs[bin].write(line) bin_counts[bin] += 1 # and then copy the footer. write_all([line]) write_all(fobj) for fobj in bin_outputs.itervalues(): fobj.close() # This is a bit nasty but I think it's Good Enough. We can change it if we # encounter problems or need to be more portable. if args.cmscores is not None: cmscores_proc = subprocess.Popen( ['romp', 'cmscores', '/dev/stdin'], stdin=subprocess.PIPE, stdout=args.cmscores) cmscores_args = [ '--alignment-method', 'INFERNAL', '--stdout', '/dev/fd/%d' % (cmscores_proc.stdin.fileno(),)] cmscores_stdout = cmscores_proc.stdout else: cmscores_proc = None cmscores_args = [] cmscores_stdout = open(os.devnull, 'w') for e, bin in enumerate(all_bins): log.info('classifying bin %s (%d/%d; %d seqs)', bin, e + 1, len(all_bins), bin_counts[bin]) input = binfile(bin) aligned = os.path.join(workdir, bin + '-aligned.sto') placed = os.path.join(workdir, bin + '.jplace') refpkg = os.path.join(args.hrefpkg, refpkg_map[bin]) if args.alignment == 'align-each': logging_check_call( [args.refpkg_align, 'align', '--output-format', 'stockholm', refpkg, input, aligned] + mpi_args + cmscores_args) elif args.alignment == 'merge-each': refpkg_obj = Refpkg(refpkg) logging_check_call( [args.cmalign, '--merge', '-o', aligned, '-1', '--hbanded', '--sub', '--dna', refpkg_obj.resource_path('profile'), refpkg_obj.resource_path('aln_sto'), input], stdout=cmscores_stdout) elif args.alignment == 'none': raise NotImplementedError('none') classifier_args, pplacer_args = [], [] if args.classifier.startswith('nbc') or args.classifier.startswith('hybrid'): if '--no-pre-mask' not in args.classification_args: classifier_args.append('--no-pre-mask') classifier_args.extend(['--nbc-sequences', input]) if args.post_prob: classifier_args.append('--pp') pplacer_args.extend( ['-p', '--inform-prior', '--prior-lower', '0.01']) logging_check_call( [args.pplacer, '--discard-nonoverlapped', '-c', refpkg, '-j', str(args.ncores), aligned, '-o', placed] + args.pplacer_args + pplacer_args) logging_check_call( [args.guppy, 'classify', '--sqlite', classif_db, '-c', refpkg, placed, '-j', str(args.ncores), '--classifier', args.classifier] + args.classification_args + classifier_args) if cmscores_proc is not None: cmscores_proc.communicate() log.info('cleaning up `multiclass` table') conn.rollback() curs = conn.cursor() curs.execute(""" CREATE TEMPORARY TABLE classified AS SELECT name, COUNT(DISTINCT run_id) n_runs FROM multiclass JOIN placements USING (placement_id) GROUP BY name HAVING n_runs > 1 """) curs.execute("SELECT name FROM classified WHERE n_runs > 2") too_many_classifications = [name for name, in curs] if too_many_classifications: raise ValueError("some sequences got classified more than twice", too_many_classifications) curs.execute(""" DELETE FROM multiclass WHERE (SELECT run_id FROM placements p WHERE p.placement_id = multiclass.placement_id) = 1 AND name IN (SELECT name FROM classified) """) conn.commit() shutil.copy(classif_db, args.classification_db) main() pplacer-1.1.alpha19/scripts/multiclass_concat.py000077500000000000000000000257061303154601500220220ustar00rootroot00000000000000#!/usr/bin/env python """This script serves two roles: * Depending on the classification method used, the classification database may be left in an inconsistent/incomplete state. In particular, the multiclass table may not contain classifications for all the sequences needed to obtain accurate read count tallies from classif_table. This script fixes these issues, but must have the dedup_info data if the sequences you passed to guppy classify were deduplicated. * Creates a view `multiclass_concat` and add names for concatenated taxids to the taxa table. This step is also necessary to run classif_table, which groups results by these concatenated taxa. Note that the file specified by `-d/--dedup-info` is the output of `deduplicate_sequence.py -d/--deduplicated-sequences-file` and is a headerless csv file with fields (kept_seq_id,orig_seq_id,count). This file is necessary for obtaining accurate results if the sequences provided to pplacer were deduplicated, and `guppy classify` was run with any method other than the "pplacer" method. """ import itertools import argparse import operator import warnings import logging import sqlite3 import csv log = logging.getLogger(__name__) warnings.filterwarnings("always", category=UserWarning) rerun_warning_message = """ It appears that you already have a table named old_placement_names. Presumably, you have already run multiclass_concat on this database and opted for --keep-tables. As such, we are leaving old_placement_names intact instead of renaming placement_names to old_placement_names """ no_dedup_info_error = """ You did not to pass in a --dedup-info file! Unless you did not perform deduplication or are using the 'pplacer' classification method, this will lead to inconsistent results in downstream analyses using this database. If you did not perform deduplication, please specify the --no-dedup flag to avoid this Exception. """ def concat_name(taxnames, rank, sep='/'): """Heuristics for creating a sensible combination of species names.""" splits = [x.split() for x in taxnames] if (rank == 'species' and all(len(x) > 1 for x in splits) and len(set(s[0] for s in splits)) == 1): name = '%s %s' % (splits[0][0], sep.join(sorted('_'.join(s[1:]) for s in splits))) else: name = sep.join('_'.join(s) for s in splits) return name def add_multiclass_concat(database): """Does all the work of creating a multiclass concat table, populating it, and ensuring there are taxa records for the concatenated taxa.""" curs = database.cursor() curs.execute('DROP TABLE IF EXISTS multiclass_concat') curs.execute(""" CREATE TABLE multiclass_concat AS SELECT placement_id, name, want_rank, GROUP_CONCAT(DISTINCT tax_id) AS tax_id, GROUP_CONCAT(DISTINCT rank) AS rank, SUM(likelihood) AS likelihood, COUNT(*) AS id_count FROM multiclass GROUP BY placement_id, name, want_rank """) curs.execute('CREATE INDEX multiclass_concat_name ON multiclass_concat (name)') # Get all of the constructed tax_ids and their constituent tax_names. curs.execute(""" SELECT DISTINCT mcc.tax_id, mc.rank, t.tax_name FROM multiclass_concat mcc JOIN multiclass mc USING (placement_id, name, want_rank) JOIN taxa t ON t.tax_id = mc.tax_id WHERE id_count > 1 """) new_taxa = itertools.groupby(curs, operator.itemgetter(slice(None, 2))) def build_new_taxa(): for (tax_id, rank), names in new_taxa: new_name = concat_name([name for _, _, name in names], rank) log.info('adding %r as %r at %r', tax_id, new_name, rank) yield tax_id, rank, new_name # We need another cursor so we can read from one and write using the other. database.cursor().executemany( "INSERT OR REPLACE INTO taxa (tax_id, rank, tax_name) VALUES (?, ?, ?)", build_new_taxa()) database.commit() def clean_database(database, dedup_info): """This function cleans up the database when deduplication has been used so that 1) the placement_name records pointed to in multiclass have the correct mass and 2) multiclass is inflated so that for each set of sequences deduplicated to a single sequence, there is at least one sequence (placement_name pointed to) represented in multiclass for each specimen.""" curs = database.cursor() # First create an index on multiclass. This will ensure we don't put anything in twice curs.execute("""CREATE UNIQUE INDEX IF NOT EXISTS multiclass_index ON multiclass (name, want_rank, tax_id)""") try: # Rename placement_names so that we can create a new, correct placement_names. If user specifies # --keep-tables, we'll leave this copy in, in case they need it for mucking with things curs.execute("""ALTER TABLE placement_names RENAME TO old_placement_names""") except sqlite3.OperationalError: # If we can't do this, this is probably the second time running the script and the user wanted to keep # tables, so raise a warning message for them, and just delete placement_names warnings.warn(rerun_warning_message) curs.execute("DROP TABLE IF EXISTS placement_names") # Create the new placement_names table (note origin, which is in the origin, is not needed here) curs.execute(""" CREATE TABLE placement_names ( placement_id INTEGER NOT NULL, name TEXT NOT NULL, mass REAL NOT NULL, PRIMARY KEY (name))""") # Read the dedup info into a new dedup_info table. We need this for it's masses and for inflating # multiclass so it has classifications for all of the sequences it's supposed to curs.execute("DROP TABLE IF EXISTS dedup_info") curs.execute(""" CREATE TABLE dedup_info ( global_rep TEXT NOT NULL, specimen_rep TEXT NOT NULL, mass REAL NOT NULL, PRIMARY KEY (global_rep, specimen_rep))""") curs.executemany("INSERT INTO dedup_info VALUES (?, ?, ?)", dedup_info) # POPULATING placement_names: # First - fill with the things that we have matches for in the multiclass table. We'll use the # placement_id values in multiclass as the corresponding values in placement_names and get masses from # dedup_info curs.execute(""" INSERT INTO placement_names SELECT placement_id, name, mass FROM dedup_info JOIN (SELECT DISTINCT placement_id, name FROM multiclass) ON name = specimen_rep""") # Next - fill with the things there weren't name matches for in multiclass. Here, we look for the names # in dedup_info that are missing in multiclass, then use the global_rep match found in placement_names for # a (somewhat dummy) placement_id. WARNING! this placement_id may not actually be consistent with the # extraneous tables in the database (those deleted if --keep-tables isn't specified). curs.execute(""" INSERT INTO placement_names SELECT placement_id, specimen_rep, di.mass FROM placement_names JOIN (SELECT * FROM dedup_info WHERE specimen_rep NOT IN (SELECT DISTINCT name from multiclass)) di ON global_rep = name""") # Inflate multiclass - now that placement_names is complete, we find the names that are missing in the # multiclass table, and using dedup_info, figure out for each of these names what the "global_rep" name is # that already lies in multiclass and create a copy of those mc tables where the name and placement id # point to the afore mentioned "missing" placement_id and name in placement_names. curs.execute(""" INSERT INTO multiclass SELECT pn.placement_id, specimen_rep, want_rank, rank, tax_id, likelihood FROM (SELECT * FROM placement_names WHERE name NOT IN (SELECT DISTINCT name from multiclass)) pn JOIN dedup_info ON pn.name = specimen_rep JOIN multiclass mc ON mc.name = global_rep""") # Commit database database.commit() def drop_uneeded_tables(database): """Since the most pertinent tables are already going to be included in the database, we can drop all the extra "housekeeping" tables used in the classification process to conserve space and consistency.""" curs = database.cursor() for table in ["placement_classifications", "placement_evidence", "placement_median_identities", "placement_nbc", "placement_positions", "old_placement_names", "dedup_info", "runs"]: curs.execute("DROP TABLE IF EXISTS %s" % table) database.commit() def main(): logging.basicConfig( level=logging.INFO, format="%(levelname)s: %(message)s") parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) parser.add_argument('database', type=sqlite3.connect, help="sqlite database (output of `rppr prep_db` after `guppy classify`)") parser.add_argument('-d', '--dedup-info', type=argparse.FileType('r'), help="""Headerless CSV file with fields "kept_seq_id","orig_seq_id","count" (see note above)""") parser.add_argument('-n', '--no-dedup', action="store_true", help="""If the classified data was not deduplicated and you can not pass in --dedup-info, this flag must be specified to avoid a runtime error.""") parser.add_argument('-k', '--keep-tables', action="store_true", help="""If specified, keep "scratch work" tables used in classification algorithms, and a copy of the current placement_names table renamed to old_placement_names. This option is advised against as placement_id consistency is not guaranteed with these tables; they can also take up quite a bit of space""") args = parser.parse_args() # Clean up the database so that masses will come out correctly/completely for all specimens downstream if args.dedup_info: log.info("Starting cleanup") dedup_info_reader = csv.reader(args.dedup_info) clean_database(args.database, dedup_info_reader) elif not args.no_dedup: raise Exception(no_dedup_info_error) # Run the actual multiclass_concat code log.info("Adding multiclass_concat") add_multiclass_concat(args.database) if not args.keep_tables: log.info("Removing uneeded tables") drop_uneeded_tables(args.database) if __name__ == '__main__': main() pplacer-1.1.alpha19/scripts/pca_for_qiime.py000077500000000000000000000014711303154601500211010ustar00rootroot00000000000000#!/usr/bin/env python import argparse import csv def main(): parser = argparse.ArgumentParser( description=( "convert a `guppy pca` trans file to the format expected by " "QIIME's plotting functions")) parser.add_argument( 'trans', type=argparse.FileType('r'), help="input PCA trans file") parser.add_argument( 'tsv', type=argparse.FileType('w'), help="output QIIME-compatible TSV") args = parser.parse_args() with args.trans, args.tsv: reader = csv.reader(args.trans) writer = csv.writer(args.tsv, dialect=csv.excel_tab) first_line = next(reader) writer.writerow(['pc vector number'] + range(1, len(first_line))) writer.writerow(first_line) writer.writerows(reader) if __name__ == '__main__': main() pplacer-1.1.alpha19/scripts/refpkg_align.py000077500000000000000000000414041303154601500207340ustar00rootroot00000000000000#!/usr/bin/env python import argparse import contextlib import itertools import json import logging import os import os.path import re import shlex import subprocess import sys import tempfile from Bio import SeqIO, AlignIO from Bio.Seq import Seq log = logging.getLogger(__name__) class InvalidReferencePackage(Exception): pass # Prefer taxtastic refpkg try: from taxtastic.refpkg import Refpkg except ImportError: class Refpkg(object): """ Minimal representation of a reference package, supporting file lookup. All of this (and much more) is in taxtastic.refpkg, but this loses a dependency. """ def __init__(self, path, create=False): if not os.path.isdir(path): raise InvalidReferencePackage("{0} is not a directory.".format(path)) self.path = os.path.abspath(path) self.contents_path = self._join('CONTENTS.json') if not os.path.exists(self.contents_path): raise InvalidReferencePackage( "CONTENTS.json not found. Is this a reference package?") with open(self.contents_path) as fp: self.contents = json.load(fp) def _join(self, *args): return os.path.join(self.path, *args) def resource_path(self, key): return self._join(self.contents['files'][key]) def open_resource(self, key, *mode): return open(self.resource_path(key), *mode) # Add some functionality to the Taxtastic / minimal reference package # from above class ReferencePackage(Refpkg): def __init__(self, *args, **kwargs): super(ReferencePackage, self).__init__(*args, **kwargs) def guess_align_method(self): if 'profile' not in self.contents['files']: return 'PyNAST' else: with self.open_resource('profile') as fp: header = next(fp) if header.startswith('INFERNAL-1'): return 'INFERNAL' elif header.startswith('HMMER3'): return 'HMMER3' else: raise ValueError( "Couldn't determine alignment method from '{0}'".format(header)) @property def has_mask(self): return 'mask' in self.contents['files'] @contextlib.contextmanager def _temp_file(**kwargs): """ Returns a handle for a temporary file, kept for the length of the context manager. """ try: with tempfile.NamedTemporaryFile(delete=False, **kwargs) as tf: yield tf finally: if os.path.exists(tf.name): os.unlink(tf.name) # Alignment tools def _parse_stockholm_consensus(sto_handle): """ Return a boolean list indicating if a column at a given index is a consensus column according to the GC RF line. """ rf_rex = re.compile(r"#=GC RF\s+(\S*)\s*$") def is_consensus(c): if c not in 'x.': raise ValueError("Unexpected character in mask: {0}".format(c) + " Only 'x' and '.' are permitted") return c == 'x' lines = (line.rstrip() for line in sto_handle) matches = (rf_rex.match(line) for line in lines) rf = "".join(m.group(1) for m in matches if m) return AlignmentMask([is_consensus(c) for c in rf]) class AlignmentMask(object): """ A mask of positions which are revealed in the alignment. Any positions which evaluate to False in the mask are dropped. """ def __init__(self, mask): self.mask = mask def __len__(self): return len(self.mask) def apply(self, maskable): """ Apply the mask to a list/tuple/string of equal length """ if not len(maskable) == len(self.mask): raise ValueError("Record length != mask length!") return list(itertools.compress(maskable, self.mask)) def mask_records(self, sequence_records): """ Apply mask to an iterable of SeqRecord objects, dropping positions evaluating to False in the records """ log.info("Applying mask: keeping %d/%d positions", sum(self.mask), len(self)) for record in sequence_records: if not len(record) == len(self.mask): raise ValueError("Record length != mask length!") seq = Seq(''.join(self.apply(str(record.seq)))) # Do the same for letter annotations letter_annotations = {} for k, v in record.letter_annotations.items(): new_value = self.apply(v) # Convert to string if it started as such, otherwise a list is # fine. if isinstance(v, basestring): new_value = ''.join(new_value) letter_annotations[k] = new_value record.letter_annotations = {} record.seq = seq record.letter_annotations = letter_annotations yield record @property def unmasked_count(self): return sum(self.mask) @classmethod def from_csv_file(cls, handle, length): """ Create an alignment mask from file handle containing a comma-delimited list of integers Each integer is a position which should *not* be masked in the output. """ unmasked_positions = set(int(i.strip()) for i in handle.read().split(',')) mask = [i in unmasked_positions for i in xrange(length)] return cls(mask) def __and__(self, other): if not isinstance(AlignmentMask, other): raise TypeError("Cannot compare to " + str(other)) new_mask = [i and j for i, j in zip(self.mask, other.mask)] return AlignmentMask(new_mask) def generate_mask(refpkg, stockholm_alignment): """ Generate an AlignmentMask from a reference package and stockholm alignment """ with refpkg.open_resource('mask') as fp: unmasked_positions = set(int(i.strip()) for i in fp.read().split(',')) # Get length of alignment with open(stockholm_alignment) as fp: align_length = len(AlignIO.read(stockholm_alignment, 'stockholm')[0]) # Load consensus columns with open(stockholm_alignment) as fp: consensus_columns = _parse_stockholm_consensus(fp) if not align_length == len(consensus_columns.mask): raise ValueError("Consensus Columns and Alignment have " "differing lengths") counter = itertools.count().next consensus_column_indexes = (counter() if i else None for i in consensus_columns.mask) consensus_mask = AlignmentMask([i in unmasked_positions for i in consensus_column_indexes]) return consensus_mask def mask_sequences(refpkg, source, target): """ Apply mask from reference package to the source file, writing to target file. """ mask = generate_mask(refpkg, source) masked_sequences = mask.mask_records( SeqIO.parse(source, 'stockholm')) SeqIO.write(masked_sequences, target, 'stockholm') def hmmer_align(refpkg, sequence_file, output_path, use_mask=True, use_mpi=False, mpi_args=None, mpi_program=None, program_path='hmmalign', alignment_options=None, stdout=None): d = os.path.dirname(output_path) with tempfile.NamedTemporaryFile(dir=d, prefix='.hmmer_aln') as tf: cmd = [program_path, '-o', tf.name, '--mapali', refpkg.resource_path('aln_sto')] cmd.extend(alignment_options or []) cmd.extend((refpkg.resource_path('profile'), sequence_file)) log.info(' '.join(cmd)) subprocess.check_call(cmd, stdout=stdout) if refpkg.has_mask and use_mask: mask_sequences(refpkg, tf.name, output_path) else: tf.delete = False tf.close() os.rename(tf.name, output_path) def infernal_align(refpkg, sequence_file, output_path, use_mask=True, use_mpi=False, mpi_args=None, mpi_program='mpirun', program_path='cmalign', alignment_options=None, stdout=None): d = os.path.dirname(output_path) base_command = ['cmalign'] if use_mpi: base_command = [mpi_program] + (mpi_args or []) + base_command + \ ['--mpi'] with tempfile.NamedTemporaryFile(prefix='.infernal_aln', dir=d) as tf, \ tempfile.NamedTemporaryFile(prefix='.infernal_merged', dir=d) as merged: cmd = base_command[:] cmd.extend(alignment_options or []) cmd.extend(['-o', tf.name, refpkg.resource_path('profile'), sequence_file]) log.info(' '.join(cmd)) subprocess.check_call(cmd, stdout=stdout) # Merge log.info("Merging.") cmd = [program_path, '--merge', '-o', merged.name] cmd.extend(alignment_options or []) cmd.extend((refpkg.resource_path('profile'), refpkg.resource_path('aln_sto'), tf.name)) log.info(' '.join(cmd)) # write the merge output to /dev/null: only the initial cmalign command # produces useful output. with open(os.devnull) as devnull: subprocess.check_call(cmd, stdout=devnull) tf.close() if refpkg.has_mask and use_mask: mask_sequences(refpkg, merged.name, output_path) else: merged.delete = False merged.close() os.rename(merged.name, output_path) def pynast_align(refpkg, sequence_file, output_path, use_mask=True, use_mpi=False, mpi_args=None, mpi_program='mpirun', program_path='pynast', alignment_options=None, stdout=None): if use_mask and refpkg.has_mask: raise NotImplementedError("Cannot mask with PyNAST") cmd = [program_path] cmd.extend(alignment_options or []) cmd.extend(['-t', refpkg.resource_path('aln_fasta'), '-i', sequence_file, '-a', output_path]) log.info(' '.join(cmd)) subprocess.check_call(cmd, stdout=stdout) ALIGNERS = { 'HMMER3': hmmer_align, 'INFERNAL': infernal_align, 'PyNAST': pynast_align, } # Default options that can be used by scripts. # Keys for search_options and alignment options must map to a valid profile. ALIGNMENT_DEFAULTS = { 'INFERNAL': ['-1', '--hbanded', '--sub', '--dna'], 'PyNAST': ['-l', '150', '-f', os.devnull, '-g', os.devnull] } # Default output format DEFAULT_FORMAT = {'HMMER3': 'stockholm', 'INFERNAL': 'stockholm', 'PyNAST': 'fasta'} def align(arguments): """ Align sequences to a reference package alignment. """ refpkg = arguments.refpkg prof = arguments.profile_version or refpkg.guess_align_method() alignment_func = ALIGNERS[prof] alignment_options = (arguments.alignment_options or ALIGNMENT_DEFAULTS.get(prof)) dn = os.path.dirname(arguments.outfile) with _temp_file(prefix='.refpkg_align', dir=dn) as tf: tf.close() r = alignment_func(refpkg, arguments.seqfile, tf.name, use_mask=arguments.use_mask, use_mpi=arguments.use_mpi, mpi_args=arguments.mpi_arguments, mpi_program=arguments.mpi_run, alignment_options=alignment_options, stdout=arguments.stdout) if (not arguments.output_format or arguments.output_format == DEFAULT_FORMAT[prof]): # No format converseion needed os.rename(tf.name, arguments.outfile) else: # Convert SeqIO.convert(tf.name, DEFAULT_FORMAT[prof], arguments.outfile, arguments.output_format) return r def extract(arguments): """ Extract a reference alignment from a reference package """ refpkg = arguments.refpkg # If not masking, just copy the sequences, reformatting if appropriate if not arguments.use_mask: with refpkg.open_resource('aln_sto') as input_fp: with arguments.output_file as output_fp: result = SeqIO.convert(input_fp, 'stockholm', output_fp, arguments.output_format) logging.info("Wrote %d sequences", result) return # Mask will be applied if available with refpkg.open_resource('aln_sto') as fp: alignment_length = len(next(SeqIO.parse(fp, 'stockholm'))) # Rewind fp.seek(0) sequences = SeqIO.parse(fp, 'stockholm') try: with refpkg.open_resource('mask') as fp: mask = AlignmentMask.from_csv_file(fp, alignment_length) logging.info("Applying mask - keeping %d/%d positions", mask.unmasked_count, len(mask)) sequences = mask.mask_records(sequences) except KeyError: log.warn("No mask found. Extracting all columns.") with arguments.output_file as output_fp: result = SeqIO.write(sequences, output_fp, arguments.output_format) logging.info("Wrote %d sequences.", result) def main(argv=sys.argv[1:]): """ Parse command-line arguments. """ logging.basicConfig(level=logging.INFO, format="%(levelname)s: %(message)s") align_defaults = ' '.join('({0}: "{1}")'.format(profile, ' '.join(options)) for profile, options in ALIGNMENT_DEFAULTS.items()) parser = argparse.ArgumentParser(description="""Wrapper script for Infernal and HMMER alignment binaries.""") # Setup sub-commands subparsers = parser.add_subparsers(dest='subparser_name') # Help parser_help = subparsers.add_parser('help', help='Help for actions') parser_help.add_argument('action', nargs=1) # align parser_align = subparsers.add_parser('align', help=align.__doc__) parser_align.set_defaults(func=align) parser_align.add_argument('--align-opts', dest='alignment_options', metavar='OPTS', help="""Alignment options, such as "--mapali $aln_sto". '$' characters will need to be escaped if using template variables. Available template variables are $aln_sto, $profile. Defaults are as follows for the different profiles: """ + align_defaults, type=shlex.split) parser_align.add_argument('--alignment-method', dest='profile_version', choices=ALIGNERS.keys(), help="""Profile version to use. [default: Guess. PyNAST is used if a valid CM or HMM is not found in the reference package.]""") parser_align.add_argument('--no-mask', default=True, dest="use_mask", action='store_false', help="""Do not trim the alignment to unmasked columns. [default: apply mask if it exists]""") parser_align.add_argument('refpkg', type=ReferencePackage, help="""Reference package directory""") parser_align.add_argument('seqfile', help="""Input file, in FASTA format.""") parser_align.add_argument('outfile', help="""Output file""") parser_align.add_argument('--stdout', help="""Write alignment program stdout to FILE [default: /dev/null]""", default=open(os.devnull), metavar='FILE', type=argparse.FileType('w')) parser_align.add_argument('--debug', action='store_true', help='Enable debug output', default=False) parser_align.add_argument('--verbose', action='store_true', help='Enable verbose output') parser_align.add_argument('--output-format', help="""Write output in FORMAT [default: stockholm for HMMER, INFERNAL; fasta for PyNAST]""", choices=('fasta', 'stockholm')) mpi_args = parser_align.add_argument_group(description="MPI Options [INFERNAL only]") mpi_args.add_argument('--use-mpi', action='store_true', default=False, help="""Use MPI [default: %(default)s]""") mpi_args.add_argument('--mpi-arguments', type=shlex.split, help="""Arguments to pass to mpirun [default: %(default)s]""") mpi_args.add_argument('--mpi-run', default='mpirun', help="""Name of mpirun executable [default: %(default)s]""") # extract parser_extract = subparsers.add_parser('extract', help=extract.__doc__) parser_extract.set_defaults(func=extract) parser_extract.add_argument("--output-format", default="stockholm", help="output format [default: %(default)s]") parser_extract.add_argument("--no-mask", dest='use_mask', default=True, action="store_false", help="""Do not apply mask to alignment [default: apply mask if it exists]""") parser_extract.add_argument('refpkg', type=ReferencePackage, help='Reference package directory') parser_extract.add_argument('output_file', type=argparse.FileType('w'), help="""Destination""") arguments = parser.parse_args() action = arguments.subparser_name arguments = parser.parse_args(argv) if action == 'help': main([str(arguments.action[0]), '-h']) arguments.func(arguments) if __name__ == "__main__": main() pplacer-1.1.alpha19/scripts/setup.py000066400000000000000000000023601303154601500174370ustar00rootroot00000000000000try: # Prefer setuptools if it exists - cleaner uninstall from setuptools import setup except ImportError: from distutils.core import setup import glob import os.path import re import warnings VERSION_FILE = '../common_src/version.ml' VERSION_PATTERN = r'^let version = "(.*)"$' def get_version(): """ parse version """ r = re.compile(VERSION_PATTERN) if not os.path.exists(VERSION_FILE): return 'unknown' with open(VERSION_FILE) as fp: for line in fp: m = r.match(line) if m: return m.group(1) raise ValueError("Couldn't find version in {0}".format(VERSION_FILE)) def scripts(): # Scripts depending on biopython scripts = [i for i in glob.glob('*.py') if not i.startswith('test_') and i != 'setup.py'] try: # Check for biopython import Bio except ImportError: warnings.warn("BioPython is not installed. Some scripts will not work") return scripts setup(name='pplacer-scripts', version=get_version(), description='Complementary scripts for use with pplacer', author='Erick Matsen, Aaron Gallagher, Connor McCoy, Brian Hodges', url='http://matsen.fhcrc.org/pplacer', scripts=scripts(), ) pplacer-1.1.alpha19/scripts/sort_placefile.py000077500000000000000000000013171303154601500212760ustar00rootroot00000000000000#!/usr/bin/env python import operator import argparse import json import sys def find_name(p): ret = p.get('n') if ret is None: ret = p.get('nm') return ret def main(args): parser = argparse.ArgumentParser() parser.add_argument( '-o', '--outfile', metavar='FILE', type=argparse.FileType('wb'), default=sys.stdout) parser.add_argument('infile', type=argparse.FileType('rb')) args = parser.parse_args(args) placerun = json.load(args.infile) placerun['placements'].sort(key=find_name) for placement in placerun['placements']: placement['p'].sort() json.dump(placerun, args.outfile, indent=2) if __name__ == '__main__': main(sys.argv[1:]) pplacer-1.1.alpha19/scripts/split_qiime.py000077500000000000000000000027151303154601500206250ustar00rootroot00000000000000#!/usr/bin/env python import argparse import logging import csv import sys import re from Bio import SeqIO log = logging.getLogger(__name__) description_regexp = re.compile(r'([^\s_]+)_\d+\s+(\S+)') def main(): logging.basicConfig( level=logging.INFO, format="%(levelname)s: %(message)s") parser = argparse.ArgumentParser( description="Extract the original sequence names from a QIIME FASTA file.") parser.add_argument( 'qiime', type=argparse.FileType('r'), nargs='?', default=sys.stdin, help="input QIIME file (default: stdin)") parser.add_argument( 'fasta', type=argparse.FileType('w'), nargs='?', default=sys.stdout, help="output FASTA file (default: stdout)") parser.add_argument( 'specimen_map', type=argparse.FileType('w'), nargs='?', help="if specified, output specimen map (default: don't write)") args = parser.parse_args() specimen_writer = None if args.specimen_map is not None: specimen_writer = csv.writer(args.specimen_map) for seq in SeqIO.parse(args.qiime, 'fasta'): match = description_regexp.match(seq.description) if not match: log.warning("sequence %r had a strange description", seq.id) continue specimen, seq.id = match.groups() seq.description = '' SeqIO.write([seq], args.fasta, 'fasta') if specimen_writer: specimen_writer.writerow((seq.id, specimen)) main() pplacer-1.1.alpha19/scripts/test_refpkg_align.py000066400000000000000000000101111303154601500217570ustar00rootroot00000000000000""" Unit tests for alignment module """ from cStringIO import StringIO import os import os.path import unittest from Bio.Seq import Seq from Bio.SeqRecord import SeqRecord import refpkg_align class ParseStockholmConsensus(unittest.TestCase): def setUp(self): self.value = """ #=GC RF xxx.xx #=GC RF xx.xxx #=GC RF xxx.x. #=GF TT IGNORED """ self.expected = [True, True, True, False, True, True, True, True, False, True, True, True, True, True, True, False, True, False] self.handle = StringIO(self.value) def _get_result(self): return refpkg_align._parse_stockholm_consensus(self.handle).mask def test_length(self): result = self._get_result() self.assertEqual(len(self.expected), len(result)) def test_value(self): self.assertEqual(self.expected, self._get_result()) def test_no_other_chars(self): handle = StringIO('#=GC RF xxxCx.x.\n') self.assertRaises(ValueError, refpkg_align._parse_stockholm_consensus, handle) class AlignmentMaskTestCase(unittest.TestCase): def setUp(self): self.sequences = [ SeqRecord(Seq('ACGTACGT')), SeqRecord(Seq('AAAAAAAT')), SeqRecord(Seq('ACGTAAAA')), ] def test_invalid_seq_length(self): mask = [True, True, False, True] instance = refpkg_align.AlignmentMask(mask) self.assertRaises(ValueError, instance.mask_records(self.sequences).next) def test_mask(self): mask = [True, False, True, True, False, False, False, True] instance = refpkg_align.AlignmentMask(mask) actual = list(instance.mask_records(self.sequences)) # equality isn't defined for SeqRecord, so this is basic actual = [str(r.seq) for r in actual] expected = ['AGTT', 'AAAT', 'AGTA'] self.assertEqual(expected, actual) def test_from_csv_file(self): value = """ 1, 2,5, 8, 10, 11 """ handle = StringIO(value) expected = [False, True, True, False, False, True, False, False, True, False, True, True, False] actual = refpkg_align.AlignmentMask.from_csv_file(handle, 13) self.assertEqual(expected, actual.mask) def test_len(self): mask = [True, True, False, True] instance = refpkg_align.AlignmentMask(mask) expected = 4 self.assertEqual(expected, len(instance)) def test_unmasked_count(self): mask = [True, True, False, True, False] instance = refpkg_align.AlignmentMask(mask) expected = 3 self.assertEqual(expected, instance.unmasked_count) class MockSubprocess(object): """ Mock of the subprocess module to support Check Call """ def __init__(self): self.commands = [] pass def check_call(self, cmd, *args, **kwargs): self.commands.append(cmd) class MockRefpkg(object): def __init__(self): self.contents = {'files': {}} def resource_path(self, path): return 'resource-' + path class SubprocessMixIn(object): """ Converts the subprocess.check_call function to a mock for the test """ def setUp(self): self._old_subproc = refpkg_align.subprocess refpkg_align.subprocess = MockSubprocess() def tearDown(self): refpkg_align.subprocess = self._old_subproc @property def latest_command(self): return refpkg_align.subprocess.commands[-1] class TempFileTestCase(unittest.TestCase): def test_close(self): with refpkg_align._temp_file() as tf: self.assertFalse(tf.closed) tf.close() self.assertTrue(os.path.isfile(tf.name)) self.assertFalse(os.path.exists(tf.name)) def test_remove_ok(self): """Test that the file can be removed without error""" with refpkg_align._temp_file() as tf: tf.close() os.unlink(tf.name) pplacer-1.1.alpha19/scripts/update_refpkg.py000077500000000000000000000016351303154601500211260ustar00rootroot00000000000000#!/usr/bin/env python import argparse import shutil import json import sys replacements = { 'tree_file': 'tree', 'phylo_model_file': 'phylo_model', } def main(args): parser = argparse.ArgumentParser() parser.add_argument('infile', metavar='CONTENTS.json', type=argparse.FileType('rb+')) args = parser.parse_args(args) shutil.copyfile(args.infile.name, args.infile.name + '.bak') contents = json.load(args.infile) for key in ['files', 'md5']: records = contents[key] for repl_in, repl_out in replacements.iteritems(): if repl_in not in records: continue records[repl_out] = records.pop(repl_in) contents.setdefault('metadata', {})['format_version'] = '1.1' args.infile.seek(0) args.infile.truncate() json.dump(contents, args.infile, indent=2) if __name__ == '__main__': main(sys.argv[1:]) pplacer-1.1.alpha19/tests/000077500000000000000000000000001303154601500153775ustar00rootroot00000000000000pplacer-1.1.alpha19/tests/data/000077500000000000000000000000001303154601500163105ustar00rootroot00000000000000pplacer-1.1.alpha19/tests/data/compress/000077500000000000000000000000001303154601500201435ustar00rootroot00000000000000pplacer-1.1.alpha19/tests/data/compress/hiv.fasta000066400000000000000000000106441303154601500217560ustar00rootroot00000000000000>AF004885 AGTAGTATCAACTCAATTGCTGTTGAATGGCAGTCTAGCAGAAAAAAATATAACAATTAGATCTGAAAATATCACAAACAATGCCAAAATTATAATAGTACAACTTGTCCAACCTGTGACAATTAAGTGTATCAGACCTAACAACAATACAAGAAAAAGTATACGTATAGGACCAGGACAAGCATTCTATGCAGGTGACATAATAGGGGATATAAG >AF069670 AGTAGTATCAACTCAACTGCTGTTAAATGGCAGTCTAGCAGAAGAAAAGATAATGATTAGATCTGAAAATATCTCAGACAATGCCAAAACCATAATAGTACAACTTACCGAGCCTGTAACAATTAATTGTACCAGACCTAGCAACAATACAAGAACAAGTATACGTATAGGACCAGGACAAGCATTCTATGCAGGTGACATAACAGGGGATATAAG >M62320 AGTGGTATCAACTCAACTGCTGTTAAATGGCAGTCTAGCAGAAAGAGAAATAAGGATTAGATCTGAAAATTTCACAAACAATGCAAAAACCATAATAGTACAGCTTGTCAATCCTGTAAAAATCAATTGTTCCAGACCTT---ACAATACAAGAAAAAATATAC-TATAGGATCAGGACAAGCATTCTATGTAGGTAAAATAATAGGGGATATAAG >U51190 AGTAGTGTCAACTCAACTGCTGTTAAATGGCAGTTTAGCAGAAGGAAAGGTAATGATTAGATCTGAAAATATCACAAACAATGTCAAAAACATAATAGTACAACTTAACGAGTCTGTAACAATTAATTGTACCAGACCTAACAATAATACAAGAAGAAGTGTACGTATAGGACCAGGACAAACATTCTATGCAGGTGATATAATAGGGGATATAAG >AF286241 AGTAGCATCAACTCAACTGCTGTTGAATGGCAGTCTAGCAGAAAAAGAGGTGATGATTAGATCTGAAAATATTACAAACAATGCCAAAAACATAATAGTACAGTTTAATGAATCGGTACCAATTACTTGTATCAGACCCAACAACAATACGAGAAAAGGTATACCTATTGGACCAGGACAAGTCTTCTATACAG---ACATAATAGGGGATATAAG >AF286238 AGTAGCATCAACTCAACTGCTGCTGAATGGCAGTCTAGCAGAAGGAAAGGTAATGATTAGATCTGAAAATATTACAGACAATGCCAAAAACATAATAGTACAGTTTAATAAACCTGTACCAATTAATTGTACCAGACCCAACAACAATACAAGAAAAAGTATACGCTTTGGACCAGGACAGGCCTTCTATACAAATAACATAATAGGGGATATAAG >AF286237 AGTAGCATCAACTCAACTGCTGTTGAATGGCAGTCTAGCAGAAGGAGAAATAATGATTAGATCTGAAAATATTACAAACAATGCCAAAAACATAATAGTTCAGTTTACTAAGCCTGTACTAATTACTTGTATCAGACCCAACAACAATACAAGAAAAAGTATACGCTTTGGACCAGGACAAGCCTTCTATACAG---AAATAATAGGGGACATAAG >K03455 AGTAGTATCAACTCAACTGCTGTTAAATGGCAGTCTAGCAGAAGAAGAGGTAGTAATTAGATCTGTCAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAACACATCTGTAGAAATTAATTGTACAAGACCCA------ATACAAGAAAAAGAATCCAGAGAGGACCAGGGAGAGCATTTGTTACAG---GAAAAATAGGAAATATGAG >M17451 AGTAGTGTCAACTCAACTGCTGTTAAATGGCAGTCTAGCAGAAGAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGTTAAAACCATAATAGTACAGCTGAATGCATCTGTACAAATTAATTGTACAAGACCCAACAACAATACAAGAAAAAGTATAACTAAGGGACCAGGGAGAGTAATTTATGCAGGACAAATAATAGGAGATATAAG >U63632 AGTAGTATCAACTCAACTGCTGCTAAATGGCAGTCTAGCAGAAGAAGAGGTAGTAATTAGATCTGACAATTTCACGAACAATGCTAAAACCATAATAGTACAGCTGAAAGAATCTGTAGAAATTAATTGTACAAGACCCAACAACAATACAAGAAAAAGTATACATATAGGACCAGGGAGAGCATTTTATACTGGAGAAATAATAGGAGATATAAG >U21135 AGTAGTGTCAACCCAATTGCTGTTAAATGGCAGTCTAGCAGAAGAAGACATAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAAACATAATAGTACAGCTGAATGTATCCATAGAAATTAATTGTACAAGACCCAACAACAATACAAGAAAAAAAATAACTTTAGGACCAGGGAGAGTACTTTATACAGGAGAAATAATAGGAGATATAAG >U52953 AGTAGTGTCAACTCAACTACTGTTAAATGGTAGTCTAGCAGAAGAAGAGATAATAATTAGATCTAAAAATCTAACAGACAATGTCAAAACAATAATAGTACATCTTAACGAATCTGTAGAGATTAATTGTACGAGACCCAACAATAATACAAGAAAAAGTATAAGGATAGGACCAGGACAAGCATTCTATGCAGGAGAAATAATAGGAGATATAAG >AF110967 AGTGGTATCAACTCAGCTACTGTTAAATGGTAGCGTAGCAAAAGGAGAGATAATAATTAGATCTGAAAATCTGACAAACAATGCCAAAATAATAATAGTACAACTTAATAAACCTGTAAAAATTGTGTGTGTAAGGCCTAACAATAATACAAGAAAAAGTGTAAGGATAGGACCAGGACAAACATTCTATGCAGGAGAAATAATAGGAGACATAAG >U46016 AGTGGTATCAACTCAACTATTGTTAAATGGTAGTATAGCAGAAGGTGAGACAATAATTAGATTTGAAAATCTGACAAACAATGCCAAAATAATAATAGTACAGCTTAATGAATCTGTAGAAATTACTTGTACGAGACCCAGCAATAATACAAGAGAAAGTATAAGGATAGGACCAGGACAAACATTCTATGCAGGAGACATAATAGGAGATATAAG >AF067155 AGTGGTATCAACTCAACTACTGTTAAATGGTAGCCTAGCAGAAGGAGGGATAATAATTAGATCTGAAAATCTGACAAACAATGTCAAAACAATAATAGTACATCTTAATCAACCTGTAGAAATTATGTGTACAAGACCCGACAATAATACAAGAAAAAGTATAAGGATAGGACCAGGACAAACATTCTATGCAGGAGACATAATAGGAGACATAAG >K03454 AGTGGTGTCAACTCAACTGCTGTTGAATGGCAGTCTAGCAGAAGAAGAGGTCATAATTAGATCCGAAAATCTCACAAACAATGCTAAAAACATAATAGCACATCTTAATGAATCTGTAAAAATTACCTGTGCAAGGCCCTATCAAAATACAAGACAAAGAACACCTATAGGACTAGGGCAATCACTCTATACTA---GATCAAGATCAATAATAGG >M27323 AGTGGTGTCAACTCAACTGCTGTTGAATGGCAGTCTAGCAGAAGAAGAGATCATAATTAGATCTGAAAATCTCACAAACAATGTTAAAACCATAATAGTACAGCTTAATGCATCTATAGTAATTAATTGTACAAGGCCCTACAAATATACAAGGCAAAGGACATCGATAGGACTAAGGCAATCACTCTATACA------AAAACAGGATACATAGG >U88822 AGTGGTGTCAACTCAACTGCTGTTAAATGGCAGTCTAGCAGAAGAAGAGATCGTAATAAGATCTGAAAATCTCACAAACAATGCTAAAATCATAATAGTACATCTTAATCAATCTGTAGAAATTAATTGTACAAGGCCCTACAAAAAGGAAAGACAAAGGACACCTATAGGACAAGGGCAAGCGCTCTATACAAGGTATACAACAAGGATAATAGG >U88824 AGTAGTGTCAACTCAACTGTTGTTGAATGGCAGTCTAGCAGAAGAAGAAATAATAATTAGATCTGAAAATCTCACAAACAATGCTAAAATCATAATAGTACAGCTTAATGAGTCTGTACCAATTAATTGCATAAGGCCCTATAACAATACAAGACAAAGTACACGTATAGGACCAGGGCAAGCACTCTTTACAA---AAGTAATAGGAGATATAAG >AF077336 AGTGGTATCAACTCAATTGTTGTTAAATGGCAGCCTAGCAGAAGAAGGTATAGTAATCAGATCTCAAAATATCTCAAATAATGCAAAAACCATAATAGTACACCTTAATGAATCTGTACAGATTAATTGTACAAGACCCAACAACAATACAAGGAAAGGTATACATTTAGGACCAGGACAAACATTCTATGCAGGAGCAATAATAGGAGACATAAG pplacer-1.1.alpha19/tests/data/compress/hiv.fasta.gz000066400000000000000000000016771303154601500224030ustar00rootroot00000000000000‹v’‹R•—Ënã0 E÷ý—~$Ž»€ P.³cÿÿWF|è-9I¦ã¦–-éø’—ôøY–ûy>¾€X~PÌ„Lá¾aÃpAø ö —†+åºp*Œ‘ŸD9©„¨çôJ\ç“ÊÊìä3„A[›ä¼Þ.r°õdP$×èd?,ûbÙ˜Mgk…í¾þÄãûx.":"ôˆº*édÔ#ÚF3"bƒÎP˜IfI(ëΑjDükÄǶo Ho†ÿ¤4²L È•†Ð’iþv@¹É"†9òívk4ÔÝâ͹”ól¶þ>Öõ;*H€œTHš(˜Ù [Aä .’q¯ ´ ò0H·óØî«!b¯á8Égì¹Íà Qè¤HF¥·p‘‡Xä!yFX WAVD™Ú”Ÿ!îçGˆ—*êj¯Á­&"V*–ˆÕ ‘$›#"X NŸŸ¨H)?S‘QBÑ­ùZÅkD(UÅ2Ñÿ.ûýÑ—‹k/Õ0â¢\˜cH&RÔGV£æˆv‹=¨¤!8àM? š“z\Ôï’‰ºK$·%2ÂZâ¥ëóþXß°š€ÙK# Ï™" ' šô Þ­&F*[Œ%/=öcß& â€YAx¡  2Wp¢PziVPǸHœp[×ýQ)ˆEG3Dx© ÂHAÖˆ{ÐMD V­ : ÌÛ÷c„(€Ü+hS%@¯ÜÖN”Õ0V6%àX “‚TRȽ‚Zé/ú™ ü¬ëz¶¶£¡ÍhÁ}´E$GŒ…8w¥%¢ü\*Lxò`æ?D¤"\!Fý½Ëz Z6룲† “ëùM@Â\î‹,ÄZCªi®aˆC —ã¹Z©h «ZHoh8 SKöÑŒyHo‡é%bU ïØ—ŠQ±w'Å#`Ùv×Fƒ0i®¡¾G¡)ÚcN€þv¡#Цå\›wÙ¬9)h-d½…ÓS•Z¸=÷mÿ*@Žk!§Z˜½8;©ZQ‹g,ñåJ€ÐÆìÅÉ+‹þžç¹mSÀi-”õ,Jg€¦ ã0D'µ0ÆÎ`V\A’Ó£ð/èÁ\ÞGÝ _)˜üc®à0ÙŒ¿8-·¥Œ‡hY Ñr›'T­ Výhh3Ïç¾÷NÊŽ˜4Ä ‘Rˆ¡!zÞø7Ä.H±ÉB¬ªá°ÜÇW ¾¶™œ|Ùfþ›j­3¤pplacer-1.1.alpha19/tests/data/heat/000077500000000000000000000000001303154601500172315ustar00rootroot00000000000000pplacer-1.1.alpha19/tests/data/heat/heat_test.csv000066400000000000000000000000541303154601500217250ustar00rootroot00000000000000"test",0,3,0,0,-6,1 "test2",0,900,0,0,100,0 pplacer-1.1.alpha19/tests/data/heat/my.simple.refpkg/000077500000000000000000000000001303154601500224235ustar00rootroot00000000000000pplacer-1.1.alpha19/tests/data/heat/my.simple.refpkg/CONTENTS.json000077500000000000000000000003051303154601500245540ustar00rootroot00000000000000{ "files": { "tree": "ref.tre" }, "md5": { "tree": "a3e0ce5f29bc8b6494763157469d368f" }, "metadata": { "create_date": "2011-01-06 13:21:20", "format_version": "1.1" } } pplacer-1.1.alpha19/tests/data/heat/my.simple.refpkg/numbered.ref.tre000066400000000000000000000000531303154601500255110ustar00rootroot00000000000000((A:2[0],B:9[1]):7[2],C:5[3],D:1[4]):0[5]; pplacer-1.1.alpha19/tests/data/heat/my.simple.refpkg/ref.tre000066400000000000000000000000311303154601500237050ustar00rootroot00000000000000((A:2,B:9):7,C:5,D:1):0; pplacer-1.1.alpha19/tests/data/json/000077500000000000000000000000001303154601500172615ustar00rootroot00000000000000pplacer-1.1.alpha19/tests/data/json/fail10.jtest000066400000000000000000000000721303154601500214070ustar00rootroot00000000000000{"Extra value after close": true} "misplaced quoted value"pplacer-1.1.alpha19/tests/data/json/fail11.jtest000066400000000000000000000000351303154601500214070ustar00rootroot00000000000000{"Illegal expression": 1 + 2}pplacer-1.1.alpha19/tests/data/json/fail12.jtest000066400000000000000000000000371303154601500214120ustar00rootroot00000000000000{"Illegal invocation": alert()}pplacer-1.1.alpha19/tests/data/json/fail13.jtest000066400000000000000000000000531303154601500214110ustar00rootroot00000000000000{"Numbers cannot have leading zeroes": 013}pplacer-1.1.alpha19/tests/data/json/fail14.jtest000066400000000000000000000000371303154601500214140ustar00rootroot00000000000000{"Numbers cannot be hex": 0x14}pplacer-1.1.alpha19/tests/data/json/fail15.jtest000066400000000000000000000000421303154601500214110ustar00rootroot00000000000000["Illegal backslash escape: \x15"]pplacer-1.1.alpha19/tests/data/json/fail16.jtest000066400000000000000000000000101303154601500214050ustar00rootroot00000000000000[\naked]pplacer-1.1.alpha19/tests/data/json/fail17.jtest000066400000000000000000000000421303154601500214130ustar00rootroot00000000000000["Illegal backslash escape: \017"]pplacer-1.1.alpha19/tests/data/json/fail19.jtest000066400000000000000000000000261303154601500214170ustar00rootroot00000000000000{"Missing colon" null}pplacer-1.1.alpha19/tests/data/json/fail2.jtest000066400000000000000000000000211303154601500213220ustar00rootroot00000000000000["Unclosed array"pplacer-1.1.alpha19/tests/data/json/fail20.jtest000066400000000000000000000000271303154601500214100ustar00rootroot00000000000000{"Double colon":: null}pplacer-1.1.alpha19/tests/data/json/fail21.jtest000066400000000000000000000000401303154601500214040ustar00rootroot00000000000000{"Comma instead of colon", null}pplacer-1.1.alpha19/tests/data/json/fail22.jtest000066400000000000000000000000411303154601500214060ustar00rootroot00000000000000["Colon instead of comma": false]pplacer-1.1.alpha19/tests/data/json/fail23.jtest000066400000000000000000000000241303154601500214100ustar00rootroot00000000000000["Bad value", truth]pplacer-1.1.alpha19/tests/data/json/fail24.jtest000066400000000000000000000000201303154601500214050ustar00rootroot00000000000000['single quote']pplacer-1.1.alpha19/tests/data/json/fail25.jtest000066400000000000000000000000351303154601500214140ustar00rootroot00000000000000[" tab character in string "]pplacer-1.1.alpha19/tests/data/json/fail26.jtest000066400000000000000000000000461303154601500214170ustar00rootroot00000000000000["tab\ character\ in\ string\ "]pplacer-1.1.alpha19/tests/data/json/fail27.jtest000066400000000000000000000000161303154601500214150ustar00rootroot00000000000000["line break"]pplacer-1.1.alpha19/tests/data/json/fail28.jtest000066400000000000000000000000171303154601500214170ustar00rootroot00000000000000["line\ break"]pplacer-1.1.alpha19/tests/data/json/fail29.jtest000066400000000000000000000000041303154601500214140ustar00rootroot00000000000000[0e]pplacer-1.1.alpha19/tests/data/json/fail3.jtest000066400000000000000000000000451303154601500213310ustar00rootroot00000000000000{unquoted_key: "keys must be quoted"}pplacer-1.1.alpha19/tests/data/json/fail30.jtest000066400000000000000000000000051303154601500214050ustar00rootroot00000000000000[0e+]pplacer-1.1.alpha19/tests/data/json/fail31.jtest000066400000000000000000000000071303154601500214100ustar00rootroot00000000000000[0e+-1]pplacer-1.1.alpha19/tests/data/json/fail32.jtest000066400000000000000000000000501303154601500214070ustar00rootroot00000000000000{"Comma instead if closing brace": true,pplacer-1.1.alpha19/tests/data/json/fail33.jtest000066400000000000000000000000141303154601500214100ustar00rootroot00000000000000["mismatch"}pplacer-1.1.alpha19/tests/data/json/fail4.jtest000066400000000000000000000000201303154601500213230ustar00rootroot00000000000000["extra comma",]pplacer-1.1.alpha19/tests/data/json/fail5.jtest000066400000000000000000000000301303154601500213250ustar00rootroot00000000000000["double extra comma",,]pplacer-1.1.alpha19/tests/data/json/fail6.jtest000066400000000000000000000000321303154601500213300ustar00rootroot00000000000000[ , "<-- missing value"]pplacer-1.1.alpha19/tests/data/json/fail7.jtest000066400000000000000000000000321303154601500213310ustar00rootroot00000000000000["Comma after the close"],pplacer-1.1.alpha19/tests/data/json/fail8.jtest000066400000000000000000000000201303154601500213270ustar00rootroot00000000000000["Extra close"]]pplacer-1.1.alpha19/tests/data/json/fail9.jtest000066400000000000000000000000261303154601500213360ustar00rootroot00000000000000{"Extra comma": true,}pplacer-1.1.alpha19/tests/data/json/pass1.jtest000066400000000000000000000026411303154601500213660ustar00rootroot00000000000000[ "JSON Test Pattern pass1", {"object with 1 member":["array with 1 element"]}, {}, [], -42, true, false, null, { "integer": 1234567890, "real": -9876.543210, "e": 0.123456789e-12, "E": 1.234567890E+34, "": 23456789012E66, "zero": 0, "one": 1, "space": " ", "quote": "\"", "backslash": "\\", "controls": "\b\f\n\r\t", "slash": "/ & \/", "alpha": "abcdefghijklmnopqrstuvwyz", "ALPHA": "ABCDEFGHIJKLMNOPQRSTUVWYZ", "digit": "0123456789", "0123456789": "digit", "special": "`1~!@#$%^&*()_+-={':[,]}|;.?", "hex": "\u0123\u4567\u89AB\uCDEF\uabcd\uef4A", "true": true, "false": false, "null": null, "array":[ ], "object":{ }, "address": "50 St. James Street", "url": "http://www.JSON.org/", "comment": "// /* */": " ", " s p a c e d " :[1,2 , 3 , 4 , 5 , 6 ,7 ],"compact":[1,2,3,4,5,6,7], "jsontext": "{\"object with 1 member\":[\"array with 1 element\"]}", "quotes": "" \u0022 %22 0x22 034 "", "\/\\\"\uCAFE\uBABE\uAB98\uFCDE\ubcda\uef4A\b\f\n\r\t`1~!@#$%^&*()_+-=[]{}|;:',./<>?" : "A key can be any string" }, 0.5 ,98.6 , 99.44 , 1066, 1e1, 0.1e1, 1e-1, 1e00,2e+00,2e-00 ,"rosebud"]pplacer-1.1.alpha19/tests/data/json/pass2.jtest000066400000000000000000000000641303154601500213640ustar00rootroot00000000000000[[[[[[[[[[[[[[[[[[["Not too deep"]]]]]]]]]]]]]]]]]]]pplacer-1.1.alpha19/tests/data/json/pass3.jtest000066400000000000000000000002241303154601500213630ustar00rootroot00000000000000{ "JSON Test Pattern pass3": { "The outermost value": "must be an object or array.", "In this test": "It is an object." } } pplacer-1.1.alpha19/tests/data/json/pass4.jtest.gz000066400000000000000000000013471303154601500220120ustar00rootroot00000000000000‹s¡‹RmTkW1ýÞ_1l¥(dŸÝ>At«EDÔ£MÕt›¾Øî–lÖR*þv“ôì9›Lï™M'w¦•ñ'—çgpES„sÊb˜4u ¤è¹‘tF4ä0ò¸0¦ãeF½eÆÈlÓˆŽiÌöý2l¹·Ú‹Ýô½…ÁYFVDéÒŒ³(ZÆ©UksÚ—Ÿ×+ú¥r¥ZsІf”D‚3kÕJÙ*ùEÏÕY*(ÇZRÓõ4¶)“Zë¬Í½¢¯±‚„5çzÍrY#ï(Kdn Jbù5WCÒ %f€¡¡7YŠ îð:H:PÖ©0‰9K¢T1ÜÃ1f˜ëë@ €m"Ñd@$E:a—öúƒáè:ÇÉ䆥<û3ÝéÞÁéÅq ½ƒÆ›·Í£wÇïO>œ~<;¿øôùòêË×oßèÞÝaÈ¥·³.±Nkh}åü <4ªÛ3~»ÿ¶^çŸmÿ,ì>ñkÏ|9ß©·Pûþï¾u`¾Ò£ôVÕ!“Ùq&óã¬Z 8“'Æ™üŸ8£=?ÐäàDÜFw Uâ°&B…K% x#ÈE)¥Ô…æÚú½«Æ0ês€{ݹÛe4UwVrà’[pBÆ4£ôA2¦j0à|R·íétjÉ^´Ö·ª`¬zKÞ² ö.l™&˜¦î“®ýHw„@¡+~Õ[.òA1—C¹œ/¬ÒÊÁú)oL@••ÕFò4BÝâ42 *"•PUôÂŒR¡[z«N<ÇO,âñ“#‹ò¨kT5 ù¢¿âþσmñ:·r)úPÈ k_Â6­$”5qÖb µ*ÎŽ„Xp&¤BZÙôÕ#-¶Ús!Äú²ì¡Åœì¸¦3I  $žAÊÙ0îêËK8V P­j•E}k5Ë÷e]GŽ—Š1!æ’Ü\1”äê8È£{j5'‡ –¤´“uöA¨¡pplacer-1.1.alpha19/tests/data/like/000077500000000000000000000000001303154601500172345ustar00rootroot00000000000000pplacer-1.1.alpha19/tests/data/like/gtr/000077500000000000000000000000001303154601500200305ustar00rootroot00000000000000pplacer-1.1.alpha19/tests/data/like/gtr/hiv.fasta000066400000000000000000000106441303154601500216430ustar00rootroot00000000000000>AF004885 AGTAGTATCAACTCAATTGCTGTTGAATGGCAGTCTAGCAGAAAAAAATATAACAATTAGATCTGAAAATATCACAAACAATGCCAAAATTATAATAGTACAACTTGTCCAACCTGTGACAATTAAGTGTATCAGACCTAACAACAATACAAGAAAAAGTATACGTATAGGACCAGGACAAGCATTCTATGCAGGTGACATAATAGGGGATATAAG >AF069670 AGTAGTATCAACTCAACTGCTGTTAAATGGCAGTCTAGCAGAAGAAAAGATAATGATTAGATCTGAAAATATCTCAGACAATGCCAAAACCATAATAGTACAACTTACCGAGCCTGTAACAATTAATTGTACCAGACCTAGCAACAATACAAGAACAAGTATACGTATAGGACCAGGACAAGCATTCTATGCAGGTGACATAACAGGGGATATAAG >M62320 AGTGGTATCAACTCAACTGCTGTTAAATGGCAGTCTAGCAGAAAGAGAAATAAGGATTAGATCTGAAAATTTCACAAACAATGCAAAAACCATAATAGTACAGCTTGTCAATCCTGTAAAAATCAATTGTTCCAGACCTT---ACAATACAAGAAAAAATATAC-TATAGGATCAGGACAAGCATTCTATGTAGGTAAAATAATAGGGGATATAAG >U51190 AGTAGTGTCAACTCAACTGCTGTTAAATGGCAGTTTAGCAGAAGGAAAGGTAATGATTAGATCTGAAAATATCACAAACAATGTCAAAAACATAATAGTACAACTTAACGAGTCTGTAACAATTAATTGTACCAGACCTAACAATAATACAAGAAGAAGTGTACGTATAGGACCAGGACAAACATTCTATGCAGGTGATATAATAGGGGATATAAG >AF286241 AGTAGCATCAACTCAACTGCTGTTGAATGGCAGTCTAGCAGAAAAAGAGGTGATGATTAGATCTGAAAATATTACAAACAATGCCAAAAACATAATAGTACAGTTTAATGAATCGGTACCAATTACTTGTATCAGACCCAACAACAATACGAGAAAAGGTATACCTATTGGACCAGGACAAGTCTTCTATACAG---ACATAATAGGGGATATAAG >AF286238 AGTAGCATCAACTCAACTGCTGCTGAATGGCAGTCTAGCAGAAGGAAAGGTAATGATTAGATCTGAAAATATTACAGACAATGCCAAAAACATAATAGTACAGTTTAATAAACCTGTACCAATTAATTGTACCAGACCCAACAACAATACAAGAAAAAGTATACGCTTTGGACCAGGACAGGCCTTCTATACAAATAACATAATAGGGGATATAAG >AF286237 AGTAGCATCAACTCAACTGCTGTTGAATGGCAGTCTAGCAGAAGGAGAAATAATGATTAGATCTGAAAATATTACAAACAATGCCAAAAACATAATAGTTCAGTTTACTAAGCCTGTACTAATTACTTGTATCAGACCCAACAACAATACAAGAAAAAGTATACGCTTTGGACCAGGACAAGCCTTCTATACAG---AAATAATAGGGGACATAAG >K03455 AGTAGTATCAACTCAACTGCTGTTAAATGGCAGTCTAGCAGAAGAAGAGGTAGTAATTAGATCTGTCAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAACACATCTGTAGAAATTAATTGTACAAGACCCA------ATACAAGAAAAAGAATCCAGAGAGGACCAGGGAGAGCATTTGTTACAG---GAAAAATAGGAAATATGAG >M17451 AGTAGTGTCAACTCAACTGCTGTTAAATGGCAGTCTAGCAGAAGAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGTTAAAACCATAATAGTACAGCTGAATGCATCTGTACAAATTAATTGTACAAGACCCAACAACAATACAAGAAAAAGTATAACTAAGGGACCAGGGAGAGTAATTTATGCAGGACAAATAATAGGAGATATAAG >U63632 AGTAGTATCAACTCAACTGCTGCTAAATGGCAGTCTAGCAGAAGAAGAGGTAGTAATTAGATCTGACAATTTCACGAACAATGCTAAAACCATAATAGTACAGCTGAAAGAATCTGTAGAAATTAATTGTACAAGACCCAACAACAATACAAGAAAAAGTATACATATAGGACCAGGGAGAGCATTTTATACTGGAGAAATAATAGGAGATATAAG >U21135 AGTAGTGTCAACCCAATTGCTGTTAAATGGCAGTCTAGCAGAAGAAGACATAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAAACATAATAGTACAGCTGAATGTATCCATAGAAATTAATTGTACAAGACCCAACAACAATACAAGAAAAAAAATAACTTTAGGACCAGGGAGAGTACTTTATACAGGAGAAATAATAGGAGATATAAG >U52953 AGTAGTGTCAACTCAACTACTGTTAAATGGTAGTCTAGCAGAAGAAGAGATAATAATTAGATCTAAAAATCTAACAGACAATGTCAAAACAATAATAGTACATCTTAACGAATCTGTAGAGATTAATTGTACGAGACCCAACAATAATACAAGAAAAAGTATAAGGATAGGACCAGGACAAGCATTCTATGCAGGAGAAATAATAGGAGATATAAG >AF110967 AGTGGTATCAACTCAGCTACTGTTAAATGGTAGCGTAGCAAAAGGAGAGATAATAATTAGATCTGAAAATCTGACAAACAATGCCAAAATAATAATAGTACAACTTAATAAACCTGTAAAAATTGTGTGTGTAAGGCCTAACAATAATACAAGAAAAAGTGTAAGGATAGGACCAGGACAAACATTCTATGCAGGAGAAATAATAGGAGACATAAG >U46016 AGTGGTATCAACTCAACTATTGTTAAATGGTAGTATAGCAGAAGGTGAGACAATAATTAGATTTGAAAATCTGACAAACAATGCCAAAATAATAATAGTACAGCTTAATGAATCTGTAGAAATTACTTGTACGAGACCCAGCAATAATACAAGAGAAAGTATAAGGATAGGACCAGGACAAACATTCTATGCAGGAGACATAATAGGAGATATAAG >AF067155 AGTGGTATCAACTCAACTACTGTTAAATGGTAGCCTAGCAGAAGGAGGGATAATAATTAGATCTGAAAATCTGACAAACAATGTCAAAACAATAATAGTACATCTTAATCAACCTGTAGAAATTATGTGTACAAGACCCGACAATAATACAAGAAAAAGTATAAGGATAGGACCAGGACAAACATTCTATGCAGGAGACATAATAGGAGACATAAG >K03454 AGTGGTGTCAACTCAACTGCTGTTGAATGGCAGTCTAGCAGAAGAAGAGGTCATAATTAGATCCGAAAATCTCACAAACAATGCTAAAAACATAATAGCACATCTTAATGAATCTGTAAAAATTACCTGTGCAAGGCCCTATCAAAATACAAGACAAAGAACACCTATAGGACTAGGGCAATCACTCTATACTA---GATCAAGATCAATAATAGG >M27323 AGTGGTGTCAACTCAACTGCTGTTGAATGGCAGTCTAGCAGAAGAAGAGATCATAATTAGATCTGAAAATCTCACAAACAATGTTAAAACCATAATAGTACAGCTTAATGCATCTATAGTAATTAATTGTACAAGGCCCTACAAATATACAAGGCAAAGGACATCGATAGGACTAAGGCAATCACTCTATACA------AAAACAGGATACATAGG >U88822 AGTGGTGTCAACTCAACTGCTGTTAAATGGCAGTCTAGCAGAAGAAGAGATCGTAATAAGATCTGAAAATCTCACAAACAATGCTAAAATCATAATAGTACATCTTAATCAATCTGTAGAAATTAATTGTACAAGGCCCTACAAAAAGGAAAGACAAAGGACACCTATAGGACAAGGGCAAGCGCTCTATACAAGGTATACAACAAGGATAATAGG >U88824 AGTAGTGTCAACTCAACTGTTGTTGAATGGCAGTCTAGCAGAAGAAGAAATAATAATTAGATCTGAAAATCTCACAAACAATGCTAAAATCATAATAGTACAGCTTAATGAGTCTGTACCAATTAATTGCATAAGGCCCTATAACAATACAAGACAAAGTACACGTATAGGACCAGGGCAAGCACTCTTTACAA---AAGTAATAGGAGATATAAG >AF077336 AGTGGTATCAACTCAATTGTTGTTAAATGGCAGCCTAGCAGAAGAAGGTATAGTAATCAGATCTCAAAATATCTCAAATAATGCAAAAACCATAATAGTACACCTTAATGAATCTGTACAGATTAATTGTACAAGACCCAACAACAATACAAGGAAAGGTATACATTTAGGACCAGGACAAACATTCTATGCAGGAGCAATAATAGGAGACATAAG pplacer-1.1.alpha19/tests/data/like/gtr/hiv.phy000066400000000000000000000133601303154601500213430ustar00rootroot00000000000000 20 216 AF004885 AGTAGTATCA ACTCAATTGC TGTTGAATGG CAGTCTAGCA GAAAAAAATA AF069670 AGTAGTATCA ACTCAACTGC TGTTAAATGG CAGTCTAGCA GAAGAAAAGA M62320 AGTGGTATCA ACTCAACTGC TGTTAAATGG CAGTCTAGCA GAAAGAGAAA U51190 AGTAGTGTCA ACTCAACTGC TGTTAAATGG CAGTTTAGCA GAAGGAAAGG AF286241 AGTAGCATCA ACTCAACTGC TGTTGAATGG CAGTCTAGCA GAAAAAGAGG AF286238 AGTAGCATCA ACTCAACTGC TGCTGAATGG CAGTCTAGCA GAAGGAAAGG AF286237 AGTAGCATCA ACTCAACTGC TGTTGAATGG CAGTCTAGCA GAAGGAGAAA K03455 AGTAGTATCA ACTCAACTGC TGTTAAATGG CAGTCTAGCA GAAGAAGAGG M17451 AGTAGTGTCA ACTCAACTGC TGTTAAATGG CAGTCTAGCA GAAGAAGAGG U63632 AGTAGTATCA ACTCAACTGC TGCTAAATGG CAGTCTAGCA GAAGAAGAGG U21135 AGTAGTGTCA ACCCAATTGC TGTTAAATGG CAGTCTAGCA GAAGAAGACA U52953 AGTAGTGTCA ACTCAACTAC TGTTAAATGG TAGTCTAGCA GAAGAAGAGA AF110967 AGTGGTATCA ACTCAGCTAC TGTTAAATGG TAGCGTAGCA AAAGGAGAGA U46016 AGTGGTATCA ACTCAACTAT TGTTAAATGG TAGTATAGCA GAAGGTGAGA AF067155 AGTGGTATCA ACTCAACTAC TGTTAAATGG TAGCCTAGCA GAAGGAGGGA K03454 AGTGGTGTCA ACTCAACTGC TGTTGAATGG CAGTCTAGCA GAAGAAGAGG M27323 AGTGGTGTCA ACTCAACTGC TGTTGAATGG CAGTCTAGCA GAAGAAGAGA U88822 AGTGGTGTCA ACTCAACTGC TGTTAAATGG CAGTCTAGCA GAAGAAGAGA U88824 AGTAGTGTCA ACTCAACTGT TGTTGAATGG CAGTCTAGCA GAAGAAGAAA AF077336 AGTGGTATCA ACTCAATTGT TGTTAAATGG CAGCCTAGCA GAAGAAGGTA TAACAATTAG ATCTGAAAAT ATCACAAACA ATGCCAAAAT TATAATAGTA TAATGATTAG ATCTGAAAAT ATCTCAGACA ATGCCAAAAC CATAATAGTA TAAGGATTAG ATCTGAAAAT TTCACAAACA ATGCAAAAAC CATAATAGTA TAATGATTAG ATCTGAAAAT ATCACAAACA ATGTCAAAAA CATAATAGTA TGATGATTAG ATCTGAAAAT ATTACAAACA ATGCCAAAAA CATAATAGTA TAATGATTAG ATCTGAAAAT ATTACAGACA ATGCCAAAAA CATAATAGTA TAATGATTAG ATCTGAAAAT ATTACAAACA ATGCCAAAAA CATAATAGTT TAGTAATTAG ATCTGTCAAT TTCACGGACA ATGCTAAAAC CATAATAGTA TAGTAATTAG ATCTGAAAAT TTCACGGACA ATGTTAAAAC CATAATAGTA TAGTAATTAG ATCTGACAAT TTCACGAACA ATGCTAAAAC CATAATAGTA TAGTAATTAG ATCTGAAAAT TTCACGGACA ATGCTAAAAA CATAATAGTA TAATAATTAG ATCTAAAAAT CTAACAGACA ATGTCAAAAC AATAATAGTA TAATAATTAG ATCTGAAAAT CTGACAAACA ATGCCAAAAT AATAATAGTA CAATAATTAG ATTTGAAAAT CTGACAAACA ATGCCAAAAT AATAATAGTA TAATAATTAG ATCTGAAAAT CTGACAAACA ATGTCAAAAC AATAATAGTA TCATAATTAG ATCCGAAAAT CTCACAAACA ATGCTAAAAA CATAATAGCA TCATAATTAG ATCTGAAAAT CTCACAAACA ATGTTAAAAC CATAATAGTA TCGTAATAAG ATCTGAAAAT CTCACAAACA ATGCTAAAAT CATAATAGTA TAATAATTAG ATCTGAAAAT CTCACAAACA ATGCTAAAAT CATAATAGTA TAGTAATCAG ATCTCAAAAT ATCTCAAATA ATGCAAAAAC CATAATAGTA CAACTTGTCC AACCTGTGAC AATTAAGTGT ATCAGACCTA ACAACAATAC CAACTTACCG AGCCTGTAAC AATTAATTGT ACCAGACCTA GCAACAATAC CAGCTTGTCA ATCCTGTAAA AATCAATTGT TCCAGACCTT ---ACAATAC CAACTTAACG AGTCTGTAAC AATTAATTGT ACCAGACCTA ACAATAATAC CAGTTTAATG AATCGGTACC AATTACTTGT ATCAGACCCA ACAACAATAC CAGTTTAATA AACCTGTACC AATTAATTGT ACCAGACCCA ACAACAATAC CAGTTTACTA AGCCTGTACT AATTACTTGT ATCAGACCCA ACAACAATAC CAGCTGAACA CATCTGTAGA AATTAATTGT ACAAGACCCA ------ATAC CAGCTGAATG CATCTGTACA AATTAATTGT ACAAGACCCA ACAACAATAC CAGCTGAAAG AATCTGTAGA AATTAATTGT ACAAGACCCA ACAACAATAC CAGCTGAATG TATCCATAGA AATTAATTGT ACAAGACCCA ACAACAATAC CATCTTAACG AATCTGTAGA GATTAATTGT ACGAGACCCA ACAATAATAC CAACTTAATA AACCTGTAAA AATTGTGTGT GTAAGGCCTA ACAATAATAC CAGCTTAATG AATCTGTAGA AATTACTTGT ACGAGACCCA GCAATAATAC CATCTTAATC AACCTGTAGA AATTATGTGT ACAAGACCCG ACAATAATAC CATCTTAATG AATCTGTAAA AATTACCTGT GCAAGGCCCT ATCAAAATAC CAGCTTAATG CATCTATAGT AATTAATTGT ACAAGGCCCT ACAAATATAC CATCTTAATC AATCTGTAGA AATTAATTGT ACAAGGCCCT ACAAAAAGGA CAGCTTAATG AGTCTGTACC AATTAATTGC ATAAGGCCCT ATAACAATAC CACCTTAATG AATCTGTACA GATTAATTGT ACAAGACCCA ACAACAATAC AAGAAAAAGT ATACGTATAG GACCAGGACA AGCATTCTAT GCAGGTGACA AAGAACAAGT ATACGTATAG GACCAGGACA AGCATTCTAT GCAGGTGACA AAGAAAAAAT ATAC-TATAG GATCAGGACA AGCATTCTAT GTAGGTAAAA AAGAAGAAGT GTACGTATAG GACCAGGACA AACATTCTAT GCAGGTGATA GAGAAAAGGT ATACCTATTG GACCAGGACA AGTCTTCTAT ACAG---ACA AAGAAAAAGT ATACGCTTTG GACCAGGACA GGCCTTCTAT ACAAATAACA AAGAAAAAGT ATACGCTTTG GACCAGGACA AGCCTTCTAT ACAG---AAA AAGAAAAAGA ATCCAGAGAG GACCAGGGAG AGCATTTGTT ACAG---GAA AAGAAAAAGT ATAACTAAGG GACCAGGGAG AGTAATTTAT GCAGGACAAA AAGAAAAAGT ATACATATAG GACCAGGGAG AGCATTTTAT ACTGGAGAAA AAGAAAAAAA ATAACTTTAG GACCAGGGAG AGTACTTTAT ACAGGAGAAA AAGAAAAAGT ATAAGGATAG GACCAGGACA AGCATTCTAT GCAGGAGAAA AAGAAAAAGT GTAAGGATAG GACCAGGACA AACATTCTAT GCAGGAGAAA AAGAGAAAGT ATAAGGATAG GACCAGGACA AACATTCTAT GCAGGAGACA AAGAAAAAGT ATAAGGATAG GACCAGGACA AACATTCTAT GCAGGAGACA AAGACAAAGA ACACCTATAG GACTAGGGCA ATCACTCTAT ACTA---GAT AAGGCAAAGG ACATCGATAG GACTAAGGCA ATCACTCTAT ACA------A AAGACAAAGG ACACCTATAG GACAAGGGCA AGCGCTCTAT ACAAGGTATA AAGACAAAGT ACACGTATAG GACCAGGGCA AGCACTCTTT ACAA---AAG AAGGAAAGGT ATACATTTAG GACCAGGACA AACATTCTAT GCAGGAGCAA TAATAGGGGA TATAAG TAACAGGGGA TATAAG TAATAGGGGA TATAAG TAATAGGGGA TATAAG TAATAGGGGA TATAAG TAATAGGGGA TATAAG TAATAGGGGA CATAAG AAATAGGAAA TATGAG TAATAGGAGA TATAAG TAATAGGAGA TATAAG TAATAGGAGA TATAAG TAATAGGAGA TATAAG TAATAGGAGA CATAAG TAATAGGAGA TATAAG TAATAGGAGA CATAAG CAAGATCAAT AATAGG AAACAGGATA CATAGG CAACAAGGAT AATAGG TAATAGGAGA TATAAG TAATAGGAGA CATAAG pplacer-1.1.alpha19/tests/data/like/gtr/hiv.phy_phyml_stats.txt000066400000000000000000000032531303154601500246100ustar00rootroot00000000000000 oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo --- PhyML v3.0_246M --- http://www.atgc-montpellier.fr/phyml Copyright CNRS - Universite Montpellier II oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo . Sequence filename: hiv.phy . Data set: #1 . Tree topology search : NNIs . Initial tree: BioNJ . Model of nucleotides substitution: GTR . Number of taxa: 20 . Log-likelihood: -1752.42340 . Unconstrained likelihood: -880.76144 . Parsimony: 315 . Tree size: 1.77835 . Discrete gamma model: Yes - Number of categories: 4 - Gamma shape parameter: 0.771 . Nucleotides frequencies: - f(A)= 0.42597 - f(C)= 0.15878 - f(G)= 0.18676 - f(T)= 0.22849 . GTR relative rate parameters : A <-> C 1.17728 A <-> G 3.08642 A <-> T 0.60698 C <-> G 0.92672 C <-> T 4.74366 G <-> T 1.00000 . Instantaneous rate matrix : [A---------C---------G---------T------] -0.71991 0.14919 0.46003 0.11069 0.40024 -1.40341 0.13813 0.86505 1.04929 0.11743 -1.34908 0.18236 0.20635 0.60112 0.14905 -0.95652 . Time used 0h0m3s . 3 seconds oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo Suggested citation: S. Guindon & O. Gascuel "A simple, fast, and accurate algorithm to estimate large phylogenies by maximum likelihood" Systematic Biology. 2003. 52(5):696-704. oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo pplacer-1.1.alpha19/tests/data/like/gtr/hiv.phy_phyml_tree.txt000066400000000000000000000012421303154601500244050ustar00rootroot00000000000000((((((((((M62320:0.1128424992,AF004885:0.0664472119):0.0150998810,AF069670:0.0297359837):0.0089889481,U51190:0.0584848901):0.0218870768,((AF286237:0.0449760823,AF286238:0.0359654079):0.0200219595,AF286241:0.0500825061):0.0702442367):0.0483484616,AF077336:0.1366738497):0.0041885959,(((AF067155:0.0206962153,AF110967:0.0751614599):0.0337023127,U46016:0.0505891619):0.0295417646,U52953:0.0370936040):0.0491127647):0.0157858047,((U21135:0.0639666402,M17451:0.0364380825):0.0242554571,(U63632:0.0206784350,K03455:0.0811739294):0.0110746105):0.0536366000):0.0513765649,U88824:0.0597751870):0.0643186983,M27323:0.0709501928):0.0214716510,U88822:0.0786439777,K03454:0.1049161502); pplacer-1.1.alpha19/tests/data/like/gtr/phylo_model.jplace000077500000000000000000000005041303154601500235250ustar00rootroot00000000000000{ "empirical_frequencies": true, "datatype": "DNA", "subs_model": "GTR", "program": "phyml", "ras_model": "gamma", "gamma": { "alpha": 0.771, "n_cats": 4 }, "subs_rates": { "ac": 1.17728, "ag": 3.08642, "at": 0.60698, "cg": 0.92672, "ct": 4.74366, "gt": 1.00000 } } pplacer-1.1.alpha19/tests/data/like/gtr/run.sh000077500000000000000000000000421303154601500211670ustar00rootroot00000000000000phyml -i hiv.phy -b 0 -m GTR -c 4 pplacer-1.1.alpha19/tests/data/like/jtt/000077500000000000000000000000001303154601500200355ustar00rootroot00000000000000pplacer-1.1.alpha19/tests/data/like/jtt/actin.fasta000066400000000000000000000161061303154601500221570ustar00rootroot00000000000000>Olucima APKAVFPSIVGRPRHHGVMVGMGQKDCYVGDEAQSKRGILTLKYPIEHGIVTNWDDMEKIWHHTFYNELRVDPAEHPVLLTEAPMNPKANREKMCQIMFETFNVPAMYVSIQAVLSLYASGRTTGIVLDCGDGVSHTVPIYEGYALPHAILRLDLAGRDLTDYMVKILTERGHSFTTSAEREIVRDIKEKLAYVAVDFDEEMAASQSSSTIEKSYELPDGQMITIGNERFRCPEVLFQPSLIGM-ETPGIHETTYNSIMRCDVDIRRDLYANIVLSGGTTMFPGIADRVSKELTAL-APSSMKIKVVAPHERKYSVWIGGSILASLSTFQQMWIAKSEYNEAGPSIVHRKCF >Otauri ??????????????????MVGMGQKDCYVGDEAQSKRGILTLKYPLEHGIVTNWDDMEKIWHHTFYNELRVDPAEHPVLLTEAPMNPKANREKMCQIMFETFNVPAMYVSIQAVLSLYASGRTTGIVLDCGDGVSHTVPIYEGYALPHAILRLDLAGRDLTDYMVKILTERGHSFTTSAEREIVRDIKEKLAYVALDFEEEMATSQSSSSIEKSYELPDGQMITIGSERFRCPEVLFQPSLIGM-ENPGIHETTYNSIMRCDVDIRRDLYANIVLSGGTTMFPGIADRISKELTAL-APSSMKIKVVAPHERKYSVWIGGSILASLSTFQQMWIAKSEYNEAGPSIFDQLVH >Igalban ?????????????????????????????????????????????????????WDDMEKIWHHTFYNELRVAPEEHPVLLTEAPLNPKANREKMTQIMFETFNVPAMYVAIQAVLSLYASGRTTGIVMDSGDGVSHTVPIYEGYALPHAILRLDLAGRDLTDWMVKLLTERGYSFTTTAEREIVRDIKEKLAYVALDFDQEMQTASSSSALEKSYELPDGQVITIGNERFRCPEALFQPTFLGM-EAAGVHETTYNSIMKCDVDIRKDLYANIVLSGGTTMYAGIADRMSKEITAL-APNSMKIKIIAPPERKYSVWIGGSILSSLSTFQQMWISKQEYDESGPSIVHRKCF >Plunula APRAVFPSIVGRPRHTGVMVGMGQKDSYVGDEAQSKRGILPLKYPIEHGIVTNWDDMEKIWHHTLYNELRVAPEEHPVLLTEAPLNPKANREKMTQIMFETFNTPAMYVAIQAVLSLYASGRTTGIVLDSGDGVSHTVPIYEGYALPHAILRLDLAGRDLTDYMMKILTERGYSFTTTAEREIVRDIKEKLAYVALDFEQEMQTAASSSALEKSYELPDGQVITIGNERFRCPEALFQPSFLGM-ESAGVHETTYNSIMKCDVDIRKDLYGNVVLSGGSTMFPGIAERMNKELVAL-APSTMKIKIIAPPERKYSVWIGGSILASLSTFQQMWISKEEYDESGPSIVHRKCF >Mpalaef ?????????????????????????????????????????????????????WDDMEKIWHHTFYNELRVAPEEHPVLLTEAPLNPKANREKMTQLMFETFNTPAMYVAIQAVLSLYASGRTTGIVLDTGDGVTHTVPIYEGYALPHAILRLDLAGRDLTDYLMKILTERGYSFTTTAEREIVRDIKEKLAYVALDFEAEMKTAAESSALEKSYELPDGQVITIGNERFRCPEAMFQPSFLGM-EASGIHETTYNSIMKCDVDIRKDLYGNIVMSGGTSMFPGIADRMQKEMTTL-APNTMKIKIIAPPERKYSVWIGGSILASLSTFQQMW??????????????????? >Ppiscic APRAVFPSIVGRPKMPGIMVGMDQKDSYVGDEAQSKRGVLTLKYPIEHGIVTNWDDMEKIWHHTFYNELRVAPEEHPVLLTEAPLNPKANRERMTQIMFETFNVPAMYVAIQAVLSLYASGRTTGIVMDSGDGVSHTVPIYEGYALPHAILRLDLAGRDLTEYMMKILTERGYSFTTTAEREIVRDVKEKLSYIALDFDSEMKAATESNEKEKTYELPDGNVITVGSERFRCPEVLFQPSFIGK-EASGIHDTTFQSIMKCDVDIRKDLYANVVLSGGTTMFEGIGERMTKELTAL-APSTMKIKVVAPPERKYSVWIGGSILSSLSTFQQMWISKGEYDESGP???????? >Lpolyed APRAVFPSIVGRPKMPGIMVGMDQKDSYIGDEAQSKRGVLTLKYPIEHGIVTNWDDMEKIWHHTFYNELRVAPEEHPVLLTEAPLNPKANRERMTQIMFETFNVPAMYVAIQAVLSLYASGRTTGIVMDSGDGVSHTVPIYEGYALPHAILRLDLAGRDLTDYLMKILTERGYSFTTTAEREIVRDVKEKLCYIALDYDSEMKAATESSDKEKTYELPDGNIITVGSERFRCPEVLFQPSLVGK-EASGVHDTTFQSIMKCDVDIRKDLYANVVLSGGTTMFIGIGERMAKELTAL-APSTMKIKVVAPPERKYSVWIGGSILSSLSTFQQMWITKTEYDEAGPSIVHRKCF >SymbiS1 APRAVFPSIVGRPKMPGIMVGMDQKDSYVGDEAQSKRGVLTLKYPIEHGIVTNWDDMEKIWHHTFYNELR?APEEHPVLLTEAPLNPKANRERMTQIMFETFNVPAMYVAIQAVLSLYASGRTTGIVMDSGDGVSHTVPIYEGYALPHAILRLDLAGRDLTEYMMKILTERGYSFTTTAEREIVRDVKEKLCYIALDFDSEMKAASESSDKEKTYELPDGNIITVGSERFRCPEVLFQPSFVGK-EASGIHDTTFQSIMKCDVDIRKDLYANVVLSGGTTMFQGIGERMTKELTAL-APSTMKIKVVAPPERKYSVWIGGSILSSLSTFQQMWISKGEYVESGPTIVHRKCF >Gcatena APRAVFPSIVGRPKMPGIMVGMDQKDSYVGDEAQSKRGVLTLKYPIEHGIVTNWDDMEKIWHHTFYNELRVAPEEHPVLLTEAPLNPKANRERMTQIMFETFNVPAMYVAIQAVLSLYASGRTTGIVMDSGDGVSHTVPIYEGYALPHAILRLDLAGRDLTEYMMKILTERGYSFTTTAEREIVRDVKEKLCYIALDFDTEMKAATESSDKEKTYELPDGNIITVGSERFRCPEVLFQPSFVGK-EASGIHDTTFQSIMKCDVDIRKDLYANVVLSGGTTMFQGIGERMTKELTAL-APSTMKIKVVAPPERKYSVWIGGSILSSLSTFQQMWISKSEYDESGP???????? >SymbiS2 APRAVFPSIVGRPKMPGIMVGMDQKDSYVGDEAQSKRGVLTLKYPIEHGIVTNWDDMEKIWHHTFYNELRVAPEEHPVLLTEAPLNPKANRERMTQIMFETFNVPAMYVAIQAVLSLYASGRTTGIVMDSGDGVSHTVPIYEGYALPHAILRLDLAGRDLTEYMMKILTERGYSFTTTAEREIVRDVKEKLCYIALDFDSEMKAASESSDKEKTYELPDGNIITVGSERFRCPEVLFQPSFVGK-EASGIHDTTFQSIMKCDVDIRKDLYANVVLSGGTTMFQGIGERMTKELTAL-APSTMKIKVVAPPERKYSVWIGGSILSSLSTFQQMWISKGEYDESGPTIVHRKCF >Acarter APRAVFPSIVGRPKMPGIMVGMDQKDSYVGDEAQSKRGVLTLKYPIEHGIVTNWDDMEKIWHHTFYNELRVAPEEHPVLLTEAPLNPKANRERMTQIMFETFNVPAMYVAIQAVLSLYASGRTTGIVMDSGDGVSHTVPIYEGYALPHAILRLDLAGRDLTEYLMKILTERGYSFTTTAEREIVRDVKEKLCYIALDFDTELKAATESSDKEKTYELPDGNIITVGAERFRCPEVLFNPSFIGK-EASGIHDTTFQSIMKCDVDIRKDLYANVVLSGGTTMFPGIGERMTKELTAL-APSTMKIKVVAPPERKYSVWIGGSILSSLSTFQQMWISKGEYDESGPTIVHRKCF >Pshumwa APRAVFPSIVGRPKMPGIMVGMDQKDSYVGDEAQSKRGVLTLKYPIEHGIVTNWDDMEKIWHHTFYNELRVAPEEHPVLLTEAPLNPKANRERMTQIMFETFNVPAMYVAIQAVLSLYASGRTTGIVVDSGDGVSHTVPIYEGYALPHAILRLDLAGRDLTEYMMKILTERGYSFTTTAEREIVRDVKEKLSYIALDFDSEMKAATESNDKEKTYELPDGNVITVGSERFRCPEVLFQPSFMGK-EASGIHDTTFQSIMKCDVDIRKDLYANIVLSGGTTMFDGIGERMTKELTAL-APSTMKIKVVAPPERKYSVWIGGSILSSLSTFQQMWISKGEYDESGP???????? >Ccohnii APRAVFPSIVGRPKMPGIMVGMDQKDSYVGDEAQSKRGVLTLKYPIEHGIVTNWDDMEKIWHHTFYNELRVAPEEHPVLLTEAPLNPKANRERMTQIMFETFNVPAMYVAIQAVLSLYASGRTTGIVMDSGDGVSHTVPIYEGYALPHAILRLDLAGRDLTEYMMKILTERGYSFTTTAEREIVRDIKEKLSYIALDYDSEMKVATESSDKEKTYELPDGNIITVGSERFRCPEVLFNPSLLGK-ESSGIHDTTFQSIMKCDVDIRKDLYANVVLSGGTTMFSGIGERMTKELTAL-APSTMKIKVVAPPERKYSVWIGGSILSSLSTFQQMWISKGEYDESGPTIVHRKCF >Plimbat APRSVFPSIVGRPKMPGIMVGMGQKDSYVGDEAQSKRGVLTLKYPIEHGIVTNWDDMEKIWHHTFYNELRVAPEEHPVLLTEAPLNPKANRERMTQIMFETFNVPAMYVAIQAVLSLYASGRTTGIVMDSGDGVSHTVPIYEGYALPHAILRLDLAGRDLTEYMMKILTERGYSFTTTAEREIVRDVKEKLCYIALDFDTEMKAATESSDKEKTYELPDGNIITVGSERFRCPEVLFQPSFIGK-EASGIHDTTFQSIMKCDVDIRKDLYTNVVLSGGTTMFAGIGERMTKELTAL-APSTMKIKVVAPPERKYSVWIGGSILSSLSTFQQMWISKGEYDESGP???????? >Ccanis APRCVFPSIVGRPKMPGVMVGMDQKDCYVGDEAQSKRGILTLKYPIEHGIVTNWEDMEKIWHHTFYNELRVAPEEHPVLLTEAPMNPKVNRERMTQIMFETFNVPAMYVNIQAVLSLYASGRTTGIVLDSGDGVSHTVPIYEGYALPHAIMRLDLAGRDLTDFLMKILHDRGYSFTTTAEREIVRDIKEKLCYIALDYEEEMKKSQESSELEKTYELPDGHVITVGSERFRCPEALFQPNLLGK-EAVGIGETTFQSIMKCDLDIRKDLYANIVLSGGTTMYPGIGERMTKELTSL-APSTMKIKVVAPPERKYSVWIGGSILSSLSTFQQMWITKEEYVE??????????? >Csaurop APRCVFPSIVGRPKMPGVMVGMDQKDCYVGDEAQSKRGILTLKYPIEHGIVTNWEDMEKIWHHTFYNELRVAPEEHPVLLTEAPMNPKVNRERMTQIMFETFNVPAMYVNIQAVLSLYASGRTTGIVLDSGDGVSHTVPIYEGYALPHAIMRLDLAGRDLTDFLMKILHDRGYSFTTTAEREIVRDIKEKLCYIALDYEEEMKKSQESSELEKTYELPDGHVITVGSERFRCPEALFQPNLLGK-EAVGIGETTFQSIMKCDLDIRKDLYANIVLSGGTTMYPGIGERMTKELTSL-APSTMKIKVVAPPERKYSVWIGGSILSSLSTFQQMWITKEE?????????????? >Asangui APRAVFSSIVGRPKMPGIMVGMDQKDSYVGDEAQSKRGVLTLKYPIEHGIVTNWDDMEKIWHHTFYNELRVAPEEHPVLLTEAPLNPKANRERMTQIMFETFNVPAMYVAIQAVLSLYASGRTTGIVMDSGDGVSHTVPIYEGYALPHAIFRLDLAGRDLTEYLMKILTERGYSFTTTAEREIVRDVKEKLSYIALDFDSEMKSATESSDKEKTYELPDGNIITIGSERFRCPEVLFQPSLIGK-EASGIHETTFQSIMKCDVDIRKDLYANVVLSGGTTMFEGIGERMTRELTAL-APSTMKIKVVAPPERKYSVWIGGSILSALSTFQQMWISKGEYDESGP???????? >Pmicans APRAVFPSIVGRPKMPGIMVGMDQKDSYVGDEAQSKRGVLTLKYPIEHGIVTNWDDMEKIWHHTFYNELRVAPEEHPVLLTEAPLNPKANRERMTQIMFETFNVPAMYVAIQAVLSLYASGRTTGIVMDSGDGVSHTVPIYEGYALPHAILRLDLAGRDLTEYLMKILTERGYSFTTTAEREIVRDVKEKLCYIALDFDTEMKAATESSDKEKTYELPDGNIITVGSERFRCPEVLFQPSFVGK-EASGIHDTTFQSIMKCDVDIRKDLYANVVLSGGTTMFTGIGERMTKELTAL-APSTMKIKVVAPPERKYSVWIGGSILSSLSTFQQMWISKGEYDESGP???????? >Pmarinu APRSVFPSIVGRPKMPGIMVGMDQKDSYVGDEAQSKRGILTLKYPIEHGIVTNWDDMEKIWHHTFYNELRVSPEEHPVLLTEAPLNPKANRERMTQLMFETFNVPAMYVQIQAVLSLYASGRTTGIVMDSGDGVSHTVPIYEGYALPHAIQRLDLAGRDLTEFMMKILTERGYTFTTTAEREIVRDIKEKLSYVALDFDTEMKAAAESSEKEKTYELPDGNIITVGNERFRCPEVLFQPTFIGK-EASGIHDTTFQSIMKCDVDIRKDLYANVVLSGGTTMFNGIGERMTKELTAL-APSTMKIKVVAPPERKYSVWIGGSILSSLSTFQQMWISKQEYDESGPTIVHRKCF >Htrique APRAVFPSIVGRPKMPGIMVGMDQKDSYVGDEAQSKRGMLTLKYPIEHGIVTNWDDMEKIWHHTFYNELRVAPEEHPVLLTEAPLNPKANRERMTQIMFETFNVPAMYVAIQAVLSLYASGRTTGIVMDSGDGVSHTVPIYEGYALPHAILRLDLAGRDLTEYLMKILTERGYSFTTTAEREIVRDVKEKLCYIALDFDTEMKSATESSDKEKTYELPDGNIITVGSERFRCPEVLFQPSFVGK-EASGIHDTTFQSIMKCDVDIRKDLYANVVLSGGTTMFTGIGERMTKELTAL-APSTMKIKVVAPPERKYSVWIGGSILSSLSTFQQMWISKGEYDESGP???????? pplacer-1.1.alpha19/tests/data/like/jtt/actin.phy000066400000000000000000000224771303154601500216710ustar00rootroot00000000000000 20 352 Olucima APKAVFPSIV GRPRHHGVMV GMGQKDCYVG DEAQSKRGIL TLKYPIEHGI Otauri ?????????? ????????MV GMGQKDCYVG DEAQSKRGIL TLKYPLEHGI Igalban ?????????? ?????????? ?????????? ?????????? ?????????? Plunula APRAVFPSIV GRPRHTGVMV GMGQKDSYVG DEAQSKRGIL PLKYPIEHGI Mpalaef ?????????? ?????????? ?????????? ?????????? ?????????? Ppiscic APRAVFPSIV GRPKMPGIMV GMDQKDSYVG DEAQSKRGVL TLKYPIEHGI Lpolyed APRAVFPSIV GRPKMPGIMV GMDQKDSYIG DEAQSKRGVL TLKYPIEHGI SymbiS1 APRAVFPSIV GRPKMPGIMV GMDQKDSYVG DEAQSKRGVL TLKYPIEHGI Gcatena APRAVFPSIV GRPKMPGIMV GMDQKDSYVG DEAQSKRGVL TLKYPIEHGI SymbiS2 APRAVFPSIV GRPKMPGIMV GMDQKDSYVG DEAQSKRGVL TLKYPIEHGI Acarter APRAVFPSIV GRPKMPGIMV GMDQKDSYVG DEAQSKRGVL TLKYPIEHGI Pshumwa APRAVFPSIV GRPKMPGIMV GMDQKDSYVG DEAQSKRGVL TLKYPIEHGI Ccohnii APRAVFPSIV GRPKMPGIMV GMDQKDSYVG DEAQSKRGVL TLKYPIEHGI Plimbat APRSVFPSIV GRPKMPGIMV GMGQKDSYVG DEAQSKRGVL TLKYPIEHGI Ccanis APRCVFPSIV GRPKMPGVMV GMDQKDCYVG DEAQSKRGIL TLKYPIEHGI Csaurop APRCVFPSIV GRPKMPGVMV GMDQKDCYVG DEAQSKRGIL TLKYPIEHGI Asangui APRAVFSSIV GRPKMPGIMV GMDQKDSYVG DEAQSKRGVL TLKYPIEHGI Pmicans APRAVFPSIV GRPKMPGIMV GMDQKDSYVG DEAQSKRGVL TLKYPIEHGI Pmarinu APRSVFPSIV GRPKMPGIMV GMDQKDSYVG DEAQSKRGIL TLKYPIEHGI Htrique APRAVFPSIV GRPKMPGIMV GMDQKDSYVG DEAQSKRGML TLKYPIEHGI VTNWDDMEKI WHHTFYNELR VDPAEHPVLL TEAPMNPKAN REKMCQIMFE VTNWDDMEKI WHHTFYNELR VDPAEHPVLL TEAPMNPKAN REKMCQIMFE ???WDDMEKI WHHTFYNELR VAPEEHPVLL TEAPLNPKAN REKMTQIMFE VTNWDDMEKI WHHTLYNELR VAPEEHPVLL TEAPLNPKAN REKMTQIMFE ???WDDMEKI WHHTFYNELR VAPEEHPVLL TEAPLNPKAN REKMTQLMFE VTNWDDMEKI WHHTFYNELR VAPEEHPVLL TEAPLNPKAN RERMTQIMFE VTNWDDMEKI WHHTFYNELR VAPEEHPVLL TEAPLNPKAN RERMTQIMFE VTNWDDMEKI WHHTFYNELR ?APEEHPVLL TEAPLNPKAN RERMTQIMFE VTNWDDMEKI WHHTFYNELR VAPEEHPVLL TEAPLNPKAN RERMTQIMFE VTNWDDMEKI WHHTFYNELR VAPEEHPVLL TEAPLNPKAN RERMTQIMFE VTNWDDMEKI WHHTFYNELR VAPEEHPVLL TEAPLNPKAN RERMTQIMFE VTNWDDMEKI WHHTFYNELR VAPEEHPVLL TEAPLNPKAN RERMTQIMFE VTNWDDMEKI WHHTFYNELR VAPEEHPVLL TEAPLNPKAN RERMTQIMFE VTNWDDMEKI WHHTFYNELR VAPEEHPVLL TEAPLNPKAN RERMTQIMFE VTNWEDMEKI WHHTFYNELR VAPEEHPVLL TEAPMNPKVN RERMTQIMFE VTNWEDMEKI WHHTFYNELR VAPEEHPVLL TEAPMNPKVN RERMTQIMFE VTNWDDMEKI WHHTFYNELR VAPEEHPVLL TEAPLNPKAN RERMTQIMFE VTNWDDMEKI WHHTFYNELR VAPEEHPVLL TEAPLNPKAN RERMTQIMFE VTNWDDMEKI WHHTFYNELR VSPEEHPVLL TEAPLNPKAN RERMTQLMFE VTNWDDMEKI WHHTFYNELR VAPEEHPVLL TEAPLNPKAN RERMTQIMFE TFNVPAMYVS IQAVLSLYAS GRTTGIVLDC GDGVSHTVPI YEGYALPHAI TFNVPAMYVS IQAVLSLYAS GRTTGIVLDC GDGVSHTVPI YEGYALPHAI TFNVPAMYVA IQAVLSLYAS GRTTGIVMDS GDGVSHTVPI YEGYALPHAI TFNTPAMYVA IQAVLSLYAS GRTTGIVLDS GDGVSHTVPI YEGYALPHAI TFNTPAMYVA IQAVLSLYAS GRTTGIVLDT GDGVTHTVPI YEGYALPHAI TFNVPAMYVA IQAVLSLYAS GRTTGIVMDS GDGVSHTVPI YEGYALPHAI TFNVPAMYVA IQAVLSLYAS GRTTGIVMDS GDGVSHTVPI YEGYALPHAI TFNVPAMYVA IQAVLSLYAS GRTTGIVMDS GDGVSHTVPI YEGYALPHAI TFNVPAMYVA IQAVLSLYAS GRTTGIVMDS GDGVSHTVPI YEGYALPHAI TFNVPAMYVA IQAVLSLYAS GRTTGIVMDS GDGVSHTVPI YEGYALPHAI TFNVPAMYVA IQAVLSLYAS GRTTGIVMDS GDGVSHTVPI YEGYALPHAI TFNVPAMYVA IQAVLSLYAS GRTTGIVVDS GDGVSHTVPI YEGYALPHAI TFNVPAMYVA IQAVLSLYAS GRTTGIVMDS GDGVSHTVPI YEGYALPHAI TFNVPAMYVA IQAVLSLYAS GRTTGIVMDS GDGVSHTVPI YEGYALPHAI TFNVPAMYVN IQAVLSLYAS GRTTGIVLDS GDGVSHTVPI YEGYALPHAI TFNVPAMYVN IQAVLSLYAS GRTTGIVLDS GDGVSHTVPI YEGYALPHAI TFNVPAMYVA IQAVLSLYAS GRTTGIVMDS GDGVSHTVPI YEGYALPHAI TFNVPAMYVA IQAVLSLYAS GRTTGIVMDS GDGVSHTVPI YEGYALPHAI TFNVPAMYVQ IQAVLSLYAS GRTTGIVMDS GDGVSHTVPI YEGYALPHAI TFNVPAMYVA IQAVLSLYAS GRTTGIVMDS GDGVSHTVPI YEGYALPHAI LRLDLAGRDL TDYMVKILTE RGHSFTTSAE REIVRDIKEK LAYVAVDFDE LRLDLAGRDL TDYMVKILTE RGHSFTTSAE REIVRDIKEK LAYVALDFEE LRLDLAGRDL TDWMVKLLTE RGYSFTTTAE REIVRDIKEK LAYVALDFDQ LRLDLAGRDL TDYMMKILTE RGYSFTTTAE REIVRDIKEK LAYVALDFEQ LRLDLAGRDL TDYLMKILTE RGYSFTTTAE REIVRDIKEK LAYVALDFEA LRLDLAGRDL TEYMMKILTE RGYSFTTTAE REIVRDVKEK LSYIALDFDS LRLDLAGRDL TDYLMKILTE RGYSFTTTAE REIVRDVKEK LCYIALDYDS LRLDLAGRDL TEYMMKILTE RGYSFTTTAE REIVRDVKEK LCYIALDFDS LRLDLAGRDL TEYMMKILTE RGYSFTTTAE REIVRDVKEK LCYIALDFDT LRLDLAGRDL TEYMMKILTE RGYSFTTTAE REIVRDVKEK LCYIALDFDS LRLDLAGRDL TEYLMKILTE RGYSFTTTAE REIVRDVKEK LCYIALDFDT LRLDLAGRDL TEYMMKILTE RGYSFTTTAE REIVRDVKEK LSYIALDFDS LRLDLAGRDL TEYMMKILTE RGYSFTTTAE REIVRDIKEK LSYIALDYDS LRLDLAGRDL TEYMMKILTE RGYSFTTTAE REIVRDVKEK LCYIALDFDT MRLDLAGRDL TDFLMKILHD RGYSFTTTAE REIVRDIKEK LCYIALDYEE MRLDLAGRDL TDFLMKILHD RGYSFTTTAE REIVRDIKEK LCYIALDYEE FRLDLAGRDL TEYLMKILTE RGYSFTTTAE REIVRDVKEK LSYIALDFDS LRLDLAGRDL TEYLMKILTE RGYSFTTTAE REIVRDVKEK LCYIALDFDT QRLDLAGRDL TEFMMKILTE RGYTFTTTAE REIVRDIKEK LSYVALDFDT LRLDLAGRDL TEYLMKILTE RGYSFTTTAE REIVRDVKEK LCYIALDFDT EMAASQSSST IEKSYELPDG QMITIGNERF RCPEVLFQPS LIGM-ETPGI EMATSQSSSS IEKSYELPDG QMITIGSERF RCPEVLFQPS LIGM-ENPGI EMQTASSSSA LEKSYELPDG QVITIGNERF RCPEALFQPT FLGM-EAAGV EMQTAASSSA LEKSYELPDG QVITIGNERF RCPEALFQPS FLGM-ESAGV EMKTAAESSA LEKSYELPDG QVITIGNERF RCPEAMFQPS FLGM-EASGI EMKAATESNE KEKTYELPDG NVITVGSERF RCPEVLFQPS FIGK-EASGI EMKAATESSD KEKTYELPDG NIITVGSERF RCPEVLFQPS LVGK-EASGV EMKAASESSD KEKTYELPDG NIITVGSERF RCPEVLFQPS FVGK-EASGI EMKAATESSD KEKTYELPDG NIITVGSERF RCPEVLFQPS FVGK-EASGI EMKAASESSD KEKTYELPDG NIITVGSERF RCPEVLFQPS FVGK-EASGI ELKAATESSD KEKTYELPDG NIITVGAERF RCPEVLFNPS FIGK-EASGI EMKAATESND KEKTYELPDG NVITVGSERF RCPEVLFQPS FMGK-EASGI EMKVATESSD KEKTYELPDG NIITVGSERF RCPEVLFNPS LLGK-ESSGI EMKAATESSD KEKTYELPDG NIITVGSERF RCPEVLFQPS FIGK-EASGI EMKKSQESSE LEKTYELPDG HVITVGSERF RCPEALFQPN LLGK-EAVGI EMKKSQESSE LEKTYELPDG HVITVGSERF RCPEALFQPN LLGK-EAVGI EMKSATESSD KEKTYELPDG NIITIGSERF RCPEVLFQPS LIGK-EASGI EMKAATESSD KEKTYELPDG NIITVGSERF RCPEVLFQPS FVGK-EASGI EMKAAAESSE KEKTYELPDG NIITVGNERF RCPEVLFQPT FIGK-EASGI EMKSATESSD KEKTYELPDG NIITVGSERF RCPEVLFQPS FVGK-EASGI HETTYNSIMR CDVDIRRDLY ANIVLSGGTT MFPGIADRVS KELTAL-APS HETTYNSIMR CDVDIRRDLY ANIVLSGGTT MFPGIADRIS KELTAL-APS HETTYNSIMK CDVDIRKDLY ANIVLSGGTT MYAGIADRMS KEITAL-APN HETTYNSIMK CDVDIRKDLY GNVVLSGGST MFPGIAERMN KELVAL-APS HETTYNSIMK CDVDIRKDLY GNIVMSGGTS MFPGIADRMQ KEMTTL-APN HDTTFQSIMK CDVDIRKDLY ANVVLSGGTT MFEGIGERMT KELTAL-APS HDTTFQSIMK CDVDIRKDLY ANVVLSGGTT MFIGIGERMA KELTAL-APS HDTTFQSIMK CDVDIRKDLY ANVVLSGGTT MFQGIGERMT KELTAL-APS HDTTFQSIMK CDVDIRKDLY ANVVLSGGTT MFQGIGERMT KELTAL-APS HDTTFQSIMK CDVDIRKDLY ANVVLSGGTT MFQGIGERMT KELTAL-APS HDTTFQSIMK CDVDIRKDLY ANVVLSGGTT MFPGIGERMT KELTAL-APS HDTTFQSIMK CDVDIRKDLY ANIVLSGGTT MFDGIGERMT KELTAL-APS HDTTFQSIMK CDVDIRKDLY ANVVLSGGTT MFSGIGERMT KELTAL-APS HDTTFQSIMK CDVDIRKDLY TNVVLSGGTT MFAGIGERMT KELTAL-APS GETTFQSIMK CDLDIRKDLY ANIVLSGGTT MYPGIGERMT KELTSL-APS GETTFQSIMK CDLDIRKDLY ANIVLSGGTT MYPGIGERMT KELTSL-APS HETTFQSIMK CDVDIRKDLY ANVVLSGGTT MFEGIGERMT RELTAL-APS HDTTFQSIMK CDVDIRKDLY ANVVLSGGTT MFTGIGERMT KELTAL-APS HDTTFQSIMK CDVDIRKDLY ANVVLSGGTT MFNGIGERMT KELTAL-APS HDTTFQSIMK CDVDIRKDLY ANVVLSGGTT MFTGIGERMT KELTAL-APS SMKIKVVAPH ERKYSVWIGG SILASLSTFQ QMWIAKSEYN EAGPSIVHRK SMKIKVVAPH ERKYSVWIGG SILASLSTFQ QMWIAKSEYN EAGPSIFDQL SMKIKIIAPP ERKYSVWIGG SILSSLSTFQ QMWISKQEYD ESGPSIVHRK TMKIKIIAPP ERKYSVWIGG SILASLSTFQ QMWISKEEYD ESGPSIVHRK TMKIKIIAPP ERKYSVWIGG SILASLSTFQ QMW??????? ?????????? TMKIKVVAPP ERKYSVWIGG SILSSLSTFQ QMWISKGEYD ESGP?????? TMKIKVVAPP ERKYSVWIGG SILSSLSTFQ QMWITKTEYD EAGPSIVHRK TMKIKVVAPP ERKYSVWIGG SILSSLSTFQ QMWISKGEYV ESGPTIVHRK TMKIKVVAPP ERKYSVWIGG SILSSLSTFQ QMWISKSEYD ESGP?????? TMKIKVVAPP ERKYSVWIGG SILSSLSTFQ QMWISKGEYD ESGPTIVHRK TMKIKVVAPP ERKYSVWIGG SILSSLSTFQ QMWISKGEYD ESGPTIVHRK TMKIKVVAPP ERKYSVWIGG SILSSLSTFQ QMWISKGEYD ESGP?????? TMKIKVVAPP ERKYSVWIGG SILSSLSTFQ QMWISKGEYD ESGPTIVHRK TMKIKVVAPP ERKYSVWIGG SILSSLSTFQ QMWISKGEYD ESGP?????? TMKIKVVAPP ERKYSVWIGG SILSSLSTFQ QMWITKEEYV E????????? TMKIKVVAPP ERKYSVWIGG SILSSLSTFQ QMWITKEE?? ?????????? TMKIKVVAPP ERKYSVWIGG SILSALSTFQ QMWISKGEYD ESGP?????? TMKIKVVAPP ERKYSVWIGG SILSSLSTFQ QMWISKGEYD ESGP?????? TMKIKVVAPP ERKYSVWIGG SILSSLSTFQ QMWISKQEYD ESGPTIVHRK TMKIKVVAPP ERKYSVWIGG SILSSLSTFQ QMWISKGEYD ESGP?????? CF VH CF CF ?? ?? CF CF ?? CF CF ?? CF ?? ?? ?? ?? ?? CF ?? pplacer-1.1.alpha19/tests/data/like/jtt/actin.phy_phyml_stats.txt000066400000000000000000000022711303154601500251240ustar00rootroot00000000000000 oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo --- PhyML v3.0_246M --- http://www.atgc-montpellier.fr/phyml Copyright CNRS - Universite Montpellier II oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo . Sequence filename: actin.phy . Data set: #1 . Tree topology search : NNIs . Initial tree: BioNJ . Model of amino acids substitution: JTT . Number of taxa: 20 . Log-likelihood: -2326.22075 . Unconstrained likelihood: -1580.47619 . Parsimony: 225 . Tree size: 0.77714 . Discrete gamma model: Yes - Number of categories: 4 - Gamma shape parameter: 0.288 . Time used 0h0m31s . 31 seconds oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo Suggested citation: S. Guindon & O. Gascuel "A simple, fast, and accurate algorithm to estimate large phylogenies by maximum likelihood" Systematic Biology. 2003. 52(5):696-704. oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo pplacer-1.1.alpha19/tests/data/like/jtt/actin.phy_phyml_tree.txt000066400000000000000000000012441303154601500247240ustar00rootroot00000000000000((((((((((Htrique:0.0061293242,Pmicans:0.0000003432):0.0000002838,Lpolyed:0.0364379869):0.0027347896,Acarter:0.0126273982):0.0031376685,(((SymbiS2:0.0000001000,SymbiS1:0.0029157394):0.0030746072,((Ccohnii:0.0213140814,Asangui:0.0251082818):0.0026865176,(Pshumwa:0.0122901111,Ppiscic:0.0030312555):0.0062626292):0.0084504574):0.0029004396,Gcatena:0.0032070071):0.0031186449):0.0048334780,Plimbat:0.0095275047):0.0160731832,Pmarinu:0.0357729782):0.0415399962,(Csaurop:0.0000001000,Ccanis:0.0000003631):0.1069386215):0.0878622248,(Mpalaef:0.0661714051,Plunula:0.0266619582):0.0152018122):0.0091502369,Igalban:0.0370098316):0.1192496543,Otauri:0.0402830051,Olucima:0.0054355925); pplacer-1.1.alpha19/tests/data/like/jtt/phylo_model.jplace000066400000000000000000000002761303154601500235350ustar00rootroot00000000000000{ "empirical_frequencies": false, "datatype": "AA", "subs_model": "JTT", "program": "PhyML v3.0_246M", "ras_model": "gamma", "gamma": { "alpha": 0.288, "n_cats": 4 } } pplacer-1.1.alpha19/tests/data/like/jtt/run.sh000077500000000000000000000000571303154601500212020ustar00rootroot00000000000000phyml -i actin.phy -d aa -b 0 -m JTT -c 4 -f m pplacer-1.1.alpha19/tests/data/like/wag/000077500000000000000000000000001303154601500200125ustar00rootroot00000000000000pplacer-1.1.alpha19/tests/data/like/wag/actin.fasta000066400000000000000000000161061303154601500221340ustar00rootroot00000000000000>Olucima APKAVFPSIVGRPRHHGVMVGMGQKDCYVGDEAQSKRGILTLKYPIEHGIVTNWDDMEKIWHHTFYNELRVDPAEHPVLLTEAPMNPKANREKMCQIMFETFNVPAMYVSIQAVLSLYASGRTTGIVLDCGDGVSHTVPIYEGYALPHAILRLDLAGRDLTDYMVKILTERGHSFTTSAEREIVRDIKEKLAYVAVDFDEEMAASQSSSTIEKSYELPDGQMITIGNERFRCPEVLFQPSLIGM-ETPGIHETTYNSIMRCDVDIRRDLYANIVLSGGTTMFPGIADRVSKELTAL-APSSMKIKVVAPHERKYSVWIGGSILASLSTFQQMWIAKSEYNEAGPSIVHRKCF >Otauri ??????????????????MVGMGQKDCYVGDEAQSKRGILTLKYPLEHGIVTNWDDMEKIWHHTFYNELRVDPAEHPVLLTEAPMNPKANREKMCQIMFETFNVPAMYVSIQAVLSLYASGRTTGIVLDCGDGVSHTVPIYEGYALPHAILRLDLAGRDLTDYMVKILTERGHSFTTSAEREIVRDIKEKLAYVALDFEEEMATSQSSSSIEKSYELPDGQMITIGSERFRCPEVLFQPSLIGM-ENPGIHETTYNSIMRCDVDIRRDLYANIVLSGGTTMFPGIADRISKELTAL-APSSMKIKVVAPHERKYSVWIGGSILASLSTFQQMWIAKSEYNEAGPSIFDQLVH >Igalban ?????????????????????????????????????????????????????WDDMEKIWHHTFYNELRVAPEEHPVLLTEAPLNPKANREKMTQIMFETFNVPAMYVAIQAVLSLYASGRTTGIVMDSGDGVSHTVPIYEGYALPHAILRLDLAGRDLTDWMVKLLTERGYSFTTTAEREIVRDIKEKLAYVALDFDQEMQTASSSSALEKSYELPDGQVITIGNERFRCPEALFQPTFLGM-EAAGVHETTYNSIMKCDVDIRKDLYANIVLSGGTTMYAGIADRMSKEITAL-APNSMKIKIIAPPERKYSVWIGGSILSSLSTFQQMWISKQEYDESGPSIVHRKCF >Plunula APRAVFPSIVGRPRHTGVMVGMGQKDSYVGDEAQSKRGILPLKYPIEHGIVTNWDDMEKIWHHTLYNELRVAPEEHPVLLTEAPLNPKANREKMTQIMFETFNTPAMYVAIQAVLSLYASGRTTGIVLDSGDGVSHTVPIYEGYALPHAILRLDLAGRDLTDYMMKILTERGYSFTTTAEREIVRDIKEKLAYVALDFEQEMQTAASSSALEKSYELPDGQVITIGNERFRCPEALFQPSFLGM-ESAGVHETTYNSIMKCDVDIRKDLYGNVVLSGGSTMFPGIAERMNKELVAL-APSTMKIKIIAPPERKYSVWIGGSILASLSTFQQMWISKEEYDESGPSIVHRKCF >Mpalaef ?????????????????????????????????????????????????????WDDMEKIWHHTFYNELRVAPEEHPVLLTEAPLNPKANREKMTQLMFETFNTPAMYVAIQAVLSLYASGRTTGIVLDTGDGVTHTVPIYEGYALPHAILRLDLAGRDLTDYLMKILTERGYSFTTTAEREIVRDIKEKLAYVALDFEAEMKTAAESSALEKSYELPDGQVITIGNERFRCPEAMFQPSFLGM-EASGIHETTYNSIMKCDVDIRKDLYGNIVMSGGTSMFPGIADRMQKEMTTL-APNTMKIKIIAPPERKYSVWIGGSILASLSTFQQMW??????????????????? >Ppiscic APRAVFPSIVGRPKMPGIMVGMDQKDSYVGDEAQSKRGVLTLKYPIEHGIVTNWDDMEKIWHHTFYNELRVAPEEHPVLLTEAPLNPKANRERMTQIMFETFNVPAMYVAIQAVLSLYASGRTTGIVMDSGDGVSHTVPIYEGYALPHAILRLDLAGRDLTEYMMKILTERGYSFTTTAEREIVRDVKEKLSYIALDFDSEMKAATESNEKEKTYELPDGNVITVGSERFRCPEVLFQPSFIGK-EASGIHDTTFQSIMKCDVDIRKDLYANVVLSGGTTMFEGIGERMTKELTAL-APSTMKIKVVAPPERKYSVWIGGSILSSLSTFQQMWISKGEYDESGP???????? >Lpolyed APRAVFPSIVGRPKMPGIMVGMDQKDSYIGDEAQSKRGVLTLKYPIEHGIVTNWDDMEKIWHHTFYNELRVAPEEHPVLLTEAPLNPKANRERMTQIMFETFNVPAMYVAIQAVLSLYASGRTTGIVMDSGDGVSHTVPIYEGYALPHAILRLDLAGRDLTDYLMKILTERGYSFTTTAEREIVRDVKEKLCYIALDYDSEMKAATESSDKEKTYELPDGNIITVGSERFRCPEVLFQPSLVGK-EASGVHDTTFQSIMKCDVDIRKDLYANVVLSGGTTMFIGIGERMAKELTAL-APSTMKIKVVAPPERKYSVWIGGSILSSLSTFQQMWITKTEYDEAGPSIVHRKCF >SymbiS1 APRAVFPSIVGRPKMPGIMVGMDQKDSYVGDEAQSKRGVLTLKYPIEHGIVTNWDDMEKIWHHTFYNELR?APEEHPVLLTEAPLNPKANRERMTQIMFETFNVPAMYVAIQAVLSLYASGRTTGIVMDSGDGVSHTVPIYEGYALPHAILRLDLAGRDLTEYMMKILTERGYSFTTTAEREIVRDVKEKLCYIALDFDSEMKAASESSDKEKTYELPDGNIITVGSERFRCPEVLFQPSFVGK-EASGIHDTTFQSIMKCDVDIRKDLYANVVLSGGTTMFQGIGERMTKELTAL-APSTMKIKVVAPPERKYSVWIGGSILSSLSTFQQMWISKGEYVESGPTIVHRKCF >Gcatena APRAVFPSIVGRPKMPGIMVGMDQKDSYVGDEAQSKRGVLTLKYPIEHGIVTNWDDMEKIWHHTFYNELRVAPEEHPVLLTEAPLNPKANRERMTQIMFETFNVPAMYVAIQAVLSLYASGRTTGIVMDSGDGVSHTVPIYEGYALPHAILRLDLAGRDLTEYMMKILTERGYSFTTTAEREIVRDVKEKLCYIALDFDTEMKAATESSDKEKTYELPDGNIITVGSERFRCPEVLFQPSFVGK-EASGIHDTTFQSIMKCDVDIRKDLYANVVLSGGTTMFQGIGERMTKELTAL-APSTMKIKVVAPPERKYSVWIGGSILSSLSTFQQMWISKSEYDESGP???????? >SymbiS2 APRAVFPSIVGRPKMPGIMVGMDQKDSYVGDEAQSKRGVLTLKYPIEHGIVTNWDDMEKIWHHTFYNELRVAPEEHPVLLTEAPLNPKANRERMTQIMFETFNVPAMYVAIQAVLSLYASGRTTGIVMDSGDGVSHTVPIYEGYALPHAILRLDLAGRDLTEYMMKILTERGYSFTTTAEREIVRDVKEKLCYIALDFDSEMKAASESSDKEKTYELPDGNIITVGSERFRCPEVLFQPSFVGK-EASGIHDTTFQSIMKCDVDIRKDLYANVVLSGGTTMFQGIGERMTKELTAL-APSTMKIKVVAPPERKYSVWIGGSILSSLSTFQQMWISKGEYDESGPTIVHRKCF >Acarter APRAVFPSIVGRPKMPGIMVGMDQKDSYVGDEAQSKRGVLTLKYPIEHGIVTNWDDMEKIWHHTFYNELRVAPEEHPVLLTEAPLNPKANRERMTQIMFETFNVPAMYVAIQAVLSLYASGRTTGIVMDSGDGVSHTVPIYEGYALPHAILRLDLAGRDLTEYLMKILTERGYSFTTTAEREIVRDVKEKLCYIALDFDTELKAATESSDKEKTYELPDGNIITVGAERFRCPEVLFNPSFIGK-EASGIHDTTFQSIMKCDVDIRKDLYANVVLSGGTTMFPGIGERMTKELTAL-APSTMKIKVVAPPERKYSVWIGGSILSSLSTFQQMWISKGEYDESGPTIVHRKCF >Pshumwa APRAVFPSIVGRPKMPGIMVGMDQKDSYVGDEAQSKRGVLTLKYPIEHGIVTNWDDMEKIWHHTFYNELRVAPEEHPVLLTEAPLNPKANRERMTQIMFETFNVPAMYVAIQAVLSLYASGRTTGIVVDSGDGVSHTVPIYEGYALPHAILRLDLAGRDLTEYMMKILTERGYSFTTTAEREIVRDVKEKLSYIALDFDSEMKAATESNDKEKTYELPDGNVITVGSERFRCPEVLFQPSFMGK-EASGIHDTTFQSIMKCDVDIRKDLYANIVLSGGTTMFDGIGERMTKELTAL-APSTMKIKVVAPPERKYSVWIGGSILSSLSTFQQMWISKGEYDESGP???????? >Ccohnii APRAVFPSIVGRPKMPGIMVGMDQKDSYVGDEAQSKRGVLTLKYPIEHGIVTNWDDMEKIWHHTFYNELRVAPEEHPVLLTEAPLNPKANRERMTQIMFETFNVPAMYVAIQAVLSLYASGRTTGIVMDSGDGVSHTVPIYEGYALPHAILRLDLAGRDLTEYMMKILTERGYSFTTTAEREIVRDIKEKLSYIALDYDSEMKVATESSDKEKTYELPDGNIITVGSERFRCPEVLFNPSLLGK-ESSGIHDTTFQSIMKCDVDIRKDLYANVVLSGGTTMFSGIGERMTKELTAL-APSTMKIKVVAPPERKYSVWIGGSILSSLSTFQQMWISKGEYDESGPTIVHRKCF >Plimbat APRSVFPSIVGRPKMPGIMVGMGQKDSYVGDEAQSKRGVLTLKYPIEHGIVTNWDDMEKIWHHTFYNELRVAPEEHPVLLTEAPLNPKANRERMTQIMFETFNVPAMYVAIQAVLSLYASGRTTGIVMDSGDGVSHTVPIYEGYALPHAILRLDLAGRDLTEYMMKILTERGYSFTTTAEREIVRDVKEKLCYIALDFDTEMKAATESSDKEKTYELPDGNIITVGSERFRCPEVLFQPSFIGK-EASGIHDTTFQSIMKCDVDIRKDLYTNVVLSGGTTMFAGIGERMTKELTAL-APSTMKIKVVAPPERKYSVWIGGSILSSLSTFQQMWISKGEYDESGP???????? >Ccanis APRCVFPSIVGRPKMPGVMVGMDQKDCYVGDEAQSKRGILTLKYPIEHGIVTNWEDMEKIWHHTFYNELRVAPEEHPVLLTEAPMNPKVNRERMTQIMFETFNVPAMYVNIQAVLSLYASGRTTGIVLDSGDGVSHTVPIYEGYALPHAIMRLDLAGRDLTDFLMKILHDRGYSFTTTAEREIVRDIKEKLCYIALDYEEEMKKSQESSELEKTYELPDGHVITVGSERFRCPEALFQPNLLGK-EAVGIGETTFQSIMKCDLDIRKDLYANIVLSGGTTMYPGIGERMTKELTSL-APSTMKIKVVAPPERKYSVWIGGSILSSLSTFQQMWITKEEYVE??????????? >Csaurop APRCVFPSIVGRPKMPGVMVGMDQKDCYVGDEAQSKRGILTLKYPIEHGIVTNWEDMEKIWHHTFYNELRVAPEEHPVLLTEAPMNPKVNRERMTQIMFETFNVPAMYVNIQAVLSLYASGRTTGIVLDSGDGVSHTVPIYEGYALPHAIMRLDLAGRDLTDFLMKILHDRGYSFTTTAEREIVRDIKEKLCYIALDYEEEMKKSQESSELEKTYELPDGHVITVGSERFRCPEALFQPNLLGK-EAVGIGETTFQSIMKCDLDIRKDLYANIVLSGGTTMYPGIGERMTKELTSL-APSTMKIKVVAPPERKYSVWIGGSILSSLSTFQQMWITKEE?????????????? >Asangui APRAVFSSIVGRPKMPGIMVGMDQKDSYVGDEAQSKRGVLTLKYPIEHGIVTNWDDMEKIWHHTFYNELRVAPEEHPVLLTEAPLNPKANRERMTQIMFETFNVPAMYVAIQAVLSLYASGRTTGIVMDSGDGVSHTVPIYEGYALPHAIFRLDLAGRDLTEYLMKILTERGYSFTTTAEREIVRDVKEKLSYIALDFDSEMKSATESSDKEKTYELPDGNIITIGSERFRCPEVLFQPSLIGK-EASGIHETTFQSIMKCDVDIRKDLYANVVLSGGTTMFEGIGERMTRELTAL-APSTMKIKVVAPPERKYSVWIGGSILSALSTFQQMWISKGEYDESGP???????? >Pmicans APRAVFPSIVGRPKMPGIMVGMDQKDSYVGDEAQSKRGVLTLKYPIEHGIVTNWDDMEKIWHHTFYNELRVAPEEHPVLLTEAPLNPKANRERMTQIMFETFNVPAMYVAIQAVLSLYASGRTTGIVMDSGDGVSHTVPIYEGYALPHAILRLDLAGRDLTEYLMKILTERGYSFTTTAEREIVRDVKEKLCYIALDFDTEMKAATESSDKEKTYELPDGNIITVGSERFRCPEVLFQPSFVGK-EASGIHDTTFQSIMKCDVDIRKDLYANVVLSGGTTMFTGIGERMTKELTAL-APSTMKIKVVAPPERKYSVWIGGSILSSLSTFQQMWISKGEYDESGP???????? >Pmarinu APRSVFPSIVGRPKMPGIMVGMDQKDSYVGDEAQSKRGILTLKYPIEHGIVTNWDDMEKIWHHTFYNELRVSPEEHPVLLTEAPLNPKANRERMTQLMFETFNVPAMYVQIQAVLSLYASGRTTGIVMDSGDGVSHTVPIYEGYALPHAIQRLDLAGRDLTEFMMKILTERGYTFTTTAEREIVRDIKEKLSYVALDFDTEMKAAAESSEKEKTYELPDGNIITVGNERFRCPEVLFQPTFIGK-EASGIHDTTFQSIMKCDVDIRKDLYANVVLSGGTTMFNGIGERMTKELTAL-APSTMKIKVVAPPERKYSVWIGGSILSSLSTFQQMWISKQEYDESGPTIVHRKCF >Htrique APRAVFPSIVGRPKMPGIMVGMDQKDSYVGDEAQSKRGMLTLKYPIEHGIVTNWDDMEKIWHHTFYNELRVAPEEHPVLLTEAPLNPKANRERMTQIMFETFNVPAMYVAIQAVLSLYASGRTTGIVMDSGDGVSHTVPIYEGYALPHAILRLDLAGRDLTEYLMKILTERGYSFTTTAEREIVRDVKEKLCYIALDFDTEMKSATESSDKEKTYELPDGNIITVGSERFRCPEVLFQPSFVGK-EASGIHDTTFQSIMKCDVDIRKDLYANVVLSGGTTMFTGIGERMTKELTAL-APSTMKIKVVAPPERKYSVWIGGSILSSLSTFQQMWISKGEYDESGP???????? pplacer-1.1.alpha19/tests/data/like/wag/actin.phy000066400000000000000000000224771303154601500216460ustar00rootroot00000000000000 20 352 Olucima APKAVFPSIV GRPRHHGVMV GMGQKDCYVG DEAQSKRGIL TLKYPIEHGI Otauri ?????????? ????????MV GMGQKDCYVG DEAQSKRGIL TLKYPLEHGI Igalban ?????????? ?????????? ?????????? ?????????? ?????????? Plunula APRAVFPSIV GRPRHTGVMV GMGQKDSYVG DEAQSKRGIL PLKYPIEHGI Mpalaef ?????????? ?????????? ?????????? ?????????? ?????????? Ppiscic APRAVFPSIV GRPKMPGIMV GMDQKDSYVG DEAQSKRGVL TLKYPIEHGI Lpolyed APRAVFPSIV GRPKMPGIMV GMDQKDSYIG DEAQSKRGVL TLKYPIEHGI SymbiS1 APRAVFPSIV GRPKMPGIMV GMDQKDSYVG DEAQSKRGVL TLKYPIEHGI Gcatena APRAVFPSIV GRPKMPGIMV GMDQKDSYVG DEAQSKRGVL TLKYPIEHGI SymbiS2 APRAVFPSIV GRPKMPGIMV GMDQKDSYVG DEAQSKRGVL TLKYPIEHGI Acarter APRAVFPSIV GRPKMPGIMV GMDQKDSYVG DEAQSKRGVL TLKYPIEHGI Pshumwa APRAVFPSIV GRPKMPGIMV GMDQKDSYVG DEAQSKRGVL TLKYPIEHGI Ccohnii APRAVFPSIV GRPKMPGIMV GMDQKDSYVG DEAQSKRGVL TLKYPIEHGI Plimbat APRSVFPSIV GRPKMPGIMV GMGQKDSYVG DEAQSKRGVL TLKYPIEHGI Ccanis APRCVFPSIV GRPKMPGVMV GMDQKDCYVG DEAQSKRGIL TLKYPIEHGI Csaurop APRCVFPSIV GRPKMPGVMV GMDQKDCYVG DEAQSKRGIL TLKYPIEHGI Asangui APRAVFSSIV GRPKMPGIMV GMDQKDSYVG DEAQSKRGVL TLKYPIEHGI Pmicans APRAVFPSIV GRPKMPGIMV GMDQKDSYVG DEAQSKRGVL TLKYPIEHGI Pmarinu APRSVFPSIV GRPKMPGIMV GMDQKDSYVG DEAQSKRGIL TLKYPIEHGI Htrique APRAVFPSIV GRPKMPGIMV GMDQKDSYVG DEAQSKRGML TLKYPIEHGI VTNWDDMEKI WHHTFYNELR VDPAEHPVLL TEAPMNPKAN REKMCQIMFE VTNWDDMEKI WHHTFYNELR VDPAEHPVLL TEAPMNPKAN REKMCQIMFE ???WDDMEKI WHHTFYNELR VAPEEHPVLL TEAPLNPKAN REKMTQIMFE VTNWDDMEKI WHHTLYNELR VAPEEHPVLL TEAPLNPKAN REKMTQIMFE ???WDDMEKI WHHTFYNELR VAPEEHPVLL TEAPLNPKAN REKMTQLMFE VTNWDDMEKI WHHTFYNELR VAPEEHPVLL TEAPLNPKAN RERMTQIMFE VTNWDDMEKI WHHTFYNELR VAPEEHPVLL TEAPLNPKAN RERMTQIMFE VTNWDDMEKI WHHTFYNELR ?APEEHPVLL TEAPLNPKAN RERMTQIMFE VTNWDDMEKI WHHTFYNELR VAPEEHPVLL TEAPLNPKAN RERMTQIMFE VTNWDDMEKI WHHTFYNELR VAPEEHPVLL TEAPLNPKAN RERMTQIMFE VTNWDDMEKI WHHTFYNELR VAPEEHPVLL TEAPLNPKAN RERMTQIMFE VTNWDDMEKI WHHTFYNELR VAPEEHPVLL TEAPLNPKAN RERMTQIMFE VTNWDDMEKI WHHTFYNELR VAPEEHPVLL TEAPLNPKAN RERMTQIMFE VTNWDDMEKI WHHTFYNELR VAPEEHPVLL TEAPLNPKAN RERMTQIMFE VTNWEDMEKI WHHTFYNELR VAPEEHPVLL TEAPMNPKVN RERMTQIMFE VTNWEDMEKI WHHTFYNELR VAPEEHPVLL TEAPMNPKVN RERMTQIMFE VTNWDDMEKI WHHTFYNELR VAPEEHPVLL TEAPLNPKAN RERMTQIMFE VTNWDDMEKI WHHTFYNELR VAPEEHPVLL TEAPLNPKAN RERMTQIMFE VTNWDDMEKI WHHTFYNELR VSPEEHPVLL TEAPLNPKAN RERMTQLMFE VTNWDDMEKI WHHTFYNELR VAPEEHPVLL TEAPLNPKAN RERMTQIMFE TFNVPAMYVS IQAVLSLYAS GRTTGIVLDC GDGVSHTVPI YEGYALPHAI TFNVPAMYVS IQAVLSLYAS GRTTGIVLDC GDGVSHTVPI YEGYALPHAI TFNVPAMYVA IQAVLSLYAS GRTTGIVMDS GDGVSHTVPI YEGYALPHAI TFNTPAMYVA IQAVLSLYAS GRTTGIVLDS GDGVSHTVPI YEGYALPHAI TFNTPAMYVA IQAVLSLYAS GRTTGIVLDT GDGVTHTVPI YEGYALPHAI TFNVPAMYVA IQAVLSLYAS GRTTGIVMDS GDGVSHTVPI YEGYALPHAI TFNVPAMYVA IQAVLSLYAS GRTTGIVMDS GDGVSHTVPI YEGYALPHAI TFNVPAMYVA IQAVLSLYAS GRTTGIVMDS GDGVSHTVPI YEGYALPHAI TFNVPAMYVA IQAVLSLYAS GRTTGIVMDS GDGVSHTVPI YEGYALPHAI TFNVPAMYVA IQAVLSLYAS GRTTGIVMDS GDGVSHTVPI YEGYALPHAI TFNVPAMYVA IQAVLSLYAS GRTTGIVMDS GDGVSHTVPI YEGYALPHAI TFNVPAMYVA IQAVLSLYAS GRTTGIVVDS GDGVSHTVPI YEGYALPHAI TFNVPAMYVA IQAVLSLYAS GRTTGIVMDS GDGVSHTVPI YEGYALPHAI TFNVPAMYVA IQAVLSLYAS GRTTGIVMDS GDGVSHTVPI YEGYALPHAI TFNVPAMYVN IQAVLSLYAS GRTTGIVLDS GDGVSHTVPI YEGYALPHAI TFNVPAMYVN IQAVLSLYAS GRTTGIVLDS GDGVSHTVPI YEGYALPHAI TFNVPAMYVA IQAVLSLYAS GRTTGIVMDS GDGVSHTVPI YEGYALPHAI TFNVPAMYVA IQAVLSLYAS GRTTGIVMDS GDGVSHTVPI YEGYALPHAI TFNVPAMYVQ IQAVLSLYAS GRTTGIVMDS GDGVSHTVPI YEGYALPHAI TFNVPAMYVA IQAVLSLYAS GRTTGIVMDS GDGVSHTVPI YEGYALPHAI LRLDLAGRDL TDYMVKILTE RGHSFTTSAE REIVRDIKEK LAYVAVDFDE LRLDLAGRDL TDYMVKILTE RGHSFTTSAE REIVRDIKEK LAYVALDFEE LRLDLAGRDL TDWMVKLLTE RGYSFTTTAE REIVRDIKEK LAYVALDFDQ LRLDLAGRDL TDYMMKILTE RGYSFTTTAE REIVRDIKEK LAYVALDFEQ LRLDLAGRDL TDYLMKILTE RGYSFTTTAE REIVRDIKEK LAYVALDFEA LRLDLAGRDL TEYMMKILTE RGYSFTTTAE REIVRDVKEK LSYIALDFDS LRLDLAGRDL TDYLMKILTE RGYSFTTTAE REIVRDVKEK LCYIALDYDS LRLDLAGRDL TEYMMKILTE RGYSFTTTAE REIVRDVKEK LCYIALDFDS LRLDLAGRDL TEYMMKILTE RGYSFTTTAE REIVRDVKEK LCYIALDFDT LRLDLAGRDL TEYMMKILTE RGYSFTTTAE REIVRDVKEK LCYIALDFDS LRLDLAGRDL TEYLMKILTE RGYSFTTTAE REIVRDVKEK LCYIALDFDT LRLDLAGRDL TEYMMKILTE RGYSFTTTAE REIVRDVKEK LSYIALDFDS LRLDLAGRDL TEYMMKILTE RGYSFTTTAE REIVRDIKEK LSYIALDYDS LRLDLAGRDL TEYMMKILTE RGYSFTTTAE REIVRDVKEK LCYIALDFDT MRLDLAGRDL TDFLMKILHD RGYSFTTTAE REIVRDIKEK LCYIALDYEE MRLDLAGRDL TDFLMKILHD RGYSFTTTAE REIVRDIKEK LCYIALDYEE FRLDLAGRDL TEYLMKILTE RGYSFTTTAE REIVRDVKEK LSYIALDFDS LRLDLAGRDL TEYLMKILTE RGYSFTTTAE REIVRDVKEK LCYIALDFDT QRLDLAGRDL TEFMMKILTE RGYTFTTTAE REIVRDIKEK LSYVALDFDT LRLDLAGRDL TEYLMKILTE RGYSFTTTAE REIVRDVKEK LCYIALDFDT EMAASQSSST IEKSYELPDG QMITIGNERF RCPEVLFQPS LIGM-ETPGI EMATSQSSSS IEKSYELPDG QMITIGSERF RCPEVLFQPS LIGM-ENPGI EMQTASSSSA LEKSYELPDG QVITIGNERF RCPEALFQPT FLGM-EAAGV EMQTAASSSA LEKSYELPDG QVITIGNERF RCPEALFQPS FLGM-ESAGV EMKTAAESSA LEKSYELPDG QVITIGNERF RCPEAMFQPS FLGM-EASGI EMKAATESNE KEKTYELPDG NVITVGSERF RCPEVLFQPS FIGK-EASGI EMKAATESSD KEKTYELPDG NIITVGSERF RCPEVLFQPS LVGK-EASGV EMKAASESSD KEKTYELPDG NIITVGSERF RCPEVLFQPS FVGK-EASGI EMKAATESSD KEKTYELPDG NIITVGSERF RCPEVLFQPS FVGK-EASGI EMKAASESSD KEKTYELPDG NIITVGSERF RCPEVLFQPS FVGK-EASGI ELKAATESSD KEKTYELPDG NIITVGAERF RCPEVLFNPS FIGK-EASGI EMKAATESND KEKTYELPDG NVITVGSERF RCPEVLFQPS FMGK-EASGI EMKVATESSD KEKTYELPDG NIITVGSERF RCPEVLFNPS LLGK-ESSGI EMKAATESSD KEKTYELPDG NIITVGSERF RCPEVLFQPS FIGK-EASGI EMKKSQESSE LEKTYELPDG HVITVGSERF RCPEALFQPN LLGK-EAVGI EMKKSQESSE LEKTYELPDG HVITVGSERF RCPEALFQPN LLGK-EAVGI EMKSATESSD KEKTYELPDG NIITIGSERF RCPEVLFQPS LIGK-EASGI EMKAATESSD KEKTYELPDG NIITVGSERF RCPEVLFQPS FVGK-EASGI EMKAAAESSE KEKTYELPDG NIITVGNERF RCPEVLFQPT FIGK-EASGI EMKSATESSD KEKTYELPDG NIITVGSERF RCPEVLFQPS FVGK-EASGI HETTYNSIMR CDVDIRRDLY ANIVLSGGTT MFPGIADRVS KELTAL-APS HETTYNSIMR CDVDIRRDLY ANIVLSGGTT MFPGIADRIS KELTAL-APS HETTYNSIMK CDVDIRKDLY ANIVLSGGTT MYAGIADRMS KEITAL-APN HETTYNSIMK CDVDIRKDLY GNVVLSGGST MFPGIAERMN KELVAL-APS HETTYNSIMK CDVDIRKDLY GNIVMSGGTS MFPGIADRMQ KEMTTL-APN HDTTFQSIMK CDVDIRKDLY ANVVLSGGTT MFEGIGERMT KELTAL-APS HDTTFQSIMK CDVDIRKDLY ANVVLSGGTT MFIGIGERMA KELTAL-APS HDTTFQSIMK CDVDIRKDLY ANVVLSGGTT MFQGIGERMT KELTAL-APS HDTTFQSIMK CDVDIRKDLY ANVVLSGGTT MFQGIGERMT KELTAL-APS HDTTFQSIMK CDVDIRKDLY ANVVLSGGTT MFQGIGERMT KELTAL-APS HDTTFQSIMK CDVDIRKDLY ANVVLSGGTT MFPGIGERMT KELTAL-APS HDTTFQSIMK CDVDIRKDLY ANIVLSGGTT MFDGIGERMT KELTAL-APS HDTTFQSIMK CDVDIRKDLY ANVVLSGGTT MFSGIGERMT KELTAL-APS HDTTFQSIMK CDVDIRKDLY TNVVLSGGTT MFAGIGERMT KELTAL-APS GETTFQSIMK CDLDIRKDLY ANIVLSGGTT MYPGIGERMT KELTSL-APS GETTFQSIMK CDLDIRKDLY ANIVLSGGTT MYPGIGERMT KELTSL-APS HETTFQSIMK CDVDIRKDLY ANVVLSGGTT MFEGIGERMT RELTAL-APS HDTTFQSIMK CDVDIRKDLY ANVVLSGGTT MFTGIGERMT KELTAL-APS HDTTFQSIMK CDVDIRKDLY ANVVLSGGTT MFNGIGERMT KELTAL-APS HDTTFQSIMK CDVDIRKDLY ANVVLSGGTT MFTGIGERMT KELTAL-APS SMKIKVVAPH ERKYSVWIGG SILASLSTFQ QMWIAKSEYN EAGPSIVHRK SMKIKVVAPH ERKYSVWIGG SILASLSTFQ QMWIAKSEYN EAGPSIFDQL SMKIKIIAPP ERKYSVWIGG SILSSLSTFQ QMWISKQEYD ESGPSIVHRK TMKIKIIAPP ERKYSVWIGG SILASLSTFQ QMWISKEEYD ESGPSIVHRK TMKIKIIAPP ERKYSVWIGG SILASLSTFQ QMW??????? ?????????? TMKIKVVAPP ERKYSVWIGG SILSSLSTFQ QMWISKGEYD ESGP?????? TMKIKVVAPP ERKYSVWIGG SILSSLSTFQ QMWITKTEYD EAGPSIVHRK TMKIKVVAPP ERKYSVWIGG SILSSLSTFQ QMWISKGEYV ESGPTIVHRK TMKIKVVAPP ERKYSVWIGG SILSSLSTFQ QMWISKSEYD ESGP?????? TMKIKVVAPP ERKYSVWIGG SILSSLSTFQ QMWISKGEYD ESGPTIVHRK TMKIKVVAPP ERKYSVWIGG SILSSLSTFQ QMWISKGEYD ESGPTIVHRK TMKIKVVAPP ERKYSVWIGG SILSSLSTFQ QMWISKGEYD ESGP?????? TMKIKVVAPP ERKYSVWIGG SILSSLSTFQ QMWISKGEYD ESGPTIVHRK TMKIKVVAPP ERKYSVWIGG SILSSLSTFQ QMWISKGEYD ESGP?????? TMKIKVVAPP ERKYSVWIGG SILSSLSTFQ QMWITKEEYV E????????? TMKIKVVAPP ERKYSVWIGG SILSSLSTFQ QMWITKEE?? ?????????? TMKIKVVAPP ERKYSVWIGG SILSALSTFQ QMWISKGEYD ESGP?????? TMKIKVVAPP ERKYSVWIGG SILSSLSTFQ QMWISKGEYD ESGP?????? TMKIKVVAPP ERKYSVWIGG SILSSLSTFQ QMWISKQEYD ESGPTIVHRK TMKIKVVAPP ERKYSVWIGG SILSSLSTFQ QMWISKGEYD ESGP?????? CF VH CF CF ?? ?? CF CF ?? CF CF ?? CF ?? ?? ?? ?? ?? CF ?? pplacer-1.1.alpha19/tests/data/like/wag/actin.phy_phyml_stats.txt000066400000000000000000000022711303154601500251010ustar00rootroot00000000000000 oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo --- PhyML v3.0_246M --- http://www.atgc-montpellier.fr/phyml Copyright CNRS - Universite Montpellier II oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo . Sequence filename: actin.phy . Data set: #1 . Tree topology search : NNIs . Initial tree: BioNJ . Model of amino acids substitution: WAG . Number of taxa: 20 . Log-likelihood: -2334.79151 . Unconstrained likelihood: -1580.47619 . Parsimony: 225 . Tree size: 0.76104 . Discrete gamma model: Yes - Number of categories: 4 - Gamma shape parameter: 0.289 . Time used 0h0m17s . 17 seconds oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo Suggested citation: S. Guindon & O. Gascuel "A simple, fast, and accurate algorithm to estimate large phylogenies by maximum likelihood" Systematic Biology. 2003. 52(5):696-704. oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo pplacer-1.1.alpha19/tests/data/like/wag/actin.phy_phyml_tree.txt000066400000000000000000000012441303154601500247010ustar00rootroot00000000000000(((((((((((Lpolyed:0.0371276966,Ccohnii:0.0169120127):0.0042685763,Asangui:0.0246491829):0.0029284097,(Pshumwa:0.0123433492,Ppiscic:0.0029797960):0.0062240615):0.0079961742,((Htrique:0.0061712911,Pmicans:0.0000003571):0.0061785340,((SymbiS2:0.0000001000,SymbiS1:0.0029409750):0.0058239134,Gcatena:0.0030398841):0.0000004894):0.0039428125):0.0022512476,Acarter:0.0124233563):0.0008482483,Plimbat:0.0113776740):0.0172747973,Pmarinu:0.0348696755):0.0383584038,(Csaurop:0.0000001000,Ccanis:0.0000003309):0.1038327450):0.0842716267,(Mpalaef:0.0632044661,Plunula:0.0270979539):0.0156578594):0.0089433878,Igalban:0.0354886851):0.1161813440,Otauri:0.0380997300,Olucima:0.0073340743); pplacer-1.1.alpha19/tests/data/like/wag/phylo_model.jplace000066400000000000000000000002761303154601500235120ustar00rootroot00000000000000{ "empirical_frequencies": false, "datatype": "AA", "subs_model": "WAG", "program": "PhyML v3.0_246M", "ras_model": "gamma", "gamma": { "alpha": 0.289, "n_cats": 4 } } pplacer-1.1.alpha19/tests/data/like/wag/run.sh000077500000000000000000000000571303154601500211570ustar00rootroot00000000000000phyml -i actin.phy -d aa -b 0 -m WAG -c 4 -f m pplacer-1.1.alpha19/tests/data/misc/000077500000000000000000000000001303154601500172435ustar00rootroot00000000000000pplacer-1.1.alpha19/tests/data/misc/compress.dot000066400000000000000000000006771303154601500216200ustar00rootroot00000000000000/* distance <=1.75 G F E D C B H 1 1 4.5 3.5 3 2.25 G 1 4.5 3.5 3 2.75 F 3.5 2.5 2 1.75 E 3 2.5 2.25 D 0.5 2.25 C 1.75 blue nodes were chosen as mass centers. */ graph G { { node [fillcolor="#9999ff" style=filled] A D E F } B -- C; B -- F; C -- D; F -- G; F -- H; G -- H; } pplacer-1.1.alpha19/tests/data/misc/compressed.jplace000066400000000000000000000012011303154601500225610ustar00rootroot00000000000000{"tree": "((:1{3},(:1{5},(:1{7},:1{8}):1{6}):1{4}):1{2},:1{1}):0{0};", "placements": [{"p": [[3, -1309.830000, 1.000000, 0.000000, 0.500000]], "n": ["D", "C"]}, {"p": [[4, -1309.830000, 1.000000, 0.000000, 0.500000], [6, -1309.830000, 1.000000, 0.000000, 0.500000] ], "n": ["F", "H", "G", "B"] }, {"p": [[1, -1309.830000, 1.000000, 0.000000, 0.500000]], "n": ["E"]}, {"p": [[8, -1309.830000, 1.000000, 0.000000, 0.500000]], "n": ["A"]} ], "metadata": {"invocation": "guppy compress"}, "version": 2, "fields": ["edge_num", "likelihood", "like_weight_ratio", "distal_length", "pendant_length" ] } pplacer-1.1.alpha19/tests/data/misc/indep_scaled.jplace000066400000000000000000000021251303154601500230350ustar00rootroot00000000000000{"tree": "((A:2{0},B:9{1}):7{2},C:5{3},D:1{4}):0{5};", "placements": [{"p": [[0, -1309.83, 1, 1, 10]], "nm": [["A", 0.757575757576]]}, {"p": [[1, -1309.83, 1, 2, 10]], "nm": [["B", 0.520833333333]]}, {"p": [[3, -1309.83, 1, 4, 10]], "nm": [["C", 0.287356321839]]}, {"p": [[3, -1309.83, 1, 0, 10]], "nm": [["D", 0.333333333333]]}, {"p": [[2, -1309.83, 1, 0, 10]], "nm": [["E", 0.609756097561]]}, {"p": [[2, -1309.83, 1, 2, 10]], "nm": [["F", 0.227272727273]]}, {"p": [[2, -1309.83, 1, 2, 10]], "nm": [["G", 0.136363636364], ["H", 0.181818181818]] }, {"p": [[2, -1309.83, 0.5, 2, 10], [2, -1309.83, 0.5, 1, 10]], "nm": [["I", 0.485436893204]] }, {"p": [[2, -1309.83, 0.4, 1, 10], [2, -1309.83, 0.3, 0.5, 10], [2, -1309.83, 0.3, 0.75, 10] ], "nm": [["J", 0.538502961766]] } ], "metadata": {"invocation": "bin\/guppy mft --leaf-values copy_test.csv tests\/data\/misc\/test_indep_contrasts.jplace -o mft" }, "version": 3, "fields": ["edge_num", "likelihood", "like_weight_ratio", "distal_length", "pendant_length" ] } pplacer-1.1.alpha19/tests/data/misc/test4.jplace000066400000000000000000000006201303154601500214640ustar00rootroot00000000000000{"tree": "((A:2[0],B:9[1]):7[2],C:5[3],D:1[4]):0[5];", "placements": [{"p": [ [0, -1309.830000, 0.300000, 0.000000, 10.000000], [1, -1309.830000, 0.200000, 6.000000, 10.000000], [2, -1309.830000, 0.500000, 1.000000, 10.000000] ], "n": ["four" ] } ], "metadata": {"invocation": "by hand" }, "version": 1, "fields": ["edge_num", "likelihood", "like_weight_ratio", "distal_length", "pendant_length" ] } pplacer-1.1.alpha19/tests/data/misc/test_compress.jplace000066400000000000000000000017071303154601500233220ustar00rootroot00000000000000{"tree": "((:1{3},(:1{5},(:1{7},:1{8}):1{6}):1{4}):1{2},:1{1}):0{0};", "placements": [ {"p": [ [8, -1309.83, 1.0, 0.0, 0.5] ], "n": ["A"]}, {"p": [ [1, -1309.83, 1.0, 0.0, 0.5], [2, -1309.83, 1.0, 0.0, 0.5], [4, -1309.83, 1.0, 0.0, 0.5], [5, -1309.83, 1.0, 0.0, 0.5] ], "n": ["B"]}, {"p": [ [2, -1309.83, 1.0, 0.0, 0.5], [3, -1309.83, 1.0, 0.0, 0.5] ], "n": ["C"]}, {"p": [ [3, -1309.83, 1.0, 0.0, 0.5] ], "n": ["D"]}, {"p": [ [1, -1309.83, 1.0, 0.0, 0.5] ], "n": ["E"]}, {"p": [ [4, -1309.83, 1.0, 0.0, 0.5], [6, -1309.83, 1.0, 0.0, 0.5] ], "n": ["F"]}, {"p": [ [6, -1309.83, 1.0, 0.0, 0.5], [7, -1309.83, 1.0, 0.0, 0.5] ], "n": ["G"]}, {"p": [ [5, -1309.83, 1.0, 0.0, 0.5], [7, -1309.83, 1.0, 0.0, 0.5] ], "n": ["H"]} ], "metadata": {"invocation": "by hand"}, "version": 2, "fields": ["edge_num", "likelihood", "like_weight_ratio", "distal_length", "pendant_length"] } pplacer-1.1.alpha19/tests/data/misc/test_error_expected.jplace000066400000000000000000000006771303154601500245060ustar00rootroot00000000000000{"tree": "((:1,(:1,:1):1):1,((:1,:1):1,:1):1);", "placements": [ {"p": [ [3, -1309.830000, 1.000000, 0.500000, 10.000000] ], "n": ["one", "two"]}, {"p": [ [0, -1309.830000, 0.400000, 0.500000, 10.000000], [3, -1309.830000, 0.600000, 0.500000, 5.000000] ], "n": ["three"]} ], "metadata": {"invocation": "by hand"}, "version": 1, "fields": ["edge_num", "likelihood", "like_weight_ratio", "distal_length", "pendant_length"] } pplacer-1.1.alpha19/tests/data/misc/test_error_experimental.jplace000066400000000000000000000011001303154601500253600ustar00rootroot00000000000000{"tree": "((:1,(:1,:1):1):1,((:1,:1):1,:1):1);", "placements": [ {"p": [ [3, -1309.830000, 0.600000, 0.800000, 10.000000], [3, -1309.830000, 0.400000, 0.100000, 5.000000] ], "n": ["one"]}, {"p": [ [0, -1309.830000, 0.400000, 0.500000, 10.000000], [1, -1309.830000, 0.600000, 0.600000, 5.000000] ], "n": ["two"]}, {"p": [ [2, -1309.830000, 1.000000, 0.500000, 10.000000] ], "n": ["three"]} ], "metadata": {"invocation": "by hand"}, "version": 1, "fields": ["edge_num", "likelihood", "like_weight_ratio", "distal_length", "pendant_length"] } pplacer-1.1.alpha19/tests/data/misc/test_indep_contrasts.jplace000066400000000000000000000015561303154601500246700ustar00rootroot00000000000000{"tree": "((A:2{0},B:9{1}):7{2},C:5{3},D:1{4}):0{5};", "placements": [{"p": [[0, -1309.83, 1, 1, 10]], "nm": [["A", 1]]}, {"p": [[1, -1309.83, 1, 2, 10]], "nm": [["B", 1]]}, {"p": [[3, -1309.83, 1, 4, 10]], "nm": [["C", 1]]}, {"p": [[3, -1309.83, 1, 0, 10]], "nm": [["D", 1]]}, {"p": [[2, -1309.83, 1, 0, 10]], "nm": [["E", 1]]}, {"p": [[2, -1309.83, 1, 2, 10]], "nm": [["F", 0.5]]}, {"p": [[2, -1309.83, 1, 2, 10]], "nm": [["G", 0.3], ["H", 0.4]]}, {"p": [[2, -1309.83, 0.5, 2, 10], [2, -1309.83, 0.5, 1, 10]], "nm": [["I", 1]] }, {"p": [[2, -1309.83, 0.4, 1, 10], [2, -1309.83, 0.3, 0.5, 10], [2, -1309.83, 0.3, 0.75, 10] ], "nm": [["J", 1]] } ], "metadata": {"invocation": "by hand"}, "version": 3, "fields": ["edge_num", "likelihood", "like_weight_ratio", "distal_length", "pendant_length" ] } pplacer-1.1.alpha19/tests/data/misc/test_indep_contrasts_holed_subtree.jplace000066400000000000000000000015741303154601500275740ustar00rootroot00000000000000{"tree": "((A:2{0},B:9{1}):7{2},(C:5{3},E:1{6}):2{7},D:1{4}):0{5};", "placements": [{"p": [[0, -1309.83, 1, 1, 10]], "nm": [["A", 1]]}, {"p": [[1, -1309.83, 1, 2, 10]], "nm": [["B", 1]]}, {"p": [[3, -1309.83, 1, 4, 10]], "nm": [["C", 1]]}, {"p": [[3, -1309.83, 1, 0, 10]], "nm": [["D", 1]]}, {"p": [[2, -1309.83, 1, 0, 10]], "nm": [["E", 1]]}, {"p": [[2, -1309.83, 1, 2, 10]], "nm": [["F", 0.5]]}, {"p": [[2, -1309.83, 1, 2, 10]], "nm": [["G", 0.3], ["H", 0.4]]}, {"p": [[2, -1309.83, 0.5, 2, 10], [2, -1309.83, 0.5, 1, 10]], "nm": [["I", 1]] }, {"p": [[2, -1309.83, 0.4, 1, 10], [2, -1309.83, 0.3, 0.5, 10], [2, -1309.83, 0.3, 0.75, 10] ], "nm": [["J", 1]] } ], "metadata": {"invocation": "by hand"}, "version": 3, "fields": ["edge_num", "likelihood", "like_weight_ratio", "distal_length", "pendant_length" ] } pplacer-1.1.alpha19/tests/data/misc/test_islands.jplace000066400000000000000000000015021303154601500231150ustar00rootroot00000000000000{"tree": "((,(,)),((,),));", "placements": [ {"p": [ [0, -1309.830000, 0.300000, 0.000000, 10.000000] ], "n": ["one"]}, {"p": [ [1, -1309.830000, 0.200000, 6.000000, 10.000000] ], "n": ["two"]}, {"p": [ [0, -1309.830000, 0.300000, 0.000000, 10.000000], [1, -1309.830000, 0.200000, 6.000000, 10.000000], [2, -1309.830000, 0.500000, 1.000000, 10.000000] ], "n": ["three"]}, {"p": [ [3, -1309.830000, 0.300000, 0.000000, 10.000000], [4, -1309.830000, 0.200000, 6.000000, 10.000000] ], "n": ["four"]}, {"p": [ [4, -1309.830000, 0.300000, 0.000000, 10.000000], [3, -1309.830000, 0.200000, 6.000000, 10.000000] ], "n": ["five"]} ], "metadata": {"invocation": "by hand"}, "version": 1, "fields": ["edge_num", "likelihood", "like_weight_ratio", "distal_length", "pendant_length"] } pplacer-1.1.alpha19/tests/data/misc/test_rarefaction.jplace000066400000000000000000000006331303154601500237610ustar00rootroot00000000000000{"tree": "((A:2,B:3):1,C:4);", "placements": [ {"p": [[0, -1309.830000, 1.000000, 1.000000, 10.000000]], "n": ["a"]}, {"p": [[1, -1309.830000, 1.000000, 1.000000, 10.000000]], "n": ["b"]}, {"p": [[3, -1309.830000, 1.000000, 1.000000, 10.000000]], "n": ["c"]} ], "metadata": {"invocation": "by hand" }, "version": 3, "fields": ["edge_num", "likelihood", "like_weight_ratio", "distal_length", "pendant_length" ] }pplacer-1.1.alpha19/tests/data/misc/test_rarefy.jplace000066400000000000000000000014271303154601500227560ustar00rootroot00000000000000{"tree": "((:1{3},(:1{5},(:1{7},:1{8}):1{6}):1{4}):1{2},:1{1}):0{0};", "placements": [ {"p": [ [8, -1309.83, 1.0, 0.0, 0.5] ], "nm": [["A", 1]]}, {"p": [ [1, -1309.83, 1.0, 0.0, 0.5], [2, -1309.83, 1.0, 0.0, 0.5], [4, -1309.83, 1.0, 0.0, 0.5], [5, -1309.83, 1.0, 0.0, 0.5] ], "nm": [["B", 1]]}, {"p": [ [2, -1309.83, 1.0, 0.0, 0.5], [3, -1309.83, 1.0, 0.0, 0.5] ], "nm": [["C", 2], ["D", 3]]}, {"p": [ [3, -1309.83, 1.0, 0.0, 0.5] ], "nm": [["E", 0.5], ["F", 0.25]]}, {"p": [ [6, -1309.83, 1.0, 0.0, 0.5], [7, -1309.83, 1.0, 0.0, 0.5] ], "nm": [["G", 1], ["H", 1], ["I", 1]]} ], "metadata": {"invocation": "by hand"}, "version": 3, "fields": ["edge_num", "likelihood", "like_weight_ratio", "distal_length", "pendant_length"] } pplacer-1.1.alpha19/tests/data/misc/test_scaled_error_experimental.jplace000066400000000000000000000011241303154601500267010ustar00rootroot00000000000000{"tree": "((:0.5,(:0.5,:0.5):0.5):0.5,((:0.5,:0.5):0.5,:0.5):0.5);", "placements": [ {"p": [ [3, -1309.830000, 0.600000, 0.400000, 10.000000], [3, -1309.830000, 0.400000, 0.050000, 5.000000] ], "n": ["one"]}, {"p": [ [0, -1309.830000, 0.400000, 0.250000, 10.000000], [1, -1309.830000, 0.600000, 0.300000, 5.000000] ], "n": ["two"]}, {"p": [ [2, -1309.830000, 1.000000, 0.250000, 10.000000] ], "n": ["three"]} ], "metadata": {"invocation": "by hand"}, "version": 1, "fields": ["edge_num", "likelihood", "like_weight_ratio", "distal_length", "pendant_length"] } pplacer-1.1.alpha19/tests/data/misc/test_voronoi.jplace000066400000000000000000000007561303154601500231650ustar00rootroot00000000000000{"tree": "(n1:4{1},(n3:1{3},(n0:6{0},n2:0.3{2}):5{4}):4{5}):0{6};", "placements": [{"p": [[1, 0, 1, 2.0, 1]], "nm": [["1_0", 1]]}, {"p": [[0, 0, 1, 0.0, 1]], "nm": [["0_0", 1]]}, {"p": [[4, 0, 1, 2.0, 1]], "nm": [["4_0", 1]]}, {"p": [[5, 0, 1, 0.0, 1]], "nm": [["5_0", 1]]} ], "metadata": {"invocation": ".\/gentree.native 2 1 4 vld-107-4-%d 3 4 5 6"}, "version": 3, "fields": ["edge_num", "likelihood", "like_weight_ratio", "distal_length", "pendant_length" ] }pplacer-1.1.alpha19/tests/data/moran/000077500000000000000000000000001303154601500174245ustar00rootroot00000000000000pplacer-1.1.alpha19/tests/data/moran/control.jplace000066400000000000000000010613151303154601500222730ustar00rootroot00000000000000{"tree": "((((((Cyanophora_paradoxa_:0.0665203[0],Mesostigma_viride_:0.0962753[1]):0.0362291[2],((chloroplast_Cyanidium_sp._Monte_Rotaro.AY391365_:0.123946[3],((chloroplast_Galdieria_sulphuraria.AY541295_:0.076265[4],((chloroplast_Galdieria_sulphuraria.AY119731_:2.68035e-06[5],chloroplast_Cyanidium_caldarium.X52758_:0.0195896[6]):0.0312019[7],chloroplast_Galdieria_sulphuraria.AY541294_:0.0188214[8]):0.0324389[9]):0.133418[10],((chloroplast_Cyanidioschyzon_merolae.AY119730_:2.68035e-06[11],chloroplast_Cyanidioschyzon_merolae_strain_DBV201.AY119729_:0.00117862[12]):0.0762594[13],chloroplast_Cyanidium_caldarium.AY541290_:0.203636[14]):0.0380657[15]):0.0194682[16]):0.0492622[17],(((chloroplast_Vaucheria_litorea.AF227740_:0.0517049[18],(plastid_Tribonema_aequale.AY528860_:0.0126259[19],chloroplast_Bumilleriopsis_filiformis.X79223_:0.00666588[20]):0.017649[21]):0.0281935[22],(((chloroplast_Skeletonema_costatum.AY119761_:0.00361095[23],Thalassiosira_pseudonana_:0.00113368[24]):0.0145191[25],(((Bigelowiella_natans_:0.097412[26],((Chlamydomonas_reinhardtii_:0.0704485[27],(chloroplast_Picochlorum_sp._RCC289.EU851960_:0.0487654[28],(Chlorella_vulgaris_:0.0467075[29],(chloroplast_Chlorella_pyrenoidosa.EU043047_:0.00161427[30],chloroplast_Auxenochlorella_protothecoides.EU043045_:0.00193294[31]):0.0152331[32]):0.0200406[33]):0.0147874[34]):0.0130863[35],((chloroplast_Chlorella_vulgaris.EU043044_:0.00120893[36],chloroplast_Chlorella_pyrenoidosa.EU043049_:0.00232797[37]):0.0768327[38],(plastid_Tetraselmis_marina.AY857618_:0.0254053[39],(chloroplast_Pseudochlorella_sp._CCAP_211_1A.EU043048_:0.0869235[40],(((((Synechococcus_sp._PCC_7002___gi170076636refNC_010475_:0.0621893[41],(((Nostock_punctiforme_gi186680550refNC_010628_:0.112883[42],((Nostoc_sp._PCC_7120_gi17227497refNC_003272_:0.00889436[43],Anabaena_variabilis_A_gi75906225refNC_007413_:0.0221131[44]):0.038336[45],(Nodularia_spumige_gi119512239refNZ_AAVW01000065_:0.0504455[46],Fremyella_diplosiphon.FDIPSBA_:0.051697[47]):0.0178891[48]):0.0237368[49]):0.0326133[50],(Lyngbya_sp_PCC_8106___gi119483230refNZ_AAVU01000001_:0.231009[51],(Microcystis_aerouginosa_gi166362741refNC_010296_:0.0929627[52],((Cyanothece_sp._ATCC_51142.CAU39610_:0.0123916[53],Cyanothece_sp._CCY_0110___gi126657681refNZ_AAXW01000012_:0.0313088[54]):0.0369935[55],(Cyanothece_sp._PCC_7425_gi218437013refNC_011729_:0.0746015[56],Cyanothece_sp._PCC_8801_gi218244892refNC_011726_:0.0616473[57]):0.0148311[58]):0.0396174[59]):0.0228094[60]):0.0166279[61]):0.0233005[62],(Synechocystis_sp_PCC_6803___gi16329170refNC_000911_:0.0535075[63],((((((Cyanothece_sp._CC_gi126660325refNZ_AAXW01000053_:0.347497[64],Synechococcus_sp._PCC_7335_gi225144522refNW_002475532_:0.317895[65]):0.108045[66],Mastigocladus_laminosus.AF170924_:0.264356[67]):0.0676548[68],((Synechococcus_sp._JA-3-3Ab__gi86604733refNC_007775_:0.0973541[69],Synechococcus_sp._JA-2-3Ba____gi86607503refNC_007776_:0.564415[70]):0.0790386[71],Gloeobacter_violaceus_gi37519569refNC_005125.1_:0.263289[72]):0.11791[73]):0.0379309[74],(Thermosynechococcus_gi22297544refNC_004113_:0.11758[75],(Cyanothece_sp._PCC_7425_gi220905643refNC_011884_:0.138332[76],Acaryochloris_marina_MBIC11017.AB303650_:0.216398[77]):0.0159655[78]):0.0287204[79]):0.0341087[80],((Prochlorothrix_hollandica.X14308_:2.68035e-06[81],Prochlorothrix_hollandica.X14523_:0.00128006[82]):0.081034[83],((Synechococcus_elongatus_PCC_7942___gi81298811refNC_007604_:0.0105928[84],Synechococcus_elongatus_PCC_6301___gi56750010refNC_006576_:0.00276979[85]):0.107743[86],((Synechococcus_sp._WH_5701__gi87301761refNZ_AANO01000004_:0.0111919[87],Synechococcus_sp._WH_5701__gi87303211refNZ_AANO01000010_:0.0726788[88]):0.0147436[89],(((((Synechococcus_sp._RCC307_gi148241099refNC_009482_:0.0408099[90],((Synechococcus_sp._WH_8102_gi33864539refNC_005070_:0.0201067[91],(Synechococcus_sp._CC9902_gi78183584refNC_007513_:0.00536202[92],Synechococcus_sp._BL107_gi211594587refNZ_DS022298_:0.00246287[93]):0.0392091[94]):0.00867041[95],Synechococcus_sp._CC9605_gi78211558refNC_007516_:0.0275067[96]):0.0214861[97]):0.0346913[98],(Synechococcus_sp.__RS9916__gi116074999refNZ_AAUA01000003_:0.0477208[99],Synechococcus_sp._gi87123618refNZ_AANP01000002_:0.0406377[100]):0.0188201[101]):0.0110855[102],((Synechococcus_sp._WH_7803___gi148238336refNC_009481_:0.00753009[103],(Synechococcus_sp.__WH_7805__gi88807077refNZ_AAOK01000001_:0.00265618[104],Synechococcus_sp._WH_7805__gi88807768refNZ_AAOK01000002_:0.0026187[105]):0.00799342[106]):0.0173394[107],(Synechococcus_sp._RS9917___gi87125174refNZ_AANP01000006_:2.68035e-06[108],Synechococcus_sp._RS9917___gi87124875refNZ_AANP01000005_:0.0026301[109]):0.00794167[110]):0.0038034[111]):0.0158306[112],Synechococcus_sp._RS9917__gi87124182refNZ_AANP01000003_:0.192923[113]):0.0118268[114],Cyanobium_sp._PCC_70_gi223490194refNW_002243451_:0.0330768[115]):0.0231555[116]):0.0518051[117]):0.0453212[118]):0.0351102[119]):0.0447589[120],Microcoleus_chthonoplastes_PCC_7420___gi224400128refNW_002435220_:0.0843742[121]):0.0306188[122]):0.0369097[123]):0.0349985[124]):0.0577156[125],Trichodesmium_erythr_gi113473942refNC_008312_:0.106684[126]):0.0409208[127],(((Prochlorococcus_marinus_subsp._pastoris_str._CCMP1986_gi33860560refNC_005072_:0.00365008[128],Prochlorococcus_marinus_str._MIT_9515___gi123965234refNC_008817_:0.00483373[129]):0.0106366[130],(Prochlorococcus_marinus_str._AS9601_gi123967536refNC_008816_:2.68035e-06[131],(Prochlorococcus_marinus_str._MIT_9301__gi126695337refNC_009091_:0.0108685[132],((Procholococcus_marinus_str._MIT_9202_gi225077649refNW_002467725_:0.00240146[133],Procholococcus_marinus_str._MIT_9215___gi157412338refNC_009840_:2.68035e-06[134]):0.00591536[135],Prochlorococcus_marinus_str._MIT_9312_gi78778385refNC_007577_:0.00379511[136]):0.0049759[137]):0.00132484[138]):0.0105617[139]):0.0465879[140],((Procholococcus_marinus_str._NATL2A___gi162958048refNC_007335.2_:0.00365548[141],Prochlorococcus_marinus_str._NATL1A___gi124024712refNC_008819_:2.68035e-06[142]):0.0615085[143],(Prochlorococcus_marinus_subsp._marinus_str._CCMP1375_gi33239452refNC_005042_:0.100663[144],Procholococcus_marinus_str._MIT_9211___gi159902540refNC_009976_:0.0611398[145]):0.060931[146]):0.0653211[147]):0.148126[148]):0.0637467[149],((chloroplast_Pavlova_gyrans.AJ575575_:0.0169655[150],(chloroplast_Pavlova_lutheri.AY119755_:0.0146662[151],chloroplast_Pavlova_gyrans.AY119754_:0.0299817[152]):0.0270032[153]):0.0303472[154],((chloroplast_Chrysochromulina_polylepis.AJ575572_:0.0128709[155],chloroplast_Imantonia_rotunda.EU851963_:0.0436031[156]):0.00589301[157],(((chloroplast_Isochrysis_galbana.AJ575574_:0.0174268[158],chloroplast_Emiliania_huxleyi.AJ575573_:0.0115577[159]):0.00738805[160],(chloroplast_Phaeocystis_antarctica.AY119756_:0.0324724[161],(chloroplast_Prymnesium_parvum.AY119758_:0.0107131[162],chloroplast_Prymnesium_parvum.AJ575576_:0.00676058[163]):0.020704[164]):0.00735947[165]):0.00200676[166],chloroplast_Pleurochrysis_carterae.AY119757_:0.0339814[167]):0.00361886[168]):0.0233927[169]):0.0187331[170]):0.0346389[171],((chloroplast_Mantoniella_squamata.EU851964_:0.00842936[172],((plastid_uncultured_Prasinophyceae.AY176630_:0.0226216[173],(((chloroplast_Ostreococcus_sp._RCC344.EU851961_:0.00605274[174],Ostreococcus_tauri_:0.010265[175]):0.00616569[176],chloroplast_Ostreococcus_sp._RCC789.EU851970_:0.01746[177]):0.00408084[178],(uncultured_Prasinophyceae.AY509537_:0.0209825[179],chloroplast_Bathycoccus_prasinos.EU851955_:0.00805147[180]):0.0371846[181]):0.00765875[182]):0.0179484[183],(chloroplast_Micromonas_pusilla.EU851965_:2.68035e-06[184],plastid_uncultured_Prasinophyceae.AY176639_:2.68035e-06[185]):0.0089575[186]):0.0110303[187]):0.0523059[188],chloroplast_Pycnococcus_provasolii.EU851957_:0.0961508[189]):0.0343432[190]):0.015656[191]):0.0224695[192]):0.0167387[193]):0.00670223[194]):0.00945502[195]):0.0781944[196],(Fragilariopsis_psbA_:0.0245188[197],Pmultiseries_psbA_:0.0131238[198]):0.0133041[199]):0.0126908[200],(Phaeodactylum_tricornutum_:0.0191354[201],plastid_Ballia_callitricha.DQ787635_:0.061781[202]):0.00999794[203]):0.0201532[204]):0.0386439[205],(chloroplast_Heterosigma_akashiwo.AY119759_:2.68035e-06[206],chloroplast_Heterosigma_carterae.HCU18090_:2.68035e-06[207]):0.0242521[208]):0.00684342[209]):0.018078[210],((chloroplast_Pachydictyon_coriaceum.AY422614_:0.0241936[211],chloroplast_Dictyota_dichotoma_var._linearis.AY422632_:0.00853816[212]):0.0239851[213],((chloroplast_Fucus_vesiculosus.DQ307679_:0.0343612[214],chloroplast_Ectocarpus_siliculosus.X56695_:0.0397557[215]):0.038827[216],((plastid_Padina_japonica.AY430360_:0.0143668[217],(plastid_Padina_arborescens.AY430357_:0.0162365[218],plastid_Padina_crassa.AY430358_:0.00695945[219]):0.00495696[220]):0.00344828[221],chloroplast_Padina_crassa.AY422643_:0.00886928[222]):0.0167452[223]):0.0107453[224]):0.0364574[225]):0.032314[226]):0.0129864[227]):0.0215549[228],(chloroplast_Flintiella_sanguinaria.AY119740_:0.047233[229],chloroplast_Porphyridium_aerugineum.AY119741_:0.0471646[230]):0.0174241[231]):0.0188085[232],(((chloroplast_Erythrotrichia_carnea.AY119739_:0.0623046[233],chloroplast_Rhodochaete_parvula.AY119743_:0.0796661[234]):0.0450641[235],chloroplast_Rhodosorus_marinus.AY119744_:0.0614381[236]):0.0130888[237],chloroplast_Bangiopsis_subsimplex.AY119736_:0.0278478[238]):0.0130213[239]):0.0469411[240],(chloroplast_Palmaria_palmata.PPU28165_:0.0983928[241],(plastid_Antithamnionella_sp._A31.DQ787640_:0.0189374[242],(plastid_Carpoblepharis_flaccida.DQ787643_:0.104554[243],chloroplast_Antithamnion_sp.X55364_:0.0274272[244]):0.00842288[245]):0.0306715[246]):0.0178171[247]):0.0709634[248],Porphyra_yezoensis_:0.0125208[249],Porphyra_purpurea_:0.0210402[250]):0[251];", "placements": [{"p": [[0, -5700.010000, 0.155277, 0.000008, 1.999990 ], [2, -5700.030000, 0.153087, 0.036220, 1.999990 ], [227, -5700.030000, 0.153070, 0.012980, 1.999990 ], [228, -5700.030000, 0.153035, 0.000005, 1.999990 ], [1, -5700.040000, 0.151204, 0.096269, 1.999990 ], [17, -5700.290000, 0.117165, 0.049256, 1.999990 ], [226, -5700.290000, 0.117162, 0.032306, 1.999990 ] ], "n": ["FDJVGXF01AR46S" ] }, {"p": [[0, -3360.110000, 0.189998, 0.000008, 0.749450 ], [2, -3360.290000, 0.158188, 0.036220, 0.682944 ], [227, -3360.290000, 0.158145, 0.012980, 0.682953 ], [228, -3360.290000, 0.158099, 0.000005, 0.682915 ], [1, -3360.410000, 0.140083, 0.096269, 0.801723 ], [148, -3360.470000, 0.132139, 0.081697, 0.906141 ], [204, -3361.210000, 0.063349, 0.015026, 0.817513 ] ], "n": ["FDJVGXF01B0W77" ] }, {"p": [[0, -2734.470000, 0.219662, 0.000008, 0.770961 ], [148, -2734.840000, 0.152975, 0.076333, 0.977053 ], [1, -2734.880000, 0.145896, 0.096269, 0.887218 ], [2, -2734.880000, 0.145895, 0.000009, 0.887199 ], [227, -2735.010000, 0.128294, 0.012980, 0.899452 ], [212, -2735.130000, 0.114269, 0.000008, 0.894439 ], [65, -2735.330000, 0.093009, 0.202930, 0.993485 ] ], "n": ["FDJVGXF01AQ80C_rvcmp" ] }, {"p": [[1, -7534.320000, 0.904492, 0.057572, 0.093211 ], [2, -7537.800000, 0.027864, 0.016056, 0.108359 ], [226, -7538.140000, 0.019822, 0.025233, 0.110628 ], [17, -7538.300000, 0.017002, 0.033682, 0.099106 ], [227, -7538.390000, 0.015414, 0.012980, 0.114407 ], [228, -7538.400000, 0.015406, 0.000005, 0.114406 ] ], "n": ["FDJVGXF01D5TIW" ] }, {"p": [[1, -7350.310000, 0.843161, 0.058259, 0.089891 ], [226, -7353.340000, 0.040725, 0.024504, 0.104966 ], [2, -7353.520000, 0.034154, 0.022140, 0.105068 ], [17, -7353.590000, 0.031751, 0.033903, 0.093812 ], [227, -7353.830000, 0.025112, 0.012980, 0.109633 ], [228, -7353.830000, 0.025098, 0.000005, 0.109634 ] ], "n": ["FDJVGXF01AJUIH_rvcmp" ] }, {"p": [[1, -6830.070000, 0.365840, 0.050655, 0.106232 ], [226, -6830.090000, 0.359994, 0.016241, 0.105660 ], [225, -6831.690000, 0.072735, 0.036449, 0.121914 ], [17, -6831.750000, 0.068473, 0.036260, 0.101017 ], [227, -6832.170000, 0.045204, 0.007426, 0.115530 ], [2, -6832.200000, 0.043891, 0.036220, 0.117886 ], [228, -6832.200000, 0.043864, 0.000005, 0.117894 ] ], "n": ["FDJVGXF01BSCCI_rvcmp" ] }, {"p": [[1, -6077.210000, 0.371419, 0.050826, 0.103586 ], [226, -6077.430000, 0.298856, 0.014817, 0.106659 ], [210, -6078.620000, 0.091368, 0.016280, 0.118972 ], [225, -6078.640000, 0.089183, 0.036449, 0.119487 ], [17, -6078.670000, 0.086937, 0.027057, 0.100541 ], [227, -6079.560000, 0.035545, 0.000006, 0.115086 ], [16, -6079.850000, 0.026692, 0.016304, 0.100662 ] ], "n": ["FDJVGXF01CDOA5" ] }, {"p": [[1, -6144.060000, 1.000000, 0.028348, 0.087970 ] ], "n": ["FDJVGXF01A615B_rvcmp" ] }, {"p": [[1, -5568.110000, 0.987551, 0.039659, 0.078913 ], [226, -5572.490000, 0.012449, 0.007116, 0.107364 ] ], "n": ["FDJVGXF01A87XB_rvcmp" ] }, {"p": [[1, -5825.460000, 1.000000, 0.028971, 0.084501 ] ], "n": ["FDJVGXF01BRKCL_rvcmp" ] }, {"p": [[1, -5526.750000, 0.974852, 0.040055, 0.096719 ], [226, -5530.400000, 0.025148, 0.014279, 0.123324 ] ], "n": ["FDJVGXF01EQECW_rvcmp" ] }, {"p": [[1, -5564.800000, 1.000000, 0.028081, 0.091764 ] ], "n": ["FDJVGXF01CKP9W_rvcmp" ] }, {"p": [[1, -5329.660000, 0.361179, 0.046886, 0.083300 ], [226, -5330.130000, 0.225502, 0.012603, 0.093797 ], [225, -5330.420000, 0.168098, 0.034696, 0.097185 ], [210, -5330.440000, 0.164555, 0.018069, 0.099227 ], [17, -5332.120000, 0.030919, 0.044550, 0.094571 ], [227, -5332.150000, 0.029884, 0.000006, 0.097389 ], [2, -5332.560000, 0.019863, 0.036220, 0.100990 ] ], "n": ["FDJVGXF01BR9HO_rvcmp" ] }, {"p": [[1, -5491.850000, 0.968936, 0.039023, 0.107218 ], [226, -5495.290000, 0.031064, 0.013863, 0.133929 ] ], "n": ["FDJVGXF01DUOWM" ] }, {"p": [[1, -5020.540000, 0.329356, 0.006667, 0.137555 ], [39, -5020.640000, 0.297083, 0.009349, 0.153063 ], [192, -5021.750000, 0.097856, 0.022464, 0.167931 ], [193, -5021.750000, 0.097852, 0.000008, 0.167932 ], [29, -5022.200000, 0.062055, 0.038654, 0.168418 ], [33, -5022.270000, 0.058241, 0.000010, 0.173834 ], [28, -5022.280000, 0.057557, 0.048759, 0.173072 ] ], "n": ["FDJVGXF01DGD2W_rvcmp" ] }, {"p": [[1, -4710.170000, 0.882102, 0.045404, 0.085828 ], [216, -4713.330000, 0.037402, 0.010593, 0.096030 ], [214, -4713.340000, 0.037035, 0.021465, 0.101702 ], [215, -4713.580000, 0.028968, 0.034528, 0.100202 ], [2, -4714.280000, 0.014493, 0.000947, 0.107480 ] ], "n": ["FDJVGXF01A1J33" ] }, {"p": [[1, -4340.990000, 1.000000, 0.044433, 0.051054 ] ], "n": ["FDJVGXF01A46Y1" ] }, {"p": [[1, -3901.840000, 1.000000, 0.025886, 0.075342 ] ], "n": ["FDJVGXF01D03AR" ] }, {"p": [[1, -3890.320000, 1.000000, 0.025861, 0.075478 ] ], "n": ["FDJVGXF01A149X" ] }, {"p": [[1, -4084.020000, 1.000000, 0.033503, 0.054114 ] ], "n": ["FDJVGXF01APO9N_rvcmp" ] }, {"p": [[2, -8322.960000, 0.784951, 0.017529, 0.049601 ], [22, -8324.370000, 0.191576, 0.014528, 0.063248 ], [227, -8327.080000, 0.012682, 0.004689, 0.065348 ], [226, -8327.240000, 0.010790, 0.029250, 0.064825 ] ], "n": ["FDJVGXF01BSXC6_rvcmp" ] }, {"p": [[2, -8255.220000, 0.786494, 0.017444, 0.050169 ], [22, -8256.640000, 0.190088, 0.014515, 0.064033 ], [227, -8259.350000, 0.012660, 0.004687, 0.066102 ], [226, -8259.510000, 0.010758, 0.029312, 0.065605 ] ], "n": ["FDJVGXF01B9YL9_rvcmp" ] }, {"p": [[2, -8253.370000, 0.795980, 0.018019, 0.046663 ], [22, -8254.910000, 0.170990, 0.013896, 0.059852 ], [227, -8257.440000, 0.013679, 0.004586, 0.061103 ], [226, -8257.580000, 0.011822, 0.028973, 0.060323 ], [18, -8258.030000, 0.007529, 0.042784, 0.067881 ] ], "n": ["FDJVGXF01AKP12_rvcmp" ] }, {"p": [[2, -8233.760000, 0.801439, 0.018024, 0.046738 ], [22, -8235.290000, 0.172786, 0.013895, 0.059948 ], [227, -8237.810000, 0.013828, 0.004576, 0.061196 ], [226, -8237.960000, 0.011948, 0.028980, 0.060412 ] ], "n": ["FDJVGXF01BLH1N_rvcmp" ] }, {"p": [[2, -7712.790000, 0.883852, 0.014640, 0.049668 ], [22, -7714.820000, 0.116148, 0.013694, 0.064873 ] ], "n": ["FDJVGXF01BUW8J" ] }, {"p": [[2, -7582.780000, 0.852815, 0.014049, 0.054796 ], [22, -7584.530000, 0.147185, 0.014067, 0.071155 ] ], "n": ["FDJVGXF01DIV21_rvcmp" ] }, {"p": [[2, -7317.910000, 0.792759, 0.014799, 0.053653 ], [22, -7319.370000, 0.184882, 0.013452, 0.069710 ], [18, -7322.050000, 0.012630, 0.041906, 0.078552 ], [227, -7322.310000, 0.009729, 0.004366, 0.070870 ] ], "n": ["FDJVGXF01CZ9O4_rvcmp" ] }, {"p": [[2, -7559.780000, 0.198092, 0.036220, 1.999990 ], [228, -7559.780000, 0.198032, 0.000005, 1.999990 ], [227, -7559.780000, 0.198013, 0.012980, 1.999990 ], [0, -7560.090000, 0.144928, 0.066512, 1.999990 ], [1, -7560.090000, 0.144927, 0.096269, 1.999990 ], [226, -7560.990000, 0.058583, 0.008703, 1.999990 ], [225, -7561.010000, 0.057425, 0.036449, 1.999990 ] ], "n": ["FDJVGXF01DRZRX_rvcmp" ] }, {"p": [[2, -7584.580000, 0.178121, 0.036220, 1.999990 ], [228, -7584.590000, 0.178066, 0.000005, 1.999990 ], [227, -7584.590000, 0.178050, 0.012980, 1.999990 ], [0, -7584.900000, 0.130179, 0.066512, 1.999990 ], [1, -7584.900000, 0.130179, 0.096269, 1.999990 ], [212, -7585.070000, 0.109323, 0.000008, 1.999990 ], [140, -7585.200000, 0.096083, 0.000006, 1.999990 ] ], "n": ["FDJVGXF01AU61H" ] }, {"p": [[2, -6893.490000, 0.190998, 0.036220, 1.987900 ], [228, -6893.490000, 0.190940, 0.000005, 1.987960 ], [227, -6893.490000, 0.190922, 0.012980, 1.987960 ], [0, -6893.790000, 0.140970, 0.000008, 1.999990 ], [1, -6893.810000, 0.138175, 0.096269, 1.999990 ], [39, -6894.250000, 0.089534, 0.000006, 1.999990 ], [236, -6894.670000, 0.058462, 0.000007, 1.999990 ] ], "n": ["FDJVGXF01D3WTC_rvcmp" ] }, {"p": [[2, -7125.950000, 0.201960, 0.036220, 1.999990 ], [228, -7125.950000, 0.201898, 0.000005, 1.999990 ], [227, -7125.950000, 0.201879, 0.012980, 1.999990 ], [0, -7126.240000, 0.150119, 0.000008, 1.999990 ], [1, -7126.270000, 0.146505, 0.096269, 1.999990 ], [226, -7127.370000, 0.048820, 0.032306, 1.999990 ], [17, -7127.370000, 0.048820, 0.049256, 1.999990 ] ], "n": ["FDJVGXF01CIEJT" ] }, {"p": [[2, -6825.070000, 0.191248, 0.036220, 1.999990 ], [228, -6825.070000, 0.191189, 0.000005, 1.999990 ], [227, -6825.070000, 0.191171, 0.012980, 1.999990 ], [1, -6825.150000, 0.176820, 0.000006, 1.999990 ], [0, -6825.370000, 0.140749, 0.066512, 1.999990 ], [226, -6826.310000, 0.055257, 0.010592, 1.999990 ], [225, -6826.340000, 0.053566, 0.036449, 1.999990 ] ], "n": ["FDJVGXF01AQSZU_rvcmp" ] }, {"p": [[2, -7754.310000, 0.217329, 0.036220, 1.999990 ], [228, -7754.310000, 0.217287, 0.000005, 1.999990 ], [227, -7754.310000, 0.217267, 0.012980, 1.999990 ], [236, -7754.930000, 0.116804, 0.000007, 1.999990 ], [1, -7755.270000, 0.083651, 0.096269, 1.999990 ], [0, -7755.270000, 0.083650, 0.066512, 1.999990 ], [26, -7755.530000, 0.064013, 0.010607, 1.999990 ] ], "n": ["FDJVGXF01CWKBY" ] }, {"p": [[2, -7082.530000, 0.228511, 0.036220, 1.999990 ], [228, -7082.530000, 0.228468, 0.000005, 1.999990 ], [227, -7082.530000, 0.228447, 0.012980, 1.999990 ], [1, -7083.490000, 0.087832, 0.096269, 1.999990 ], [0, -7083.490000, 0.087831, 0.066512, 1.999990 ], [26, -7083.720000, 0.069759, 0.009954, 1.999990 ], [236, -7083.730000, 0.069152, 0.000007, 1.999990 ] ], "n": ["FDJVGXF01DTUVZ_rvcmp" ] }, {"p": [[2, -2319.500000, 0.428546, 0.018691, 0.021661 ], [227, -2320.730000, 0.125308, 0.012980, 0.036105 ], [228, -2320.730000, 0.125279, 0.000005, 0.036112 ], [226, -2321.040000, 0.091860, 0.032306, 0.036947 ], [17, -2321.040000, 0.091849, 0.049256, 0.036947 ], [225, -2321.070000, 0.089561, 0.027302, 0.028114 ], [210, -2321.700000, 0.047597, 0.018069, 0.038507 ] ], "n": ["FDJVGXF01CFZ5I_rvcmp" ] }, {"p": [[4, -5865.650000, 0.379359, 0.000009, 1.195070 ], [6, -5866.630000, 0.142877, 0.000010, 1.502030 ], [9, -5866.930000, 0.105563, 0.032431, 1.515360 ], [10, -5866.930000, 0.105556, 0.000008, 1.515370 ], [8, -5867.010000, 0.097852, 0.018812, 1.564030 ], [7, -5867.010000, 0.097850, 0.031194, 1.564020 ], [5, -5867.330000, 0.070942, 0.000001, 1.632330 ] ], "n": ["FDJVGXF01A51R9_rvcmp" ] }, {"p": [[5, -8635.630000, 0.169083, 0.000001, 1.762920 ], [6, -8635.630000, 0.169083, 0.000010, 1.762910 ], [7, -8635.630000, 0.169064, 0.000008, 1.762940 ], [4, -8635.910000, 0.127654, 0.076256, 1.768260 ], [9, -8635.910000, 0.127649, 0.032431, 1.768270 ], [10, -8635.910000, 0.127642, 0.000008, 1.768260 ], [8, -8636.060000, 0.109825, 0.000009, 1.839190 ] ], "n": ["FDJVGXF01CDR6W" ] }, {"p": [[17, -8474.300000, 0.614349, 0.034732, 0.085322 ], [226, -8475.450000, 0.193496, 0.031646, 0.098796 ], [227, -8475.460000, 0.192155, 0.000006, 0.098944 ] ], "n": ["FDJVGXF01EFJFC" ] }, {"p": [[17, -6215.670000, 0.550917, 0.031377, 0.079741 ], [226, -6216.640000, 0.210639, 0.027077, 0.092727 ], [227, -6216.910000, 0.160179, 0.000006, 0.095417 ], [16, -6218.310000, 0.039349, 0.017811, 0.079631 ], [3, -6218.320000, 0.038916, 0.123938, 0.080816 ] ], "n": ["FDJVGXF01EJVTA_rvcmp" ] }, {"p": [[17, -6592.980000, 0.344063, 0.041282, 0.104860 ], [226, -6593.070000, 0.316607, 0.031123, 0.110801 ], [227, -6593.080000, 0.311338, 0.000006, 0.111220 ], [2, -6596.300000, 0.012517, 0.017926, 0.113731 ], [210, -6597.170000, 0.005246, 0.002151, 0.143325 ], [22, -6597.190000, 0.005117, 0.028187, 0.145327 ], [209, -6597.190000, 0.005111, 0.006837, 0.145327 ] ], "n": ["FDJVGXF01B500Z" ] }, {"p": [[18, -8985.560000, 0.362090, 0.045212, 0.134997 ], [22, -8985.650000, 0.329178, 0.003070, 0.135397 ], [21, -8985.720000, 0.308732, 0.017640, 0.138657 ] ], "n": ["FDJVGXF01AXBUQ" ] }, {"p": [[18, -6749.270000, 0.350601, 0.048560, 0.063242 ], [22, -6749.330000, 0.328473, 0.002367, 0.064802 ], [21, -6749.350000, 0.320926, 0.016831, 0.065869 ] ], "n": ["FDJVGXF01DA10A" ] }, {"p": [[18, -6958.920000, 0.891405, 0.000006, 0.272210 ], [202, -6961.390000, 0.074915, 0.023119, 0.286868 ], [196, -6962.730000, 0.019566, 0.032002, 0.286802 ], [10, -6963.060000, 0.014114, 0.064427, 0.239780 ] ], "n": ["FDJVGXF01C6BVV_rvcmp" ] }, {"p": [[19, -7122.190000, 0.629362, 0.000006, 0.297979 ], [20, -7123.410000, 0.185332, 0.006659, 0.316409 ], [21, -7123.410000, 0.185306, 0.000009, 0.316394 ] ], "n": ["FDJVGXF01DSGZT" ] }, {"p": [[19, -5982.550000, 0.325158, 0.000006, 0.327313 ], [22, -5983.020000, 0.202501, 0.009215, 0.319262 ], [21, -5983.190000, 0.170974, 0.003177, 0.336098 ], [20, -5983.210000, 0.167443, 0.006659, 0.340610 ], [18, -5983.640000, 0.109223, 0.051699, 0.341409 ], [38, -5985.810000, 0.012384, 0.074343, 0.369984 ], [193, -5985.820000, 0.012317, 0.016731, 0.373520 ] ], "n": ["FDJVGXF01BVJSL_rvcmp" ] }, {"p": [[19, -5907.270000, 0.285611, 0.000006, 0.336734 ], [22, -5907.630000, 0.198338, 0.010261, 0.327181 ], [21, -5907.890000, 0.152619, 0.002886, 0.346591 ], [20, -5907.910000, 0.150211, 0.006659, 0.350749 ], [18, -5908.330000, 0.099093, 0.051699, 0.352205 ], [38, -5908.880000, 0.057068, 0.076823, 0.354397 ], [193, -5908.880000, 0.057060, 0.016731, 0.354408 ] ], "n": ["FDJVGXF01EJ0WT_rvcmp" ] }, {"p": [[20, -9179.430000, 0.646073, 0.002134, 0.061422 ], [22, -9180.630000, 0.194400, 0.008485, 0.058725 ], [196, -9181.810000, 0.059417, 0.031252, 0.059233 ], [21, -9181.850000, 0.057227, 0.009490, 0.061524 ], [19, -9182.710000, 0.024347, 0.012620, 0.065491 ], [205, -9182.980000, 0.018536, 0.025964, 0.062752 ] ], "n": ["FDJVGXF01A7QII_rvcmp" ] }, {"p": [[20, -9179.430000, 0.646073, 0.002134, 0.061422 ], [22, -9180.630000, 0.194400, 0.008485, 0.058725 ], [196, -9181.810000, 0.059417, 0.031252, 0.059233 ], [21, -9181.850000, 0.057227, 0.009490, 0.061524 ], [19, -9182.710000, 0.024347, 0.012620, 0.065491 ], [205, -9182.980000, 0.018536, 0.025964, 0.062752 ] ], "n": ["FDJVGXF01BQVWT_rvcmp" ] }, {"p": [[20, -9168.740000, 0.444129, 0.002140, 0.065787 ], [22, -9169.080000, 0.316010, 0.011397, 0.060297 ], [205, -9170.020000, 0.122547, 0.025926, 0.062733 ], [196, -9170.790000, 0.056788, 0.031633, 0.063014 ], [21, -9171.080000, 0.042665, 0.010039, 0.065795 ], [19, -9171.950000, 0.017862, 0.012620, 0.070053 ] ], "n": ["FDJVGXF01DXDA3_rvcmp" ] }, {"p": [[20, -7841.330000, 0.431985, 0.000007, 0.045802 ], [21, -7842.460000, 0.138766, 0.000009, 0.046498 ], [19, -7842.460000, 0.138539, 0.012620, 0.046500 ], [22, -7842.610000, 0.119361, 0.000008, 0.045836 ], [18, -7842.610000, 0.119218, 0.051699, 0.045840 ], [204, -7843.440000, 0.052130, 0.010770, 0.048283 ] ], "n": ["FDJVGXF01BKUCP_rvcmp" ] }, {"p": [[20, -9179.430000, 0.646073, 0.002134, 0.061422 ], [22, -9180.630000, 0.194400, 0.008485, 0.058725 ], [196, -9181.810000, 0.059417, 0.031252, 0.059233 ], [21, -9181.850000, 0.057227, 0.009490, 0.061524 ], [19, -9182.710000, 0.024347, 0.012620, 0.065491 ], [205, -9182.980000, 0.018536, 0.025964, 0.062752 ] ], "n": ["FDJVGXF01BHQ5C_rvcmp" ] }, {"p": [[20, -9173.420000, 0.649986, 0.002139, 0.065747 ], [22, -9174.660000, 0.187954, 0.008443, 0.063354 ], [196, -9175.820000, 0.058955, 0.031217, 0.064574 ], [21, -9175.840000, 0.057829, 0.009450, 0.066118 ], [19, -9176.630000, 0.026113, 0.012620, 0.070026 ], [205, -9176.940000, 0.019163, 0.026033, 0.067544 ] ], "n": ["FDJVGXF01B5Z58" ] }, {"p": [[20, -7862.870000, 0.414092, 0.000007, 0.046058 ], [21, -7864.010000, 0.133165, 0.000009, 0.046762 ], [19, -7864.010000, 0.132946, 0.012620, 0.046758 ], [22, -7864.140000, 0.116718, 0.000008, 0.046086 ], [18, -7864.140000, 0.116592, 0.051699, 0.046095 ], [204, -7864.440000, 0.086487, 0.010854, 0.048084 ] ], "n": ["FDJVGXF01EQ0TT_rvcmp" ] }, {"p": [[20, -8713.380000, 0.228455, 0.005202, 0.050899 ], [21, -8713.430000, 0.217694, 0.000008, 0.051116 ], [19, -8713.430000, 0.217260, 0.012620, 0.051122 ], [22, -8713.680000, 0.168386, 0.000007, 0.050615 ], [18, -8713.680000, 0.168206, 0.051699, 0.050619 ] ], "n": ["FDJVGXF01A1O4M" ] }, {"p": [[20, -7763.720000, 0.412044, 0.000007, 0.046922 ], [21, -7764.850000, 0.132906, 0.000009, 0.047653 ], [19, -7764.850000, 0.132688, 0.012620, 0.047649 ], [22, -7764.980000, 0.116811, 0.000008, 0.046980 ], [18, -7764.980000, 0.116688, 0.051699, 0.046984 ], [204, -7765.250000, 0.088863, 0.010812, 0.049090 ] ], "n": ["FDJVGXF01C8XFL_rvcmp" ] }, {"p": [[20, -8889.620000, 0.694774, 0.002125, 0.063644 ], [22, -8891.290000, 0.130933, 0.005669, 0.061361 ], [21, -8892.040000, 0.061982, 0.009631, 0.063891 ], [196, -8892.300000, 0.047744, 0.030477, 0.062592 ], [18, -8892.530000, 0.037866, 0.051699, 0.065488 ], [19, -8892.880000, 0.026702, 0.012620, 0.067987 ] ], "n": ["FDJVGXF01BYCO7" ] }, {"p": [[20, -8889.620000, 0.694774, 0.002125, 0.063644 ], [22, -8891.290000, 0.130933, 0.005669, 0.061361 ], [21, -8892.040000, 0.061982, 0.009631, 0.063891 ], [196, -8892.300000, 0.047744, 0.030477, 0.062592 ], [18, -8892.530000, 0.037866, 0.051699, 0.065488 ], [19, -8892.880000, 0.026702, 0.012620, 0.067987 ] ], "n": ["FDJVGXF01AELJM" ] }, {"p": [[20, -8829.380000, 0.694192, 0.002126, 0.064447 ], [22, -8831.050000, 0.130136, 0.005657, 0.062202 ], [21, -8831.790000, 0.062028, 0.009625, 0.064754 ], [196, -8832.040000, 0.048587, 0.030455, 0.063577 ], [18, -8832.280000, 0.038050, 0.051699, 0.066369 ], [19, -8832.630000, 0.027007, 0.012620, 0.068879 ] ], "n": ["FDJVGXF01CBX1F_rvcmp" ] }, {"p": [[20, -8108.800000, 0.380342, 0.000005, 0.049950 ], [21, -8109.950000, 0.120935, 0.000009, 0.050725 ], [19, -8109.950000, 0.120685, 0.012620, 0.050723 ], [22, -8110.050000, 0.109196, 0.000007, 0.050101 ], [18, -8110.050000, 0.109082, 0.051699, 0.050105 ], [196, -8110.050000, 0.109071, 0.057308, 0.048154 ], [204, -8110.820000, 0.050689, 0.006091, 0.058115 ] ], "n": ["FDJVGXF01B687C" ] }, {"p": [[20, -8809.930000, 0.693433, 0.002121, 0.059804 ], [22, -8811.570000, 0.135037, 0.005735, 0.057229 ], [21, -8812.350000, 0.061692, 0.009669, 0.059798 ], [196, -8812.610000, 0.047789, 0.030531, 0.057821 ], [18, -8812.870000, 0.036889, 0.051699, 0.061405 ], [19, -8813.250000, 0.025161, 0.012620, 0.063986 ] ], "n": ["FDJVGXF01A1U38" ] }, {"p": [[20, -8061.750000, 0.226940, 0.005258, 0.055615 ], [21, -8061.800000, 0.217229, 0.000008, 0.055869 ], [19, -8061.800000, 0.216804, 0.012620, 0.055871 ], [22, -8062.060000, 0.166853, 0.000007, 0.055379 ], [18, -8062.060000, 0.166687, 0.051699, 0.055388 ], [196, -8065.480000, 0.005487, 0.050156, 0.062604 ] ], "n": ["FDJVGXF01DNP11" ] }, {"p": [[20, -8061.750000, 0.226940, 0.005258, 0.055615 ], [21, -8061.800000, 0.217229, 0.000008, 0.055869 ], [19, -8061.800000, 0.216804, 0.012620, 0.055871 ], [22, -8062.060000, 0.166853, 0.000007, 0.055379 ], [18, -8062.060000, 0.166687, 0.051699, 0.055388 ], [196, -8065.480000, 0.005487, 0.050156, 0.062604 ] ], "n": ["FDJVGXF01AXT7W" ] }, {"p": [[20, -7502.900000, 0.410102, 0.000007, 0.048206 ], [21, -7504.020000, 0.132875, 0.000009, 0.048978 ], [19, -7504.030000, 0.132658, 0.012620, 0.048975 ], [22, -7504.140000, 0.117963, 0.000008, 0.048301 ], [18, -7504.140000, 0.117854, 0.051699, 0.048305 ], [204, -7504.430000, 0.088548, 0.010777, 0.050597 ] ], "n": ["FDJVGXF01DF939_rvcmp" ] }, {"p": [[20, -8648.250000, 0.671613, 0.002128, 0.065710 ], [22, -8649.930000, 0.126077, 0.005626, 0.063497 ], [196, -8650.410000, 0.077535, 0.032683, 0.064763 ], [21, -8650.660000, 0.060533, 0.009672, 0.066099 ], [18, -8651.140000, 0.037608, 0.051699, 0.067756 ], [19, -8651.480000, 0.026634, 0.012620, 0.070291 ] ], "n": ["FDJVGXF01C9YBP_rvcmp" ] }, {"p": [[20, -7788.040000, 0.768616, 0.000007, 0.050459 ], [21, -7790.250000, 0.084015, 0.000009, 0.053723 ], [19, -7790.250000, 0.083951, 0.012620, 0.053724 ], [22, -7790.830000, 0.046894, 0.002360, 0.052617 ], [196, -7792.400000, 0.009808, 0.053012, 0.040083 ], [204, -7792.780000, 0.006717, 0.011669, 0.049572 ] ], "n": ["FDJVGXF01A0HKE" ] }, {"p": [[20, -7991.920000, 0.226374, 0.005272, 0.056413 ], [21, -7991.960000, 0.216847, 0.000008, 0.056668 ], [19, -7991.960000, 0.216424, 0.012620, 0.056674 ], [22, -7992.230000, 0.166383, 0.000007, 0.056187 ], [18, -7992.230000, 0.166220, 0.051699, 0.056191 ], [196, -7995.290000, 0.007751, 0.047586, 0.063102 ] ], "n": ["FDJVGXF01CJHZG_rvcmp" ] }, {"p": [[20, -7504.760000, 0.228280, 0.005264, 0.056019 ], [21, -7504.810000, 0.218607, 0.000008, 0.056296 ], [19, -7504.810000, 0.218180, 0.012620, 0.056298 ], [22, -7505.070000, 0.167549, 0.000007, 0.055786 ], [18, -7505.070000, 0.167384, 0.051699, 0.055790 ] ], "n": ["FDJVGXF01A6W2D" ] }, {"p": [[20, -7346.080000, 0.228361, 0.005219, 0.052363 ], [21, -7346.130000, 0.217917, 0.000008, 0.052635 ], [19, -7346.130000, 0.217485, 0.012620, 0.052637 ], [22, -7346.390000, 0.168207, 0.000007, 0.052065 ], [18, -7346.390000, 0.168031, 0.051699, 0.052070 ] ], "n": ["FDJVGXF01EAHUW_rvcmp" ] }, {"p": [[20, -6813.430000, 0.371533, 0.000007, 0.061604 ], [204, -6814.480000, 0.129920, 0.005294, 0.072664 ], [21, -6814.530000, 0.122985, 0.000009, 0.062794 ], [196, -6814.580000, 0.117936, 0.044809, 0.065739 ], [22, -6814.660000, 0.108196, 0.000009, 0.062215 ], [200, -6815.030000, 0.074779, 0.012685, 0.078680 ], [203, -6815.030000, 0.074651, 0.009988, 0.078676 ] ], "n": ["FDJVGXF01CS3NG" ] }, {"p": [[20, -6657.860000, 0.214367, 0.005452, 0.065365 ], [21, -6657.890000, 0.207852, 0.000009, 0.065687 ], [19, -6657.890000, 0.207542, 0.012620, 0.065689 ], [22, -6658.110000, 0.167861, 0.001648, 0.064386 ], [18, -6658.120000, 0.165099, 0.051699, 0.065232 ], [205, -6659.980000, 0.025678, 0.022564, 0.066624 ], [204, -6660.780000, 0.011600, 0.009560, 0.086873 ] ], "n": ["FDJVGXF01DDLP3_rvcmp" ] }, {"p": [[20, -6345.380000, 0.498605, 0.000005, 0.049213 ], [21, -6346.530000, 0.158197, 0.000008, 0.050218 ], [19, -6346.530000, 0.157869, 0.012620, 0.050225 ], [22, -6346.640000, 0.142479, 0.000007, 0.049437 ], [204, -6348.760000, 0.017109, 0.005529, 0.066029 ], [196, -6348.780000, 0.016629, 0.046111, 0.058333 ], [200, -6349.390000, 0.009110, 0.012685, 0.072601 ] ], "n": ["FDJVGXF01DH3DF_rvcmp" ] }, {"p": [[20, -6206.060000, 0.338424, 0.000005, 0.056786 ], [204, -6206.850000, 0.153702, 0.005474, 0.068323 ], [21, -6207.180000, 0.110240, 0.000008, 0.058002 ], [19, -6207.180000, 0.110016, 0.012620, 0.058005 ], [22, -6207.260000, 0.101875, 0.000007, 0.057284 ], [18, -6207.260000, 0.101763, 0.051699, 0.057284 ], [200, -6207.450000, 0.083978, 0.012685, 0.075100 ] ], "n": ["FDJVGXF01COB4U" ] }, {"p": [[20, -6235.790000, 0.485949, 0.000005, 0.056344 ], [21, -6236.910000, 0.158009, 0.000008, 0.057541 ], [19, -6236.920000, 0.157690, 0.012620, 0.057549 ], [22, -6237.030000, 0.140088, 0.000007, 0.056847 ], [204, -6238.810000, 0.023633, 0.005180, 0.074652 ], [196, -6238.950000, 0.020584, 0.046374, 0.067115 ], [200, -6239.330000, 0.014047, 0.012685, 0.081216 ] ], "n": ["FDJVGXF01EJR5M" ] }, {"p": [[20, -6483.400000, 0.254133, 0.005394, 0.061007 ], [21, -6483.430000, 0.245510, 0.000008, 0.061328 ], [19, -6483.430000, 0.245135, 0.012620, 0.061330 ], [22, -6483.630000, 0.201786, 0.002135, 0.059671 ], [205, -6485.530000, 0.030153, 0.022599, 0.061902 ], [196, -6486.450000, 0.011992, 0.054783, 0.075214 ], [204, -6486.510000, 0.011290, 0.009716, 0.082480 ] ], "n": ["FDJVGXF01D2F9J_rvcmp" ] }, {"p": [[20, -5487.710000, 0.347264, 0.000005, 0.049417 ], [21, -5488.520000, 0.154710, 0.000008, 0.050249 ], [19, -5488.520000, 0.154522, 0.012620, 0.050246 ], [22, -5488.630000, 0.138315, 0.000007, 0.049376 ], [18, -5488.630000, 0.138237, 0.051699, 0.049381 ], [196, -5489.570000, 0.054077, 0.021806, 0.059651 ], [204, -5491.000000, 0.012874, 0.005393, 0.068791 ] ], "n": ["FDJVGXF01D1UNE_rvcmp" ] }, {"p": [[20, -5082.600000, 0.301061, 0.000005, 0.052830 ], [21, -5083.400000, 0.135331, 0.000008, 0.053791 ], [19, -5083.400000, 0.135167, 0.012620, 0.053789 ], [22, -5083.480000, 0.124414, 0.000007, 0.052891 ], [18, -5083.480000, 0.124378, 0.051699, 0.052901 ], [196, -5083.770000, 0.093233, 0.011326, 0.065491 ], [195, -5083.850000, 0.086416, 0.009446, 0.068185 ] ], "n": ["FDJVGXF01AWJHN" ] }, {"p": [[20, -4711.160000, 0.265598, 0.000005, 0.058329 ], [204, -4711.840000, 0.134673, 0.005222, 0.073914 ], [196, -4711.890000, 0.127930, 0.024267, 0.071129 ], [21, -4711.950000, 0.121090, 0.000008, 0.059498 ], [19, -4711.950000, 0.120944, 0.012620, 0.059500 ], [22, -4712.000000, 0.114908, 0.000007, 0.058582 ], [18, -4712.000000, 0.114857, 0.051699, 0.058588 ] ], "n": ["FDJVGXF01B5ZPX" ] }, {"p": [[20, -4633.000000, 0.284052, 0.000005, 0.059136 ], [21, -4633.780000, 0.129725, 0.000008, 0.060334 ], [19, -4633.780000, 0.129572, 0.012620, 0.060341 ], [22, -4633.880000, 0.117856, 0.000007, 0.059459 ], [18, -4633.880000, 0.117832, 0.051699, 0.059461 ], [196, -4633.920000, 0.113303, 0.009594, 0.074759 ], [195, -4633.970000, 0.107660, 0.009446, 0.077152 ] ], "n": ["FDJVGXF01EP157_rvcmp" ] }, {"p": [[21, -8857.520000, 0.241756, 0.017640, 0.063147 ], [22, -8857.520000, 0.241705, 0.000007, 0.063148 ], [18, -8857.520000, 0.241484, 0.051699, 0.063151 ], [196, -8857.870000, 0.169731, 0.043505, 0.061825 ], [20, -8859.030000, 0.053416, 0.005530, 0.067425 ], [19, -8859.060000, 0.051909, 0.012620, 0.067624 ] ], "n": ["FDJVGXF01EMP0L" ] }, {"p": [[21, -8756.560000, 0.298567, 0.017640, 0.050185 ], [22, -8756.560000, 0.298561, 0.000007, 0.050186 ], [18, -8756.570000, 0.298231, 0.051699, 0.050190 ], [20, -8758.290000, 0.053301, 0.005391, 0.054467 ], [19, -8758.320000, 0.051340, 0.012620, 0.054636 ] ], "n": ["FDJVGXF01DYC5M_rvcmp" ] }, {"p": [[21, -8756.560000, 0.298567, 0.017640, 0.050185 ], [22, -8756.560000, 0.298561, 0.000007, 0.050186 ], [18, -8756.570000, 0.298231, 0.051699, 0.050190 ], [20, -8758.290000, 0.053301, 0.005391, 0.054467 ], [19, -8758.320000, 0.051340, 0.012620, 0.054636 ] ], "n": ["FDJVGXF01AYXVW_rvcmp" ] }, {"p": [[21, -8764.250000, 0.241191, 0.017640, 0.064045 ], [22, -8764.250000, 0.241137, 0.000007, 0.064042 ], [18, -8764.250000, 0.240919, 0.051699, 0.064041 ], [196, -8764.600000, 0.170275, 0.043558, 0.062879 ], [20, -8765.750000, 0.053984, 0.005541, 0.068370 ], [19, -8765.770000, 0.052493, 0.012620, 0.068579 ] ], "n": ["FDJVGXF01EQVCZ" ] }, {"p": [[21, -8764.250000, 0.241191, 0.017640, 0.064045 ], [22, -8764.250000, 0.241137, 0.000007, 0.064042 ], [18, -8764.250000, 0.240919, 0.051699, 0.064041 ], [196, -8764.600000, 0.170275, 0.043558, 0.062879 ], [20, -8765.750000, 0.053984, 0.005541, 0.068370 ], [19, -8765.770000, 0.052493, 0.012620, 0.068579 ] ], "n": ["FDJVGXF01A3P8N" ] }, {"p": [[21, -9393.890000, 0.335770, 0.016952, 0.077000 ], [18, -9393.900000, 0.332727, 0.051153, 0.076860 ], [22, -9393.910000, 0.331502, 0.000007, 0.077313 ] ], "n": ["FDJVGXF01DFDUU_rvcmp" ] }, {"p": [[21, -8360.510000, 0.276947, 0.017640, 0.068484 ], [22, -8360.510000, 0.276896, 0.000007, 0.068480 ], [18, -8360.510000, 0.276642, 0.051699, 0.068484 ], [20, -8361.960000, 0.065329, 0.005597, 0.073092 ], [19, -8361.980000, 0.063720, 0.012620, 0.073310 ], [196, -8362.440000, 0.040466, 0.046564, 0.073127 ] ], "n": ["FDJVGXF01BSS33" ] }, {"p": [[21, -9049.150000, 0.545070, 0.014824, 0.128769 ], [18, -9050.260000, 0.178560, 0.049070, 0.128461 ], [22, -9050.300000, 0.172684, 0.000006, 0.130199 ], [196, -9051.070000, 0.079736, 0.033559, 0.089578 ], [170, -9052.700000, 0.015638, 0.009104, 0.110595 ], [208, -9053.810000, 0.005143, 0.015849, 0.127643 ], [171, -9054.290000, 0.003170, 0.007158, 0.109472 ] ], "n": ["FDJVGXF01DR5DG_rvcmp" ] }, {"p": [[21, -8760.780000, 0.764831, 0.009283, 0.113684 ], [20, -8762.920000, 0.089692, 0.006659, 0.130551 ], [19, -8762.920000, 0.089654, 0.012620, 0.130551 ], [18, -8764.090000, 0.027983, 0.050809, 0.119543 ], [22, -8764.090000, 0.027839, 0.000007, 0.120118 ] ], "n": ["FDJVGXF01C5K53" ] }, {"p": [[21, -5586.930000, 0.525919, 0.009466, 0.119094 ], [151, -5587.840000, 0.210875, 0.000007, 0.129028 ], [19, -5588.420000, 0.118469, 0.007921, 0.138188 ], [20, -5588.710000, 0.088721, 0.006659, 0.142648 ], [22, -5589.820000, 0.029139, 0.003531, 0.121782 ], [18, -5589.900000, 0.026878, 0.050786, 0.127034 ] ], "n": ["FDJVGXF01EEXIW_rvcmp" ] }, {"p": [[21, -5174.880000, 0.685963, 0.009681, 0.104253 ], [19, -5176.610000, 0.122703, 0.007801, 0.125831 ], [20, -5176.940000, 0.088018, 0.006659, 0.130750 ], [22, -5177.810000, 0.036974, 0.004606, 0.104939 ], [151, -5177.870000, 0.034679, 0.000007, 0.125188 ], [18, -5177.960000, 0.031663, 0.050060, 0.112306 ] ], "n": ["FDJVGXF01DQNVD" ] }, {"p": [[21, -5096.750000, 0.680130, 0.009659, 0.105775 ], [19, -5098.440000, 0.125415, 0.007818, 0.127615 ], [20, -5098.770000, 0.090584, 0.006659, 0.132604 ], [22, -5099.670000, 0.036703, 0.004488, 0.106745 ], [151, -5099.710000, 0.035412, 0.000007, 0.126940 ], [18, -5099.820000, 0.031756, 0.050158, 0.114060 ] ], "n": ["FDJVGXF01AK7Z0" ] }, {"p": [[21, -5086.830000, 0.679558, 0.009656, 0.105925 ], [19, -5088.520000, 0.125680, 0.007819, 0.127797 ], [20, -5088.840000, 0.090837, 0.006659, 0.132787 ], [22, -5089.750000, 0.036677, 0.004476, 0.106922 ], [151, -5089.780000, 0.035483, 0.000007, 0.127111 ], [18, -5089.890000, 0.031765, 0.050168, 0.114232 ] ], "n": ["FDJVGXF01CI761" ] }, {"p": [[22, -8116.320000, 0.432899, 0.007415, 0.043692 ], [196, -8116.890000, 0.243117, 0.052776, 0.044010 ], [20, -8117.270000, 0.166579, 0.000008, 0.050211 ], [21, -8118.120000, 0.071382, 0.017642, 0.048837 ], [19, -8118.420000, 0.052969, 0.012620, 0.050994 ], [204, -8119.250000, 0.022986, 0.006195, 0.058276 ], [200, -8120.080000, 0.010069, 0.012685, 0.063975 ] ], "n": ["FDJVGXF01EK578_rvcmp" ] }, {"p": [[22, -8110.550000, 0.432800, 0.007410, 0.043712 ], [196, -8111.130000, 0.243070, 0.052777, 0.044032 ], [20, -8111.510000, 0.166641, 0.000008, 0.050232 ], [21, -8112.350000, 0.071400, 0.017642, 0.048858 ], [19, -8112.650000, 0.052992, 0.012620, 0.051016 ], [204, -8113.490000, 0.023012, 0.006194, 0.058303 ], [200, -8114.310000, 0.010085, 0.012685, 0.064014 ] ], "n": ["FDJVGXF01BMIPR_rvcmp" ] }, {"p": [[22, -7971.610000, 0.833365, 0.012877, 0.045942 ], [205, -7973.380000, 0.141658, 0.016486, 0.040738 ], [204, -7975.120000, 0.024977, 0.012657, 0.047316 ] ], "n": ["FDJVGXF01A2K5F_rvcmp" ] }, {"p": [[22, -9367.150000, 0.299014, 0.020167, 0.125235 ], [210, -9367.290000, 0.260603, 0.008701, 0.114952 ], [226, -9367.800000, 0.156182, 0.013928, 0.102518 ], [205, -9368.340000, 0.091177, 0.034259, 0.126778 ], [208, -9368.440000, 0.082744, 0.022260, 0.129085 ], [209, -9368.470000, 0.079838, 0.001012, 0.130155 ], [18, -9369.440000, 0.030442, 0.039566, 0.133067 ] ], "n": ["FDJVGXF01DHZEC_rvcmp" ] }, {"p": [[22, -9441.470000, 0.647056, 0.013638, 0.066579 ], [226, -9442.680000, 0.192521, 0.023682, 0.058617 ], [227, -9443.700000, 0.069329, 0.000005, 0.062512 ], [17, -9443.700000, 0.069326, 0.049256, 0.062509 ], [18, -9444.860000, 0.021769, 0.047504, 0.076894 ] ], "n": ["FDJVGXF01DPQJQ" ] }, {"p": [[22, -9441.470000, 0.647056, 0.013638, 0.066579 ], [226, -9442.680000, 0.192521, 0.023682, 0.058617 ], [227, -9443.700000, 0.069329, 0.000005, 0.062512 ], [17, -9443.700000, 0.069326, 0.049256, 0.062509 ], [18, -9444.860000, 0.021769, 0.047504, 0.076894 ] ], "n": ["FDJVGXF01EUBGX" ] }, {"p": [[22, -9441.470000, 0.647056, 0.013638, 0.066579 ], [226, -9442.680000, 0.192521, 0.023682, 0.058617 ], [227, -9443.700000, 0.069329, 0.000005, 0.062512 ], [17, -9443.700000, 0.069326, 0.049256, 0.062509 ], [18, -9444.860000, 0.021769, 0.047504, 0.076894 ] ], "n": ["FDJVGXF01DG1KE" ] }, {"p": [[22, -7700.000000, 0.259307, 0.006053, 0.067207 ], [18, -7700.020000, 0.253999, 0.044938, 0.067186 ], [21, -7700.390000, 0.175992, 0.017641, 0.071790 ], [19, -7700.570000, 0.146840, 0.012620, 0.074896 ], [20, -7700.570000, 0.146595, 0.006657, 0.074889 ], [204, -7702.710000, 0.017267, 0.012282, 0.068861 ] ], "n": ["FDJVGXF01A17E7" ] }, {"p": [[22, -9083.850000, 0.341257, 0.011880, 0.112346 ], [196, -9084.010000, 0.288788, 0.037225, 0.078003 ], [18, -9084.540000, 0.170038, 0.051699, 0.120338 ], [208, -9085.550000, 0.062069, 0.019500, 0.111303 ], [205, -9085.830000, 0.047090, 0.038635, 0.114857 ], [209, -9085.830000, 0.047080, 0.000007, 0.114860 ], [170, -9085.900000, 0.043679, 0.010216, 0.104607 ] ], "n": ["FDJVGXF01DX64R" ] }, {"p": [[22, -8981.030000, 0.695748, 0.010849, 0.066999 ], [226, -8982.920000, 0.105435, 0.023384, 0.058442 ], [18, -8983.330000, 0.069652, 0.047324, 0.072922 ], [21, -8983.530000, 0.057143, 0.017643, 0.076983 ], [17, -8983.990000, 0.036013, 0.049256, 0.062614 ], [227, -8983.990000, 0.036008, 0.000006, 0.062617 ] ], "n": ["FDJVGXF01EVFCB" ] }, {"p": [[22, -8749.080000, 0.943543, 0.015018, 0.058031 ], [226, -8752.790000, 0.023113, 0.019501, 0.055572 ], [18, -8753.000000, 0.018753, 0.046923, 0.068025 ], [21, -8753.250000, 0.014591, 0.017643, 0.072504 ] ], "n": ["FDJVGXF01DNYHY" ] }, {"p": [[22, -9493.480000, 0.503611, 0.012101, 0.110554 ], [18, -9493.530000, 0.478967, 0.031586, 0.103810 ], [226, -9496.840000, 0.017422, 0.017080, 0.102923 ] ], "n": ["FDJVGXF01BF7RQ_rvcmp" ] }, {"p": [[22, -7742.180000, 0.830428, 0.009385, 0.072561 ], [18, -7744.690000, 0.067295, 0.050523, 0.082882 ], [21, -7744.700000, 0.066638, 0.017640, 0.083492 ], [20, -7745.330000, 0.035639, 0.004941, 0.088199 ] ], "n": ["FDJVGXF01BGCWG_rvcmp" ] }, {"p": [[22, -8098.260000, 0.624693, 0.008892, 0.092349 ], [18, -8099.530000, 0.175998, 0.046542, 0.096620 ], [21, -8099.690000, 0.149878, 0.017640, 0.099328 ], [208, -8101.390000, 0.027529, 0.015759, 0.098554 ], [205, -8102.310000, 0.010967, 0.037983, 0.103660 ], [209, -8102.310000, 0.010935, 0.000007, 0.104082 ] ], "n": ["FDJVGXF01B1SI3_rvcmp" ] }, {"p": [[22, -8441.960000, 0.829793, 0.011352, 0.097676 ], [18, -8443.990000, 0.108013, 0.050447, 0.107426 ], [226, -8445.510000, 0.023776, 0.011511, 0.098419 ], [2, -8445.620000, 0.021300, 0.019434, 0.095146 ], [210, -8445.840000, 0.017119, 0.014632, 0.104562 ] ], "n": ["FDJVGXF01CMX3V" ] }, {"p": [[22, -8634.790000, 0.732384, 0.011183, 0.106522 ], [18, -8636.690000, 0.109276, 0.051173, 0.116562 ], [21, -8636.700000, 0.108994, 0.017641, 0.116941 ], [226, -8638.550000, 0.017101, 0.005563, 0.110058 ], [210, -8638.560000, 0.016956, 0.014839, 0.113096 ], [225, -8638.660000, 0.015289, 0.036449, 0.114309 ] ], "n": ["FDJVGXF01CF0XW_rvcmp" ] }, {"p": [[22, -5622.340000, 0.497746, 0.012218, 0.063494 ], [205, -5622.590000, 0.389629, 0.023497, 0.070181 ], [21, -5624.600000, 0.052065, 0.017642, 0.072396 ], [19, -5624.650000, 0.049277, 0.012620, 0.074766 ], [209, -5626.130000, 0.011283, 0.006837, 0.077110 ] ], "n": ["FDJVGXF01D44GE_rvcmp" ] }, {"p": [[22, -5614.660000, 0.505089, 0.012299, 0.055552 ], [205, -5615.020000, 0.354677, 0.023520, 0.062338 ], [21, -5617.060000, 0.045857, 0.017641, 0.064524 ], [20, -5617.120000, 0.043193, 0.005469, 0.066727 ], [19, -5617.150000, 0.041861, 0.012620, 0.067124 ], [209, -5618.660000, 0.009323, 0.006837, 0.068705 ] ], "n": ["FDJVGXF01EHQS6_rvcmp" ] }, {"p": [[22, -5614.660000, 0.505089, 0.012299, 0.055552 ], [205, -5615.020000, 0.354677, 0.023520, 0.062338 ], [21, -5617.060000, 0.045857, 0.017641, 0.064524 ], [20, -5617.120000, 0.043193, 0.005469, 0.066727 ], [19, -5617.150000, 0.041861, 0.012620, 0.067124 ], [209, -5618.660000, 0.009323, 0.006837, 0.068705 ] ], "n": ["FDJVGXF01D3DDV_rvcmp" ] }, {"p": [[22, -5614.660000, 0.505089, 0.012299, 0.055552 ], [205, -5615.020000, 0.354677, 0.023520, 0.062338 ], [21, -5617.060000, 0.045857, 0.017641, 0.064524 ], [20, -5617.120000, 0.043193, 0.005469, 0.066727 ], [19, -5617.150000, 0.041861, 0.012620, 0.067124 ], [209, -5618.660000, 0.009323, 0.006837, 0.068705 ] ], "n": ["FDJVGXF01B2QGK_rvcmp" ] }, {"p": [[22, -5614.660000, 0.505089, 0.012299, 0.055552 ], [205, -5615.020000, 0.354677, 0.023520, 0.062338 ], [21, -5617.060000, 0.045857, 0.017641, 0.064524 ], [20, -5617.120000, 0.043193, 0.005469, 0.066727 ], [19, -5617.150000, 0.041861, 0.012620, 0.067124 ], [209, -5618.660000, 0.009323, 0.006837, 0.068705 ] ], "n": ["FDJVGXF01AYXKC_rvcmp" ] }, {"p": [[22, -5614.660000, 0.505089, 0.012299, 0.055552 ], [205, -5615.020000, 0.354677, 0.023520, 0.062338 ], [21, -5617.060000, 0.045857, 0.017641, 0.064524 ], [20, -5617.120000, 0.043193, 0.005469, 0.066727 ], [19, -5617.150000, 0.041861, 0.012620, 0.067124 ], [209, -5618.660000, 0.009323, 0.006837, 0.068705 ] ], "n": ["FDJVGXF01ERHT8_rvcmp" ] }, {"p": [[22, -7141.920000, 0.788321, 0.011313, 0.066880 ], [18, -7143.230000, 0.211679, 0.036486, 0.069322 ] ], "n": ["FDJVGXF01CWNZP_rvcmp" ] }, {"p": [[22, -7141.920000, 0.788321, 0.011313, 0.066880 ], [18, -7143.230000, 0.211679, 0.036486, 0.069322 ] ], "n": ["FDJVGXF01B1WZO_rvcmp" ] }, {"p": [[22, -6966.420000, 0.654951, 0.014096, 0.073132 ], [2, -6967.240000, 0.288348, 0.014318, 0.061974 ], [18, -6969.070000, 0.046428, 0.039858, 0.083710 ], [226, -6970.580000, 0.010273, 0.027924, 0.079237 ] ], "n": ["FDJVGXF01DGBP7_rvcmp" ] }, {"p": [[22, -6799.140000, 0.680899, 0.012082, 0.075222 ], [2, -6800.720000, 0.140079, 0.014257, 0.064586 ], [18, -6800.870000, 0.120855, 0.039424, 0.080774 ], [21, -6801.600000, 0.058167, 0.016482, 0.089068 ] ], "n": ["FDJVGXF01A0X4A_rvcmp" ] }, {"p": [[22, -6964.780000, 0.631228, 0.013526, 0.067780 ], [2, -6965.570000, 0.287010, 0.014967, 0.057475 ], [18, -6967.300000, 0.050529, 0.039609, 0.076551 ], [226, -6968.820000, 0.011115, 0.027573, 0.072719 ], [17, -6968.920000, 0.010060, 0.049256, 0.074865 ], [227, -6968.920000, 0.010058, 0.000009, 0.074868 ] ], "n": ["FDJVGXF01DUF87_rvcmp" ] }, {"p": [[22, -6656.310000, 0.666910, 0.011432, 0.071236 ], [18, -6657.880000, 0.138927, 0.039218, 0.075260 ], [2, -6657.930000, 0.131925, 0.014937, 0.061318 ], [21, -6658.690000, 0.062238, 0.016399, 0.083872 ] ], "n": ["FDJVGXF01A4IF9_rvcmp" ] }, {"p": [[22, -6375.530000, 0.716238, 0.012317, 0.074751 ], [2, -6377.000000, 0.164205, 0.014093, 0.062778 ], [18, -6378.000000, 0.060739, 0.047216, 0.087721 ], [21, -6378.030000, 0.058819, 0.016382, 0.089903 ] ], "n": ["FDJVGXF01BXZSF" ] }, {"p": [[22, -6053.370000, 0.697262, 0.011585, 0.075418 ], [2, -6054.870000, 0.154421, 0.014645, 0.063296 ], [18, -6055.640000, 0.071773, 0.047143, 0.087533 ], [21, -6055.670000, 0.069455, 0.016361, 0.089888 ], [226, -6057.960000, 0.007089, 0.027422, 0.081533 ] ], "n": ["FDJVGXF01BAPDX_rvcmp" ] }, {"p": [[22, -5582.050000, 0.491019, 0.011540, 0.083643 ], [28, -5583.220000, 0.151923, 0.000006, 0.059147 ], [2, -5583.300000, 0.139896, 0.013198, 0.069440 ], [18, -5583.930000, 0.075040, 0.040262, 0.094530 ], [21, -5584.210000, 0.056564, 0.016509, 0.099343 ], [154, -5584.230000, 0.055650, 0.020817, 0.095971 ], [170, -5584.850000, 0.029908, 0.001994, 0.098123 ] ], "n": ["FDJVGXF01C9I07" ] }, {"p": [[22, -5397.850000, 0.837648, 0.011875, 0.064819 ], [18, -5400.010000, 0.096656, 0.039824, 0.075969 ], [21, -5400.400000, 0.065696, 0.016266, 0.081312 ] ], "n": ["FDJVGXF01CTOLS" ] }, {"p": [[22, -5397.850000, 0.837648, 0.011875, 0.064819 ], [18, -5400.010000, 0.096656, 0.039824, 0.075969 ], [21, -5400.400000, 0.065696, 0.016266, 0.081312 ] ], "n": ["FDJVGXF01BY8LZ" ] }, {"p": [[22, -5397.850000, 0.837648, 0.011875, 0.064819 ], [18, -5400.010000, 0.096656, 0.039824, 0.075969 ], [21, -5400.400000, 0.065696, 0.016266, 0.081312 ] ], "n": ["FDJVGXF01DEQXN" ] }, {"p": [[22, -5397.850000, 0.837648, 0.011875, 0.064819 ], [18, -5400.010000, 0.096656, 0.039824, 0.075969 ], [21, -5400.400000, 0.065696, 0.016266, 0.081312 ] ], "n": ["FDJVGXF01EP3G9_rvcmp" ] }, {"p": [[22, -7717.090000, 0.567396, 0.011448, 0.244312 ], [21, -7718.190000, 0.188560, 0.017644, 0.262479 ], [38, -7719.430000, 0.054502, 0.073275, 0.257869 ], [193, -7719.460000, 0.052837, 0.016731, 0.263198 ], [194, -7719.460000, 0.052826, 0.000007, 0.263210 ], [28, -7719.640000, 0.044197, 0.000006, 0.246324 ], [35, -7719.750000, 0.039684, 0.011822, 0.265900 ] ], "n": ["FDJVGXF01D3ERO" ] }, {"p": [[22, -5283.330000, 0.823992, 0.011834, 0.067054 ], [18, -5285.450000, 0.099020, 0.039871, 0.078540 ], [21, -5285.820000, 0.068439, 0.016299, 0.083946 ], [2, -5287.900000, 0.008550, 0.017422, 0.070203 ] ], "n": ["FDJVGXF01DEQXQ" ] }, {"p": [[22, -4906.210000, 0.828014, 0.011880, 0.064839 ], [18, -4908.360000, 0.096591, 0.039895, 0.077724 ], [21, -4908.730000, 0.066721, 0.016296, 0.083616 ], [2, -4910.770000, 0.008673, 0.017237, 0.068477 ] ], "n": ["FDJVGXF01A5GV4_rvcmp" ] }, {"p": [[22, -7414.900000, 0.473150, 0.011299, 0.240073 ], [18, -7416.000000, 0.158222, 0.051699, 0.258545 ], [21, -7416.000000, 0.158207, 0.017644, 0.258549 ], [208, -7416.930000, 0.062156, 0.005868, 0.244548 ], [206, -7417.100000, 0.052354, 0.000001, 0.255476 ], [207, -7417.100000, 0.052354, 0.000001, 0.255476 ], [38, -7417.290000, 0.043559, 0.074250, 0.255960 ] ], "n": ["FDJVGXF01DRUVX_rvcmp" ] }, {"p": [[22, -4490.610000, 0.627871, 0.011733, 0.074100 ], [2, -4492.140000, 0.136292, 0.016529, 0.066055 ], [18, -4492.290000, 0.117437, 0.033063, 0.088367 ], [21, -4492.920000, 0.062721, 0.016440, 0.094638 ], [226, -4493.730000, 0.027865, 0.031612, 0.081953 ], [227, -4493.730000, 0.027813, 0.000006, 0.082228 ] ], "n": ["FDJVGXF01CP2D6_rvcmp" ] }, {"p": [[22, -6282.140000, 0.265651, 0.000007, 0.312496 ], [18, -6282.140000, 0.265602, 0.051699, 0.312511 ], [21, -6282.140000, 0.265314, 0.017640, 0.312514 ], [149, -6283.110000, 0.100244, 0.019491, 0.297416 ], [148, -6283.730000, 0.054248, 0.119619, 0.316263 ], [127, -6284.160000, 0.034979, 0.040911, 0.317481 ], [208, -6285.080000, 0.013962, 0.004882, 0.304195 ] ], "n": ["FDJVGXF01CXCEM" ] }, {"p": [[22, -6518.670000, 0.450850, 0.010198, 0.284949 ], [18, -6519.480000, 0.201661, 0.051699, 0.305331 ], [21, -6519.480000, 0.201654, 0.017644, 0.305328 ], [193, -6521.080000, 0.040538, 0.016731, 0.313063 ], [194, -6521.080000, 0.040532, 0.000007, 0.313082 ], [35, -6521.310000, 0.032386, 0.013080, 0.317575 ], [195, -6521.310000, 0.032380, 0.000009, 0.317572 ] ], "n": ["FDJVGXF01ENFXJ" ] }, {"p": [[22, -6393.510000, 0.437025, 0.010321, 0.291393 ], [21, -6394.310000, 0.196139, 0.017639, 0.312046 ], [18, -6394.310000, 0.196121, 0.051696, 0.312057 ], [148, -6395.580000, 0.054895, 0.073715, 0.287845 ], [194, -6395.810000, 0.043760, 0.000007, 0.317668 ], [149, -6395.960000, 0.037536, 0.034304, 0.272688 ], [210, -6396.040000, 0.034524, 0.006050, 0.306459 ] ], "n": ["FDJVGXF01A61OK_rvcmp" ] }, {"p": [[22, -3786.790000, 0.767111, 0.011062, 0.065583 ], [18, -3788.440000, 0.146934, 0.034299, 0.079558 ], [21, -3788.980000, 0.085955, 0.015308, 0.086274 ] ], "n": ["FDJVGXF01BDGXM_rvcmp" ] }, {"p": [[22, -2915.980000, 0.167996, 0.023900, 0.048112 ], [210, -2916.020000, 0.161655, 0.017507, 0.056369 ], [225, -2916.020000, 0.161619, 0.036449, 0.056488 ], [226, -2916.020000, 0.161540, 0.000008, 0.056493 ], [208, -2916.120000, 0.146836, 0.011944, 0.051939 ], [209, -2916.200000, 0.134710, 0.006837, 0.054137 ], [206, -2916.920000, 0.065644, 0.000001, 0.075954 ] ], "n": ["FDJVGXF01EKSSX_rvcmp" ] }, {"p": [[22, -2915.980000, 0.167996, 0.023900, 0.048112 ], [210, -2916.020000, 0.161655, 0.017507, 0.056369 ], [225, -2916.020000, 0.161619, 0.036449, 0.056488 ], [226, -2916.020000, 0.161540, 0.000008, 0.056493 ], [208, -2916.120000, 0.146836, 0.011944, 0.051939 ], [209, -2916.200000, 0.134710, 0.006837, 0.054137 ], [206, -2916.920000, 0.065644, 0.000001, 0.075954 ] ], "n": ["FDJVGXF01B68CK_rvcmp" ] }, {"p": [[22, -2915.980000, 0.167996, 0.023900, 0.048112 ], [210, -2916.020000, 0.161655, 0.017507, 0.056369 ], [225, -2916.020000, 0.161619, 0.036449, 0.056488 ], [226, -2916.020000, 0.161540, 0.000008, 0.056493 ], [208, -2916.120000, 0.146836, 0.011944, 0.051939 ], [209, -2916.200000, 0.134710, 0.006837, 0.054137 ], [206, -2916.920000, 0.065644, 0.000001, 0.075954 ] ], "n": ["FDJVGXF01BI0WX_rvcmp" ] }, {"p": [[22, -2915.980000, 0.167996, 0.023900, 0.048112 ], [210, -2916.020000, 0.161655, 0.017507, 0.056369 ], [225, -2916.020000, 0.161619, 0.036449, 0.056488 ], [226, -2916.020000, 0.161540, 0.000008, 0.056493 ], [208, -2916.120000, 0.146836, 0.011944, 0.051939 ], [209, -2916.200000, 0.134710, 0.006837, 0.054137 ], [206, -2916.920000, 0.065644, 0.000001, 0.075954 ] ], "n": ["FDJVGXF01CBQYG_rvcmp" ] }, {"p": [[22, -5628.620000, 0.322446, 0.011036, 0.335857 ], [19, -5629.280000, 0.166040, 0.000006, 0.373100 ], [21, -5629.360000, 0.153771, 0.017642, 0.366053 ], [18, -5629.360000, 0.153758, 0.051699, 0.366048 ], [38, -5630.170000, 0.068000, 0.076823, 0.376496 ], [193, -5630.170000, 0.067993, 0.016731, 0.376501 ], [194, -5630.170000, 0.067993, 0.000007, 0.376515 ] ], "n": ["FDJVGXF01EA5M3" ] }, {"p": [[25, -7196.200000, 0.323894, 0.011291, 0.074983 ], [204, -7196.230000, 0.313467, 0.016776, 0.073899 ], [205, -7196.430000, 0.257122, 0.000009, 0.075721 ], [208, -7198.510000, 0.032148, 0.005063, 0.086473 ], [206, -7198.710000, 0.026425, 0.000001, 0.089984 ], [207, -7198.710000, 0.026425, 0.000001, 0.089984 ], [24, -7198.960000, 0.020518, 0.000009, 0.090029 ] ], "n": ["FDJVGXF01CX8JF_rvcmp" ] }, {"p": [[25, -7294.250000, 0.305122, 0.005501, 0.073479 ], [24, -7294.900000, 0.158889, 0.000009, 0.079530 ], [23, -7294.920000, 0.156492, 0.003604, 0.079522 ], [150, -7294.940000, 0.153350, 0.007819, 0.072550 ], [154, -7295.560000, 0.082156, 0.003047, 0.071342 ], [153, -7295.690000, 0.072281, 0.026997, 0.074671 ], [204, -7295.700000, 0.071709, 0.018581, 0.075710 ] ], "n": ["FDJVGXF01CY5JN" ] }, {"p": [[25, -6501.510000, 0.331815, 0.011347, 0.063491 ], [204, -6501.520000, 0.331760, 0.016586, 0.062138 ], [205, -6501.760000, 0.258412, 0.000009, 0.064228 ], [208, -6504.100000, 0.025023, 0.005638, 0.075996 ], [206, -6504.370000, 0.019090, 0.000001, 0.080257 ], [207, -6504.370000, 0.019090, 0.000001, 0.080257 ], [24, -6504.620000, 0.014810, 0.000009, 0.080313 ] ], "n": ["FDJVGXF01A523Y_rvcmp" ] }, {"p": [[25, -7548.420000, 0.322884, 0.013577, 0.070185 ], [205, -7548.440000, 0.316332, 0.000009, 0.070531 ], [204, -7548.440000, 0.316284, 0.020145, 0.070531 ], [202, -7551.400000, 0.016409, 0.035634, 0.062473 ], [209, -7551.860000, 0.010377, 0.002327, 0.079589 ], [22, -7551.900000, 0.009939, 0.019245, 0.080059 ], [24, -7552.140000, 0.007775, 0.000009, 0.086799 ] ], "n": ["FDJVGXF01E0TI0" ] }, {"p": [[25, -5881.700000, 0.288593, 0.011895, 0.056320 ], [205, -5881.840000, 0.251127, 0.000007, 0.057142 ], [204, -5881.840000, 0.250948, 0.020143, 0.057141 ], [20, -5882.480000, 0.133119, 0.000007, 0.064712 ], [226, -5883.890000, 0.032552, 0.015797, 0.043371 ], [22, -5884.280000, 0.021949, 0.016434, 0.064604 ], [24, -5884.290000, 0.021713, 0.000009, 0.071494 ] ], "n": ["FDJVGXF01BER0Y" ] }, {"p": [[25, -5279.500000, 0.384556, 0.004185, 0.047567 ], [24, -5280.030000, 0.227282, 0.000009, 0.052484 ], [23, -5280.040000, 0.223664, 0.003604, 0.052477 ], [204, -5281.120000, 0.076202, 0.017952, 0.049224 ], [205, -5281.190000, 0.071240, 0.000006, 0.050023 ], [196, -5282.620000, 0.017056, 0.041669, 0.030225 ] ], "n": ["FDJVGXF01EQDJB" ] }, {"p": [[25, -4663.070000, 0.415364, 0.006242, 0.028094 ], [204, -4663.950000, 0.171527, 0.016945, 0.028270 ], [205, -4664.110000, 0.146471, 0.000006, 0.029536 ], [24, -4664.200000, 0.134337, 0.000009, 0.034388 ], [23, -4664.210000, 0.132301, 0.003604, 0.034372 ] ], "n": ["FDJVGXF01EN425" ] }, {"p": [[25, -2720.170000, 0.199961, 0.002591, 0.165221 ], [23, -2720.200000, 0.192676, 0.003604, 0.169054 ], [24, -2720.200000, 0.192676, 0.001125, 0.169054 ], [39, -2720.320000, 0.170961, 0.000006, 0.170057 ], [204, -2720.760000, 0.110516, 0.020143, 0.175797 ], [205, -2720.760000, 0.110507, 0.000009, 0.175796 ], [197, -2722.340000, 0.022703, 0.000006, 0.210278 ] ], "n": ["FDJVGXF01B8PSX_rvcmp" ] }, {"p": [[26, -9785.140000, 0.378815, 0.085621, 0.125408 ], [196, -9785.200000, 0.355986, 0.013721, 0.127073 ], [195, -9785.870000, 0.182999, 0.009446, 0.137527 ], [28, -9787.330000, 0.042319, 0.024823, 0.131278 ], [226, -9788.090000, 0.019911, 0.018198, 0.110773 ], [22, -9788.770000, 0.010087, 0.013555, 0.133021 ], [34, -9788.790000, 0.009883, 0.007060, 0.143981 ] ], "n": ["FDJVGXF01D9CL6" ] }, {"p": [[26, -8650.750000, 0.668765, 0.073940, 0.100025 ], [196, -8652.270000, 0.146170, 0.015581, 0.111131 ], [195, -8653.300000, 0.052139, 0.009446, 0.124997 ], [226, -8653.490000, 0.042994, 0.021774, 0.099733 ], [34, -8653.630000, 0.037669, 0.000007, 0.128628 ], [33, -8653.630000, 0.037620, 0.020031, 0.128631 ], [17, -8654.570000, 0.014643, 0.036770, 0.097095 ] ], "n": ["FDJVGXF01C3ZUR_rvcmp" ] }, {"p": [[26, -7415.530000, 0.520418, 0.080891, 0.095791 ], [196, -7416.170000, 0.274383, 0.013660, 0.105985 ], [195, -7416.460000, 0.205199, 0.009446, 0.113181 ] ], "n": ["FDJVGXF01DPKM4_rvcmp" ] }, {"p": [[26, -8544.590000, 0.501009, 0.064494, 0.115150 ], [189, -8544.790000, 0.408167, 0.069580, 0.107416 ], [188, -8547.280000, 0.034000, 0.043171, 0.134307 ], [190, -8547.300000, 0.033131, 0.013901, 0.134622 ], [40, -8547.640000, 0.023692, 0.059244, 0.123122 ] ], "n": ["FDJVGXF01B1LFA" ] }, {"p": [[26, -7437.980000, 0.502622, 0.082239, 0.097808 ], [196, -7438.590000, 0.271218, 0.010533, 0.108413 ], [195, -7438.770000, 0.226160, 0.009446, 0.114154 ] ], "n": ["FDJVGXF01D4M9I_rvcmp" ] }, {"p": [[26, -7188.250000, 0.386827, 0.087265, 0.065688 ], [196, -7188.800000, 0.221806, 0.002452, 0.071176 ], [195, -7188.820000, 0.217057, 0.009446, 0.073209 ], [35, -7190.060000, 0.063148, 0.003882, 0.081949 ], [38, -7190.250000, 0.051923, 0.052037, 0.077211 ], [171, -7190.810000, 0.029755, 0.028664, 0.067591 ], [194, -7190.820000, 0.029484, 0.006266, 0.082479 ] ], "n": ["FDJVGXF01AY8A2" ] }, {"p": [[26, -7543.650000, 1.000000, 0.012900, 0.004624 ] ], "n": ["FDJVGXF01CB6R6_rvcmp" ] }, {"p": [[26, -6492.670000, 0.674984, 0.059215, 0.121916 ], [38, -6494.440000, 0.115589, 0.056011, 0.124175 ], [189, -6494.920000, 0.071300, 0.080055, 0.138213 ], [193, -6495.500000, 0.039743, 0.009724, 0.143873 ], [188, -6495.510000, 0.039322, 0.041639, 0.149450 ], [195, -6495.720000, 0.032099, 0.009446, 0.146900 ], [190, -6495.890000, 0.026962, 0.000153, 0.153334 ] ], "n": ["FDJVGXF01CUK8T_rvcmp" ] }, {"p": [[26, -7539.030000, 0.269078, 0.000006, 1.999990 ], [2, -7539.610000, 0.150161, 0.036220, 1.999990 ], [228, -7539.610000, 0.150115, 0.000005, 1.999990 ], [227, -7539.610000, 0.150101, 0.012980, 1.999990 ], [1, -7539.940000, 0.108320, 0.096269, 1.999990 ], [0, -7539.940000, 0.108319, 0.066512, 1.999990 ], [14, -7540.470000, 0.063906, 0.048824, 1.999990 ] ], "n": ["FDJVGXF01DZUNB" ] }, {"p": [[26, -7408.260000, 0.591385, 0.000006, 1.999990 ], [14, -7409.740000, 0.135109, 0.000006, 1.999990 ], [2, -7410.470000, 0.065269, 0.036220, 1.999990 ], [38, -7410.680000, 0.052552, 0.003874, 1.999990 ], [36, -7410.680000, 0.052546, 0.000009, 1.999990 ], [37, -7410.680000, 0.052546, 0.000009, 1.999990 ], [195, -7410.720000, 0.050593, 0.000009, 1.999990 ] ], "n": ["FDJVGXF01ETYCA" ] }, {"p": [[26, -6148.540000, 0.393406, 0.000006, 1.999990 ], [14, -6149.500000, 0.149561, 0.000006, 1.999990 ], [2, -6149.870000, 0.103705, 0.036220, 1.999990 ], [228, -6149.870000, 0.103674, 0.000005, 1.999990 ], [39, -6149.910000, 0.099593, 0.000006, 1.999990 ], [1, -6150.190000, 0.075030, 0.096269, 1.999990 ], [0, -6150.190000, 0.075030, 0.066512, 1.999990 ] ], "n": ["FDJVGXF01AFNGW" ] }, {"p": [[27, -8480.600000, 0.987834, 0.033353, 0.125391 ], [171, -8485.000000, 0.012166, 0.027474, 0.111686 ] ], "n": ["FDJVGXF01BEWVV" ] }, {"p": [[27, -7541.970000, 1.000000, 0.051013, 0.102601 ] ], "n": ["FDJVGXF01E2POB_rvcmp" ] }, {"p": [[27, -8794.890000, 0.948750, 0.018039, 0.168500 ], [189, -8797.810000, 0.051250, 0.031566, 0.122540 ] ], "n": ["FDJVGXF01CXKE2_rvcmp" ] }, {"p": [[27, -8873.900000, 0.984622, 0.031482, 0.161094 ], [29, -8878.060000, 0.015378, 0.011348, 0.175154 ] ], "n": ["FDJVGXF01C3UNG" ] }, {"p": [[27, -8494.520000, 1.000000, 0.024380, 0.160097 ] ], "n": ["FDJVGXF01B4NK4" ] }, {"p": [[27, -8575.950000, 0.441439, 0.041832, 0.110988 ], [191, -8577.400000, 0.103152, 0.002698, 0.128775 ], [190, -8577.440000, 0.099045, 0.034335, 0.129588 ], [171, -8577.440000, 0.099044, 0.034630, 0.129585 ], [192, -8577.450000, 0.098275, 0.016900, 0.132782 ], [193, -8577.510000, 0.093008, 0.000730, 0.134753 ], [33, -8577.850000, 0.066038, 0.012553, 0.125908 ] ], "n": ["FDJVGXF01BT0P0" ] }, {"p": [[27, -8252.080000, 1.000000, 0.044840, 0.119610 ] ], "n": ["FDJVGXF01DFJYN" ] }, {"p": [[27, -8519.870000, 0.797720, 0.000009, 0.223913 ], [191, -8522.370000, 0.065216, 0.000008, 0.209334 ], [171, -8522.370000, 0.065204, 0.034630, 0.209332 ], [190, -8522.370000, 0.065146, 0.034335, 0.209334 ], [40, -8524.640000, 0.006713, 0.066534, 0.207001 ] ], "n": ["FDJVGXF01B7K9G" ] }, {"p": [[27, -8069.610000, 0.982754, 0.020683, 0.354160 ], [202, -8073.650000, 0.017246, 0.008546, 0.294292 ] ], "n": ["FDJVGXF01EHNCM" ] }, {"p": [[27, -7570.730000, 0.639660, 0.001875, 0.255345 ], [191, -7572.630000, 0.095670, 0.007141, 0.242888 ], [40, -7572.740000, 0.085202, 0.057089, 0.228434 ], [190, -7573.110000, 0.058757, 0.033150, 0.248040 ], [171, -7573.120000, 0.058551, 0.034630, 0.248905 ], [192, -7573.460000, 0.041758, 0.000005, 0.249257 ], [29, -7574.170000, 0.020402, 0.008150, 0.221989 ] ], "n": ["FDJVGXF01ADV5J" ] }, {"p": [[27, -8130.950000, 1.000000, 0.003503, 0.209133 ] ], "n": ["FDJVGXF01DVR9S_rvcmp" ] }, {"p": [[27, -8753.250000, 0.480622, 0.050950, 0.345543 ], [196, -8754.490000, 0.138849, 0.024994, 0.298571 ], [195, -8754.900000, 0.092407, 0.003437, 0.323949 ], [35, -8754.990000, 0.084673, 0.013080, 0.329554 ], [194, -8754.990000, 0.084592, 0.006696, 0.329553 ], [204, -8755.320000, 0.060648, 0.003601, 0.326005 ], [26, -8755.360000, 0.058209, 0.097406, 0.319995 ] ], "n": ["FDJVGXF01COGD3" ] }, {"p": [[27, -8753.250000, 0.480622, 0.050950, 0.345543 ], [196, -8754.490000, 0.138849, 0.024994, 0.298571 ], [195, -8754.900000, 0.092407, 0.003437, 0.323949 ], [35, -8754.990000, 0.084673, 0.013080, 0.329554 ], [194, -8754.990000, 0.084592, 0.006696, 0.329553 ], [204, -8755.320000, 0.060648, 0.003601, 0.326005 ], [26, -8755.360000, 0.058209, 0.097406, 0.319995 ] ], "n": ["FDJVGXF01DB5FM" ] }, {"p": [[27, -8113.830000, 1.000000, 0.011034, 0.248635 ] ], "n": ["FDJVGXF01BPCLK_rvcmp" ] }, {"p": [[27, -7658.150000, 0.496547, 0.025129, 0.226669 ], [191, -7659.270000, 0.161940, 0.006116, 0.219079 ], [190, -7659.590000, 0.117591, 0.034335, 0.223343 ], [171, -7659.590000, 0.117553, 0.034630, 0.223348 ], [192, -7660.410000, 0.052044, 0.005630, 0.223407 ], [40, -7660.580000, 0.044019, 0.086016, 0.226846 ], [39, -7662.030000, 0.010305, 0.011861, 0.238159 ] ], "n": ["FDJVGXF01EE4Q1_rvcmp" ] }, {"p": [[27, -7658.150000, 0.496547, 0.025129, 0.226669 ], [191, -7659.270000, 0.161940, 0.006116, 0.219079 ], [190, -7659.590000, 0.117591, 0.034335, 0.223343 ], [171, -7659.590000, 0.117553, 0.034630, 0.223348 ], [192, -7660.410000, 0.052044, 0.005630, 0.223407 ], [40, -7660.580000, 0.044019, 0.086016, 0.226846 ], [39, -7662.030000, 0.010305, 0.011861, 0.238159 ] ], "n": ["FDJVGXF01CG2V8_rvcmp" ] }, {"p": [[27, -7461.450000, 1.000000, 0.035734, 0.198678 ] ], "n": ["FDJVGXF01E1PZO" ] }, {"p": [[27, -8016.640000, 0.778360, 0.000009, 0.333906 ], [189, -8018.040000, 0.191564, 0.016830, 0.312409 ], [190, -8020.580000, 0.015038, 0.000008, 0.353306 ], [188, -8020.580000, 0.015038, 0.052299, 0.353304 ] ], "n": ["FDJVGXF01ET3VX_rvcmp" ] }, {"p": [[27, -8146.750000, 0.886981, 0.033031, 0.171195 ], [29, -8150.370000, 0.023772, 0.026137, 0.191592 ], [34, -8150.420000, 0.022558, 0.014780, 0.202076 ], [190, -8150.630000, 0.018381, 0.013225, 0.199783 ], [38, -8150.630000, 0.018248, 0.054964, 0.185963 ], [33, -8150.810000, 0.015294, 0.016076, 0.198447 ], [188, -8150.840000, 0.014766, 0.030099, 0.194250 ] ], "n": ["FDJVGXF01B0502_rvcmp" ] }, {"p": [[27, -6304.870000, 1.000000, 0.000009, 0.277141 ] ], "n": ["FDJVGXF01DD0OW" ] }, {"p": [[27, -5875.360000, 1.000000, 0.000009, 0.291627 ] ], "n": ["FDJVGXF01EKMU2" ] }, {"p": [[27, -5502.140000, 0.319339, 0.057286, 0.054812 ], [34, -5502.560000, 0.209897, 0.011137, 0.063932 ], [35, -5502.930000, 0.146168, 0.002260, 0.064910 ], [38, -5503.020000, 0.133263, 0.042277, 0.065028 ], [196, -5503.720000, 0.066049, 0.008533, 0.054450 ], [194, -5503.730000, 0.065586, 0.000007, 0.068670 ], [195, -5503.820000, 0.059697, 0.004561, 0.063798 ] ], "n": ["FDJVGXF01DYDV9_rvcmp" ] }, {"p": [[27, -4417.180000, 0.296322, 0.036107, 0.188909 ], [1, -4417.780000, 0.162792, 0.056749, 0.138474 ], [40, -4417.900000, 0.144268, 0.049608, 0.215464 ], [191, -4418.120000, 0.116404, 0.005550, 0.226032 ], [190, -4418.170000, 0.110253, 0.034335, 0.228249 ], [192, -4418.280000, 0.099065, 0.000005, 0.228487 ], [189, -4418.610000, 0.070897, 0.053508, 0.189541 ] ], "n": ["FDJVGXF01DPAGA" ] }, {"p": [[27, -4263.960000, 0.564470, 0.041935, 0.058075 ], [34, -4265.300000, 0.147662, 0.009810, 0.072352 ], [36, -4266.040000, 0.070694, 0.000009, 0.084567 ], [38, -4266.040000, 0.070474, 0.000009, 0.084563 ], [28, -4266.290000, 0.054819, 0.042091, 0.073487 ], [29, -4266.440000, 0.047307, 0.025261, 0.079211 ], [33, -4266.500000, 0.044574, 0.020031, 0.081548 ] ], "n": ["FDJVGXF01BFWNO_rvcmp" ] }, {"p": [[28, -8735.770000, 0.401269, 0.018383, 0.111327 ], [226, -8736.320000, 0.232132, 0.014150, 0.103981 ], [210, -8736.840000, 0.138367, 0.010060, 0.120374 ], [208, -8737.500000, 0.071088, 0.018539, 0.131285 ], [205, -8737.730000, 0.056653, 0.038277, 0.134073 ], [209, -8737.730000, 0.056592, 0.000007, 0.134494 ], [225, -8737.980000, 0.043898, 0.036449, 0.118496 ] ], "n": ["FDJVGXF01C55VE_rvcmp" ] }, {"p": [[28, -8732.760000, 0.401198, 0.018383, 0.111358 ], [226, -8733.310000, 0.232012, 0.014155, 0.104019 ], [210, -8733.830000, 0.138400, 0.010059, 0.120409 ], [208, -8734.490000, 0.071140, 0.018540, 0.131322 ], [205, -8734.720000, 0.056702, 0.038282, 0.134115 ], [209, -8734.720000, 0.056643, 0.000007, 0.134525 ], [225, -8734.970000, 0.043905, 0.036449, 0.118523 ] ], "n": ["FDJVGXF01EPNHK_rvcmp" ] }, {"p": [[28, -8150.130000, 0.857109, 0.020590, 0.097505 ], [226, -8152.760000, 0.061399, 0.014270, 0.094204 ], [210, -8153.420000, 0.031874, 0.010110, 0.110986 ], [34, -8154.150000, 0.015311, 0.001184, 0.118005 ], [205, -8154.430000, 0.011535, 0.037133, 0.124377 ], [208, -8154.450000, 0.011396, 0.023820, 0.126001 ], [209, -8154.450000, 0.011376, 0.000008, 0.126217 ] ], "n": ["FDJVGXF01DDHVB_rvcmp" ] }, {"p": [[28, -7621.560000, 0.784069, 0.020793, 0.105895 ], [226, -7623.610000, 0.101207, 0.017045, 0.101445 ], [210, -7624.600000, 0.037569, 0.010185, 0.120880 ], [1, -7624.970000, 0.025894, 0.050442, 0.098915 ], [34, -7625.270000, 0.019192, 0.000849, 0.128410 ], [17, -7625.430000, 0.016283, 0.038141, 0.103179 ], [26, -7625.470000, 0.015785, 0.072570, 0.113443 ] ], "n": ["FDJVGXF01DU45W" ] }, {"p": [[28, -8686.640000, 0.251000, 0.015457, 0.285717 ], [27, -8686.950000, 0.184268, 0.037601, 0.288896 ], [38, -8687.090000, 0.159867, 0.054112, 0.279957 ], [34, -8687.460000, 0.110353, 0.000007, 0.301796 ], [33, -8687.460000, 0.110324, 0.020031, 0.301797 ], [26, -8687.640000, 0.092098, 0.097406, 0.307066 ], [195, -8687.640000, 0.092091, 0.009446, 0.307071 ] ], "n": ["FDJVGXF01D2V22" ] }, {"p": [[28, -7052.400000, 1.000000, 0.015369, 0.101695 ] ], "n": ["FDJVGXF01BC051" ] }, {"p": [[28, -6830.530000, 1.000000, 0.015382, 0.105398 ] ], "n": ["FDJVGXF01EW47W_rvcmp" ] }, {"p": [[28, -6830.530000, 1.000000, 0.015382, 0.105398 ] ], "n": ["FDJVGXF01A3SD0_rvcmp" ] }, {"p": [[28, -6830.530000, 1.000000, 0.015382, 0.105398 ] ], "n": ["FDJVGXF01DG74P_rvcmp" ] }, {"p": [[28, -6830.530000, 1.000000, 0.015382, 0.105398 ] ], "n": ["FDJVGXF01CW7A1_rvcmp" ] }, {"p": [[28, -6758.460000, 0.961130, 0.015403, 0.107414 ], [1, -6761.670000, 0.038870, 0.023967, 0.109655 ] ], "n": ["FDJVGXF01EHYHY_rvcmp" ] }, {"p": [[28, -7154.900000, 0.213921, 0.028682, 0.280870 ], [29, -7155.070000, 0.182092, 0.035805, 0.291756 ], [33, -7155.190000, 0.160769, 0.000010, 0.299549 ], [32, -7155.190000, 0.160757, 0.015226, 0.299555 ], [31, -7155.650000, 0.101727, 0.001925, 0.307674 ], [30, -7155.650000, 0.101727, 0.001608, 0.307681 ], [27, -7155.900000, 0.079008, 0.038892, 0.298900 ] ], "n": ["FDJVGXF01ELF81_rvcmp" ] }, {"p": [[28, -7087.020000, 0.208578, 0.029011, 0.286693 ], [29, -7087.170000, 0.180399, 0.036116, 0.297542 ], [33, -7087.280000, 0.160913, 0.000010, 0.305114 ], [32, -7087.280000, 0.160901, 0.015226, 0.305105 ], [31, -7087.730000, 0.103004, 0.001925, 0.313224 ], [30, -7087.730000, 0.103004, 0.001608, 0.313224 ], [40, -7087.940000, 0.083201, 0.066894, 0.319652 ] ], "n": ["FDJVGXF01E4PPJ_rvcmp" ] }, {"p": [[28, -4264.790000, 0.563518, 0.000006, 0.030971 ], [22, -4266.200000, 0.137728, 0.012974, 0.071761 ], [38, -4266.730000, 0.080549, 0.062722, 0.067609 ], [27, -4266.920000, 0.066417, 0.057149, 0.067303 ], [35, -4267.060000, 0.057861, 0.005345, 0.070558 ], [193, -4267.270000, 0.047125, 0.015824, 0.080709 ], [194, -4267.270000, 0.046801, 0.000007, 0.080829 ] ], "n": ["FDJVGXF01AK3EJ_rvcmp" ] }, {"p": [[29, -7075.160000, 0.316776, 0.040951, 0.124289 ], [32, -7075.310000, 0.271848, 0.014936, 0.129256 ], [33, -7075.310000, 0.271390, 0.000010, 0.129346 ], [31, -7077.130000, 0.044039, 0.001925, 0.140845 ], [30, -7077.130000, 0.044017, 0.001608, 0.140845 ], [190, -7077.480000, 0.031031, 0.018935, 0.132868 ], [171, -7077.870000, 0.020898, 0.026287, 0.137670 ] ], "n": ["FDJVGXF01CJZMI" ] }, {"p": [[29, -8815.800000, 1.000000, 0.000006, 0.288753 ] ], "n": ["FDJVGXF01BKLB9_rvcmp" ] }, {"p": [[29, -8090.520000, 0.451493, 0.000006, 0.404868 ], [28, -8091.120000, 0.246879, 0.000006, 0.401663 ], [40, -8092.100000, 0.092673, 0.009897, 0.427511 ], [34, -8092.590000, 0.057112, 0.000007, 0.432758 ], [33, -8092.590000, 0.057110, 0.020031, 0.432752 ], [38, -8092.750000, 0.048307, 0.069299, 0.433190 ], [26, -8092.790000, 0.046426, 0.080460, 0.429622 ] ], "n": ["FDJVGXF01AYDNG" ] }, {"p": [[29, -6499.070000, 0.834613, 0.000006, 0.257147 ], [28, -6502.050000, 0.042232, 0.029109, 0.269024 ], [33, -6502.310000, 0.032687, 0.000010, 0.286191 ], [32, -6502.310000, 0.032680, 0.015226, 0.286194 ], [34, -6502.520000, 0.026437, 0.000007, 0.288807 ], [31, -6503.050000, 0.015676, 0.001925, 0.300005 ], [30, -6503.050000, 0.015676, 0.001608, 0.300001 ] ], "n": ["FDJVGXF01DI1YF_rvcmp" ] }, {"p": [[29, -5761.260000, 0.898807, 0.000006, 0.258513 ], [40, -5764.410000, 0.038425, 0.057750, 0.255693 ], [192, -5764.890000, 0.023772, 0.001042, 0.275250 ], [191, -5764.900000, 0.023715, 0.015648, 0.275874 ], [190, -5765.340000, 0.015281, 0.028144, 0.277102 ] ], "n": ["FDJVGXF01B7XA4_rvcmp" ] }, {"p": [[29, -4871.430000, 0.579528, 0.019369, 0.174551 ], [28, -4873.320000, 0.087510, 0.023571, 0.175732 ], [26, -4873.390000, 0.081443, 0.039661, 0.198622 ], [27, -4873.450000, 0.076387, 0.046675, 0.176235 ], [33, -4873.470000, 0.074640, 0.010873, 0.197984 ], [34, -4873.610000, 0.065482, 0.000007, 0.196667 ], [39, -4874.230000, 0.035011, 0.000006, 0.220005 ] ], "n": ["FDJVGXF01AK9MM" ] }, {"p": [[29, -4868.610000, 0.579353, 0.019370, 0.174653 ], [28, -4870.500000, 0.087488, 0.023594, 0.175870 ], [26, -4870.570000, 0.081503, 0.039653, 0.198754 ], [27, -4870.640000, 0.076370, 0.046677, 0.176345 ], [33, -4870.660000, 0.074692, 0.010871, 0.198111 ], [34, -4870.790000, 0.065524, 0.000007, 0.196796 ], [39, -4871.410000, 0.035069, 0.000006, 0.220131 ] ], "n": ["FDJVGXF01EAP1T" ] }, {"p": [[29, -4272.950000, 0.178561, 0.029909, 0.274528 ], [33, -4273.040000, 0.163512, 0.000010, 0.282634 ], [32, -4273.040000, 0.163478, 0.015226, 0.282639 ], [28, -4273.100000, 0.154448, 0.048759, 0.283219 ], [34, -4273.100000, 0.154362, 0.000007, 0.283233 ], [31, -4273.610000, 0.092819, 0.001925, 0.299591 ], [30, -4273.610000, 0.092819, 0.001608, 0.299584 ] ], "n": ["FDJVGXF01ATIJK_rvcmp" ] }, {"p": [[29, -4245.760000, 0.183923, 0.029112, 0.257568 ], [33, -4245.870000, 0.164292, 0.000010, 0.266315 ], [32, -4245.870000, 0.164256, 0.015226, 0.266320 ], [28, -4245.930000, 0.154939, 0.048759, 0.266804 ], [34, -4245.930000, 0.154846, 0.000007, 0.266817 ], [31, -4246.480000, 0.088872, 0.001925, 0.283134 ], [30, -4246.480000, 0.088872, 0.001608, 0.283127 ] ], "n": ["FDJVGXF01B3QSM_rvcmp" ] }, {"p": [[31, -8045.170000, 0.330072, 0.000008, 0.308291 ], [29, -8045.950000, 0.151520, 0.028068, 0.306626 ], [40, -8046.040000, 0.138221, 0.000720, 0.316620 ], [32, -8046.240000, 0.113836, 0.008482, 0.313236 ], [33, -8046.310000, 0.106154, 0.000010, 0.314181 ], [30, -8046.350000, 0.102107, 0.001608, 0.317904 ], [177, -8046.910000, 0.058090, 0.000009, 0.355336 ] ], "n": ["FDJVGXF01DOJCP" ] }, {"p": [[31, -6288.280000, 0.186718, 0.000008, 0.246558 ], [30, -6288.280000, 0.186718, 0.000006, 0.246558 ], [32, -6288.280000, 0.186679, 0.000007, 0.246553 ], [28, -6288.650000, 0.128559, 0.035942, 0.240041 ], [29, -6288.700000, 0.122409, 0.041188, 0.245345 ], [33, -6288.750000, 0.117081, 0.000010, 0.249271 ], [189, -6289.230000, 0.071837, 0.054112, 0.226860 ] ], "n": ["FDJVGXF01EOSEH_rvcmp" ] }, {"p": [[31, -4726.800000, 0.194414, 0.000008, 0.250616 ], [30, -4726.800000, 0.194414, 0.000006, 0.250616 ], [32, -4726.810000, 0.194348, 0.000007, 0.250617 ], [27, -4727.380000, 0.109759, 0.027251, 0.234662 ], [28, -4727.430000, 0.103547, 0.035953, 0.243550 ], [33, -4727.450000, 0.101759, 0.000010, 0.257401 ], [29, -4727.450000, 0.101758, 0.046702, 0.257394 ] ], "n": ["FDJVGXF01AW2QG" ] }, {"p": [[31, -4169.380000, 0.218182, 0.000008, 0.182375 ], [30, -4169.380000, 0.218182, 0.000006, 0.182375 ], [32, -4169.380000, 0.218104, 0.000007, 0.182374 ], [29, -4170.160000, 0.099773, 0.046702, 0.187393 ], [33, -4170.160000, 0.099762, 0.000010, 0.187402 ], [28, -4170.460000, 0.073866, 0.044395, 0.185578 ], [34, -4170.490000, 0.072131, 0.000007, 0.190970 ] ], "n": ["FDJVGXF01EVSH3_rvcmp" ] }, {"p": [[33, -8208.690000, 0.486362, 0.008908, 0.092767 ], [32, -8209.880000, 0.147711, 0.015226, 0.100686 ], [194, -8210.180000, 0.109723, 0.002533, 0.103308 ], [28, -8210.350000, 0.092525, 0.045337, 0.096891 ], [34, -8210.400000, 0.087712, 0.000007, 0.098753 ], [193, -8210.840000, 0.056853, 0.016731, 0.105309 ], [192, -8211.930000, 0.019115, 0.009166, 0.095966 ] ], "n": ["FDJVGXF01DCTSU" ] }, {"p": [[33, -2691.780000, 0.250596, 0.000010, 0.000008 ], [29, -2691.780000, 0.250561, 0.046702, 0.000006 ], [32, -2691.780000, 0.250547, 0.015226, 0.000006 ], [34, -2691.860000, 0.230000, 0.000006, 0.000008 ], [35, -2694.850000, 0.011614, 0.000006, 0.000009 ], [31, -2696.100000, 0.003341, 0.001925, 0.012214 ], [30, -2696.100000, 0.003341, 0.001608, 0.012214 ] ], "n": ["FDJVGXF01BB0IM_rvcmp" ] }, {"p": [[33, -2691.780000, 0.250596, 0.000010, 0.000008 ], [29, -2691.780000, 0.250561, 0.046702, 0.000006 ], [32, -2691.780000, 0.250547, 0.015226, 0.000006 ], [34, -2691.860000, 0.230000, 0.000006, 0.000008 ], [35, -2694.850000, 0.011614, 0.000006, 0.000009 ], [31, -2696.100000, 0.003341, 0.001925, 0.012214 ], [30, -2696.100000, 0.003341, 0.001608, 0.012214 ] ], "n": ["FDJVGXF01DWWKJ_rvcmp" ] }, {"p": [[33, -2584.920000, 0.250514, 0.000010, 0.000008 ], [29, -2584.920000, 0.250477, 0.046702, 0.000006 ], [32, -2584.920000, 0.250463, 0.015226, 0.000006 ], [34, -2585.000000, 0.229932, 0.000006, 0.000008 ], [35, -2587.990000, 0.011610, 0.000006, 0.000009 ], [31, -2589.190000, 0.003502, 0.001925, 0.012828 ], [30, -2589.190000, 0.003502, 0.001608, 0.012828 ] ], "n": ["FDJVGXF01BQIGM_rvcmp" ] }, {"p": [[34, -5009.290000, 0.336056, 0.010012, 0.034424 ], [35, -5009.640000, 0.236740, 0.002293, 0.035065 ], [196, -5009.830000, 0.196693, 0.008756, 0.027162 ], [195, -5010.640000, 0.087359, 0.005082, 0.034088 ], [33, -5011.090000, 0.055689, 0.020031, 0.041990 ], [194, -5011.200000, 0.049703, 0.006696, 0.038883 ], [38, -5011.480000, 0.037758, 0.048406, 0.040167 ] ], "n": ["FDJVGXF01BOA9N_rvcmp" ] }, {"p": [[34, -4856.530000, 0.279036, 0.010173, 0.026730 ], [196, -4856.850000, 0.203294, 0.008684, 0.018685 ], [35, -4856.900000, 0.194173, 0.002471, 0.027037 ], [27, -4857.000000, 0.174673, 0.070440, 0.027959 ], [195, -4857.860000, 0.073979, 0.005360, 0.025621 ], [33, -4858.530000, 0.038016, 0.020031, 0.034971 ], [194, -4858.560000, 0.036830, 0.006696, 0.031053 ] ], "n": ["FDJVGXF01BF4ZH_rvcmp" ] }, {"p": [[34, -4856.530000, 0.279036, 0.010173, 0.026730 ], [196, -4856.850000, 0.203294, 0.008684, 0.018685 ], [35, -4856.900000, 0.194173, 0.002471, 0.027037 ], [27, -4857.000000, 0.174673, 0.070440, 0.027959 ], [195, -4857.860000, 0.073979, 0.005360, 0.025621 ], [33, -4858.530000, 0.038016, 0.020031, 0.034971 ], [194, -4858.560000, 0.036830, 0.006696, 0.031053 ] ], "n": ["FDJVGXF01D2AEW_rvcmp" ] }, {"p": [[34, -4856.530000, 0.279036, 0.010173, 0.026730 ], [196, -4856.850000, 0.203294, 0.008684, 0.018685 ], [35, -4856.900000, 0.194173, 0.002471, 0.027037 ], [27, -4857.000000, 0.174673, 0.070440, 0.027959 ], [195, -4857.860000, 0.073979, 0.005360, 0.025621 ], [33, -4858.530000, 0.038016, 0.020031, 0.034971 ], [194, -4858.560000, 0.036830, 0.006696, 0.031053 ] ], "n": ["FDJVGXF01AN94K_rvcmp" ] }, {"p": [[34, -4689.110000, 0.323398, 0.008734, 0.024066 ], [196, -4689.570000, 0.204135, 0.009572, 0.016895 ], [27, -4689.800000, 0.161769, 0.070440, 0.025796 ], [35, -4689.910000, 0.144563, 0.006526, 0.022794 ], [195, -4690.680000, 0.067229, 0.005151, 0.023690 ], [33, -4690.710000, 0.065259, 0.020031, 0.029045 ], [194, -4691.370000, 0.033648, 0.006696, 0.028739 ] ], "n": ["FDJVGXF01C6JWZ" ] }, {"p": [[34, -4686.420000, 0.324557, 0.008734, 0.024076 ], [196, -4686.880000, 0.204798, 0.009562, 0.016903 ], [27, -4687.110000, 0.162362, 0.070440, 0.025798 ], [35, -4687.250000, 0.141531, 0.006526, 0.028935 ], [195, -4687.990000, 0.067468, 0.005151, 0.023701 ], [33, -4688.020000, 0.065508, 0.020031, 0.029062 ], [194, -4688.690000, 0.033776, 0.006696, 0.028746 ] ], "n": ["FDJVGXF01DNF8C_rvcmp" ] }, {"p": [[34, -4480.410000, 0.515996, 0.006122, 0.014612 ], [33, -4481.400000, 0.192943, 0.020031, 0.016072 ], [35, -4481.630000, 0.152838, 0.000006, 0.016126 ], [29, -4482.620000, 0.056934, 0.043740, 0.020382 ], [32, -4482.670000, 0.054059, 0.015226, 0.021360 ], [195, -4483.780000, 0.017797, 0.005612, 0.014244 ], [38, -4484.420000, 0.009432, 0.018786, 0.024949 ] ], "n": ["FDJVGXF01EF2ZF_rvcmp" ] }, {"p": [[34, -4385.160000, 0.551948, 0.005601, 0.007911 ], [33, -4386.110000, 0.213932, 0.020031, 0.008380 ], [35, -4386.600000, 0.131372, 0.000006, 0.009309 ], [29, -4387.580000, 0.049037, 0.042951, 0.011890 ], [32, -4387.690000, 0.044285, 0.015226, 0.013395 ], [38, -4389.870000, 0.004987, 0.014439, 0.019023 ], [36, -4389.990000, 0.004438, 0.000009, 0.023562 ] ], "n": ["FDJVGXF01CPIPJ" ] }, {"p": [[34, -4385.160000, 0.551948, 0.005601, 0.007911 ], [33, -4386.110000, 0.213932, 0.020031, 0.008380 ], [35, -4386.600000, 0.131372, 0.000006, 0.009309 ], [29, -4387.580000, 0.049037, 0.042951, 0.011890 ], [32, -4387.690000, 0.044285, 0.015226, 0.013395 ], [38, -4389.870000, 0.004987, 0.014439, 0.019023 ], [36, -4389.990000, 0.004438, 0.000009, 0.023562 ] ], "n": ["FDJVGXF01DRUD1" ] }, {"p": [[34, -3775.760000, 0.279284, 0.013488, 0.009167 ], [35, -3775.760000, 0.277579, 0.000006, 0.009191 ], [27, -3775.760000, 0.277568, 0.070440, 0.009191 ], [33, -3777.370000, 0.055799, 0.020031, 0.009875 ], [28, -3777.370000, 0.055791, 0.048759, 0.009884 ], [38, -3777.980000, 0.030182, 0.017966, 0.011942 ], [36, -3778.220000, 0.023797, 0.000009, 0.018156 ] ], "n": ["FDJVGXF01E0FKB" ] }, {"p": [[34, -3737.670000, 0.609757, 0.005964, 0.000008 ], [33, -3738.740000, 0.207846, 0.020031, 0.000008 ], [35, -3739.160000, 0.137024, 0.000006, 0.000009 ], [32, -3741.330000, 0.015677, 0.015226, 0.003920 ], [195, -3741.530000, 0.012780, 0.000009, 0.007750 ], [194, -3741.530000, 0.012776, 0.006696, 0.007751 ], [38, -3742.660000, 0.004140, 0.076825, 0.009051 ] ], "n": ["FDJVGXF01DG78X" ] }, {"p": [[34, -3379.210000, 0.610403, 0.005989, 0.000008 ], [33, -3380.290000, 0.207005, 0.020031, 0.000008 ], [35, -3380.700000, 0.137841, 0.000006, 0.000009 ], [32, -3382.820000, 0.016494, 0.015226, 0.004956 ], [195, -3382.980000, 0.014131, 0.000009, 0.008851 ], [194, -3382.980000, 0.014126, 0.006696, 0.008856 ] ], "n": ["FDJVGXF01BOPK9" ] }, {"p": [[34, -3277.300000, 0.609748, 0.005990, 0.000008 ], [33, -3278.380000, 0.206732, 0.020031, 0.000008 ], [35, -3278.790000, 0.137669, 0.000006, 0.000009 ], [32, -3280.890000, 0.016754, 0.015226, 0.005271 ], [195, -3281.030000, 0.014551, 0.000009, 0.009196 ], [194, -3281.030000, 0.014546, 0.006696, 0.009188 ] ], "n": ["FDJVGXF01CS07I_rvcmp" ] }, {"p": [[34, -2751.070000, 0.612253, 0.005977, 0.000008 ], [33, -2752.150000, 0.207854, 0.020031, 0.000008 ], [35, -2752.560000, 0.137506, 0.000006, 0.000009 ], [195, -2754.600000, 0.017932, 0.000009, 0.011486 ], [194, -2754.600000, 0.017926, 0.006696, 0.011487 ], [38, -2755.610000, 0.006529, 0.076823, 0.013352 ] ], "n": ["FDJVGXF01E32DQ_rvcmp" ] }, {"p": [[34, -2751.070000, 0.612253, 0.005977, 0.000008 ], [33, -2752.150000, 0.207854, 0.020031, 0.000008 ], [35, -2752.560000, 0.137506, 0.000006, 0.000009 ], [195, -2754.600000, 0.017932, 0.000009, 0.011486 ], [194, -2754.600000, 0.017926, 0.006696, 0.011487 ], [38, -2755.610000, 0.006529, 0.076823, 0.013352 ] ], "n": ["FDJVGXF01DZ5JQ_rvcmp" ] }, {"p": [[37, -3002.860000, 0.207747, 0.001057, 0.010760 ], [36, -3002.860000, 0.207740, 0.000398, 0.010762 ], [38, -3002.860000, 0.207731, 0.000005, 0.010762 ], [194, -3003.430000, 0.117592, 0.000007, 0.010719 ], [193, -3003.430000, 0.117556, 0.016731, 0.010720 ], [35, -3003.850000, 0.077417, 0.013078, 0.010537 ], [27, -3004.040000, 0.064216, 0.070440, 0.010211 ] ], "n": ["FDJVGXF01BKUZO_rvcmp" ] }, {"p": [[37, -2941.210000, 0.205062, 0.001050, 0.011100 ], [36, -2941.210000, 0.205055, 0.000392, 0.011102 ], [38, -2941.210000, 0.205046, 0.000005, 0.011108 ], [194, -2941.780000, 0.116069, 0.000007, 0.011074 ], [193, -2941.780000, 0.116034, 0.016731, 0.011074 ], [35, -2942.190000, 0.076374, 0.013078, 0.010893 ], [195, -2942.190000, 0.076359, 0.000009, 0.010887 ] ], "n": ["FDJVGXF01DK2IL_rvcmp" ] }, {"p": [[38, -5005.960000, 0.272955, 0.036152, 0.045702 ], [35, -5006.490000, 0.161323, 0.004278, 0.047279 ], [196, -5006.610000, 0.141864, 0.009466, 0.033773 ], [27, -5006.690000, 0.131723, 0.070440, 0.049071 ], [194, -5006.940000, 0.102720, 0.000007, 0.048326 ], [193, -5006.940000, 0.102644, 0.016731, 0.048324 ], [195, -5007.110000, 0.086772, 0.003416, 0.043918 ] ], "n": ["FDJVGXF01A14WV" ] }, {"p": [[38, -4389.820000, 0.622291, 0.036927, 0.168334 ], [27, -4391.290000, 0.142084, 0.031389, 0.195385 ], [37, -4392.180000, 0.058621, 0.002319, 0.231171 ], [36, -4392.180000, 0.058621, 0.001199, 0.231167 ], [33, -4392.530000, 0.041216, 0.014141, 0.204838 ], [193, -4392.570000, 0.039606, 0.004247, 0.215666 ], [192, -4392.620000, 0.037560, 0.022464, 0.219012 ] ], "n": ["FDJVGXF01AX1XU" ] }, {"p": [[39, -6492.780000, 1.000000, 0.005258, 0.024366 ] ], "n": ["FDJVGXF01AFET7" ] }, {"p": [[39, -3901.470000, 0.251301, 0.009835, 0.109960 ], [190, -3901.690000, 0.201958, 0.018101, 0.108118 ], [34, -3902.180000, 0.123774, 0.000608, 0.130203 ], [33, -3902.180000, 0.123491, 0.020031, 0.130829 ], [29, -3902.350000, 0.103864, 0.046702, 0.134200 ], [171, -3902.390000, 0.099611, 0.031112, 0.113474 ], [191, -3902.430000, 0.096000, 0.000008, 0.116689 ] ], "n": ["FDJVGXF01CLTHA" ] }, {"p": [[39, -3751.040000, 0.239880, 0.000006, 0.295663 ], [29, -3751.120000, 0.222172, 0.000006, 0.310543 ], [167, -3751.670000, 0.127800, 0.000008, 0.281584 ], [151, -3751.770000, 0.115081, 0.000007, 0.340280 ], [171, -3751.930000, 0.098439, 0.001538, 0.344289 ], [149, -3751.930000, 0.098314, 0.063739, 0.345315 ], [170, -3751.930000, 0.098313, 0.018724, 0.345319 ] ], "n": ["FDJVGXF01CD0V5" ] }, {"p": [[39, -2616.910000, 0.371083, 0.011719, 0.029263 ], [190, -2617.240000, 0.267240, 0.009321, 0.027562 ], [205, -2618.520000, 0.073822, 0.000007, 0.043403 ], [204, -2618.520000, 0.073797, 0.020143, 0.043398 ], [25, -2618.520000, 0.073768, 0.014512, 0.043407 ], [196, -2618.570000, 0.070169, 0.000010, 0.041398 ], [195, -2618.570000, 0.070121, 0.009446, 0.041400 ] ], "n": ["FDJVGXF01EFQH4_rvcmp" ] }, {"p": [[39, -4661.100000, 0.172658, 0.015769, 0.270216 ], [193, -4661.300000, 0.141802, 0.000008, 0.285076 ], [192, -4661.300000, 0.141781, 0.022464, 0.285078 ], [196, -4661.340000, 0.136034, 0.000010, 0.284980 ], [195, -4661.340000, 0.136014, 0.009446, 0.284985 ], [38, -4661.340000, 0.135866, 0.076823, 0.289323 ], [194, -4661.340000, 0.135845, 0.000007, 0.289333 ] ], "n": ["FDJVGXF01DI2Q5" ] }, {"p": [[39, -4661.100000, 0.172658, 0.015769, 0.270216 ], [193, -4661.300000, 0.141802, 0.000008, 0.285076 ], [192, -4661.300000, 0.141781, 0.022464, 0.285078 ], [196, -4661.340000, 0.136034, 0.000010, 0.284980 ], [195, -4661.340000, 0.136014, 0.009446, 0.284985 ], [38, -4661.340000, 0.135866, 0.076823, 0.289323 ], [194, -4661.340000, 0.135845, 0.000007, 0.289333 ] ], "n": ["FDJVGXF01APVY4" ] }, {"p": [[39, -4598.410000, 0.169965, 0.015889, 0.278196 ], [193, -4598.590000, 0.142036, 0.000008, 0.293331 ], [192, -4598.590000, 0.142015, 0.022464, 0.293333 ], [38, -4598.630000, 0.136764, 0.076823, 0.297622 ], [194, -4598.630000, 0.136744, 0.000007, 0.297627 ], [196, -4598.630000, 0.136247, 0.000010, 0.293277 ], [195, -4598.630000, 0.136229, 0.009446, 0.293287 ] ], "n": ["FDJVGXF01B0VT1_rvcmp" ] }, {"p": [[40, -8851.540000, 0.875607, 0.020885, 0.282963 ], [38, -8854.460000, 0.047061, 0.047732, 0.292386 ], [193, -8855.270000, 0.021034, 0.006850, 0.322703 ], [29, -8855.420000, 0.018065, 0.005765, 0.316543 ], [192, -8855.570000, 0.015578, 0.022464, 0.329483 ], [191, -8855.800000, 0.012401, 0.000008, 0.329554 ], [34, -8855.990000, 0.010254, 0.014240, 0.330980 ] ], "n": ["FDJVGXF01CCFV1" ] }, {"p": [[40, -7351.360000, 0.243770, 0.064968, 0.138430 ], [192, -7351.520000, 0.207621, 0.012056, 0.150422 ], [149, -7351.780000, 0.160413, 0.038290, 0.114484 ], [171, -7352.130000, 0.113366, 0.020146, 0.143555 ], [39, -7352.190000, 0.106637, 0.021827, 0.160322 ], [193, -7352.240000, 0.100737, 0.000008, 0.162317 ], [191, -7352.640000, 0.067457, 0.007862, 0.153095 ] ], "n": ["FDJVGXF01DA51F" ] }, {"p": [[40, -6917.390000, 0.513125, 0.060544, 0.129058 ], [192, -6918.840000, 0.120271, 0.005055, 0.149334 ], [191, -6918.950000, 0.107874, 0.015648, 0.150823 ], [190, -6919.310000, 0.075084, 0.034335, 0.152179 ], [171, -6919.310000, 0.075026, 0.034630, 0.152186 ], [39, -6919.410000, 0.067658, 0.012365, 0.156288 ], [28, -6919.920000, 0.040962, 0.030353, 0.159886 ] ], "n": ["FDJVGXF01C794H" ] }, {"p": [[40, -6743.190000, 0.326190, 0.054919, 0.103919 ], [38, -6743.550000, 0.229056, 0.059882, 0.108165 ], [193, -6744.120000, 0.129299, 0.008136, 0.121297 ], [26, -6744.240000, 0.113878, 0.097406, 0.129670 ], [195, -6744.240000, 0.113863, 0.009446, 0.129676 ], [192, -6745.070000, 0.049903, 0.013478, 0.126012 ], [189, -6745.350000, 0.037811, 0.059105, 0.101751 ] ], "n": ["FDJVGXF01BHLXE" ] }, {"p": [[40, -5927.500000, 0.264380, 0.062612, 0.142518 ], [192, -5927.810000, 0.193444, 0.012191, 0.157604 ], [149, -5927.900000, 0.177115, 0.039103, 0.120925 ], [39, -5928.410000, 0.106030, 0.021179, 0.169849 ], [193, -5928.470000, 0.100253, 0.000008, 0.171827 ], [171, -5928.490000, 0.098728, 0.017591, 0.153717 ], [191, -5928.980000, 0.060051, 0.011998, 0.163414 ] ], "n": ["FDJVGXF01AOYHI" ] }, {"p": [[40, -4726.410000, 0.760962, 0.038868, 0.141689 ], [189, -4728.920000, 0.061545, 0.029295, 0.159271 ], [191, -4729.350000, 0.040127, 0.015648, 0.185840 ], [192, -4729.350000, 0.040114, 0.000005, 0.185845 ], [27, -4729.490000, 0.035029, 0.020378, 0.189434 ], [190, -4729.590000, 0.031557, 0.030632, 0.185317 ], [171, -4729.620000, 0.030667, 0.034630, 0.189743 ] ], "n": ["FDJVGXF01A4I83" ] }, {"p": [[40, -5682.820000, 0.956613, 0.017061, 0.218498 ], [151, -5686.870000, 0.016766, 0.006743, 0.257700 ], [152, -5686.950000, 0.015368, 0.007516, 0.256068 ], [153, -5687.270000, 0.011253, 0.004451, 0.261264 ] ], "n": ["FDJVGXF01AOJEQ_rvcmp" ] }, {"p": [[40, -5092.630000, 0.308732, 0.044753, 0.473982 ], [192, -5093.020000, 0.209361, 0.000005, 0.508740 ], [191, -5093.020000, 0.209317, 0.015648, 0.508741 ], [193, -5094.060000, 0.073576, 0.000008, 0.526621 ], [39, -5094.060000, 0.073575, 0.025399, 0.526627 ], [38, -5094.130000, 0.069037, 0.076823, 0.526439 ], [29, -5094.330000, 0.056402, 0.000006, 0.527534 ] ], "n": ["FDJVGXF01A3XD4" ] }, {"p": [[40, -2816.800000, 0.423833, 0.019033, 0.133227 ], [149, -2817.070000, 0.324398, 0.024917, 0.094660 ], [191, -2818.520000, 0.076319, 0.012681, 0.150562 ], [192, -2818.610000, 0.069967, 0.000005, 0.153313 ], [148, -2819.200000, 0.038771, 0.029076, 0.101645 ], [162, -2819.350000, 0.033356, 0.000005, 0.182495 ], [163, -2819.350000, 0.033356, 0.000007, 0.182495 ] ], "n": ["FDJVGXF01E3HCE" ] }, {"p": [[50, -5253.880000, 0.274406, 0.000008, 1.582230 ], [51, -5254.470000, 0.151137, 0.196060, 1.634300 ], [60, -5254.700000, 0.121000, 0.000006, 1.668060 ], [52, -5254.700000, 0.121000, 0.092957, 1.668050 ], [59, -5254.700000, 0.121000, 0.039608, 1.668050 ], [53, -5254.830000, 0.105892, 0.000006, 1.685530 ], [56, -5254.830000, 0.105565, 0.000009, 1.689540 ] ], "n": ["FDJVGXF01CNQFK" ] }, {"p": [[65, -7187.180000, 0.434361, 0.057306, 1.999990 ], [73, -7188.700000, 0.094971, 0.065085, 1.999990 ], [68, -7188.710000, 0.094527, 0.067647, 1.999990 ], [74, -7188.710000, 0.094524, 0.000009, 1.999990 ], [72, -7188.710000, 0.094252, 0.263281, 1.999990 ], [71, -7188.710000, 0.094249, 0.079029, 1.999990 ], [70, -7188.720000, 0.093115, 0.490388, 1.999990 ] ], "n": ["FDJVGXF01BU5S3" ] }, {"p": [[65, -4705.050000, 0.177114, 0.223601, 1.999990 ], [37, -4705.210000, 0.151343, 0.000009, 1.999990 ], [36, -4705.210000, 0.151343, 0.000009, 1.999990 ], [38, -4705.210000, 0.151320, 0.000009, 1.999990 ], [66, -4705.330000, 0.133482, 0.000007, 1.999990 ], [64, -4705.330000, 0.133478, 0.347492, 1.999990 ], [9, -4705.600000, 0.101921, 0.000008, 1.999990 ] ], "n": ["FDJVGXF01EZU4N_rvcmp" ] }, {"p": [[65, -4705.050000, 0.177114, 0.223601, 1.999990 ], [37, -4705.210000, 0.151343, 0.000009, 1.999990 ], [36, -4705.210000, 0.151343, 0.000009, 1.999990 ], [38, -4705.210000, 0.151320, 0.000009, 1.999990 ], [66, -4705.330000, 0.133482, 0.000007, 1.999990 ], [64, -4705.330000, 0.133478, 0.347492, 1.999990 ], [9, -4705.600000, 0.101921, 0.000008, 1.999990 ] ], "n": ["FDJVGXF01B0X78_rvcmp" ] }, {"p": [[70, -7142.740000, 0.351172, 0.530580, 1.452650 ], [71, -7142.860000, 0.310021, 0.000010, 1.530600 ], [73, -7144.160000, 0.084655, 0.000007, 1.693500 ], [72, -7144.160000, 0.084644, 0.263281, 1.693490 ], [68, -7144.290000, 0.073869, 0.067647, 1.740840 ], [74, -7144.290000, 0.073867, 0.000009, 1.740840 ], [66, -7145.520000, 0.021772, 0.108039, 1.856570 ] ], "n": ["FDJVGXF01B16PZ_rvcmp" ] }, {"p": [[76, -5729.170000, 0.958801, 0.050177, 0.350206 ], [77, -5732.960000, 0.021518, 0.207696, 0.360811 ], [19, -5733.050000, 0.019682, 0.000006, 0.324320 ] ], "n": ["FDJVGXF01EZGSA" ] }, {"p": [[76, -5729.170000, 0.958801, 0.050177, 0.350206 ], [77, -5732.960000, 0.021518, 0.207696, 0.360811 ], [19, -5733.050000, 0.019682, 0.000006, 0.324320 ] ], "n": ["FDJVGXF01DHOIS" ] }, {"p": [[76, -5729.170000, 0.958801, 0.050177, 0.350206 ], [77, -5732.960000, 0.021518, 0.207696, 0.360811 ], [19, -5733.050000, 0.019682, 0.000006, 0.324320 ] ], "n": ["FDJVGXF01EN2KD" ] }, {"p": [[76, -5729.170000, 0.958801, 0.050177, 0.350206 ], [77, -5732.960000, 0.021518, 0.207696, 0.360811 ], [19, -5733.050000, 0.019682, 0.000006, 0.324320 ] ], "n": ["FDJVGXF01BGP0B" ] }, {"p": [[76, -5729.170000, 0.958801, 0.050177, 0.350206 ], [77, -5732.960000, 0.021518, 0.207696, 0.360811 ], [19, -5733.050000, 0.019682, 0.000006, 0.324320 ] ], "n": ["FDJVGXF01CYI70" ] }, {"p": [[77, -2525.760000, 0.197960, 0.210163, 0.404921 ], [76, -2525.760000, 0.197743, 0.138323, 0.406483 ], [78, -2525.760000, 0.197603, 0.000008, 0.406483 ], [57, -2526.090000, 0.142237, 0.003602, 0.428880 ], [86, -2526.240000, 0.122371, 0.000007, 0.485847 ], [56, -2526.460000, 0.098211, 0.074592, 0.418339 ], [67, -2527.260000, 0.043874, 0.124498, 0.320033 ] ], "n": ["FDJVGXF01DNDT7" ] }, {"p": [[80, -4604.640000, 0.661735, 0.027934, 0.017933 ], [98, -4605.670000, 0.235997, 0.020494, 0.030096 ], [101, -4607.660000, 0.032174, 0.018812, 0.042387 ], [102, -4607.660000, 0.032148, 0.000005, 0.042381 ], [100, -4608.220000, 0.018487, 0.035413, 0.043297 ], [106, -4608.690000, 0.011563, 0.002434, 0.051403 ], [107, -4609.070000, 0.007895, 0.009012, 0.049026 ] ], "n": ["FDJVGXF01EWN6U" ] }, {"p": [[88, -7380.950000, 0.831891, 0.012117, 0.174910 ], [99, -7382.550000, 0.168109, 0.000006, 0.201624 ] ], "n": ["FDJVGXF01D7743" ] }, {"p": [[91, -7654.100000, 0.981270, 0.004268, 0.014477 ], [98, -7658.060000, 0.018730, 0.028308, 0.018154 ] ], "n": ["FDJVGXF01DZWVS_rvcmp" ] }, {"p": [[91, -7668.570000, 0.985688, 0.004399, 0.009574 ], [98, -7672.800000, 0.014312, 0.028008, 0.012959 ] ], "n": ["FDJVGXF01BNVHS_rvcmp" ] }, {"p": [[91, -7668.570000, 0.985688, 0.004399, 0.009574 ], [98, -7672.800000, 0.014312, 0.028008, 0.012959 ] ], "n": ["FDJVGXF01BN1TA_rvcmp" ] }, {"p": [[91, -8551.810000, 0.709247, 0.013971, 0.033195 ], [95, -8553.490000, 0.133045, 0.000008, 0.036348 ], [94, -8553.490000, 0.132891, 0.039199, 0.036347 ], [96, -8555.160000, 0.024816, 0.027500, 0.039177 ] ], "n": ["FDJVGXF01DSJSA" ] }, {"p": [[91, -8770.720000, 1.000000, 0.007056, 0.061371 ] ], "n": ["FDJVGXF01CD42S_rvcmp" ] }, {"p": [[91, -8560.370000, 0.364627, 0.014868, 0.039063 ], [95, -8560.550000, 0.304691, 0.001827, 0.037973 ], [94, -8560.720000, 0.257789, 0.039199, 0.038827 ], [96, -8562.680000, 0.036455, 0.027500, 0.041880 ], [97, -8562.680000, 0.036438, 0.000005, 0.041874 ] ], "n": ["FDJVGXF01BX0MO_rvcmp" ] }, {"p": [[91, -8780.350000, 0.642793, 0.013949, 0.045399 ], [95, -8781.830000, 0.146511, 0.000008, 0.048708 ], [94, -8781.830000, 0.146413, 0.039199, 0.048703 ], [96, -8783.350000, 0.032149, 0.027500, 0.051441 ], [97, -8783.350000, 0.032133, 0.000005, 0.051444 ] ], "n": ["FDJVGXF01AIDG8_rvcmp" ] }, {"p": [[91, -8780.350000, 0.642793, 0.013949, 0.045399 ], [95, -8781.830000, 0.146511, 0.000008, 0.048708 ], [94, -8781.830000, 0.146413, 0.039199, 0.048703 ], [96, -8783.350000, 0.032149, 0.027500, 0.051441 ], [97, -8783.350000, 0.032133, 0.000005, 0.051444 ] ], "n": ["FDJVGXF01DXA5V_rvcmp" ] }, {"p": [[91, -7458.550000, 1.000000, 0.002194, 0.009349 ] ], "n": ["FDJVGXF01EB87R_rvcmp" ] }, {"p": [[91, -8045.590000, 1.000000, 0.005559, 0.023239 ] ], "n": ["FDJVGXF01AKE7H_rvcmp" ] }, {"p": [[91, -8435.690000, 1.000000, 0.006508, 0.003112 ] ], "n": ["FDJVGXF01DDIQU_rvcmp" ] }, {"p": [[91, -6972.830000, 0.351256, 0.014913, 0.005056 ], [94, -6972.910000, 0.324775, 0.039199, 0.005129 ], [95, -6972.910000, 0.323969, 0.000008, 0.005129 ] ], "n": ["FDJVGXF01CSHXA_rvcmp" ] }, {"p": [[91, -6557.310000, 0.311233, 0.017470, 0.064477 ], [94, -6557.330000, 0.305814, 0.039199, 0.064531 ], [95, -6557.330000, 0.305529, 0.000008, 0.064531 ], [96, -6559.880000, 0.023827, 0.027500, 0.069617 ], [97, -6559.880000, 0.023805, 0.000005, 0.069608 ], [92, -6560.350000, 0.014918, 0.005357, 0.072940 ], [93, -6560.350000, 0.014875, 0.002453, 0.072931 ] ], "n": ["FDJVGXF01DBSFJ" ] }, {"p": [[91, -4031.760000, 0.598185, 0.013190, 0.018968 ], [103, -4032.710000, 0.230729, 0.000007, 0.027634 ], [95, -4033.760000, 0.080418, 0.000008, 0.024651 ], [97, -4034.450000, 0.040645, 0.000005, 0.028925 ], [96, -4034.450000, 0.040626, 0.027500, 0.028932 ], [112, -4035.910000, 0.009395, 0.007821, 0.028428 ] ], "n": ["FDJVGXF01CQPYV" ] }, {"p": [[91, -3147.970000, 0.932996, 0.000010, 0.010161 ], [107, -3150.610000, 0.067004, 0.011338, 0.006548 ] ], "n": ["FDJVGXF01CT8L2" ] }, {"p": [[91, -4271.070000, 0.315406, 0.020097, 0.000009 ], [94, -4271.070000, 0.315272, 0.039199, 0.000006 ], [95, -4271.080000, 0.315134, 0.000007, 0.000009 ], [96, -4273.530000, 0.027106, 0.027498, 0.000006 ], [97, -4273.530000, 0.027082, 0.000006, 0.000009 ] ], "n": ["FDJVGXF01COAXF" ] }, {"p": [[91, -4790.420000, 0.265379, 0.018578, 0.083840 ], [94, -4790.430000, 0.263825, 0.039199, 0.083871 ], [95, -4790.430000, 0.263772, 0.000008, 0.083871 ], [96, -4791.540000, 0.086629, 0.027500, 0.087459 ], [97, -4791.540000, 0.086588, 0.000005, 0.087458 ], [92, -4793.150000, 0.017282, 0.000005, 0.096662 ], [93, -4793.200000, 0.016525, 0.002453, 0.096667 ] ], "n": ["FDJVGXF01CDXTH" ] }, {"p": [[91, -3878.730000, 0.345262, 0.000010, 0.000010 ], [95, -3879.330000, 0.189186, 0.000008, 0.000006 ], [94, -3879.330000, 0.189049, 0.039199, 0.000006 ], [97, -3879.760000, 0.122924, 0.000005, 0.000006 ], [96, -3879.760000, 0.122823, 0.027500, 0.000006 ], [90, -3881.840000, 0.015380, 0.040800, 0.000006 ], [98, -3881.840000, 0.015375, 0.000006, 0.000007 ] ], "n": ["FDJVGXF01BA67J_rvcmp" ] }, {"p": [[91, -3878.730000, 0.345262, 0.000010, 0.000010 ], [95, -3879.330000, 0.189186, 0.000008, 0.000006 ], [94, -3879.330000, 0.189049, 0.039199, 0.000006 ], [97, -3879.760000, 0.122924, 0.000005, 0.000006 ], [96, -3879.760000, 0.122823, 0.027500, 0.000006 ], [90, -3881.840000, 0.015380, 0.040800, 0.000006 ], [98, -3881.840000, 0.015375, 0.000006, 0.000007 ] ], "n": ["FDJVGXF01EJGZO_rvcmp" ] }, {"p": [[91, -3567.400000, 0.535857, 0.000010, 0.000010 ], [95, -3568.350000, 0.208224, 0.000008, 0.000006 ], [94, -3568.350000, 0.208136, 0.039199, 0.000006 ], [97, -3570.510000, 0.023901, 0.000005, 0.000006 ], [96, -3570.510000, 0.023882, 0.027500, 0.000006 ] ], "n": ["FDJVGXF01BN5NS" ] }, {"p": [[91, -3498.010000, 0.533894, 0.000010, 0.000010 ], [95, -3498.950000, 0.209243, 0.000008, 0.000006 ], [94, -3498.950000, 0.209207, 0.039199, 0.000006 ], [97, -3501.120000, 0.023838, 0.000005, 0.000006 ], [96, -3501.120000, 0.023818, 0.027500, 0.000006 ] ], "n": ["FDJVGXF01CBW0V" ] }, {"p": [[92, -7385.460000, 0.437230, 0.000005, 0.375406 ], [94, -7386.070000, 0.236897, 0.011266, 0.387712 ], [93, -7386.530000, 0.149695, 0.002453, 0.395694 ], [96, -7386.680000, 0.128911, 0.000007, 0.430910 ], [95, -7387.680000, 0.047267, 0.000008, 0.442571 ] ], "n": ["FDJVGXF01DYW39_rvcmp" ] }, {"p": [[92, -3171.330000, 0.191206, 0.000005, 0.066052 ], [91, -3171.330000, 0.191191, 0.000010, 0.066052 ], [94, -3171.380000, 0.183008, 0.000010, 0.066075 ], [93, -3171.380000, 0.182330, 0.002453, 0.066078 ], [95, -3171.600000, 0.147055, 0.000008, 0.066480 ], [90, -3172.080000, 0.090116, 0.032365, 0.054778 ], [97, -3173.870000, 0.015093, 0.009613, 0.072928 ] ], "n": ["FDJVGXF01BHQHK_rvcmp" ] }, {"p": [[92, -3149.800000, 0.208580, 0.000005, 0.061622 ], [91, -3149.800000, 0.208563, 0.000010, 0.061626 ], [94, -3149.850000, 0.199617, 0.000010, 0.061647 ], [93, -3149.850000, 0.198875, 0.002453, 0.061649 ], [95, -3150.070000, 0.159968, 0.000008, 0.061995 ], [97, -3152.640000, 0.012199, 0.000005, 0.071541 ], [96, -3152.640000, 0.012198, 0.027500, 0.071544 ] ], "n": ["FDJVGXF01CIWT1" ] }, {"p": [[94, -4303.370000, 0.415424, 0.016196, 0.110324 ], [92, -4304.400000, 0.147428, 0.003101, 0.121184 ], [93, -4304.680000, 0.112071, 0.002453, 0.127032 ], [96, -4304.900000, 0.089370, 0.012969, 0.128662 ], [97, -4304.930000, 0.087230, 0.015024, 0.130123 ], [90, -4304.980000, 0.083185, 0.040800, 0.132911 ], [95, -4305.220000, 0.065291, 0.003223, 0.129745 ] ], "n": ["FDJVGXF01E4CX1_rvcmp" ] }, {"p": [[96, -8436.950000, 0.296251, 0.027500, 0.037727 ], [95, -8436.950000, 0.296170, 0.008662, 0.037728 ], [97, -8436.950000, 0.296153, 0.000005, 0.037725 ], [91, -8438.620000, 0.055719, 0.020097, 0.039723 ], [94, -8438.630000, 0.055707, 0.039199, 0.039722 ] ], "n": ["FDJVGXF01DYJC3" ] }, {"p": [[96, -6812.330000, 0.318743, 0.027500, 0.062015 ], [97, -6812.330000, 0.318462, 0.000005, 0.062013 ], [95, -6812.330000, 0.318398, 0.008662, 0.062017 ], [91, -6814.990000, 0.022200, 0.020097, 0.069709 ], [94, -6814.990000, 0.022197, 0.039199, 0.069708 ] ], "n": ["FDJVGXF01EPE9H_rvcmp" ] }, {"p": [[96, -4931.260000, 0.293513, 0.027500, 0.023659 ], [95, -4931.260000, 0.293359, 0.008662, 0.023659 ], [97, -4931.260000, 0.293211, 0.000005, 0.023659 ], [91, -4932.850000, 0.059965, 0.020097, 0.026076 ], [94, -4932.850000, 0.059953, 0.039199, 0.026076 ] ], "n": ["FDJVGXF01CY75H_rvcmp" ] }, {"p": [[96, -3398.990000, 0.270657, 0.027500, 0.057707 ], [97, -3398.990000, 0.270602, 0.000005, 0.057704 ], [95, -3398.990000, 0.270487, 0.008662, 0.057708 ], [94, -3400.490000, 0.060573, 0.039199, 0.065527 ], [91, -3400.490000, 0.060567, 0.020097, 0.065528 ], [92, -3401.060000, 0.034342, 0.000005, 0.072279 ], [93, -3401.100000, 0.032773, 0.002453, 0.072309 ] ], "n": ["FDJVGXF01AQEN6_rvcmp" ] }, {"p": [[97, -6900.410000, 0.757300, 0.007090, 0.070911 ], [95, -6902.710000, 0.076110, 0.005228, 0.084481 ], [96, -6902.960000, 0.058821, 0.027500, 0.085255 ], [91, -6903.190000, 0.047104, 0.020097, 0.088585 ], [94, -6903.190000, 0.047095, 0.039199, 0.088589 ], [92, -6904.430000, 0.013570, 0.000005, 0.093427 ] ], "n": ["FDJVGXF01B6WPS" ] }, {"p": [[98, -7310.330000, 0.552111, 0.004438, 0.013636 ], [90, -7310.610000, 0.416978, 0.019300, 0.015954 ], [97, -7313.210000, 0.030911, 0.019052, 0.015130 ] ], "n": ["FDJVGXF01COCCL" ] }, {"p": [[98, -6851.070000, 0.928888, 0.015176, 0.024296 ], [99, -6853.920000, 0.053971, 0.026970, 0.034854 ], [101, -6855.750000, 0.008581, 0.003975, 0.037003 ], [100, -6855.760000, 0.008561, 0.040628, 0.037107 ] ], "n": ["FDJVGXF01BEMTE" ] }, {"p": [[98, -8256.620000, 0.981437, 0.013147, 0.029377 ], [91, -8260.590000, 0.018563, 0.000010, 0.040407 ] ], "n": ["FDJVGXF01BLNDV" ] }, {"p": [[98, -8037.810000, 0.483180, 0.010748, 0.068080 ], [101, -8039.060000, 0.138712, 0.004768, 0.075958 ], [91, -8039.230000, 0.117186, 0.000367, 0.076499 ], [99, -8039.510000, 0.088153, 0.047715, 0.080405 ], [100, -8039.510000, 0.088107, 0.040628, 0.080410 ], [95, -8040.230000, 0.043004, 0.007119, 0.072969 ], [97, -8040.260000, 0.041658, 0.002846, 0.073160 ] ], "n": ["FDJVGXF01BLA1W_rvcmp" ] }, {"p": [[98, -8037.810000, 0.483180, 0.010748, 0.068080 ], [101, -8039.060000, 0.138712, 0.004768, 0.075958 ], [91, -8039.230000, 0.117186, 0.000367, 0.076499 ], [99, -8039.510000, 0.088153, 0.047715, 0.080405 ], [100, -8039.510000, 0.088107, 0.040628, 0.080410 ], [95, -8040.230000, 0.043004, 0.007119, 0.072969 ], [97, -8040.260000, 0.041658, 0.002846, 0.073160 ] ], "n": ["FDJVGXF01CXNXZ_rvcmp" ] }, {"p": [[98, -8129.970000, 0.975763, 0.010743, 0.035591 ], [96, -8134.310000, 0.012753, 0.021709, 0.038102 ], [97, -8134.420000, 0.011485, 0.013182, 0.039923 ] ], "n": ["FDJVGXF01DK0CF_rvcmp" ] }, {"p": [[98, -8129.970000, 0.975763, 0.010743, 0.035591 ], [96, -8134.310000, 0.012753, 0.021709, 0.038102 ], [97, -8134.420000, 0.011485, 0.013182, 0.039923 ] ], "n": ["FDJVGXF01D4J8L_rvcmp" ] }, {"p": [[98, -8113.060000, 0.975528, 0.010740, 0.036212 ], [96, -8117.390000, 0.012841, 0.021706, 0.038782 ], [97, -8117.490000, 0.011631, 0.013213, 0.040634 ] ], "n": ["FDJVGXF01D4DWZ_rvcmp" ] }, {"p": [[98, -7986.790000, 0.764732, 0.016719, 0.058849 ], [101, -7989.070000, 0.078481, 0.000005, 0.073333 ], [99, -7989.070000, 0.078439, 0.047715, 0.073334 ], [100, -7989.070000, 0.078348, 0.040628, 0.073337 ] ], "n": ["FDJVGXF01BG5L2_rvcmp" ] }, {"p": [[98, -7713.010000, 0.532546, 0.010055, 0.055415 ], [96, -7714.250000, 0.153885, 0.023774, 0.052968 ], [95, -7714.400000, 0.132600, 0.006710, 0.054358 ], [97, -7714.540000, 0.114871, 0.000005, 0.055683 ], [91, -7715.260000, 0.055967, 0.008268, 0.059538 ], [90, -7716.970000, 0.010130, 0.034866, 0.060120 ] ], "n": ["FDJVGXF01A6VRG" ] }, {"p": [[98, -7415.430000, 0.287386, 0.026731, 0.060709 ], [101, -7415.580000, 0.246916, 0.009940, 0.065004 ], [99, -7416.040000, 0.155747, 0.047715, 0.066873 ], [100, -7416.050000, 0.155583, 0.040628, 0.066874 ], [102, -7416.050000, 0.154369, 0.000005, 0.066932 ] ], "n": ["FDJVGXF01A9CN5_rvcmp" ] }, {"p": [[98, -7305.260000, 0.909458, 0.010308, 0.039954 ], [95, -7308.980000, 0.022059, 0.006472, 0.043999 ], [96, -7309.100000, 0.019402, 0.026069, 0.043982 ], [97, -7309.110000, 0.019275, 0.006137, 0.044288 ], [91, -7309.360000, 0.015043, 0.003834, 0.049662 ], [90, -7309.380000, 0.014764, 0.032931, 0.043551 ] ], "n": ["FDJVGXF01C8RIL_rvcmp" ] }, {"p": [[98, -5457.430000, 0.794994, 0.016481, 0.042794 ], [101, -5460.170000, 0.051327, 0.018813, 0.057717 ], [102, -5460.170000, 0.051306, 0.000005, 0.057710 ], [99, -5460.470000, 0.038252, 0.033057, 0.053265 ], [107, -5460.570000, 0.034566, 0.008820, 0.056280 ], [106, -5461.010000, 0.022159, 0.004361, 0.057596 ], [111, -5462.110000, 0.007396, 0.000007, 0.067823 ] ], "n": ["FDJVGXF01DGPDX_rvcmp" ] }, {"p": [[98, -5572.670000, 0.926148, 0.009797, 0.039998 ], [116, -5575.970000, 0.034019, 0.004166, 0.049851 ], [115, -5576.350000, 0.023200, 0.020395, 0.053567 ], [97, -5576.690000, 0.016633, 0.021481, 0.045176 ] ], "n": ["FDJVGXF01DZTOW_rvcmp" ] }, {"p": [[99, -8295.650000, 0.766979, 0.037756, 0.025098 ], [101, -8297.380000, 0.136462, 0.004531, 0.029294 ], [100, -8297.730000, 0.096560, 0.038517, 0.030743 ] ], "n": ["FDJVGXF01DOZP0_rvcmp" ] }, {"p": [[99, -7850.950000, 0.356968, 0.000006, 0.072210 ], [98, -7851.010000, 0.336633, 0.008039, 0.055350 ], [96, -7851.370000, 0.233977, 0.016912, 0.048694 ], [97, -7853.240000, 0.036233, 0.000005, 0.054018 ], [95, -7853.240000, 0.036189, 0.008662, 0.054025 ] ], "n": ["FDJVGXF01CH8LC" ] }, {"p": [[99, -7734.930000, 0.477771, 0.035422, 0.045134 ], [100, -7735.410000, 0.295308, 0.037856, 0.044215 ], [101, -7735.680000, 0.226921, 0.003618, 0.043543 ] ], "n": ["FDJVGXF01DCCT9_rvcmp" ] }, {"p": [[99, -8401.450000, 0.502724, 0.038108, 0.027041 ], [100, -8401.670000, 0.405831, 0.036342, 0.027534 ], [101, -8403.160000, 0.091446, 0.000947, 0.029564 ] ], "n": ["FDJVGXF01ADQBO_rvcmp" ] }, {"p": [[99, -8925.760000, 0.786011, 0.035736, 0.032897 ], [100, -8927.370000, 0.156484, 0.036700, 0.038702 ], [101, -8928.380000, 0.057506, 0.002473, 0.039503 ] ], "n": ["FDJVGXF01C6K5T" ] }, {"p": [[99, -7577.130000, 0.335096, 0.046718, 0.043163 ], [100, -7577.140000, 0.332461, 0.040628, 0.043301 ], [101, -7577.140000, 0.332442, 0.000009, 0.043299 ] ], "n": ["FDJVGXF01CNATM_rvcmp" ] }, {"p": [[99, -8205.290000, 0.816739, 0.034938, 0.040531 ], [100, -8207.370000, 0.101449, 0.037959, 0.047119 ], [101, -8207.590000, 0.081812, 0.001662, 0.047310 ] ], "n": ["FDJVGXF01D8OH4" ] }, {"p": [[99, -7479.330000, 0.692567, 0.027296, 0.107768 ], [98, -7480.800000, 0.158012, 0.017151, 0.118360 ], [100, -7481.250000, 0.100908, 0.030912, 0.117834 ], [101, -7481.990000, 0.048513, 0.003228, 0.124599 ] ], "n": ["FDJVGXF01BW7BG" ] }, {"p": [[99, -7907.590000, 0.809185, 0.034962, 0.042337 ], [100, -7909.620000, 0.105566, 0.037962, 0.049213 ], [101, -7909.840000, 0.085250, 0.001595, 0.049467 ] ], "n": ["FDJVGXF01DJFWS_rvcmp" ] }, {"p": [[99, -7449.140000, 0.576704, 0.029292, 0.158120 ], [100, -7450.200000, 0.200837, 0.030836, 0.163007 ], [101, -7450.810000, 0.108383, 0.000009, 0.172028 ], [98, -7451.040000, 0.086836, 0.017357, 0.166713 ], [94, -7453.130000, 0.010738, 0.012681, 0.158291 ], [93, -7453.220000, 0.009761, 0.000010, 0.167494 ], [88, -7453.590000, 0.006741, 0.035470, 0.177038 ] ], "n": ["FDJVGXF01DGA00_rvcmp" ] }, {"p": [[99, -6475.180000, 0.869666, 0.034852, 0.024661 ], [100, -6477.640000, 0.074250, 0.037446, 0.032531 ], [101, -6477.930000, 0.056084, 0.002065, 0.032135 ] ], "n": ["FDJVGXF01AW1AC" ] }, {"p": [[99, -6475.180000, 0.869666, 0.034852, 0.024661 ], [100, -6477.640000, 0.074250, 0.037446, 0.032531 ], [101, -6477.930000, 0.056084, 0.002065, 0.032135 ] ], "n": ["FDJVGXF01AWUYU" ] }, {"p": [[99, -6817.930000, 1.000000, 0.028675, 0.061645 ] ], "n": ["FDJVGXF01C55EU_rvcmp" ] }, {"p": [[99, -6960.640000, 1.000000, 0.013256, 0.075130 ] ], "n": ["FDJVGXF01ATCR1" ] }, {"p": [[99, -5134.700000, 0.333457, 0.047715, 0.117445 ], [101, -5134.700000, 0.333392, 0.000009, 0.117432 ], [100, -5134.700000, 0.333151, 0.040628, 0.117443 ] ], "n": ["FDJVGXF01EE1C0" ] }, {"p": [[99, -5134.700000, 0.333457, 0.047715, 0.117445 ], [101, -5134.700000, 0.333392, 0.000009, 0.117432 ], [100, -5134.700000, 0.333151, 0.040628, 0.117443 ] ], "n": ["FDJVGXF01DMENF" ] }, {"p": [[100, -7873.340000, 0.401226, 0.035142, 0.053974 ], [101, -7873.640000, 0.299453, 0.000009, 0.056924 ], [99, -7873.640000, 0.299321, 0.047715, 0.056919 ] ], "n": ["FDJVGXF01CTU6F" ] }, {"p": [[100, -8353.190000, 0.317740, 0.033186, 0.176914 ], [99, -8353.470000, 0.238844, 0.042975, 0.179036 ], [101, -8353.540000, 0.222732, 0.000009, 0.182839 ], [104, -8354.650000, 0.073579, 0.002651, 0.179816 ], [105, -8354.650000, 0.073579, 0.002614, 0.179816 ], [106, -8354.650000, 0.073525, 0.000008, 0.179802 ] ], "n": ["FDJVGXF01BHQGA" ] }, {"p": [[100, -3415.710000, 0.430176, 0.029911, 0.045156 ], [99, -3416.130000, 0.284979, 0.047715, 0.051596 ], [101, -3416.130000, 0.284845, 0.000009, 0.051596 ] ], "n": ["FDJVGXF01A8NFC_rvcmp" ] }, {"p": [[100, -3460.800000, 0.333409, 0.040633, 0.133589 ], [99, -3460.800000, 0.333337, 0.047715, 0.133600 ], [101, -3460.800000, 0.333254, 0.000009, 0.133576 ] ], "n": ["FDJVGXF01B5B3E" ] }, {"p": [[100, -3470.380000, 0.333398, 0.040628, 0.069134 ], [101, -3470.380000, 0.333358, 0.000009, 0.069136 ], [99, -3470.380000, 0.333244, 0.047715, 0.069139 ] ], "n": ["FDJVGXF01BMHW5_rvcmp" ] }, {"p": [[100, -2591.760000, 0.549550, 0.028277, 0.013756 ], [99, -2592.650000, 0.225276, 0.047715, 0.020423 ], [101, -2592.650000, 0.225174, 0.000009, 0.020422 ] ], "n": ["FDJVGXF01D39J6_rvcmp" ] }, {"p": [[101, -7726.680000, 0.783055, 0.005842, 0.048733 ], [99, -7728.650000, 0.108480, 0.047715, 0.052038 ], [100, -7728.650000, 0.108465, 0.040628, 0.052034 ] ], "n": ["FDJVGXF01EXJTF_rvcmp" ] }, {"p": [[101, -7311.370000, 0.335414, 0.000654, 0.101429 ], [100, -7311.380000, 0.332359, 0.040542, 0.102192 ], [99, -7311.380000, 0.332227, 0.047715, 0.102260 ] ], "n": ["FDJVGXF01C9KOS" ] }, {"p": [[101, -7246.420000, 0.343654, 0.001573, 0.095897 ], [99, -7246.460000, 0.328257, 0.047715, 0.097423 ], [100, -7246.460000, 0.328089, 0.040628, 0.097412 ] ], "n": ["FDJVGXF01ENOD3" ] }, {"p": [[101, -7136.700000, 0.334893, 0.000555, 0.086486 ], [99, -7136.700000, 0.333024, 0.046998, 0.087070 ], [100, -7136.700000, 0.332084, 0.040628, 0.087112 ] ], "n": ["FDJVGXF01A0JQI" ] }, {"p": [[101, -8573.730000, 0.404302, 0.003058, 0.102933 ], [100, -8574.030000, 0.298490, 0.040038, 0.106855 ], [99, -8574.040000, 0.297208, 0.047715, 0.107441 ] ], "n": ["FDJVGXF01BJU15" ] }, {"p": [[101, -7175.140000, 0.336424, 0.000807, 0.096768 ], [100, -7175.150000, 0.331997, 0.040277, 0.097545 ], [99, -7175.160000, 0.331579, 0.047715, 0.097811 ] ], "n": ["FDJVGXF01BN8R7" ] }, {"p": [[101, -8270.160000, 0.402417, 0.002678, 0.079404 ], [100, -8270.460000, 0.298911, 0.040628, 0.082534 ], [99, -8270.460000, 0.298672, 0.047715, 0.082548 ] ], "n": ["FDJVGXF01BMACA" ] }, {"p": [[101, -7175.140000, 0.336424, 0.000807, 0.096768 ], [100, -7175.150000, 0.331997, 0.040277, 0.097545 ], [99, -7175.160000, 0.331579, 0.047715, 0.097811 ] ], "n": ["FDJVGXF01BTWF0" ] }, {"p": [[101, -8748.940000, 0.439425, 0.003706, 0.094270 ], [99, -8749.390000, 0.280365, 0.047715, 0.099951 ], [100, -8749.390000, 0.280210, 0.040628, 0.099956 ] ], "n": ["FDJVGXF01BNHRU_rvcmp" ] }, {"p": [[101, -7196.810000, 0.333723, 0.000277, 0.111901 ], [100, -7196.810000, 0.333156, 0.040628, 0.112261 ], [99, -7196.810000, 0.333121, 0.047715, 0.112268 ] ], "n": ["FDJVGXF01A1OR6_rvcmp" ] }, {"p": [[101, -7752.630000, 0.402234, 0.002679, 0.079450 ], [100, -7752.930000, 0.299001, 0.040628, 0.082796 ], [99, -7752.930000, 0.298764, 0.047715, 0.082805 ] ], "n": ["FDJVGXF01DVROI_rvcmp" ] }, {"p": [[107, -7662.070000, 0.923548, 0.006196, 0.018721 ], [103, -7665.630000, 0.026357, 0.007523, 0.024783 ], [106, -7665.630000, 0.026357, 0.007986, 0.024783 ], [104, -7665.730000, 0.023738, 0.000005, 0.025393 ] ], "n": ["FDJVGXF01ENS3X" ] }, {"p": [[107, -7662.070000, 0.923548, 0.006196, 0.018721 ], [103, -7665.630000, 0.026357, 0.007523, 0.024783 ], [106, -7665.630000, 0.026357, 0.007986, 0.024783 ], [104, -7665.730000, 0.023738, 0.000005, 0.025393 ] ], "n": ["FDJVGXF01EVR7E" ] }, {"p": [[107, -7666.300000, 0.339984, 0.013106, 0.023752 ], [98, -7666.900000, 0.186902, 0.031155, 0.021802 ], [102, -7666.940000, 0.178340, 0.005627, 0.021885 ], [101, -7667.470000, 0.105591, 0.018811, 0.023346 ], [91, -7667.470000, 0.105427, 0.000155, 0.027085 ], [111, -7668.210000, 0.050231, 0.000007, 0.026199 ], [100, -7668.610000, 0.033526, 0.040628, 0.026867 ] ], "n": ["FDJVGXF01DJB6P_rvcmp" ] }, {"p": [[107, -8053.210000, 0.561968, 0.013067, 0.033004 ], [102, -8054.680000, 0.129037, 0.008897, 0.032193 ], [110, -8054.940000, 0.099976, 0.007316, 0.035618 ], [111, -8054.970000, 0.096883, 0.000007, 0.035736 ], [112, -8055.260000, 0.072071, 0.000008, 0.035783 ], [114, -8055.850000, 0.040064, 0.000006, 0.036941 ] ], "n": ["FDJVGXF01BE4X9" ] }, {"p": [[107, -8015.140000, 0.561626, 0.013059, 0.033133 ], [102, -8016.610000, 0.128877, 0.008900, 0.032330 ], [110, -8016.870000, 0.100116, 0.007317, 0.035763 ], [111, -8016.900000, 0.097028, 0.000007, 0.035881 ], [112, -8017.190000, 0.072181, 0.000008, 0.035930 ], [114, -8017.780000, 0.040172, 0.000006, 0.037100 ] ], "n": ["FDJVGXF01BTEPV" ] }, {"p": [[107, -7979.530000, 0.529791, 0.013015, 0.044003 ], [102, -7981.030000, 0.117777, 0.009128, 0.043840 ], [110, -7981.100000, 0.109741, 0.007352, 0.047090 ], [111, -7981.120000, 0.107016, 0.000007, 0.047231 ], [112, -7981.420000, 0.079668, 0.000008, 0.047399 ], [114, -7981.940000, 0.047293, 0.000006, 0.048560 ], [100, -7983.630000, 0.008714, 0.027596, 0.045589 ] ], "n": ["FDJVGXF01CVK05" ] }, {"p": [[108, -6986.020000, 0.144091, 0.000001, 1.487940 ], [109, -6986.020000, 0.144091, 0.002625, 1.487950 ], [110, -6986.020000, 0.144090, 0.000008, 1.487940 ], [111, -6986.020000, 0.143993, 0.003796, 1.482470 ], [102, -6986.020000, 0.143985, 0.011080, 1.482460 ], [107, -6986.030000, 0.142921, 0.017331, 1.486640 ], [103, -6986.070000, 0.136827, 0.000007, 1.509300 ] ], "n": ["FDJVGXF01DQ4QQ" ] }, {"p": [[114, -7013.340000, 0.265268, 0.003600, 0.773263 ], [113, -7013.510000, 0.224139, 0.180105, 0.773938 ], [112, -7013.520000, 0.220693, 0.015823, 0.782841 ], [103, -7014.160000, 0.116650, 0.000007, 0.727390 ], [106, -7014.840000, 0.059205, 0.007986, 0.789788 ], [105, -7014.850000, 0.058540, 0.002614, 0.791176 ], [72, -7014.900000, 0.055506, 0.199553, 0.828865 ] ], "n": ["FDJVGXF01E0ZLL" ] }, {"p": [[114, -6624.070000, 0.303042, 0.003346, 1.070590 ], [113, -6624.070000, 0.302732, 0.128195, 1.047670 ], [112, -6624.200000, 0.265406, 0.015823, 1.084740 ], [73, -6626.060000, 0.041225, 0.041274, 1.183910 ], [71, -6626.320000, 0.031788, 0.073878, 1.239120 ], [72, -6626.320000, 0.031713, 0.263281, 1.236990 ], [70, -6626.600000, 0.024095, 0.549790, 1.298720 ] ], "n": ["FDJVGXF01DCDRY" ] }, {"p": [[116, -7058.890000, 0.241249, 0.023150, 0.872170 ], [117, -7058.890000, 0.241180, 0.000006, 0.872196 ], [115, -7059.190000, 0.178494, 0.033069, 0.854725 ], [114, -7059.190000, 0.178463, 0.011821, 0.854733 ], [113, -7060.040000, 0.075749, 0.120561, 0.817583 ], [112, -7060.320000, 0.057414, 0.015823, 0.857944 ], [103, -7061.060000, 0.027451, 0.000007, 0.797855 ] ], "n": ["FDJVGXF01DSMLK" ] }, {"p": [[118, -3952.440000, 0.754659, 0.025388, 0.153619 ], [83, -3954.250000, 0.123939, 0.075511, 0.171413 ], [119, -3954.270000, 0.121402, 0.000009, 0.174132 ] ], "n": ["FDJVGXF01BHVQB_rvcmp" ] }, {"p": [[127, -7205.960000, 0.683272, 0.021436, 0.026696 ], [149, -7207.150000, 0.208535, 0.004237, 0.030194 ], [125, -7207.800000, 0.108193, 0.055019, 0.032376 ] ], "n": ["FDJVGXF01EDQRP_rvcmp" ] }, {"p": [[127, -7779.010000, 0.527838, 0.033938, 0.091159 ], [149, -7779.120000, 0.472162, 0.000008, 0.093477 ] ], "n": ["FDJVGXF01BMGRR_rvcmp" ] }, {"p": [[127, -3351.200000, 0.301469, 0.033073, 0.032593 ], [149, -3351.260000, 0.284458, 0.000008, 0.033805 ], [126, -3351.850000, 0.156698, 0.083114, 0.035490 ], [29, -3352.310000, 0.099656, 0.026610, 0.057379 ], [196, -3352.870000, 0.056406, 0.032853, 0.042738 ], [31, -3352.980000, 0.050733, 0.000008, 0.074705 ], [32, -3352.980000, 0.050579, 0.000007, 0.074701 ] ], "n": ["FDJVGXF01EF0UY" ] }, {"p": [[128, -7515.000000, 0.351482, 0.000007, 0.000006 ], [130, -7515.070000, 0.325020, 0.000005, 0.000006 ], [129, -7515.080000, 0.323498, 0.004824, 0.000006 ] ], "n": ["FDJVGXF01C8LKU_rvcmp" ] }, {"p": [[128, -7672.660000, 0.969422, 0.000007, 0.000006 ], [130, -7676.810000, 0.015308, 0.000005, 0.000006 ], [129, -7676.810000, 0.015270, 0.004824, 0.000006 ] ], "n": ["FDJVGXF01EL3RG" ] }, {"p": [[128, -6066.250000, 0.919074, 0.000007, 0.005351 ], [130, -6069.380000, 0.040471, 0.000005, 0.006452 ], [129, -6069.380000, 0.040455, 0.004824, 0.006454 ] ], "n": ["FDJVGXF01CLDZW_rvcmp" ] }, {"p": [[128, -6538.650000, 0.145734, 0.000007, 1.999990 ], [130, -6538.650000, 0.145710, 0.000005, 1.999990 ], [129, -6538.650000, 0.145707, 0.004824, 1.999990 ], [140, -6538.660000, 0.145339, 0.000006, 1.999990 ], [2, -6538.660000, 0.144116, 0.036220, 1.999990 ], [147, -6538.720000, 0.136698, 0.065313, 1.999990 ], [148, -6538.720000, 0.136696, 0.000009, 1.999990 ] ], "n": ["FDJVGXF01E417W" ] }, {"p": [[130, -7375.020000, 0.475927, 0.005093, 0.008358 ], [140, -7375.830000, 0.212971, 0.000006, 0.008607 ], [139, -7375.830000, 0.212795, 0.010556, 0.008608 ], [128, -7377.290000, 0.049298, 0.003643, 0.011932 ], [129, -7377.290000, 0.049010, 0.004824, 0.011933 ] ], "n": ["FDJVGXF01ECZV4" ] }, {"p": [[130, -7528.290000, 0.666633, 0.005110, 0.003992 ], [139, -7529.120000, 0.289798, 0.010556, 0.004124 ], [128, -7531.020000, 0.043569, 0.003643, 0.007219 ] ], "n": ["FDJVGXF01BDJTA" ] }, {"p": [[130, -7310.840000, 0.312938, 0.000010, 0.004331 ], [128, -7310.840000, 0.312766, 0.003643, 0.004325 ], [129, -7310.840000, 0.312140, 0.004824, 0.004331 ], [140, -7313.150000, 0.031082, 0.000006, 0.004453 ], [139, -7313.150000, 0.031075, 0.010556, 0.004454 ] ], "n": ["FDJVGXF01CXZHA_rvcmp" ] }, {"p": [[130, -7367.820000, 0.157818, 0.010632, 1.999990 ], [140, -7367.820000, 0.157818, 0.000006, 1.999990 ], [139, -7367.820000, 0.157797, 0.010556, 1.999990 ], [148, -7367.870000, 0.149674, 0.000009, 1.999990 ], [147, -7367.870000, 0.149673, 0.065313, 1.999990 ], [131, -7368.140000, 0.113612, 0.000001, 1.999990 ], [138, -7368.140000, 0.113609, 0.001320, 1.999990 ] ], "n": ["FDJVGXF01DL2MT_rvcmp" ] }, {"p": [[131, -7215.640000, 0.262641, 0.000001, 0.013227 ], [139, -7215.640000, 0.262331, 0.000005, 0.013218 ], [138, -7215.650000, 0.261556, 0.001320, 0.013218 ], [132, -7216.110000, 0.164009, 0.008607, 0.010233 ], [130, -7218.000000, 0.024733, 0.010632, 0.013131 ], [140, -7218.000000, 0.024729, 0.000006, 0.013130 ] ], "n": ["FDJVGXF01BRHTY_rvcmp" ] }, {"p": [[131, -5919.040000, 0.152183, 0.000001, 0.005211 ], [138, -5919.050000, 0.152095, 0.001317, 0.005211 ], [139, -5919.050000, 0.152075, 0.000009, 0.005210 ], [137, -5919.140000, 0.137822, 0.004966, 0.005215 ], [132, -5919.150000, 0.137590, 0.010862, 0.005215 ], [136, -5919.170000, 0.134217, 0.003788, 0.005216 ], [135, -5919.170000, 0.134017, 0.005909, 0.005216 ] ], "n": ["FDJVGXF01BPT51" ] }, {"p": [[131, -5902.580000, 0.143914, 0.000001, 0.005533 ], [138, -5902.580000, 0.143912, 0.001320, 0.005533 ], [137, -5902.580000, 0.143760, 0.004966, 0.005533 ], [132, -5902.580000, 0.143698, 0.010863, 0.005533 ], [139, -5902.580000, 0.143693, 0.000009, 0.005533 ], [135, -5902.600000, 0.140551, 0.005910, 0.005534 ], [136, -5902.600000, 0.140473, 0.003789, 0.005535 ] ], "n": ["FDJVGXF01D3855_rvcmp" ] }, {"p": [[131, -5902.580000, 0.143914, 0.000001, 0.005533 ], [138, -5902.580000, 0.143912, 0.001320, 0.005533 ], [137, -5902.580000, 0.143760, 0.004966, 0.005533 ], [132, -5902.580000, 0.143698, 0.010863, 0.005533 ], [139, -5902.580000, 0.143693, 0.000009, 0.005533 ], [135, -5902.600000, 0.140551, 0.005910, 0.005534 ], [136, -5902.600000, 0.140473, 0.003789, 0.005535 ] ], "n": ["FDJVGXF01BZHST_rvcmp" ] }, {"p": [[131, -5902.580000, 0.143914, 0.000001, 0.005533 ], [138, -5902.580000, 0.143912, 0.001320, 0.005533 ], [137, -5902.580000, 0.143760, 0.004966, 0.005533 ], [132, -5902.580000, 0.143698, 0.010863, 0.005533 ], [139, -5902.580000, 0.143693, 0.000009, 0.005533 ], [135, -5902.600000, 0.140551, 0.005910, 0.005534 ], [136, -5902.600000, 0.140473, 0.003789, 0.005535 ] ], "n": ["FDJVGXF01E193F_rvcmp" ] }, {"p": [[131, -5902.580000, 0.143914, 0.000001, 0.005533 ], [138, -5902.580000, 0.143912, 0.001320, 0.005533 ], [137, -5902.580000, 0.143760, 0.004966, 0.005533 ], [132, -5902.580000, 0.143698, 0.010863, 0.005533 ], [139, -5902.580000, 0.143693, 0.000009, 0.005533 ], [135, -5902.600000, 0.140551, 0.005910, 0.005534 ], [136, -5902.600000, 0.140473, 0.003789, 0.005535 ] ], "n": ["FDJVGXF01CVSFI_rvcmp" ] }, {"p": [[131, -5902.580000, 0.143914, 0.000001, 0.005533 ], [138, -5902.580000, 0.143912, 0.001320, 0.005533 ], [137, -5902.580000, 0.143760, 0.004966, 0.005533 ], [132, -5902.580000, 0.143698, 0.010863, 0.005533 ], [139, -5902.580000, 0.143693, 0.000009, 0.005533 ], [135, -5902.600000, 0.140551, 0.005910, 0.005534 ], [136, -5902.600000, 0.140473, 0.003789, 0.005535 ] ], "n": ["FDJVGXF01CQZLD_rvcmp" ] }, {"p": [[131, -5902.580000, 0.143914, 0.000001, 0.005533 ], [138, -5902.580000, 0.143912, 0.001320, 0.005533 ], [137, -5902.580000, 0.143760, 0.004966, 0.005533 ], [132, -5902.580000, 0.143698, 0.010863, 0.005533 ], [139, -5902.580000, 0.143693, 0.000009, 0.005533 ], [135, -5902.600000, 0.140551, 0.005910, 0.005534 ], [136, -5902.600000, 0.140473, 0.003789, 0.005535 ] ], "n": ["FDJVGXF01A5U3U_rvcmp" ] }, {"p": [[131, -5902.580000, 0.143914, 0.000001, 0.005533 ], [138, -5902.580000, 0.143912, 0.001320, 0.005533 ], [137, -5902.580000, 0.143760, 0.004966, 0.005533 ], [132, -5902.580000, 0.143698, 0.010863, 0.005533 ], [139, -5902.580000, 0.143693, 0.000009, 0.005533 ], [135, -5902.600000, 0.140551, 0.005910, 0.005534 ], [136, -5902.600000, 0.140473, 0.003789, 0.005535 ] ], "n": ["FDJVGXF01CXMMU_rvcmp" ] }, {"p": [[131, -5733.610000, 0.143915, 0.000001, 0.005704 ], [138, -5733.610000, 0.143912, 0.001320, 0.005704 ], [139, -5733.620000, 0.143788, 0.000005, 0.005704 ], [137, -5733.620000, 0.143756, 0.004966, 0.005704 ], [132, -5733.620000, 0.143672, 0.010862, 0.005704 ], [135, -5733.640000, 0.140547, 0.005910, 0.005706 ], [136, -5733.640000, 0.140410, 0.003788, 0.005706 ] ], "n": ["FDJVGXF01DPLLJ_rvcmp" ] }, {"p": [[131, -5135.980000, 0.143907, 0.000001, 0.006357 ], [138, -5135.980000, 0.143904, 0.001320, 0.006357 ], [137, -5135.980000, 0.143750, 0.004966, 0.006357 ], [139, -5135.980000, 0.143734, 0.000009, 0.006357 ], [132, -5135.980000, 0.143689, 0.010863, 0.006357 ], [135, -5136.010000, 0.140547, 0.005910, 0.006359 ], [136, -5136.010000, 0.140469, 0.003789, 0.006359 ] ], "n": ["FDJVGXF01DX3O4" ] }, {"p": [[131, -5137.250000, 0.143907, 0.000001, 0.006348 ], [138, -5137.250000, 0.143905, 0.001320, 0.006348 ], [139, -5137.250000, 0.143810, 0.000005, 0.006348 ], [137, -5137.250000, 0.143747, 0.004966, 0.006348 ], [132, -5137.250000, 0.143683, 0.010863, 0.006348 ], [135, -5137.280000, 0.140542, 0.005910, 0.006350 ], [136, -5137.280000, 0.140406, 0.003788, 0.006350 ] ], "n": ["FDJVGXF01BKQDZ" ] }, {"p": [[131, -5420.840000, 0.144016, 0.000001, 0.025524 ], [138, -5420.840000, 0.144014, 0.001320, 0.025524 ], [139, -5420.850000, 0.143632, 0.000009, 0.025524 ], [137, -5420.850000, 0.143510, 0.004966, 0.025525 ], [132, -5420.850000, 0.143320, 0.010863, 0.025526 ], [135, -5420.870000, 0.140790, 0.005910, 0.025533 ], [136, -5420.870000, 0.140718, 0.003789, 0.025533 ] ], "n": ["FDJVGXF01AIGJT" ] }, {"p": [[131, -5023.500000, 0.194397, 0.000001, 0.000005 ], [138, -5023.500000, 0.194387, 0.001319, 0.000005 ], [132, -5023.500000, 0.194365, 0.000005, 0.000006 ], [139, -5023.500000, 0.194257, 0.000006, 0.000005 ], [137, -5023.520000, 0.190556, 0.004966, 0.000005 ], [140, -5025.990000, 0.016022, 0.000006, 0.000006 ], [130, -5026.000000, 0.016015, 0.010632, 0.000006 ] ], "n": ["FDJVGXF01D6I11" ] }, {"p": [[131, -5023.500000, 0.194397, 0.000001, 0.000005 ], [138, -5023.500000, 0.194387, 0.001319, 0.000005 ], [132, -5023.500000, 0.194365, 0.000005, 0.000006 ], [139, -5023.500000, 0.194257, 0.000006, 0.000005 ], [137, -5023.520000, 0.190556, 0.004966, 0.000005 ], [140, -5025.990000, 0.016022, 0.000006, 0.000006 ], [130, -5026.000000, 0.016015, 0.010632, 0.000006 ] ], "n": ["FDJVGXF01DQG0M" ] }, {"p": [[131, -4343.850000, 0.149701, 0.000001, 0.000005 ], [138, -4343.850000, 0.149701, 0.001319, 0.000005 ], [137, -4343.850000, 0.149696, 0.004966, 0.000005 ], [139, -4343.850000, 0.149686, 0.000006, 0.000005 ], [132, -4343.850000, 0.149680, 0.000005, 0.000006 ], [130, -4344.030000, 0.125795, 0.010632, 0.000006 ], [140, -4344.030000, 0.125742, 0.000006, 0.000006 ] ], "n": ["FDJVGXF01CKX81" ] }, {"p": [[132, -7014.870000, 0.665444, 0.006377, 0.010918 ], [139, -7016.690000, 0.108621, 0.004004, 0.014688 ], [138, -7017.100000, 0.071550, 0.001021, 0.016736 ], [131, -7017.170000, 0.066777, 0.000001, 0.017978 ], [130, -7017.440000, 0.051018, 0.008840, 0.014089 ], [135, -7018.420000, 0.019213, 0.003201, 0.018300 ], [137, -7018.520000, 0.017377, 0.004966, 0.016505 ] ], "n": ["FDJVGXF01BAPJZ" ] }, {"p": [[132, -6977.680000, 0.955968, 0.007570, 0.000006 ], [138, -6981.170000, 0.029134, 0.000620, 0.004440 ], [137, -6982.450000, 0.008163, 0.004966, 0.004512 ], [131, -6982.640000, 0.006736, 0.000001, 0.008874 ] ], "n": ["FDJVGXF01BCIP2_rvcmp" ] }, {"p": [[132, -8290.540000, 0.937456, 0.000007, 0.003936 ], [139, -8294.070000, 0.027381, 0.005647, 0.003680 ], [130, -8294.550000, 0.016992, 0.008326, 0.003416 ], [138, -8295.550000, 0.006241, 0.000010, 0.007498 ], [137, -8295.560000, 0.006196, 0.004966, 0.007496 ], [131, -8295.630000, 0.005734, 0.000001, 0.007877 ] ], "n": ["FDJVGXF01EMKP2" ] }, {"p": [[132, -9045.610000, 0.647220, 0.008211, 0.003637 ], [137, -9047.760000, 0.074839, 0.004966, 0.006919 ], [138, -9047.760000, 0.074839, 0.000005, 0.006920 ], [131, -9047.820000, 0.070515, 0.000001, 0.007148 ], [135, -9047.880000, 0.066422, 0.005910, 0.007149 ], [136, -9047.890000, 0.066165, 0.003788, 0.007150 ] ], "n": ["FDJVGXF01A8ZUE" ] }, {"p": [[132, -7396.450000, 0.442109, 0.006866, 0.005039 ], [135, -7396.930000, 0.274154, 0.002119, 0.008360 ], [138, -7397.530000, 0.150308, 0.000428, 0.005424 ], [137, -7398.440000, 0.060565, 0.004966, 0.005636 ], [134, -7399.190000, 0.028774, 0.000001, 0.012451 ], [139, -7399.250000, 0.026978, 0.002614, 0.009089 ], [131, -7399.710000, 0.017111, 0.000001, 0.012338 ] ], "n": ["FDJVGXF01B0F8P_rvcmp" ] }, {"p": [[132, -8083.600000, 0.925088, 0.007266, 0.000006 ], [137, -8087.590000, 0.017024, 0.004966, 0.003192 ], [138, -8087.590000, 0.017018, 0.000005, 0.003186 ], [131, -8087.790000, 0.013994, 0.000001, 0.003984 ], [135, -8087.830000, 0.013458, 0.005910, 0.003977 ], [136, -8087.830000, 0.013419, 0.003788, 0.003977 ] ], "n": ["FDJVGXF01BOZD6_rvcmp" ] }, {"p": [[132, -7151.250000, 0.919704, 0.005418, 0.004600 ], [138, -7154.740000, 0.028049, 0.000007, 0.008783 ], [131, -7154.810000, 0.026132, 0.000001, 0.009165 ], [139, -7154.810000, 0.026115, 0.000006, 0.009165 ] ], "n": ["FDJVGXF01BSJSQ_rvcmp" ] }, {"p": [[132, -7777.730000, 0.933986, 0.005437, 0.000006 ], [137, -7781.910000, 0.014321, 0.004966, 0.003638 ], [138, -7781.910000, 0.014319, 0.000005, 0.003632 ], [131, -7782.020000, 0.012806, 0.000001, 0.004103 ], [135, -7782.060000, 0.012302, 0.005910, 0.004100 ], [136, -7782.070000, 0.012266, 0.003788, 0.004100 ] ], "n": ["FDJVGXF01ANWZP_rvcmp" ] }, {"p": [[132, -7237.450000, 0.435326, 0.007381, 0.013640 ], [138, -7238.950000, 0.096709, 0.000005, 0.017737 ], [137, -7238.950000, 0.096707, 0.004966, 0.017737 ], [131, -7238.970000, 0.094587, 0.000001, 0.017859 ], [139, -7238.980000, 0.094394, 0.000005, 0.017859 ], [135, -7239.010000, 0.091269, 0.005910, 0.017864 ], [136, -7239.010000, 0.091010, 0.003788, 0.017864 ] ], "n": ["FDJVGXF01AO7VS_rvcmp" ] }, {"p": [[132, -6669.930000, 0.725590, 0.005458, 0.004846 ], [137, -6672.650000, 0.047777, 0.004966, 0.009456 ], [138, -6672.650000, 0.047777, 0.000005, 0.009457 ], [131, -6672.690000, 0.045658, 0.000001, 0.009688 ], [139, -6672.690000, 0.045601, 0.000005, 0.009694 ], [135, -6672.730000, 0.043862, 0.005910, 0.009690 ], [136, -6672.740000, 0.043735, 0.003788, 0.009691 ] ], "n": ["FDJVGXF01BYQBX_rvcmp" ] }, {"p": [[132, -5141.110000, 0.668522, 0.000005, 0.012804 ], [140, -5142.500000, 0.166838, 0.017164, 0.000006 ], [139, -5143.290000, 0.075854, 0.007324, 0.013431 ], [138, -5144.500000, 0.022567, 0.000005, 0.019272 ], [137, -5144.500000, 0.022567, 0.004966, 0.019272 ], [131, -5144.520000, 0.022089, 0.000001, 0.019421 ], [136, -5144.550000, 0.021564, 0.003788, 0.019429 ] ], "n": ["FDJVGXF01DRG7K" ] }, {"p": [[132, -4764.280000, 0.840060, 0.007262, 0.000006 ], [137, -4767.500000, 0.033580, 0.004966, 0.006191 ], [138, -4767.500000, 0.033569, 0.000010, 0.006194 ], [131, -4767.560000, 0.031419, 0.000001, 0.006665 ], [135, -4767.590000, 0.030697, 0.005908, 0.006663 ], [136, -4767.590000, 0.030674, 0.003788, 0.006663 ] ], "n": ["FDJVGXF01DJR9E" ] }, {"p": [[132, -4936.860000, 0.142950, 0.005435, 0.013257 ], [135, -4936.860000, 0.142864, 0.002961, 0.013290 ], [137, -4936.860000, 0.142853, 0.002486, 0.013294 ], [136, -4936.860000, 0.142843, 0.001902, 0.013299 ], [133, -4936.860000, 0.142833, 0.001201, 0.013302 ], [138, -4936.860000, 0.142829, 0.000645, 0.013304 ], [134, -4936.860000, 0.142827, 0.000001, 0.013305 ] ], "n": ["FDJVGXF01EOS1A_rvcmp" ] }, {"p": [[132, -4936.860000, 0.142950, 0.005435, 0.013257 ], [135, -4936.860000, 0.142864, 0.002961, 0.013290 ], [137, -4936.860000, 0.142853, 0.002486, 0.013294 ], [136, -4936.860000, 0.142843, 0.001902, 0.013299 ], [133, -4936.860000, 0.142833, 0.001201, 0.013302 ], [138, -4936.860000, 0.142829, 0.000645, 0.013304 ], [134, -4936.860000, 0.142827, 0.000001, 0.013305 ] ], "n": ["FDJVGXF01B3VIU_rvcmp" ] }, {"p": [[133, -7904.640000, 0.967795, 0.000009, 0.008199 ], [135, -7909.140000, 0.010738, 0.000006, 0.012420 ], [134, -7909.140000, 0.010735, 0.000001, 0.012426 ], [136, -7909.140000, 0.010732, 0.000007, 0.012423 ] ], "n": ["FDJVGXF01A3B1Y_rvcmp" ] }, {"p": [[133, -7621.030000, 0.806433, 0.000009, 0.016875 ], [135, -7622.850000, 0.131052, 0.002991, 0.017215 ], [136, -7624.590000, 0.022921, 0.003788, 0.020855 ], [137, -7624.600000, 0.022803, 0.000010, 0.020844 ], [134, -7624.910000, 0.016790, 0.000001, 0.021319 ] ], "n": ["FDJVGXF01B2CX4" ] }, {"p": [[133, -8258.370000, 0.201059, 0.001201, 0.007917 ], [134, -8258.370000, 0.201007, 0.000001, 0.007920 ], [135, -8258.370000, 0.201004, 0.000008, 0.007920 ], [136, -8258.370000, 0.201001, 0.000007, 0.007920 ], [137, -8258.400000, 0.195929, 0.000010, 0.007921 ] ], "n": ["FDJVGXF01E3CEA" ] }, {"p": [[133, -7690.830000, 0.347298, 0.000009, 0.021059 ], [136, -7691.270000, 0.224953, 0.000007, 0.021157 ], [135, -7691.340000, 0.209867, 0.005910, 0.021122 ], [137, -7691.340000, 0.209021, 0.000010, 0.021110 ], [134, -7694.500000, 0.008861, 0.000001, 0.025533 ] ], "n": ["FDJVGXF01B7EYW_rvcmp" ] }, {"p": [[133, -6664.220000, 0.353396, 0.000009, 0.009683 ], [136, -6664.670000, 0.226117, 0.000007, 0.009738 ], [135, -6664.750000, 0.208599, 0.005910, 0.009736 ], [137, -6664.760000, 0.207247, 0.000010, 0.009735 ], [134, -6668.560000, 0.004642, 0.000001, 0.014700 ] ], "n": ["FDJVGXF01EHE28_rvcmp" ] }, {"p": [[133, -6211.610000, 0.967791, 0.000009, 0.020053 ], [134, -6215.020000, 0.032209, 0.000001, 0.025203 ] ], "n": ["FDJVGXF01A9H7J" ] }, {"p": [[133, -7027.850000, 0.312249, 0.001185, 0.004537 ], [134, -7027.850000, 0.312211, 0.000001, 0.004540 ], [135, -7027.850000, 0.311902, 0.000006, 0.004540 ], [132, -7029.740000, 0.047172, 0.007297, 0.004624 ], [137, -7031.830000, 0.005795, 0.000010, 0.008068 ], [136, -7031.840000, 0.005771, 0.003788, 0.008069 ], [138, -7032.000000, 0.004901, 0.000005, 0.008915 ] ], "n": ["FDJVGXF01BP62Q_rvcmp" ] }, {"p": [[133, -6237.740000, 0.972919, 0.000009, 0.010256 ], [134, -6242.020000, 0.013547, 0.000001, 0.015576 ], [135, -6242.020000, 0.013534, 0.000008, 0.015575 ] ], "n": ["FDJVGXF01B9U2G" ] }, {"p": [[133, -7261.180000, 0.201025, 0.001210, 0.009050 ], [134, -7261.180000, 0.201016, 0.000001, 0.009052 ], [135, -7261.180000, 0.201013, 0.000006, 0.009052 ], [136, -7261.180000, 0.201009, 0.000007, 0.009052 ], [137, -7261.200000, 0.195937, 0.000010, 0.009053 ] ], "n": ["FDJVGXF01CXPZZ_rvcmp" ] }, {"p": [[134, -7873.070000, 0.325384, 0.000001, 0.008218 ], [135, -7873.070000, 0.324953, 0.000008, 0.008218 ], [133, -7873.070000, 0.324123, 0.002392, 0.008218 ], [136, -7875.610000, 0.025540, 0.003788, 0.009198 ] ], "n": ["FDJVGXF01CUFN8" ] }, {"p": [[134, -7260.760000, 0.201019, 0.000001, 0.009038 ], [133, -7260.760000, 0.201019, 0.000007, 0.009043 ], [135, -7260.760000, 0.201015, 0.000006, 0.009038 ], [136, -7260.760000, 0.201012, 0.000007, 0.009038 ], [137, -7260.780000, 0.195936, 0.000010, 0.009040 ] ], "n": ["FDJVGXF01EK9LF_rvcmp" ] }, {"p": [[134, -5777.390000, 0.250244, 0.000001, 0.011578 ], [135, -5777.390000, 0.250240, 0.000006, 0.011578 ], [136, -5777.390000, 0.250237, 0.000007, 0.011573 ], [133, -5777.400000, 0.249279, 0.002392, 0.011573 ] ], "n": ["FDJVGXF01BSBSB" ] }, {"p": [[134, -4661.580000, 0.333940, 0.000001, 0.000008 ], [135, -4661.580000, 0.333428, 0.000006, 0.000006 ], [133, -4661.590000, 0.332632, 0.002392, 0.000008 ] ], "n": ["FDJVGXF01CMIYW" ] }, {"p": [[134, -4661.580000, 0.333940, 0.000001, 0.000008 ], [135, -4661.580000, 0.333428, 0.000006, 0.000006 ], [133, -4661.590000, 0.332632, 0.002392, 0.000008 ] ], "n": ["FDJVGXF01ER03M" ] }, {"p": [[134, -6194.170000, 0.142879, 0.000001, 0.000006 ], [133, -6194.170000, 0.142879, 0.000009, 0.000006 ], [136, -6194.170000, 0.142878, 0.000007, 0.000006 ], [135, -6194.170000, 0.142878, 0.000006, 0.000006 ], [137, -6194.170000, 0.142873, 0.004966, 0.000006 ], [138, -6194.170000, 0.142813, 0.001320, 0.000009 ], [132, -6194.170000, 0.142800, 0.000005, 0.000009 ] ], "n": ["FDJVGXF01B2KWB_rvcmp" ] }, {"p": [[135, -7450.450000, 0.392870, 0.002040, 0.008612 ], [139, -7451.180000, 0.189836, 0.005812, 0.007434 ], [130, -7451.510000, 0.135679, 0.008241, 0.006318 ], [140, -7451.740000, 0.107816, 0.000006, 0.006577 ], [138, -7452.130000, 0.073215, 0.000934, 0.010978 ], [131, -7452.280000, 0.062966, 0.000001, 0.012722 ], [134, -7452.800000, 0.037617, 0.000001, 0.012753 ] ], "n": ["FDJVGXF01ETCRK" ] }, {"p": [[135, -7450.450000, 0.392870, 0.002040, 0.008612 ], [139, -7451.180000, 0.189836, 0.005812, 0.007434 ], [130, -7451.510000, 0.135679, 0.008241, 0.006318 ], [140, -7451.740000, 0.107816, 0.000006, 0.006577 ], [138, -7452.130000, 0.073215, 0.000934, 0.010978 ], [131, -7452.280000, 0.062966, 0.000001, 0.012722 ], [134, -7452.800000, 0.037617, 0.000001, 0.012753 ] ], "n": ["FDJVGXF01AXXCX" ] }, {"p": [[135, -7450.450000, 0.392870, 0.002040, 0.008612 ], [139, -7451.180000, 0.189836, 0.005812, 0.007434 ], [130, -7451.510000, 0.135679, 0.008241, 0.006318 ], [140, -7451.740000, 0.107816, 0.000006, 0.006577 ], [138, -7452.130000, 0.073215, 0.000934, 0.010978 ], [131, -7452.280000, 0.062966, 0.000001, 0.012722 ], [134, -7452.800000, 0.037617, 0.000001, 0.012753 ] ], "n": ["FDJVGXF01CQ9NP" ] }, {"p": [[135, -8615.520000, 0.544410, 0.002958, 0.007607 ], [132, -8616.330000, 0.241301, 0.008267, 0.007720 ], [137, -8617.850000, 0.053011, 0.000010, 0.010616 ], [138, -8617.970000, 0.047004, 0.000005, 0.011179 ], [131, -8618.010000, 0.045296, 0.000001, 0.011338 ], [133, -8618.280000, 0.034492, 0.001418, 0.011317 ], [134, -8618.280000, 0.034486, 0.000001, 0.011325 ] ], "n": ["FDJVGXF01DRNY6_rvcmp" ] }, {"p": [[135, -8615.520000, 0.544410, 0.002958, 0.007607 ], [132, -8616.330000, 0.241301, 0.008267, 0.007720 ], [137, -8617.850000, 0.053011, 0.000010, 0.010616 ], [138, -8617.970000, 0.047004, 0.000005, 0.011179 ], [131, -8618.010000, 0.045296, 0.000001, 0.011338 ], [133, -8618.280000, 0.034492, 0.001418, 0.011317 ], [134, -8618.280000, 0.034486, 0.000001, 0.011325 ] ], "n": ["FDJVGXF01BTTJJ_rvcmp" ] }, {"p": [[135, -7320.250000, 0.724536, 0.002359, 0.007737 ], [136, -7322.080000, 0.116134, 0.001922, 0.008799 ], [134, -7322.650000, 0.065519, 0.000001, 0.012991 ], [133, -7322.660000, 0.065270, 0.002392, 0.012991 ], [137, -7324.070000, 0.015902, 0.000010, 0.011082 ], [132, -7324.300000, 0.012641, 0.009039, 0.013228 ] ], "n": ["FDJVGXF01BIKH0" ] }, {"p": [[135, -7404.360000, 0.557954, 0.002054, 0.004229 ], [132, -7404.790000, 0.361276, 0.005627, 0.004225 ], [134, -7407.060000, 0.037284, 0.000001, 0.008372 ], [133, -7407.070000, 0.037143, 0.002392, 0.008372 ], [137, -7408.840000, 0.006343, 0.000010, 0.007635 ] ], "n": ["FDJVGXF01A6BE9_rvcmp" ] }, {"p": [[135, -7918.580000, 0.391273, 0.003235, 0.003943 ], [132, -7919.380000, 0.175716, 0.009607, 0.003972 ], [137, -7919.630000, 0.137398, 0.001383, 0.004052 ], [136, -7919.640000, 0.136601, 0.003788, 0.004058 ], [138, -7919.640000, 0.136373, 0.000010, 0.004063 ], [134, -7921.900000, 0.014187, 0.000001, 0.007860 ], [131, -7922.420000, 0.008451, 0.000001, 0.007833 ] ], "n": ["FDJVGXF01AVDK2" ] }, {"p": [[135, -7476.470000, 0.689104, 0.001496, 0.012515 ], [134, -7478.070000, 0.140201, 0.000001, 0.016331 ], [133, -7478.070000, 0.139766, 0.002394, 0.016331 ], [132, -7479.580000, 0.030928, 0.003697, 0.016699 ] ], "n": ["FDJVGXF01EP4MK" ] }, {"p": [[135, -6187.250000, 0.142931, 0.002982, 0.005267 ], [137, -6187.250000, 0.142906, 0.002482, 0.005272 ], [136, -6187.250000, 0.142880, 0.001921, 0.005276 ], [138, -6187.250000, 0.142849, 0.000616, 0.005282 ], [134, -6187.250000, 0.142844, 0.000001, 0.005283 ], [131, -6187.250000, 0.142844, 0.000001, 0.005283 ], [139, -6187.250000, 0.142745, 0.000006, 0.005283 ] ], "n": ["FDJVGXF01DH8UR" ] }, {"p": [[136, -8150.660000, 0.342137, 0.000007, 0.011747 ], [135, -8150.720000, 0.321357, 0.005910, 0.011672 ], [137, -8150.720000, 0.320687, 0.000010, 0.011653 ], [134, -8154.430000, 0.007925, 0.000001, 0.015739 ], [133, -8154.430000, 0.007895, 0.002392, 0.015739 ] ], "n": ["FDJVGXF01DZISV" ] }, {"p": [[136, -8036.580000, 0.351447, 0.000007, 0.003987 ], [135, -8036.670000, 0.323624, 0.005910, 0.003996 ], [137, -8036.670000, 0.321427, 0.000010, 0.003996 ], [134, -8041.190000, 0.003502, 0.000001, 0.008014 ] ], "n": ["FDJVGXF01DRGTB" ] }, {"p": [[136, -8058.720000, 0.503946, 0.000007, 0.016173 ], [135, -8058.800000, 0.465083, 0.005910, 0.016181 ], [134, -8062.200000, 0.015515, 0.000001, 0.020324 ], [133, -8062.200000, 0.015456, 0.002392, 0.020321 ] ], "n": ["FDJVGXF01D7MYF" ] }, {"p": [[136, -8058.720000, 0.503946, 0.000007, 0.016173 ], [135, -8058.800000, 0.465083, 0.005910, 0.016181 ], [134, -8062.200000, 0.015515, 0.000001, 0.020324 ], [133, -8062.200000, 0.015456, 0.002392, 0.020321 ] ], "n": ["FDJVGXF01CHDUO" ] }, {"p": [[136, -7347.020000, 0.727639, 0.001924, 0.004400 ], [137, -7349.320000, 0.072616, 0.000010, 0.005938 ], [135, -7349.320000, 0.072588, 0.005910, 0.005937 ], [138, -7350.140000, 0.031889, 0.000005, 0.008672 ], [132, -7350.150000, 0.031860, 0.010863, 0.008672 ], [131, -7350.150000, 0.031722, 0.000001, 0.008704 ], [139, -7350.150000, 0.031686, 0.000005, 0.008704 ] ], "n": ["FDJVGXF01CFDMV" ] }, {"p": [[136, -5995.640000, 0.344277, 0.000007, 0.016503 ], [135, -5995.720000, 0.317724, 0.005910, 0.016509 ], [137, -5995.730000, 0.315622, 0.000010, 0.016513 ], [134, -5999.070000, 0.011210, 0.000001, 0.022165 ], [133, -5999.070000, 0.011167, 0.002392, 0.022165 ] ], "n": ["FDJVGXF01B4HXX" ] }, {"p": [[136, -5995.640000, 0.344277, 0.000007, 0.016503 ], [135, -5995.720000, 0.317724, 0.005910, 0.016509 ], [137, -5995.730000, 0.315622, 0.000010, 0.016513 ], [134, -5999.070000, 0.011210, 0.000001, 0.022165 ], [133, -5999.070000, 0.011167, 0.002392, 0.022165 ] ], "n": ["FDJVGXF01DHESL" ] }, {"p": [[136, -6675.570000, 0.462885, 0.001918, 0.009913 ], [140, -6676.370000, 0.206595, 0.015066, 0.000006 ], [139, -6676.840000, 0.129733, 0.003653, 0.010135 ], [137, -6677.560000, 0.062916, 0.000010, 0.012441 ], [135, -6677.560000, 0.062881, 0.005910, 0.012440 ], [138, -6678.080000, 0.037537, 0.000005, 0.014652 ], [131, -6678.080000, 0.037452, 0.000001, 0.014674 ] ], "n": ["FDJVGXF01DSKDH_rvcmp" ] }, {"p": [[136, -5274.870000, 0.825498, 0.001925, 0.000006 ], [135, -5277.140000, 0.085351, 0.004128, 0.001699 ], [137, -5277.820000, 0.043072, 0.000010, 0.000134 ], [132, -5278.180000, 0.030089, 0.007997, 0.005897 ], [138, -5278.820000, 0.015989, 0.000010, 0.006150 ] ], "n": ["FDJVGXF01A9GJ5" ] }, {"p": [[138, -7193.460000, 0.345995, 0.000643, 0.004662 ], [134, -7194.370000, 0.138515, 0.000001, 0.008559 ], [133, -7194.380000, 0.137990, 0.002392, 0.008559 ], [132, -7194.510000, 0.121165, 0.009535, 0.004986 ], [137, -7194.770000, 0.093307, 0.004966, 0.005034 ], [139, -7194.900000, 0.081559, 0.000005, 0.008519 ], [131, -7194.900000, 0.081470, 0.000001, 0.008528 ] ], "n": ["FDJVGXF01E1IMM" ] }, {"p": [[138, -7213.990000, 0.278223, 0.000682, 0.009227 ], [136, -7214.000000, 0.275582, 0.001748, 0.009190 ], [139, -7214.930000, 0.109077, 0.001229, 0.011257 ], [131, -7214.980000, 0.102956, 0.000001, 0.012711 ], [132, -7215.010000, 0.100786, 0.009507, 0.009742 ], [137, -7215.260000, 0.078297, 0.004966, 0.009841 ], [135, -7215.610000, 0.055079, 0.004575, 0.011640 ] ], "n": ["FDJVGXF01AWLKR" ] }, {"p": [[138, -5130.640000, 0.143922, 0.001320, 0.000007 ], [131, -5130.640000, 0.143904, 0.000001, 0.000008 ], [139, -5130.640000, 0.143847, 0.000005, 0.000006 ], [137, -5130.640000, 0.143761, 0.004966, 0.000007 ], [132, -5130.640000, 0.143720, 0.010863, 0.000006 ], [135, -5130.670000, 0.140492, 0.005910, 0.000008 ], [136, -5130.670000, 0.140353, 0.003788, 0.000008 ] ], "n": ["FDJVGXF01AVMLL" ] }, {"p": [[138, -5116.950000, 0.143922, 0.001320, 0.000007 ], [131, -5116.950000, 0.143904, 0.000001, 0.000008 ], [139, -5116.950000, 0.143847, 0.000005, 0.000006 ], [137, -5116.950000, 0.143761, 0.004966, 0.000007 ], [132, -5116.950000, 0.143720, 0.010863, 0.000006 ], [135, -5116.970000, 0.140492, 0.005910, 0.000008 ], [136, -5116.970000, 0.140354, 0.003788, 0.000008 ] ], "n": ["FDJVGXF01C374J" ] }, {"p": [[138, -5052.660000, 0.143922, 0.001320, 0.000007 ], [131, -5052.660000, 0.143904, 0.000001, 0.000008 ], [139, -5052.660000, 0.143847, 0.000005, 0.000006 ], [137, -5052.660000, 0.143761, 0.004966, 0.000007 ], [132, -5052.660000, 0.143720, 0.010863, 0.000006 ], [135, -5052.690000, 0.140492, 0.005910, 0.000008 ], [136, -5052.690000, 0.140354, 0.003788, 0.000008 ] ], "n": ["FDJVGXF01D8C14" ] }, {"p": [[138, -4741.480000, 0.143922, 0.001320, 0.000007 ], [131, -4741.480000, 0.143905, 0.000001, 0.000008 ], [139, -4741.480000, 0.143846, 0.000005, 0.000006 ], [137, -4741.480000, 0.143761, 0.004966, 0.000007 ], [132, -4741.480000, 0.143718, 0.010863, 0.000006 ], [135, -4741.510000, 0.140493, 0.005910, 0.000008 ], [136, -4741.510000, 0.140355, 0.003788, 0.000008 ] ], "n": ["FDJVGXF01CLDTB_rvcmp" ] }, {"p": [[138, -4602.400000, 0.143921, 0.001320, 0.000007 ], [131, -4602.400000, 0.143905, 0.000001, 0.000008 ], [139, -4602.400000, 0.143845, 0.000005, 0.000006 ], [137, -4602.400000, 0.143761, 0.004966, 0.000007 ], [132, -4602.400000, 0.143718, 0.010863, 0.000006 ], [135, -4602.430000, 0.140494, 0.005910, 0.000008 ], [136, -4602.430000, 0.140355, 0.003788, 0.000008 ] ], "n": ["FDJVGXF01BNNUV" ] }, {"p": [[138, -4016.290000, 0.143920, 0.001320, 0.000007 ], [131, -4016.290000, 0.143906, 0.000001, 0.000008 ], [139, -4016.290000, 0.143846, 0.000005, 0.000006 ], [137, -4016.290000, 0.143761, 0.004966, 0.000007 ], [132, -4016.290000, 0.143715, 0.010863, 0.000006 ], [135, -4016.320000, 0.140495, 0.005910, 0.000008 ], [136, -4016.320000, 0.140357, 0.003788, 0.000008 ] ], "n": ["FDJVGXF01BK9IG" ] }, {"p": [[138, -4016.290000, 0.143920, 0.001320, 0.000007 ], [131, -4016.290000, 0.143906, 0.000001, 0.000008 ], [139, -4016.290000, 0.143846, 0.000005, 0.000006 ], [137, -4016.290000, 0.143761, 0.004966, 0.000007 ], [132, -4016.290000, 0.143715, 0.010863, 0.000006 ], [135, -4016.320000, 0.140495, 0.005910, 0.000008 ], [136, -4016.320000, 0.140357, 0.003788, 0.000008 ] ], "n": ["FDJVGXF01BO5BO" ] }, {"p": [[138, -2821.380000, 0.143316, 0.001320, 0.000007 ], [131, -2821.380000, 0.143307, 0.000001, 0.000008 ], [135, -2821.380000, 0.143306, 0.000006, 0.000008 ], [139, -2821.380000, 0.143247, 0.000005, 0.000006 ], [137, -2821.380000, 0.143164, 0.004966, 0.000007 ], [132, -2821.380000, 0.143111, 0.010863, 0.000006 ], [136, -2821.400000, 0.140548, 0.003788, 0.000008 ] ], "n": ["FDJVGXF01ADS38_rvcmp" ] }, {"p": [[139, -9133.970000, 0.582142, 0.002371, 0.007206 ], [132, -9134.810000, 0.251177, 0.008229, 0.007453 ], [136, -9136.670000, 0.038967, 0.003054, 0.010781 ], [137, -9136.840000, 0.032941, 0.004966, 0.010734 ], [138, -9136.840000, 0.032935, 0.000005, 0.010734 ], [135, -9136.900000, 0.031159, 0.005910, 0.010991 ], [131, -9136.910000, 0.030679, 0.000001, 0.011008 ] ], "n": ["FDJVGXF01DQPJF_rvcmp" ] }, {"p": [[139, -7133.220000, 0.386195, 0.004938, 0.000006 ], [130, -7133.910000, 0.193915, 0.008812, 0.000006 ], [140, -7134.070000, 0.164996, 0.000006, 0.000006 ], [138, -7134.150000, 0.152569, 0.000630, 0.000006 ], [132, -7134.990000, 0.066026, 0.009235, 0.000006 ], [131, -7135.590000, 0.036299, 0.000001, 0.004172 ] ], "n": ["FDJVGXF01A01TX_rvcmp" ] }, {"p": [[139, -7484.580000, 0.661269, 0.005013, 0.003366 ], [130, -7485.430000, 0.284324, 0.010632, 0.002826 ], [138, -7487.290000, 0.044152, 0.000660, 0.004433 ], [131, -7488.750000, 0.010255, 0.000001, 0.008116 ] ], "n": ["FDJVGXF01CJ2JL" ] }, {"p": [[139, -6419.500000, 0.375121, 0.004541, 0.005335 ], [138, -6420.220000, 0.182778, 0.000818, 0.006641 ], [130, -6420.230000, 0.180870, 0.008777, 0.005141 ], [131, -6420.540000, 0.132706, 0.000001, 0.009468 ], [132, -6421.240000, 0.065833, 0.009250, 0.005875 ], [137, -6421.710000, 0.041151, 0.004966, 0.006472 ], [135, -6422.360000, 0.021541, 0.004279, 0.009767 ] ], "n": ["FDJVGXF01CKG1U" ] }, {"p": [[139, -4245.940000, 0.331825, 0.010556, 0.000008 ], [130, -4245.940000, 0.331813, 0.010631, 0.000008 ], [140, -4245.940000, 0.331757, 0.000006, 0.000008 ], [128, -4250.900000, 0.002304, 0.003643, 0.005370 ], [129, -4250.910000, 0.002300, 0.004824, 0.005370 ] ], "n": ["FDJVGXF01DYONQ_rvcmp" ] }, {"p": [[140, -4188.430000, 0.503578, 0.010319, 0.006123 ], [139, -4189.180000, 0.236240, 0.010556, 0.014473 ], [130, -4189.180000, 0.236231, 0.010632, 0.014473 ], [135, -4191.940000, 0.015025, 0.003000, 0.015190 ], [128, -4192.460000, 0.008927, 0.003643, 0.021883 ] ], "n": ["FDJVGXF01ETMYH" ] }, {"p": [[140, -6170.920000, 0.188502, 0.027039, 0.115191 ], [148, -6171.020000, 0.171047, 0.024050, 0.107844 ], [137, -6171.300000, 0.128451, 0.004909, 0.124897 ], [138, -6171.310000, 0.128341, 0.000005, 0.125256 ], [132, -6171.310000, 0.128291, 0.010863, 0.125256 ], [131, -6171.310000, 0.127717, 0.000001, 0.125371 ], [139, -6171.310000, 0.127651, 0.000005, 0.125373 ] ], "n": ["FDJVGXF01DVG07" ] }, {"p": [[140, -5070.950000, 0.314561, 0.019597, 0.526614 ], [143, -5071.520000, 0.178109, 0.017650, 0.616520 ], [66, -5071.830000, 0.131399, 0.070198, 0.657958 ], [147, -5071.890000, 0.123350, 0.059057, 0.576223 ], [148, -5071.910000, 0.120709, 0.000009, 0.576876 ], [202, -5072.280000, 0.083664, 0.000006, 0.520545 ], [128, -5072.830000, 0.048208, 0.000007, 0.516921 ] ], "n": ["FDJVGXF01D1IUI" ] }, {"p": [[140, -4443.080000, 0.406181, 0.008476, 0.013241 ], [134, -4444.490000, 0.098970, 0.000001, 0.022409 ], [131, -4444.490000, 0.098970, 0.000001, 0.022409 ], [138, -4444.490000, 0.098970, 0.001319, 0.022409 ], [133, -4444.490000, 0.098970, 0.000009, 0.022409 ], [136, -4444.490000, 0.098970, 0.000007, 0.022409 ], [135, -4444.490000, 0.098970, 0.000006, 0.022409 ] ], "n": ["FDJVGXF01D4RB1_rvcmp" ] }, {"p": [[140, -2661.580000, 0.370956, 0.007635, 0.000006 ], [139, -2662.800000, 0.108861, 0.010556, 0.011499 ], [130, -2662.800000, 0.108860, 0.010632, 0.011495 ], [135, -2662.860000, 0.102840, 0.002986, 0.012395 ], [136, -2662.860000, 0.102832, 0.001875, 0.012403 ], [131, -2662.860000, 0.102826, 0.000001, 0.012412 ], [134, -2662.860000, 0.102825, 0.000001, 0.012408 ] ], "n": ["FDJVGXF01ETSPE" ] }, {"p": [[141, -6435.950000, 1.000000, 0.001219, 0.000006 ] ], "n": ["FDJVGXF01BTIP8" ] }, {"p": [[141, -2625.550000, 0.307988, 0.001828, 0.012296 ], [142, -2625.550000, 0.307926, 0.000001, 0.012308 ], [143, -2625.550000, 0.307922, 0.000006, 0.012304 ], [147, -2627.610000, 0.038923, 0.003682, 0.000006 ], [146, -2627.660000, 0.037242, 0.060923, 0.000006 ] ], "n": ["FDJVGXF01BK6PN_rvcmp" ] }, {"p": [[141, -2891.930000, 0.972896, 0.001828, 0.000006 ], [142, -2895.510000, 0.027104, 0.000001, 0.010915 ] ], "n": ["FDJVGXF01AX3NN_rvcmp" ] }, {"p": [[142, -7234.100000, 0.333368, 0.000001, 0.013247 ], [141, -7234.100000, 0.333368, 0.000007, 0.013255 ], [143, -7234.100000, 0.333264, 0.000009, 0.013243 ] ], "n": ["FDJVGXF01BGWOV" ] }, {"p": [[142, -7234.100000, 0.333368, 0.000001, 0.013247 ], [141, -7234.100000, 0.333368, 0.000007, 0.013255 ], [143, -7234.100000, 0.333264, 0.000009, 0.013243 ] ], "n": ["FDJVGXF01CLRF7" ] }, {"p": [[142, -9034.580000, 0.333482, 0.000001, 0.000006 ], [141, -9034.580000, 0.333479, 0.000007, 0.000006 ], [143, -9034.580000, 0.333039, 0.000008, 0.000006 ] ], "n": ["FDJVGXF01DJVG4_rvcmp" ] }, {"p": [[142, -6869.600000, 0.333718, 0.000001, 0.013546 ], [143, -6869.600000, 0.333377, 0.000008, 0.013543 ], [141, -6869.600000, 0.332904, 0.003648, 0.013547 ] ], "n": ["FDJVGXF01CFAI1" ] }, {"p": [[142, -3385.750000, 0.319812, 0.000001, 0.000007 ], [141, -3385.750000, 0.319811, 0.000007, 0.000007 ], [143, -3385.750000, 0.319750, 0.000006, 0.000006 ], [146, -3388.510000, 0.020315, 0.060923, 0.000006 ], [147, -3388.510000, 0.020312, 0.000008, 0.000006 ] ], "n": ["FDJVGXF01DQ6TF" ] }, {"p": [[142, -3324.410000, 0.326406, 0.000001, 0.000007 ], [141, -3324.410000, 0.326405, 0.000007, 0.000007 ], [143, -3324.410000, 0.326322, 0.000006, 0.000006 ], [146, -3327.860000, 0.010435, 0.060923, 0.000006 ], [147, -3327.860000, 0.010433, 0.000008, 0.000006 ] ], "n": ["FDJVGXF01A51QA" ] }, {"p": [[143, -7689.270000, 0.414132, 0.004400, 0.007355 ], [142, -7689.610000, 0.293291, 0.000001, 0.012144 ], [141, -7689.610000, 0.292576, 0.003648, 0.012149 ] ], "n": ["FDJVGXF01DI8GN_rvcmp" ] }, {"p": [[143, -7365.040000, 0.830853, 0.013805, 0.000006 ], [142, -7366.630000, 0.169147, 0.000001, 0.008446 ] ], "n": ["FDJVGXF01BYR1G_rvcmp" ] }, {"p": [[143, -8098.340000, 0.652953, 0.011527, 0.005205 ], [141, -8099.660000, 0.173529, 0.001876, 0.012145 ], [142, -8099.660000, 0.173518, 0.000001, 0.012155 ] ], "n": ["FDJVGXF01EW1Z2" ] }, {"p": [[143, -8098.340000, 0.652953, 0.011527, 0.005205 ], [141, -8099.660000, 0.173529, 0.001876, 0.012145 ], [142, -8099.660000, 0.173518, 0.000001, 0.012155 ] ], "n": ["FDJVGXF01EX20I" ] }, {"p": [[143, -6609.850000, 0.746332, 0.004229, 0.000006 ], [142, -6611.620000, 0.127245, 0.000001, 0.004846 ], [141, -6611.620000, 0.126423, 0.003648, 0.004846 ] ], "n": ["FDJVGXF01DIQTM_rvcmp" ] }, {"p": [[143, -6562.880000, 0.745836, 0.004242, 0.000006 ], [142, -6564.650000, 0.127494, 0.000001, 0.004866 ], [141, -6564.660000, 0.126670, 0.003648, 0.004866 ] ], "n": ["FDJVGXF01AJGH5_rvcmp" ] }, {"p": [[143, -6865.440000, 0.855030, 0.025097, 0.000006 ], [147, -6868.020000, 0.065253, 0.000008, 0.000006 ], [146, -6868.020000, 0.065159, 0.060923, 0.000006 ], [141, -6870.210000, 0.007280, 0.001842, 0.014159 ], [142, -6870.210000, 0.007278, 0.000001, 0.014165 ] ], "n": ["FDJVGXF01AQ3LC_rvcmp" ] }, {"p": [[143, -6865.440000, 0.855030, 0.025097, 0.000006 ], [147, -6868.020000, 0.065253, 0.000008, 0.000006 ], [146, -6868.020000, 0.065159, 0.060923, 0.000006 ], [141, -6870.210000, 0.007280, 0.001842, 0.014159 ], [142, -6870.210000, 0.007278, 0.000001, 0.014165 ] ], "n": ["FDJVGXF01AFXQZ_rvcmp" ] }, {"p": [[148, -3315.640000, 0.293596, 0.078751, 0.165776 ], [167, -3315.700000, 0.276687, 0.014138, 0.211653 ], [155, -3316.350000, 0.144339, 0.000006, 0.207621 ], [162, -3316.500000, 0.123884, 0.000005, 0.233272 ], [156, -3317.260000, 0.057997, 0.043598, 0.226445 ], [157, -3317.260000, 0.057996, 0.000006, 0.226444 ], [169, -3317.500000, 0.045500, 0.005276, 0.230866 ] ], "n": ["FDJVGXF01B503G" ] }, {"p": [[148, -5736.550000, 0.275929, 0.024601, 0.116279 ], [140, -5736.790000, 0.216993, 0.033314, 0.125225 ], [138, -5737.550000, 0.101587, 0.000005, 0.137563 ], [137, -5737.550000, 0.101560, 0.004968, 0.137516 ], [132, -5737.550000, 0.101549, 0.010863, 0.137563 ], [131, -5737.550000, 0.101216, 0.000001, 0.137678 ], [139, -5737.550000, 0.101166, 0.000005, 0.137679 ] ], "n": ["FDJVGXF01CJJ11" ] }, {"p": [[148, -5964.790000, 0.186827, 0.000009, 1.999990 ], [225, -5965.090000, 0.138428, 0.036449, 1.999990 ], [222, -5965.110000, 0.135073, 0.000009, 1.999990 ], [224, -5965.110000, 0.135034, 0.010740, 1.999990 ], [213, -5965.110000, 0.135034, 0.023979, 1.999990 ], [223, -5965.110000, 0.134804, 0.016737, 1.999990 ], [216, -5965.110000, 0.134799, 0.038817, 1.999990 ] ], "n": ["FDJVGXF01EHCC7_rvcmp" ] }, {"p": [[148, -6078.330000, 0.163256, 0.000009, 1.868790 ], [147, -6078.330000, 0.163250, 0.065313, 1.868830 ], [140, -6078.330000, 0.163247, 0.046582, 1.868800 ], [212, -6078.340000, 0.162756, 0.000008, 1.736350 ], [225, -6078.670000, 0.116609, 0.036449, 1.795480 ], [222, -6078.680000, 0.115916, 0.000009, 1.803950 ], [224, -6078.690000, 0.114966, 0.010740, 1.809520 ] ], "n": ["FDJVGXF01BCLYU_rvcmp" ] }, {"p": [[148, -7299.210000, 0.205856, 0.085601, 1.558440 ], [22, -7299.300000, 0.187430, 0.028187, 1.590720 ], [56, -7299.430000, 0.165121, 0.035411, 1.398180 ], [13, -7299.570000, 0.143655, 0.000009, 1.536740 ], [225, -7299.870000, 0.106000, 0.036449, 1.654230 ], [52, -7299.970000, 0.096260, 0.003885, 1.575010 ], [149, -7299.980000, 0.095678, 0.010240, 1.525030 ] ], "n": ["FDJVGXF01BWPPJ_rvcmp" ] }, {"p": [[148, -5372.700000, 0.443335, 0.054279, 0.259461 ], [140, -5373.680000, 0.166111, 0.046581, 0.267004 ], [147, -5373.680000, 0.166042, 0.065313, 0.267001 ], [149, -5374.470000, 0.075243, 0.000008, 0.333858 ], [127, -5374.470000, 0.075220, 0.040911, 0.333870 ], [132, -5374.920000, 0.048087, 0.003188, 0.291572 ], [138, -5375.530000, 0.025961, 0.000005, 0.296234 ] ], "n": ["FDJVGXF01D8LWK_rvcmp" ] }, {"p": [[148, -3702.190000, 0.183650, 0.000009, 1.999990 ], [147, -3702.190000, 0.183646, 0.065313, 1.999990 ], [140, -3702.190000, 0.183641, 0.046582, 1.999990 ], [143, -3702.370000, 0.153443, 0.000008, 1.999990 ], [146, -3702.400000, 0.149451, 0.060923, 1.999990 ], [0, -3703.100000, 0.074343, 0.000008, 1.960390 ], [126, -3703.130000, 0.071825, 0.047265, 1.816950 ] ], "n": ["FDJVGXF01DCAR9_rvcmp" ] }, {"p": [[148, -5479.490000, 0.172235, 0.000009, 1.697450 ], [147, -5479.490000, 0.172227, 0.065313, 1.697490 ], [213, -5479.740000, 0.133518, 0.000006, 1.582040 ], [225, -5479.760000, 0.131687, 0.000009, 1.594760 ], [224, -5479.760000, 0.131687, 0.010740, 1.594770 ], [222, -5479.770000, 0.130063, 0.000009, 1.604550 ], [223, -5479.780000, 0.128583, 0.016737, 1.607350 ] ], "n": ["FDJVGXF01CKKZS" ] }, {"p": [[149, -7859.470000, 0.714002, 0.023643, 0.065584 ], [127, -7860.460000, 0.266646, 0.040911, 0.065541 ], [171, -7863.080000, 0.019352, 0.000008, 0.091486 ] ], "n": ["FDJVGXF01A31Z8_rvcmp" ] }, {"p": [[149, -7616.070000, 0.365816, 0.024579, 0.115179 ], [127, -7616.690000, 0.195900, 0.040911, 0.113790 ], [171, -7617.210000, 0.116644, 0.024563, 0.138173 ], [190, -7617.240000, 0.113961, 0.031426, 0.138584 ], [191, -7617.260000, 0.110699, 0.000008, 0.140486 ], [170, -7617.510000, 0.086430, 0.018724, 0.137474 ], [40, -7619.620000, 0.010551, 0.071825, 0.140047 ] ], "n": ["FDJVGXF01D5RDK_rvcmp" ] }, {"p": [[149, -7892.020000, 0.243928, 0.063738, 0.199750 ], [171, -7892.020000, 0.243909, 0.000008, 0.199760 ], [170, -7892.020000, 0.243794, 0.018724, 0.199759 ], [191, -7892.750000, 0.117453, 0.000008, 0.206784 ], [190, -7892.750000, 0.117434, 0.034335, 0.206774 ], [39, -7894.630000, 0.017934, 0.013859, 0.220401 ], [192, -7894.780000, 0.015548, 0.009937, 0.220919 ] ], "n": ["FDJVGXF01D7DG8_rvcmp" ] }, {"p": [[149, -6105.790000, 0.557956, 0.021300, 0.262656 ], [148, -6106.530000, 0.266359, 0.116820, 0.285370 ], [127, -6107.030000, 0.161365, 0.040911, 0.284073 ], [154, -6109.960000, 0.008658, 0.002126, 0.301759 ], [170, -6110.380000, 0.005661, 0.010643, 0.293237 ] ], "n": ["FDJVGXF01CD7FN_rvcmp" ] }, {"p": [[149, -3027.000000, 0.308670, 0.042582, 0.037480 ], [171, -3027.600000, 0.169575, 0.004336, 0.058110 ], [153, -3027.660000, 0.159548, 0.019512, 0.059828 ], [170, -3027.670000, 0.158471, 0.018724, 0.060576 ], [154, -3028.320000, 0.082852, 0.000007, 0.070365 ], [150, -3028.320000, 0.082788, 0.016957, 0.070358 ], [169, -3029.090000, 0.038097, 0.023387, 0.074562 ] ], "n": ["FDJVGXF01CDHY3" ] }, {"p": [[149, -4692.820000, 0.156258, 0.001277, 0.267483 ], [148, -4692.820000, 0.156162, 0.148117, 0.268221 ], [127, -4692.820000, 0.156128, 0.040911, 0.268234 ], [30, -4692.960000, 0.135807, 0.000006, 0.287788 ], [31, -4692.960000, 0.135807, 0.000008, 0.287806 ], [32, -4692.960000, 0.135797, 0.000007, 0.287807 ], [33, -4693.050000, 0.124041, 0.000010, 0.289128 ] ], "n": ["FDJVGXF01EXALQ_rvcmp" ] }, {"p": [[150, -4565.290000, 0.201967, 0.013936, 0.116502 ], [153, -4565.320000, 0.195101, 0.026997, 0.117676 ], [154, -4565.320000, 0.195065, 0.000007, 0.117677 ], [18, -4565.540000, 0.156286, 0.042159, 0.128399 ], [22, -4565.770000, 0.124913, 0.000007, 0.137235 ], [21, -4565.770000, 0.124878, 0.017640, 0.137231 ], [170, -4570.010000, 0.001789, 0.000009, 0.140219 ] ], "n": ["FDJVGXF01BP94M" ] }, {"p": [[152, -7894.430000, 0.371874, 0.016894, 0.094034 ], [149, -7895.320000, 0.152010, 0.049239, 0.066945 ], [154, -7895.600000, 0.114819, 0.015837, 0.088348 ], [153, -7895.690000, 0.105185, 0.006429, 0.093230 ], [151, -7895.760000, 0.098160, 0.011601, 0.093952 ], [171, -7895.810000, 0.093381, 0.012125, 0.080318 ], [170, -7896.180000, 0.064571, 0.010043, 0.087387 ] ], "n": ["FDJVGXF01B561Z" ] }, {"p": [[152, -8500.510000, 0.334684, 0.022798, 0.124098 ], [153, -8500.950000, 0.215715, 0.010005, 0.129694 ], [151, -8501.170000, 0.173555, 0.014659, 0.132171 ], [154, -8501.350000, 0.143933, 0.005629, 0.129717 ], [150, -8501.480000, 0.126625, 0.016957, 0.133630 ], [170, -8504.620000, 0.005487, 0.003859, 0.130961 ] ], "n": ["FDJVGXF01A3BDZ_rvcmp" ] }, {"p": [[152, -8500.510000, 0.334684, 0.022798, 0.124098 ], [153, -8500.950000, 0.215715, 0.010005, 0.129694 ], [151, -8501.170000, 0.173555, 0.014659, 0.132171 ], [154, -8501.350000, 0.143933, 0.005629, 0.129717 ], [150, -8501.480000, 0.126625, 0.016957, 0.133630 ], [170, -8504.620000, 0.005487, 0.003859, 0.130961 ] ], "n": ["FDJVGXF01AU0X5_rvcmp" ] }, {"p": [[152, -8500.510000, 0.334684, 0.022798, 0.124098 ], [153, -8500.950000, 0.215715, 0.010005, 0.129694 ], [151, -8501.170000, 0.173555, 0.014659, 0.132171 ], [154, -8501.350000, 0.143933, 0.005629, 0.129717 ], [150, -8501.480000, 0.126625, 0.016957, 0.133630 ], [170, -8504.620000, 0.005487, 0.003859, 0.130961 ] ], "n": ["FDJVGXF01EXELD_rvcmp" ] }, {"p": [[152, -7336.720000, 0.526145, 0.022468, 0.076251 ], [151, -7337.310000, 0.291753, 0.009891, 0.076898 ], [153, -7337.820000, 0.174920, 0.001007, 0.076657 ], [40, -7341.010000, 0.007182, 0.068956, 0.071776 ] ], "n": ["FDJVGXF01CA5RL" ] }, {"p": [[152, -6215.320000, 0.468801, 0.022146, 0.094871 ], [151, -6215.890000, 0.263296, 0.009833, 0.095493 ], [153, -6216.360000, 0.164896, 0.000504, 0.096766 ], [196, -6217.610000, 0.047316, 0.026079, 0.082851 ], [38, -6218.260000, 0.024567, 0.031199, 0.112056 ], [40, -6218.630000, 0.017110, 0.061559, 0.089980 ], [205, -6218.830000, 0.014014, 0.019823, 0.095344 ] ], "n": ["FDJVGXF01A92O9" ] }, {"p": [[152, -6120.540000, 0.477929, 0.021592, 0.168350 ], [151, -6120.730000, 0.393266, 0.000007, 0.170925 ], [153, -6121.850000, 0.128804, 0.000005, 0.176441 ] ], "n": ["FDJVGXF01AKJDE" ] }, {"p": [[152, -6120.540000, 0.477929, 0.021592, 0.168350 ], [151, -6120.730000, 0.393266, 0.000007, 0.170925 ], [153, -6121.850000, 0.128804, 0.000005, 0.176441 ] ], "n": ["FDJVGXF01A4L25" ] }, {"p": [[152, -4886.180000, 0.431038, 0.020505, 0.079776 ], [153, -4886.610000, 0.280584, 0.001055, 0.081496 ], [151, -4886.640000, 0.272372, 0.014659, 0.084184 ], [40, -4889.470000, 0.016006, 0.049556, 0.071326 ] ], "n": ["FDJVGXF01B6FHY" ] }, {"p": [[153, -8554.990000, 0.924246, 0.011753, 0.080980 ], [149, -8558.550000, 0.026380, 0.050852, 0.074461 ], [171, -8558.690000, 0.022849, 0.010727, 0.086074 ], [152, -8558.970000, 0.017355, 0.029974, 0.101303 ], [170, -8559.600000, 0.009170, 0.015306, 0.093924 ] ], "n": ["FDJVGXF01CO5FC_rvcmp" ] }, {"p": [[153, -2764.170000, 0.305109, 0.000007, 0.081293 ], [152, -2764.170000, 0.305099, 0.029974, 0.081310 ], [151, -2764.170000, 0.304989, 0.014659, 0.081308 ], [18, -2766.690000, 0.024757, 0.051699, 0.098316 ], [22, -2766.690000, 0.024757, 0.000007, 0.098313 ], [21, -2766.690000, 0.024740, 0.017640, 0.098320 ], [209, -2767.540000, 0.010549, 0.006837, 0.106067 ] ], "n": ["FDJVGXF01CDHY3_rvcmp" ] }, {"p": [[153, -2477.970000, 0.226548, 0.011446, 0.159988 ], [151, -2478.430000, 0.144427, 0.014659, 0.186928 ], [152, -2478.430000, 0.144407, 0.029974, 0.186930 ], [149, -2478.510000, 0.132905, 0.063739, 0.178142 ], [171, -2478.510000, 0.132888, 0.000008, 0.178151 ], [170, -2478.510000, 0.132872, 0.018724, 0.178148 ], [39, -2478.940000, 0.085953, 0.003187, 0.195799 ] ], "n": ["FDJVGXF01EMJ2U" ] }, {"p": [[154, -7417.770000, 0.924403, 0.010692, 0.047037 ], [153, -7420.270000, 0.075597, 0.018477, 0.055214 ] ], "n": ["FDJVGXF01EOB14" ] }, {"p": [[154, -7417.770000, 0.924403, 0.010692, 0.047037 ], [153, -7420.270000, 0.075597, 0.018477, 0.055214 ] ], "n": ["FDJVGXF01C63HA" ] }, {"p": [[154, -7393.070000, 0.924040, 0.010690, 0.047200 ], [153, -7395.570000, 0.075960, 0.018477, 0.055404 ] ], "n": ["FDJVGXF01ET7SO" ] }, {"p": [[154, -6945.420000, 0.959355, 0.019746, 0.019332 ], [169, -6948.580000, 0.040645, 0.018628, 0.024577 ] ], "n": ["FDJVGXF01ES1QJ_rvcmp" ] }, {"p": [[154, -7637.840000, 1.000000, 0.013700, 0.051007 ] ], "n": ["FDJVGXF01C5HGH_rvcmp" ] }, {"p": [[154, -7036.670000, 0.972908, 0.013202, 0.043934 ], [153, -7040.260000, 0.027092, 0.026997, 0.054951 ] ], "n": ["FDJVGXF01EJMGG" ] }, {"p": [[154, -5001.520000, 0.327181, 0.019700, 0.013094 ], [169, -5001.550000, 0.315792, 0.014044, 0.015714 ], [159, -5002.490000, 0.123708, 0.006002, 0.028360 ], [167, -5002.920000, 0.080613, 0.027435, 0.028412 ], [168, -5003.350000, 0.052544, 0.003613, 0.030329 ], [157, -5003.350000, 0.052539, 0.005887, 0.030329 ], [155, -5003.450000, 0.047623, 0.012864, 0.030665 ] ], "n": ["FDJVGXF01D298Z_rvcmp" ] }, {"p": [[154, -5001.520000, 0.327181, 0.019700, 0.013094 ], [169, -5001.550000, 0.315792, 0.014044, 0.015714 ], [159, -5002.490000, 0.123708, 0.006002, 0.028360 ], [167, -5002.920000, 0.080613, 0.027435, 0.028412 ], [168, -5003.350000, 0.052544, 0.003613, 0.030329 ], [157, -5003.350000, 0.052539, 0.005887, 0.030329 ], [155, -5003.450000, 0.047623, 0.012864, 0.030665 ] ], "n": ["FDJVGXF01EJRS5_rvcmp" ] }, {"p": [[154, -5001.520000, 0.327181, 0.019700, 0.013094 ], [169, -5001.550000, 0.315792, 0.014044, 0.015714 ], [159, -5002.490000, 0.123708, 0.006002, 0.028360 ], [167, -5002.920000, 0.080613, 0.027435, 0.028412 ], [168, -5003.350000, 0.052544, 0.003613, 0.030329 ], [157, -5003.350000, 0.052539, 0.005887, 0.030329 ], [155, -5003.450000, 0.047623, 0.012864, 0.030665 ] ], "n": ["FDJVGXF01EUN41_rvcmp" ] }, {"p": [[154, -5001.520000, 0.327181, 0.019700, 0.013094 ], [169, -5001.550000, 0.315792, 0.014044, 0.015714 ], [159, -5002.490000, 0.123708, 0.006002, 0.028360 ], [167, -5002.920000, 0.080613, 0.027435, 0.028412 ], [168, -5003.350000, 0.052544, 0.003613, 0.030329 ], [157, -5003.350000, 0.052539, 0.005887, 0.030329 ], [155, -5003.450000, 0.047623, 0.012864, 0.030665 ] ], "n": ["FDJVGXF01EFXAW_rvcmp" ] }, {"p": [[154, -3816.820000, 0.487098, 0.011617, 0.106240 ], [153, -3818.020000, 0.146889, 0.017579, 0.114027 ], [149, -3818.430000, 0.097182, 0.052552, 0.102683 ], [170, -3818.690000, 0.074904, 0.005639, 0.124997 ], [169, -3818.730000, 0.072088, 0.023387, 0.128691 ], [171, -3818.860000, 0.063177, 0.000008, 0.121621 ], [152, -3818.930000, 0.058662, 0.029974, 0.121505 ] ], "n": ["FDJVGXF01CJ582" ] }, {"p": [[155, -8152.240000, 0.480363, 0.000006, 0.011923 ], [157, -8153.320000, 0.163391, 0.001530, 0.009646 ], [156, -8153.430000, 0.145576, 0.043598, 0.010882 ], [168, -8153.510000, 0.134337, 0.002660, 0.008259 ], [169, -8154.080000, 0.076333, 0.003110, 0.005582 ] ], "n": ["FDJVGXF01DR7NL_rvcmp" ] }, {"p": [[155, -6988.150000, 0.919910, 0.010101, 0.004780 ], [156, -6990.690000, 0.072056, 0.040757, 0.005474 ], [161, -6992.890000, 0.008035, 0.016182, 0.007528 ] ], "n": ["FDJVGXF01BDPG4" ] }, {"p": [[155, -8859.610000, 1.000000, 0.006133, 0.000009 ] ], "n": ["FDJVGXF01BS1BC_rvcmp" ] }, {"p": [[155, -8033.050000, 0.158475, 0.010865, 0.051495 ], [156, -8033.070000, 0.155828, 0.042365, 0.050258 ], [157, -8033.100000, 0.151109, 0.000006, 0.051603 ], [169, -8033.170000, 0.139899, 0.000005, 0.051751 ], [168, -8033.170000, 0.139725, 0.003613, 0.051755 ], [165, -8033.200000, 0.136551, 0.003002, 0.049728 ], [167, -8033.340000, 0.118414, 0.023649, 0.044340 ] ], "n": ["FDJVGXF01E4IKQ_rvcmp" ] }, {"p": [[155, -6918.030000, 0.889692, 0.010172, 0.000009 ], [156, -6920.780000, 0.056705, 0.041414, 0.000005 ], [157, -6920.840000, 0.053602, 0.000006, 0.000006 ] ], "n": ["FDJVGXF01EU9B9" ] }, {"p": [[155, -6969.330000, 0.970924, 0.008545, 0.000009 ], [156, -6972.840000, 0.029076, 0.042552, 0.000005 ] ], "n": ["FDJVGXF01DKR11" ] }, {"p": [[155, -7043.480000, 0.957203, 0.000006, 0.000006 ], [156, -7047.280000, 0.021418, 0.043598, 0.000006 ], [157, -7047.280000, 0.021380, 0.000006, 0.000006 ] ], "n": ["FDJVGXF01AXQF5_rvcmp" ] }, {"p": [[155, -6841.200000, 0.953691, 0.009424, 0.000009 ], [156, -6844.220000, 0.046309, 0.041439, 0.000005 ] ], "n": ["FDJVGXF01CO480" ] }, {"p": [[155, -7196.940000, 0.312306, 0.008290, 0.000009 ], [157, -7197.240000, 0.230141, 0.000006, 0.000006 ], [169, -7197.340000, 0.209888, 0.000006, 0.000006 ], [168, -7197.340000, 0.209671, 0.003612, 0.000006 ], [166, -7199.650000, 0.020721, 0.001999, 0.000006 ], [160, -7199.830000, 0.017272, 0.007381, 0.000006 ] ], "n": ["FDJVGXF01DS0II" ] }, {"p": [[155, -7055.290000, 0.254017, 0.008301, 0.000009 ], [157, -7055.590000, 0.187403, 0.000006, 0.000006 ], [156, -7055.590000, 0.187112, 0.043598, 0.000006 ], [169, -7055.690000, 0.170410, 0.000006, 0.000006 ], [168, -7055.690000, 0.170233, 0.003612, 0.000006 ], [166, -7058.000000, 0.016811, 0.001999, 0.000006 ], [160, -7058.190000, 0.014013, 0.007381, 0.000006 ] ], "n": ["FDJVGXF01APT00" ] }, {"p": [[155, -6301.120000, 0.345452, 0.000006, 0.033775 ], [156, -6301.350000, 0.274016, 0.043598, 0.033846 ], [157, -6301.350000, 0.273834, 0.000006, 0.033847 ], [169, -6303.090000, 0.048099, 0.000006, 0.035537 ], [168, -6303.100000, 0.047940, 0.003612, 0.035538 ], [159, -6304.600000, 0.010659, 0.002352, 0.043944 ] ], "n": ["FDJVGXF01EXALQ" ] }, {"p": [[155, -5445.870000, 0.380729, 0.000006, 0.000006 ], [156, -5446.130000, 0.292637, 0.043598, 0.000006 ], [157, -5446.130000, 0.292383, 0.000006, 0.000006 ], [169, -5448.280000, 0.034251, 0.000006, 0.000006 ] ], "n": ["FDJVGXF01ATTC2_rvcmp" ] }, {"p": [[155, -6483.730000, 1.000000, 0.003777, 0.000009 ] ], "n": ["FDJVGXF01DRYOS_rvcmp" ] }, {"p": [[155, -6210.550000, 0.777879, 0.009087, 0.017610 ], [160, -6212.440000, 0.117759, 0.002863, 0.029434 ], [157, -6213.190000, 0.055689, 0.000622, 0.020088 ], [161, -6213.320000, 0.048673, 0.003698, 0.025183 ] ], "n": ["FDJVGXF01DVCVF_rvcmp" ] }, {"p": [[156, -7348.850000, 0.409794, 0.033189, 0.000006 ], [155, -7349.290000, 0.263450, 0.012864, 0.000009 ], [157, -7349.290000, 0.263364, 0.000006, 0.000009 ], [169, -7351.400000, 0.031748, 0.000005, 0.000007 ], [168, -7351.410000, 0.031644, 0.003612, 0.000009 ] ], "n": ["FDJVGXF01ELZQ3" ] }, {"p": [[156, -7016.410000, 0.372866, 0.000008, 0.000006 ], [155, -7016.690000, 0.280191, 0.012864, 0.000009 ], [157, -7016.690000, 0.279957, 0.000006, 0.000009 ], [169, -7018.820000, 0.033558, 0.000005, 0.000007 ], [168, -7018.820000, 0.033429, 0.003612, 0.000009 ] ], "n": ["FDJVGXF01A1ZF5_rvcmp" ] }, {"p": [[156, -7188.430000, 0.459423, 0.039024, 0.000006 ], [155, -7188.600000, 0.387899, 0.012864, 0.000009 ], [161, -7189.530000, 0.152678, 0.014142, 0.000006 ] ], "n": ["FDJVGXF01BINP8" ] }, {"p": [[156, -8631.280000, 0.787774, 0.035424, 0.029829 ], [155, -8632.590000, 0.212226, 0.011646, 0.033031 ] ], "n": ["FDJVGXF01A0WFN" ] }, {"p": [[156, -7107.690000, 0.331161, 0.039004, 0.000006 ], [157, -7107.860000, 0.279472, 0.000006, 0.000006 ], [155, -7107.860000, 0.279254, 0.012864, 0.000009 ], [161, -7108.790000, 0.110114, 0.014144, 0.000006 ] ], "n": ["FDJVGXF01BUUSC" ] }, {"p": [[156, -8533.640000, 0.618499, 0.026223, 0.017319 ], [160, -8534.430000, 0.280603, 0.003124, 0.041606 ], [158, -8535.720000, 0.077125, 0.016009, 0.044188 ], [161, -8536.900000, 0.023773, 0.021910, 0.034458 ] ], "n": ["FDJVGXF01BM0LU" ] }, {"p": [[156, -8535.470000, 0.484013, 0.035236, 0.007529 ], [161, -8536.060000, 0.267888, 0.019096, 0.012456 ], [155, -8536.500000, 0.172465, 0.011277, 0.014959 ], [160, -8537.870000, 0.043903, 0.004443, 0.023010 ], [157, -8538.190000, 0.031731, 0.000547, 0.016482 ] ], "n": ["FDJVGXF01EUT0Q_rvcmp" ] }, {"p": [[156, -7044.040000, 0.984531, 0.017995, 0.016303 ], [169, -7048.190000, 0.015469, 0.015766, 0.018549 ] ], "n": ["FDJVGXF01D8ZRC" ] }, {"p": [[156, -7940.960000, 0.192084, 0.043598, 0.162312 ], [157, -7940.960000, 0.191852, 0.000006, 0.162323 ], [152, -7941.200000, 0.150875, 0.027190, 0.166036 ], [153, -7941.250000, 0.143757, 0.010694, 0.166671 ], [151, -7941.410000, 0.121927, 0.014659, 0.169808 ], [150, -7941.600000, 0.100815, 0.016562, 0.169695 ], [161, -7941.630000, 0.098690, 0.003142, 0.165592 ] ], "n": ["FDJVGXF01DD17R" ] }, {"p": [[156, -8450.420000, 0.963382, 0.026244, 0.029413 ], [169, -8453.690000, 0.036618, 0.012719, 0.033335 ] ], "n": ["FDJVGXF01DIEMZ" ] }, {"p": [[156, -8026.240000, 1.000000, 0.021424, 0.030421 ] ], "n": ["FDJVGXF01BTHJI" ] }, {"p": [[156, -8157.270000, 1.000000, 0.028362, 0.017192 ] ], "n": ["FDJVGXF01BOUVN" ] }, {"p": [[156, -7886.970000, 1.000000, 0.019536, 0.032334 ] ], "n": ["FDJVGXF01CV576" ] }, {"p": [[156, -7505.930000, 0.988029, 0.029827, 0.021579 ], [164, -7510.340000, 0.011971, 0.011055, 0.034218 ] ], "n": ["FDJVGXF01CPK4B" ] }, {"p": [[156, -4932.190000, 0.969805, 0.025642, 0.000008 ], [157, -4935.660000, 0.030195, 0.000006, 0.000006 ] ], "n": ["FDJVGXF01A50J2_rvcmp" ] }, {"p": [[156, -5751.870000, 0.925523, 0.023127, 0.030889 ], [169, -5754.550000, 0.063596, 0.014680, 0.038096 ], [154, -5756.320000, 0.010882, 0.030340, 0.040912 ] ], "n": ["FDJVGXF01CAXIU" ] }, {"p": [[156, -3368.160000, 0.206274, 0.000009, 0.000009 ], [155, -3368.260000, 0.186481, 0.012865, 0.000006 ], [157, -3368.260000, 0.186440, 0.000006, 0.000009 ], [169, -3368.680000, 0.122347, 0.000006, 0.000008 ], [168, -3368.680000, 0.122122, 0.003613, 0.000009 ], [154, -3369.010000, 0.088172, 0.030340, 0.000006 ], [170, -3369.010000, 0.088164, 0.000009, 0.000005 ] ], "n": ["FDJVGXF01DWGJY" ] }, {"p": [[158, -9036.680000, 0.932177, 0.006238, 0.026953 ], [160, -9039.300000, 0.067823, 0.003932, 0.029348 ] ], "n": ["FDJVGXF01A9Y23" ] }, {"p": [[158, -8531.270000, 0.844369, 0.010577, 0.025817 ], [160, -8532.960000, 0.155631, 0.004116, 0.031472 ] ], "n": ["FDJVGXF01ARWGQ_rvcmp" ] }, {"p": [[158, -5813.630000, 0.945899, 0.001957, 0.059647 ], [160, -5817.060000, 0.030814, 0.002770, 0.064356 ], [159, -5817.340000, 0.023287, 0.006775, 0.066761 ] ], "n": ["FDJVGXF01COJV0" ] }, {"p": [[158, -5112.460000, 0.229320, 0.007237, 0.447277 ], [167, -5112.770000, 0.168601, 0.023906, 0.428526 ], [149, -5112.970000, 0.138961, 0.063739, 0.444914 ], [170, -5112.970000, 0.138948, 0.018724, 0.444922 ], [171, -5112.970000, 0.138946, 0.000008, 0.444909 ], [166, -5113.300000, 0.099158, 0.001999, 0.477735 ], [159, -5113.440000, 0.086067, 0.000006, 0.485093 ] ], "n": ["FDJVGXF01DH8C7_rvcmp" ] }, {"p": [[158, -4581.990000, 0.311999, 0.004914, 0.291159 ], [159, -4582.470000, 0.191965, 0.011552, 0.311146 ], [160, -4582.470000, 0.191879, 0.000007, 0.311139 ], [149, -4583.160000, 0.096084, 0.045181, 0.225341 ], [150, -4583.490000, 0.069380, 0.016957, 0.245361 ], [154, -4583.490000, 0.069362, 0.000007, 0.245370 ], [171, -4583.490000, 0.069331, 0.000008, 0.244944 ] ], "n": ["FDJVGXF01D4AN8" ] }, {"p": [[158, -4581.990000, 0.311999, 0.004914, 0.291159 ], [159, -4582.470000, 0.191965, 0.011552, 0.311146 ], [160, -4582.470000, 0.191879, 0.000007, 0.311139 ], [149, -4583.160000, 0.096084, 0.045181, 0.225341 ], [150, -4583.490000, 0.069380, 0.016957, 0.245361 ], [154, -4583.490000, 0.069362, 0.000007, 0.245370 ], [171, -4583.490000, 0.069331, 0.000008, 0.244944 ] ], "n": ["FDJVGXF01EG76B" ] }, {"p": [[158, -4581.990000, 0.311999, 0.004914, 0.291159 ], [159, -4582.470000, 0.191965, 0.011552, 0.311146 ], [160, -4582.470000, 0.191879, 0.000007, 0.311139 ], [149, -4583.160000, 0.096084, 0.045181, 0.225341 ], [150, -4583.490000, 0.069380, 0.016957, 0.245361 ], [154, -4583.490000, 0.069362, 0.000007, 0.245370 ], [171, -4583.490000, 0.069331, 0.000008, 0.244944 ] ], "n": ["FDJVGXF01A0XE2" ] }, {"p": [[159, -8542.780000, 0.932740, 0.001412, 0.018049 ], [169, -8546.430000, 0.024153, 0.005425, 0.014448 ], [155, -8546.910000, 0.014930, 0.012455, 0.018731 ], [157, -8546.920000, 0.014872, 0.000006, 0.018693 ], [168, -8547.030000, 0.013304, 0.003612, 0.018783 ] ], "n": ["FDJVGXF01CTDOF_rvcmp" ] }, {"p": [[159, -6998.240000, 0.928119, 0.004795, 0.004597 ], [160, -7000.970000, 0.060594, 0.000007, 0.006671 ], [165, -7002.650000, 0.011287, 0.007352, 0.009290 ] ], "n": ["FDJVGXF01CLVU7" ] }, {"p": [[159, -6998.240000, 0.928119, 0.004795, 0.004597 ], [160, -7000.970000, 0.060594, 0.000007, 0.006671 ], [165, -7002.650000, 0.011287, 0.007352, 0.009290 ] ], "n": ["FDJVGXF01EYURC" ] }, {"p": [[159, -6998.240000, 0.928119, 0.004795, 0.004597 ], [160, -7000.970000, 0.060594, 0.000007, 0.006671 ], [165, -7002.650000, 0.011287, 0.007352, 0.009290 ] ], "n": ["FDJVGXF01EVEMN" ] }, {"p": [[159, -7568.320000, 0.990820, 0.001192, 0.016023 ], [165, -7573.000000, 0.009180, 0.003255, 0.015806 ] ], "n": ["FDJVGXF01DZWUU" ] }, {"p": [[159, -6052.700000, 0.985910, 0.000530, 0.021940 ], [165, -6056.950000, 0.014090, 0.002472, 0.021961 ] ], "n": ["FDJVGXF01ARS8Z" ] }, {"p": [[159, -5370.700000, 0.889906, 0.004818, 0.006163 ], [160, -5373.270000, 0.067538, 0.000007, 0.009471 ], [165, -5374.820000, 0.014437, 0.007352, 0.012499 ], [166, -5374.820000, 0.014398, 0.000008, 0.012500 ], [161, -5374.870000, 0.013721, 0.032465, 0.012493 ] ], "n": ["FDJVGXF01B9JIG_rvcmp" ] }, {"p": [[159, -4947.330000, 0.918133, 0.000006, 0.006578 ], [165, -4951.390000, 0.015839, 0.005224, 0.006110 ], [155, -4951.540000, 0.013611, 0.010797, 0.008971 ], [157, -4951.540000, 0.013582, 0.005887, 0.007789 ], [168, -4951.540000, 0.013576, 0.003612, 0.007779 ], [160, -4951.600000, 0.012778, 0.005934, 0.005993 ], [166, -4951.620000, 0.012482, 0.000008, 0.007409 ] ], "n": ["FDJVGXF01BHKG4_rvcmp" ] }, {"p": [[159, -4955.890000, 0.812681, 0.000006, 0.020157 ], [167, -4957.970000, 0.101618, 0.018717, 0.018124 ], [165, -4958.970000, 0.037247, 0.003907, 0.023138 ], [169, -4959.320000, 0.026334, 0.012507, 0.015444 ], [157, -4960.560000, 0.007588, 0.005887, 0.026436 ], [168, -4960.560000, 0.007588, 0.003613, 0.026437 ], [155, -4960.650000, 0.006944, 0.012865, 0.026740 ] ], "n": ["FDJVGXF01ELR2H_rvcmp" ] }, {"p": [[159, -4066.730000, 0.713471, 0.000006, 0.008048 ], [169, -4067.850000, 0.231738, 0.014337, 0.000006 ], [165, -4070.780000, 0.012421, 0.005354, 0.008859 ], [157, -4070.890000, 0.011088, 0.005887, 0.010452 ], [168, -4070.890000, 0.011083, 0.003612, 0.010461 ], [160, -4070.980000, 0.010104, 0.007224, 0.010084 ], [166, -4070.990000, 0.010095, 0.000008, 0.010256 ] ], "n": ["FDJVGXF01BHCBT_rvcmp" ] }, {"p": [[159, -4061.620000, 0.995177, 0.000006, 0.000006 ], [169, -4066.950000, 0.004823, 0.013046, 0.000006 ] ], "n": ["FDJVGXF01AZOG4_rvcmp" ] }, {"p": [[159, -3443.790000, 0.621391, 0.000006, 0.009450 ], [154, -3444.800000, 0.225733, 0.017821, 0.000006 ], [169, -3445.240000, 0.144701, 0.017012, 0.000007 ], [150, -3448.120000, 0.008175, 0.000742, 0.019032 ] ], "n": ["FDJVGXF01DA570_rvcmp" ] }, {"p": [[160, -7192.250000, 0.211070, 0.000007, 0.004300 ], [159, -7192.250000, 0.210865, 0.011552, 0.004306 ], [169, -7192.480000, 0.166924, 0.004577, 0.000005 ], [165, -7192.940000, 0.105617, 0.007352, 0.004333 ], [166, -7192.940000, 0.105350, 0.000008, 0.004333 ], [164, -7192.990000, 0.100122, 0.020699, 0.004324 ], [161, -7192.990000, 0.100052, 0.032465, 0.004323 ] ], "n": ["FDJVGXF01ETJB9" ] }, {"p": [[160, -8892.780000, 0.678355, 0.003001, 0.026701 ], [158, -8894.030000, 0.195054, 0.015228, 0.027971 ], [159, -8894.460000, 0.126591, 0.011552, 0.029900 ] ], "n": ["FDJVGXF01EU8BE" ] }, {"p": [[160, -8788.090000, 0.628820, 0.002934, 0.040213 ], [158, -8789.180000, 0.210606, 0.015393, 0.042175 ], [159, -8789.460000, 0.160574, 0.011552, 0.043977 ] ], "n": ["FDJVGXF01D07AB_rvcmp" ] }, {"p": [[160, -8392.660000, 0.688401, 0.003007, 0.023981 ], [158, -8393.940000, 0.192038, 0.015204, 0.025171 ], [159, -8394.410000, 0.119562, 0.011551, 0.027245 ] ], "n": ["FDJVGXF01CW7IC_rvcmp" ] }, {"p": [[160, -7585.130000, 0.360042, 0.002066, 0.181552 ], [158, -7585.160000, 0.346508, 0.011388, 0.183853 ], [159, -7585.330000, 0.293450, 0.011199, 0.186653 ] ], "n": ["FDJVGXF01A424Q" ] }, {"p": [[160, -6455.770000, 0.162556, 0.003397, 0.228094 ], [165, -6455.830000, 0.152105, 0.003926, 0.228200 ], [159, -6455.900000, 0.142856, 0.009976, 0.230720 ], [158, -6455.910000, 0.141520, 0.017418, 0.230701 ], [166, -6455.940000, 0.136905, 0.000008, 0.232599 ], [168, -6455.970000, 0.132620, 0.000007, 0.232950 ], [164, -6455.980000, 0.131436, 0.020696, 0.228464 ] ], "n": ["FDJVGXF01DD617_rvcmp" ] }, {"p": [[160, -3727.940000, 0.613450, 0.004383, 0.060260 ], [158, -3729.420000, 0.139129, 0.014806, 0.069386 ], [159, -3729.630000, 0.112835, 0.011552, 0.073669 ], [169, -3730.300000, 0.057607, 0.012311, 0.036944 ], [164, -3730.710000, 0.038366, 0.012850, 0.050574 ], [161, -3731.320000, 0.020798, 0.029300, 0.054239 ], [165, -3731.480000, 0.017815, 0.000007, 0.058462 ] ], "n": ["FDJVGXF01B33FQ" ] }, {"p": [[161, -8495.250000, 1.000000, 0.013932, 0.010939 ] ], "n": ["FDJVGXF01DQ8PK_rvcmp" ] }, {"p": [[161, -8394.210000, 0.775393, 0.026397, 0.005462 ], [165, -8396.150000, 0.111314, 0.001053, 0.008620 ], [164, -8396.230000, 0.103015, 0.020699, 0.009275 ], [159, -8398.530000, 0.010278, 0.005966, 0.012148 ] ], "n": ["FDJVGXF01AS3FJ" ] }, {"p": [[161, -7998.160000, 0.840548, 0.022222, 0.036180 ], [169, -8001.010000, 0.048555, 0.010237, 0.034509 ], [164, -8001.530000, 0.028973, 0.020699, 0.047130 ], [165, -8001.530000, 0.028956, 0.000007, 0.047128 ], [168, -8001.700000, 0.024439, 0.001107, 0.043464 ], [166, -8002.110000, 0.016195, 0.001999, 0.046240 ], [155, -8002.380000, 0.012336, 0.000006, 0.048614 ] ], "n": ["FDJVGXF01C2SQT_rvcmp" ] }, {"p": [[161, -9013.270000, 0.968884, 0.015180, 0.015739 ], [157, -9016.710000, 0.031116, 0.003472, 0.023588 ] ], "n": ["FDJVGXF01A1GA0" ] }, {"p": [[161, -6206.450000, 0.552176, 0.000007, 0.005202 ], [156, -6207.750000, 0.149290, 0.043594, 0.005125 ], [157, -6207.750000, 0.149274, 0.000006, 0.005126 ], [155, -6207.750000, 0.149260, 0.012864, 0.005126 ] ], "n": ["FDJVGXF01A256J_rvcmp" ] }, {"p": [[161, -5630.660000, 1.000000, 0.010894, 0.018145 ] ], "n": ["FDJVGXF01AS2WY_rvcmp" ] }, {"p": [[161, -4994.790000, 0.700340, 0.026141, 0.006909 ], [165, -4996.610000, 0.113123, 0.000008, 0.014344 ], [164, -4996.610000, 0.113045, 0.020699, 0.014346 ], [159, -4997.540000, 0.044543, 0.000006, 0.020090 ], [169, -4997.970000, 0.028949, 0.015647, 0.004757 ] ], "n": ["FDJVGXF01ARGFQ_rvcmp" ] }, {"p": [[161, -4982.390000, 0.905858, 0.025920, 0.000005 ], [165, -4985.350000, 0.047082, 0.000008, 0.003727 ], [164, -4985.350000, 0.047060, 0.020699, 0.003725 ] ], "n": ["FDJVGXF01DLG57" ] }, {"p": [[161, -4982.390000, 0.905858, 0.025920, 0.000005 ], [165, -4985.350000, 0.047082, 0.000008, 0.003727 ], [164, -4985.350000, 0.047060, 0.020699, 0.003725 ] ], "n": ["FDJVGXF01AEFP2" ] }, {"p": [[161, -7291.310000, 0.373441, 0.026980, 0.156572 ], [164, -7291.650000, 0.266476, 0.017955, 0.159797 ], [165, -7291.780000, 0.233991, 0.000007, 0.162231 ], [166, -7293.600000, 0.038012, 0.001999, 0.176984 ], [168, -7293.600000, 0.037981, 0.000007, 0.176980 ], [155, -7293.770000, 0.032106, 0.004739, 0.175935 ], [157, -7294.350000, 0.017993, 0.005887, 0.179634 ] ], "n": ["FDJVGXF01EO8BI_rvcmp" ] }, {"p": [[161, -4374.740000, 0.518755, 0.023666, 0.000007 ], [159, -4375.140000, 0.346898, 0.004411, 0.006254 ], [165, -4377.260000, 0.041486, 0.003676, 0.007237 ], [169, -4377.770000, 0.025039, 0.010859, 0.000009 ], [160, -4377.770000, 0.024864, 0.006981, 0.008990 ], [166, -4377.780000, 0.024816, 0.000008, 0.009402 ], [164, -4378.090000, 0.018142, 0.020699, 0.006849 ] ], "n": ["FDJVGXF01EKR2F" ] }, {"p": [[161, -7047.640000, 0.619269, 0.013304, 0.162386 ], [165, -7049.590000, 0.088116, 0.000007, 0.175950 ], [164, -7049.590000, 0.088045, 0.020699, 0.175958 ], [160, -7050.090000, 0.053578, 0.007381, 0.182682 ], [166, -7050.090000, 0.053552, 0.000008, 0.182695 ], [159, -7050.110000, 0.052502, 0.000006, 0.183253 ], [167, -7050.260000, 0.044939, 0.033973, 0.184594 ] ], "n": ["FDJVGXF01B07MY" ] }, {"p": [[161, -3175.110000, 0.951152, 0.024236, 0.000006 ], [164, -3178.780000, 0.024435, 0.020699, 0.006992 ], [165, -3178.780000, 0.024413, 0.000007, 0.007003 ] ], "n": ["FDJVGXF01DQEP4_rvcmp" ] }, {"p": [[161, -4067.170000, 0.914465, 0.024982, 0.000005 ], [165, -4070.230000, 0.042773, 0.000008, 0.006456 ], [164, -4070.230000, 0.042762, 0.020699, 0.006455 ] ], "n": ["FDJVGXF01CYHI1_rvcmp" ] }, {"p": [[161, -4067.170000, 0.914465, 0.024982, 0.000005 ], [165, -4070.230000, 0.042773, 0.000008, 0.006456 ], [164, -4070.230000, 0.042762, 0.020699, 0.006455 ] ], "n": ["FDJVGXF01EBZRV_rvcmp" ] }, {"p": [[161, -4229.040000, 1.000000, 0.005904, 0.028610 ] ], "n": ["FDJVGXF01BA6QW_rvcmp" ] }, {"p": [[161, -3866.160000, 0.618062, 0.025090, 0.000005 ], [159, -3866.810000, 0.324682, 0.000006, 0.008524 ], [164, -3869.150000, 0.031186, 0.020699, 0.007315 ], [165, -3869.330000, 0.026070, 0.002816, 0.005999 ] ], "n": ["FDJVGXF01D1JBL" ] }, {"p": [[161, -3607.280000, 1.000000, 0.003628, 0.010436 ] ], "n": ["FDJVGXF01E2A59_rvcmp" ] }, {"p": [[161, -6169.100000, 0.498806, 0.017709, 0.164975 ], [164, -6170.340000, 0.144797, 0.020699, 0.174954 ], [165, -6170.340000, 0.144726, 0.000007, 0.174961 ], [166, -6171.290000, 0.055755, 0.000008, 0.184401 ], [160, -6171.290000, 0.055702, 0.007381, 0.184409 ], [168, -6171.340000, 0.053375, 0.000007, 0.184722 ], [169, -6171.470000, 0.046840, 0.006367, 0.178465 ] ], "n": ["FDJVGXF01BWLKH_rvcmp" ] }, {"p": [[162, -6838.770000, 0.975351, 0.004054, 0.013034 ], [164, -6842.450000, 0.024649, 0.007643, 0.008987 ] ], "n": ["FDJVGXF01DALMR" ] }, {"p": [[162, -4722.670000, 0.337342, 0.000005, 0.225788 ], [163, -4722.670000, 0.336806, 0.000007, 0.225792 ], [164, -4723.290000, 0.180915, 0.000005, 0.236769 ], [150, -4724.420000, 0.058523, 0.000008, 0.265070 ], [161, -4724.700000, 0.044396, 0.015557, 0.240610 ], [165, -4725.350000, 0.022983, 0.000007, 0.267900 ], [154, -4725.540000, 0.019034, 0.000007, 0.271727 ] ], "n": ["FDJVGXF01B27AA" ] }, {"p": [[162, -4723.890000, 0.343597, 0.000005, 0.234764 ], [163, -4723.890000, 0.343050, 0.000007, 0.234767 ], [164, -4724.490000, 0.189588, 0.000005, 0.246051 ], [150, -4725.550000, 0.065657, 0.000008, 0.274790 ], [161, -4725.880000, 0.047070, 0.015729, 0.251220 ], [201, -4727.800000, 0.006878, 0.000009, 0.251761 ], [202, -4728.310000, 0.004161, 0.061774, 0.258122 ] ], "n": ["FDJVGXF01D4YQ1" ] }, {"p": [[164, -5550.060000, 0.900699, 0.007894, 0.012676 ], [162, -5553.160000, 0.040709, 0.010708, 0.022973 ], [163, -5553.160000, 0.040651, 0.006754, 0.022974 ], [155, -5553.980000, 0.017941, 0.006009, 0.024389 ] ], "n": ["FDJVGXF01BUGF0_rvcmp" ] }, {"p": [[164, -5683.770000, 0.825483, 0.012195, 0.005991 ], [155, -5685.320000, 0.174517, 0.008300, 0.011393 ] ], "n": ["FDJVGXF01D97BL_rvcmp" ] }, {"p": [[164, -5683.770000, 0.825483, 0.012195, 0.005991 ], [155, -5685.320000, 0.174517, 0.008300, 0.011393 ] ], "n": ["FDJVGXF01D4VRH_rvcmp" ] }, {"p": [[164, -7527.090000, 0.255544, 0.014989, 0.129580 ], [155, -7527.300000, 0.206866, 0.004847, 0.133944 ], [161, -7527.450000, 0.178279, 0.029713, 0.133233 ], [165, -7527.680000, 0.141941, 0.000007, 0.135995 ], [157, -7528.280000, 0.077262, 0.000006, 0.137809 ], [166, -7528.380000, 0.070078, 0.001999, 0.142445 ], [168, -7528.380000, 0.070030, 0.000007, 0.142445 ] ], "n": ["FDJVGXF01C3PES_rvcmp" ] }, {"p": [[164, -7151.620000, 0.295355, 0.014941, 0.123827 ], [161, -7152.000000, 0.201714, 0.029693, 0.127686 ], [165, -7152.250000, 0.158200, 0.000007, 0.130662 ], [155, -7152.370000, 0.139764, 0.004880, 0.131964 ], [166, -7152.970000, 0.076587, 0.001999, 0.137476 ], [168, -7152.970000, 0.076512, 0.000007, 0.137479 ], [157, -7153.360000, 0.051868, 0.000006, 0.135897 ] ], "n": ["FDJVGXF01DLGO6_rvcmp" ] }, {"p": [[164, -3757.020000, 0.503438, 0.013914, 0.009277 ], [169, -3757.830000, 0.225570, 0.012326, 0.000006 ], [161, -3758.360000, 0.132759, 0.032465, 0.014534 ], [165, -3758.360000, 0.132641, 0.000007, 0.014536 ], [168, -3761.520000, 0.005593, 0.003612, 0.026007 ] ], "n": ["FDJVGXF01C6KKI" ] }, {"p": [[165, -6176.870000, 0.421826, 0.005089, 0.016222 ], [167, -6177.570000, 0.207874, 0.026670, 0.016546 ], [168, -6178.180000, 0.113803, 0.000007, 0.018092 ], [166, -6178.180000, 0.113776, 0.001999, 0.018094 ], [160, -6179.040000, 0.048156, 0.005415, 0.021215 ], [158, -6179.050000, 0.047294, 0.017418, 0.022042 ], [159, -6179.050000, 0.047272, 0.011552, 0.022042 ] ], "n": ["FDJVGXF01D027R_rvcmp" ] }, {"p": [[165, -5414.350000, 0.229090, 0.005750, 0.000006 ], [166, -5414.520000, 0.194957, 0.000008, 0.000006 ], [160, -5414.520000, 0.194827, 0.007381, 0.000006 ], [167, -5414.600000, 0.179701, 0.033973, 0.000006 ], [168, -5414.600000, 0.179649, 0.000007, 0.000006 ], [169, -5417.160000, 0.013819, 0.000006, 0.000006 ], [158, -5417.710000, 0.007958, 0.017418, 0.002107 ] ], "n": ["FDJVGXF01DXHE5_rvcmp" ] }, {"p": [[165, -6501.580000, 0.177577, 0.003466, 0.193929 ], [164, -6501.730000, 0.153458, 0.020699, 0.194264 ], [161, -6501.730000, 0.153396, 0.032465, 0.194270 ], [166, -6501.760000, 0.148655, 0.000008, 0.198777 ], [160, -6501.760000, 0.148504, 0.007381, 0.198776 ], [168, -6501.790000, 0.144317, 0.000007, 0.199009 ], [169, -6502.460000, 0.074094, 0.009563, 0.190624 ] ], "n": ["FDJVGXF01E3DCK_rvcmp" ] }, {"p": [[167, -7819.850000, 1.000000, 0.016748, 0.054861 ] ], "n": ["FDJVGXF01DDYJ5_rvcmp" ] }, {"p": [[167, -7819.850000, 1.000000, 0.016748, 0.054861 ] ], "n": ["FDJVGXF01ATROJ_rvcmp" ] }, {"p": [[167, -7793.760000, 1.000000, 0.013598, 0.039140 ] ], "n": ["FDJVGXF01DYDVU" ] }, {"p": [[167, -8252.900000, 1.000000, 0.016413, 0.037819 ] ], "n": ["FDJVGXF01BSD6A" ] }, {"p": [[167, -7282.000000, 0.370541, 0.023082, 0.080586 ], [158, -7282.230000, 0.294312, 0.013941, 0.085157 ], [160, -7283.310000, 0.099315, 0.002620, 0.087322 ], [159, -7283.510000, 0.081898, 0.011552, 0.089460 ], [154, -7283.790000, 0.061892, 0.017615, 0.082518 ], [165, -7284.080000, 0.046049, 0.007352, 0.090987 ], [166, -7284.080000, 0.045993, 0.000008, 0.090994 ] ], "n": ["FDJVGXF01EGVNK_rvcmp" ] }, {"p": [[167, -7394.210000, 0.381657, 0.018893, 0.031414 ], [158, -7394.320000, 0.343279, 0.000009, 0.038715 ], [169, -7395.760000, 0.081009, 0.007403, 0.034166 ], [156, -7396.150000, 0.054934, 0.040755, 0.037894 ], [157, -7396.320000, 0.046602, 0.005887, 0.040976 ], [168, -7396.320000, 0.046539, 0.003613, 0.040977 ], [155, -7396.330000, 0.045979, 0.012864, 0.040981 ] ], "n": ["FDJVGXF01DE4E1" ] }, {"p": [[167, -6294.240000, 0.474035, 0.000008, 1.391180 ], [26, -6295.260000, 0.171650, 0.024915, 1.742300 ], [73, -6296.060000, 0.076706, 0.028578, 1.607230 ], [72, -6296.140000, 0.071414, 0.263281, 1.638850 ], [71, -6296.140000, 0.071409, 0.079029, 1.638870 ], [148, -6296.190000, 0.067394, 0.148117, 1.462050 ], [127, -6296.190000, 0.067392, 0.040911, 1.462060 ] ], "n": ["FDJVGXF01BGO8N_rvcmp" ] }, {"p": [[167, -2380.180000, 0.552422, 0.017055, 0.033289 ], [23, -2381.930000, 0.096157, 0.000007, 0.050451 ], [24, -2381.930000, 0.096156, 0.000009, 0.050451 ], [158, -2382.330000, 0.063889, 0.008393, 0.062730 ], [159, -2382.330000, 0.063856, 0.005298, 0.062798 ], [160, -2382.340000, 0.063825, 0.000007, 0.062847 ], [166, -2382.340000, 0.063695, 0.000008, 0.062759 ] ], "n": ["FDJVGXF01AJDEO_rvcmp" ] }, {"p": [[168, -7376.950000, 0.380124, 0.002136, 0.004098 ], [169, -7377.620000, 0.194927, 0.000007, 0.004057 ], [157, -7377.620000, 0.194834, 0.005887, 0.004058 ], [156, -7377.710000, 0.178257, 0.034979, 0.000006 ], [166, -7378.940000, 0.051859, 0.001999, 0.006018 ] ], "n": ["FDJVGXF01BZPLE" ] }, {"p": [[168, -7243.450000, 0.474199, 0.002101, 0.000009 ], [169, -7244.170000, 0.230915, 0.000005, 0.000007 ], [157, -7244.170000, 0.230721, 0.005887, 0.000009 ], [166, -7245.850000, 0.043342, 0.001999, 0.000006 ], [156, -7247.270000, 0.010420, 0.043598, 0.000006 ], [155, -7247.270000, 0.010403, 0.012864, 0.000009 ] ], "n": ["FDJVGXF01EVTOH_rvcmp" ] }, {"p": [[168, -7808.700000, 0.391834, 0.002737, 0.008242 ], [169, -7809.060000, 0.274885, 0.000005, 0.008441 ], [157, -7809.060000, 0.274839, 0.005887, 0.008441 ], [156, -7811.660000, 0.020309, 0.043598, 0.010116 ], [155, -7811.660000, 0.020296, 0.012864, 0.010110 ], [166, -7812.130000, 0.012696, 0.001999, 0.010662 ], [165, -7813.040000, 0.005142, 0.005116, 0.009763 ] ], "n": ["FDJVGXF01C1PAH" ] }, {"p": [[168, -8106.150000, 0.373918, 0.002754, 0.016079 ], [169, -8106.440000, 0.278475, 0.001721, 0.014961 ], [157, -8106.470000, 0.272040, 0.005887, 0.016372 ], [156, -8108.830000, 0.025702, 0.043598, 0.018777 ], [155, -8108.830000, 0.025691, 0.012865, 0.018779 ], [166, -8109.190000, 0.017861, 0.001999, 0.019159 ], [165, -8110.230000, 0.006313, 0.004985, 0.018711 ] ], "n": ["FDJVGXF01CA81S_rvcmp" ] }, {"p": [[168, -7944.410000, 0.403745, 0.002713, 0.003873 ], [169, -7944.790000, 0.274686, 0.000005, 0.004038 ], [157, -7944.790000, 0.274629, 0.005887, 0.004038 ], [156, -7947.610000, 0.016425, 0.043598, 0.005104 ], [155, -7947.610000, 0.016414, 0.012864, 0.005105 ], [166, -7948.140000, 0.009662, 0.001999, 0.005427 ], [165, -7948.920000, 0.004439, 0.005207, 0.004606 ] ], "n": ["FDJVGXF01DT4AR_rvcmp" ] }, {"p": [[168, -7341.430000, 0.501062, 0.001912, 0.000009 ], [169, -7342.290000, 0.212390, 0.000005, 0.000007 ], [157, -7342.290000, 0.212203, 0.005887, 0.000009 ], [166, -7343.660000, 0.053927, 0.001896, 0.000006 ], [156, -7345.260000, 0.010879, 0.039706, 0.000006 ], [155, -7345.390000, 0.009539, 0.012864, 0.000009 ] ], "n": ["FDJVGXF01CCEGB_rvcmp" ] }, {"p": [[168, -7205.520000, 0.333633, 0.002093, 0.004340 ], [169, -7205.710000, 0.276059, 0.011517, 0.000006 ], [170, -7206.210000, 0.166604, 0.000009, 0.000006 ], [157, -7206.220000, 0.166329, 0.005887, 0.004433 ], [166, -7207.470000, 0.047606, 0.001999, 0.006080 ], [156, -7209.050000, 0.009769, 0.043598, 0.005603 ] ], "n": ["FDJVGXF01E3W9Q_rvcmp" ] }, {"p": [[168, -6921.580000, 0.474224, 0.002096, 0.000009 ], [169, -6922.300000, 0.230878, 0.000005, 0.000007 ], [157, -6922.300000, 0.230687, 0.005887, 0.000009 ], [166, -6923.980000, 0.043349, 0.001999, 0.000006 ], [156, -6925.400000, 0.010440, 0.043598, 0.000006 ], [155, -6925.400000, 0.010423, 0.012864, 0.000009 ] ], "n": ["FDJVGXF01D7MRO" ] }, {"p": [[168, -6921.580000, 0.474224, 0.002096, 0.000009 ], [169, -6922.300000, 0.230878, 0.000005, 0.000007 ], [157, -6922.300000, 0.230687, 0.005887, 0.000009 ], [166, -6923.980000, 0.043349, 0.001999, 0.000006 ], [156, -6925.400000, 0.010440, 0.043598, 0.000006 ], [155, -6925.400000, 0.010423, 0.012864, 0.000009 ] ], "n": ["FDJVGXF01A8SQ3" ] }, {"p": [[168, -6921.580000, 0.474224, 0.002096, 0.000009 ], [169, -6922.300000, 0.230878, 0.000005, 0.000007 ], [157, -6922.300000, 0.230687, 0.005887, 0.000009 ], [166, -6923.980000, 0.043349, 0.001999, 0.000006 ], [156, -6925.400000, 0.010440, 0.043598, 0.000006 ], [155, -6925.400000, 0.010423, 0.012864, 0.000009 ] ], "n": ["FDJVGXF01CEVXD" ] }, {"p": [[168, -7469.280000, 0.508581, 0.001867, 0.000009 ], [169, -7470.180000, 0.208215, 0.000005, 0.000007 ], [157, -7470.180000, 0.208120, 0.005887, 0.000009 ], [166, -7471.470000, 0.056820, 0.001895, 0.000006 ], [156, -7473.300000, 0.009198, 0.042695, 0.000006 ], [155, -7473.310000, 0.009065, 0.012864, 0.000009 ] ], "n": ["FDJVGXF01B6BK0" ] }, {"p": [[168, -7342.220000, 0.508640, 0.001867, 0.000009 ], [169, -7343.120000, 0.208176, 0.000005, 0.000007 ], [157, -7343.120000, 0.208083, 0.005887, 0.000009 ], [166, -7344.410000, 0.056839, 0.001895, 0.000006 ], [156, -7346.240000, 0.009198, 0.042684, 0.000006 ], [155, -7346.250000, 0.009063, 0.012864, 0.000009 ] ], "n": ["FDJVGXF01AP6X8_rvcmp" ] }, {"p": [[168, -6783.890000, 0.453762, 0.002085, 0.004608 ], [169, -6784.590000, 0.226440, 0.000005, 0.004715 ], [157, -6784.590000, 0.226282, 0.005887, 0.004719 ], [166, -6785.810000, 0.066451, 0.001999, 0.006491 ], [156, -6787.400000, 0.013538, 0.043598, 0.005994 ], [155, -6787.410000, 0.013527, 0.012864, 0.005995 ] ], "n": ["FDJVGXF01CWS9R_rvcmp" ] }, {"p": [[168, -6793.990000, 0.401006, 0.002720, 0.004654 ], [169, -6794.370000, 0.274802, 0.000005, 0.004850 ], [157, -6794.370000, 0.274732, 0.005887, 0.004851 ], [156, -6797.130000, 0.017287, 0.043598, 0.006315 ], [155, -6797.140000, 0.017274, 0.012864, 0.006316 ], [166, -6797.650000, 0.010315, 0.001999, 0.006838 ], [165, -6798.460000, 0.004584, 0.005176, 0.005758 ] ], "n": ["FDJVGXF01BIS5A" ] }, {"p": [[168, -5481.210000, 0.393179, 0.002123, 0.005606 ], [169, -5481.880000, 0.201446, 0.000007, 0.005637 ], [157, -5481.880000, 0.201366, 0.005887, 0.005639 ], [156, -5482.230000, 0.142326, 0.034851, 0.000006 ], [166, -5483.060000, 0.061683, 0.001999, 0.008571 ] ], "n": ["FDJVGXF01CK4HZ_rvcmp" ] }, {"p": [[169, -7890.220000, 0.836287, 0.005637, 0.004195 ], [168, -7892.380000, 0.095821, 0.002767, 0.006554 ], [157, -7892.730000, 0.067892, 0.005887, 0.006678 ] ], "n": ["FDJVGXF01DDX2Q" ] }, {"p": [[169, -7135.180000, 0.372418, 0.013024, 0.001964 ], [168, -7135.600000, 0.245804, 0.002073, 0.013226 ], [157, -7136.240000, 0.128543, 0.005887, 0.013458 ], [170, -7136.320000, 0.118738, 0.000009, 0.000006 ], [156, -7136.740000, 0.078120, 0.023734, 0.011522 ], [166, -7137.070000, 0.056377, 0.001999, 0.016017 ] ], "n": ["FDJVGXF01A1M91_rvcmp" ] }, {"p": [[169, -7832.860000, 0.832542, 0.005567, 0.004342 ], [168, -7835.000000, 0.097986, 0.002767, 0.006655 ], [157, -7835.340000, 0.069471, 0.005887, 0.006781 ] ], "n": ["FDJVGXF01BZ3K6" ] }, {"p": [[169, -9192.910000, 0.669984, 0.019992, 0.099478 ], [170, -9194.330000, 0.162186, 0.000009, 0.101826 ], [154, -9194.330000, 0.162120, 0.030340, 0.101833 ], [149, -9197.670000, 0.005710, 0.045329, 0.084529 ] ], "n": ["FDJVGXF01DR66X_rvcmp" ] }, {"p": [[169, -7221.840000, 0.453381, 0.015762, 0.000006 ], [170, -7222.260000, 0.299408, 0.004074, 0.000005 ], [156, -7222.540000, 0.225109, 0.021859, 0.003763 ], [171, -7225.070000, 0.018045, 0.000008, 0.002259 ], [157, -7226.560000, 0.004057, 0.004604, 0.005047 ] ], "n": ["FDJVGXF01DLFZ5_rvcmp" ] }, {"p": [[169, -8322.520000, 0.725974, 0.015607, 0.008671 ], [154, -8324.190000, 0.137148, 0.030340, 0.010608 ], [170, -8324.190000, 0.136878, 0.000009, 0.010610 ] ], "n": ["FDJVGXF01BYRHV_rvcmp" ] }, {"p": [[169, -8459.780000, 0.578540, 0.010578, 0.037236 ], [154, -8460.300000, 0.341665, 0.020053, 0.034242 ], [168, -8462.590000, 0.034693, 0.003612, 0.043790 ], [161, -8463.540000, 0.013435, 0.024284, 0.044690 ], [160, -8463.720000, 0.011245, 0.006055, 0.047821 ], [166, -8463.810000, 0.010230, 0.000282, 0.048569 ], [165, -8463.820000, 0.010192, 0.007352, 0.048516 ] ], "n": ["FDJVGXF01AM4AD_rvcmp" ] }, {"p": [[169, -6471.260000, 0.664118, 0.013160, 0.000008 ], [170, -6472.780000, 0.145363, 0.000009, 0.000084 ], [157, -6473.400000, 0.078067, 0.005887, 0.009379 ], [168, -6473.400000, 0.078001, 0.003613, 0.009378 ], [156, -6474.420000, 0.028150, 0.036582, 0.009421 ], [166, -6475.910000, 0.006301, 0.001668, 0.012321 ] ], "n": ["FDJVGXF01EG01C" ] }, {"p": [[169, -7245.180000, 0.718688, 0.009227, 0.014142 ], [159, -7246.890000, 0.129591, 0.007927, 0.018815 ], [160, -7248.010000, 0.042390, 0.000007, 0.021796 ], [157, -7248.060000, 0.040165, 0.005887, 0.016048 ], [168, -7248.060000, 0.040150, 0.003613, 0.016057 ], [164, -7248.940000, 0.016658, 0.014353, 0.019064 ], [165, -7249.240000, 0.012358, 0.007352, 0.023266 ] ], "n": ["FDJVGXF01AGMX4_rvcmp" ] }, {"p": [[169, -7212.620000, 0.373919, 0.007352, 0.009064 ], [155, -7213.310000, 0.187631, 0.011303, 0.014999 ], [157, -7213.360000, 0.179038, 0.000006, 0.014947 ], [168, -7213.460000, 0.161489, 0.003613, 0.015025 ], [165, -7214.430000, 0.061505, 0.004066, 0.013150 ], [167, -7215.590000, 0.019251, 0.032083, 0.015305 ], [166, -7215.700000, 0.017167, 0.001999, 0.015890 ] ], "n": ["FDJVGXF01B0W9G_rvcmp" ] }, {"p": [[169, -7212.620000, 0.373919, 0.007352, 0.009064 ], [155, -7213.310000, 0.187631, 0.011303, 0.014999 ], [157, -7213.360000, 0.179038, 0.000006, 0.014947 ], [168, -7213.460000, 0.161489, 0.003613, 0.015025 ], [165, -7214.430000, 0.061505, 0.004066, 0.013150 ], [167, -7215.590000, 0.019251, 0.032083, 0.015305 ], [166, -7215.700000, 0.017167, 0.001999, 0.015890 ] ], "n": ["FDJVGXF01DPKAW_rvcmp" ] }, {"p": [[169, -7083.240000, 0.697960, 0.012060, 0.027418 ], [167, -7085.190000, 0.099132, 0.019595, 0.030412 ], [158, -7085.540000, 0.069859, 0.000009, 0.039164 ], [154, -7085.740000, 0.057435, 0.025688, 0.028309 ], [170, -7085.910000, 0.048044, 0.000707, 0.028503 ], [157, -7087.130000, 0.014198, 0.004538, 0.039627 ], [159, -7087.190000, 0.013371, 0.005607, 0.036686 ] ], "n": ["FDJVGXF01BTULW" ] }, {"p": [[169, -5220.230000, 0.653058, 0.012382, 0.013599 ], [163, -5221.540000, 0.175109, 0.000007, 0.024457 ], [154, -5221.830000, 0.131600, 0.030340, 0.018308 ], [168, -5223.740000, 0.019418, 0.003612, 0.016044 ], [160, -5224.270000, 0.011504, 0.000007, 0.025924 ], [164, -5224.480000, 0.009312, 0.012209, 0.020770 ] ], "n": ["FDJVGXF01DD6V5_rvcmp" ] }, {"p": [[169, -5223.070000, 0.447610, 0.013991, 0.018289 ], [154, -5223.590000, 0.267726, 0.022877, 0.018556 ], [170, -5224.300000, 0.131798, 0.000009, 0.022347 ], [163, -5224.330000, 0.127631, 0.000007, 0.030849 ], [168, -5226.850000, 0.010199, 0.003612, 0.023857 ], [160, -5226.990000, 0.008883, 0.000007, 0.032660 ], [164, -5227.360000, 0.006152, 0.013389, 0.028987 ] ], "n": ["FDJVGXF01BGLYC_rvcmp" ] }, {"p": [[169, -5223.070000, 0.447610, 0.013991, 0.018289 ], [154, -5223.590000, 0.267726, 0.022877, 0.018556 ], [170, -5224.300000, 0.131798, 0.000009, 0.022347 ], [163, -5224.330000, 0.127631, 0.000007, 0.030849 ], [168, -5226.850000, 0.010199, 0.003612, 0.023857 ], [160, -5226.990000, 0.008883, 0.000007, 0.032660 ], [164, -5227.360000, 0.006152, 0.013389, 0.028987 ] ], "n": ["FDJVGXF01B6IAB_rvcmp" ] }, {"p": [[169, -5221.500000, 0.372691, 0.009266, 0.015173 ], [160, -5222.360000, 0.157881, 0.000007, 0.024789 ], [159, -5222.360000, 0.157733, 0.011552, 0.024789 ], [164, -5222.870000, 0.094793, 0.015388, 0.022994 ], [165, -5223.020000, 0.082068, 0.007352, 0.025005 ], [166, -5223.020000, 0.081880, 0.000008, 0.025006 ], [168, -5223.450000, 0.052955, 0.003612, 0.021364 ] ], "n": ["FDJVGXF01CU2T7_rvcmp" ] }, {"p": [[169, -5560.040000, 0.726153, 0.013593, 0.023332 ], [164, -5561.700000, 0.137767, 0.012782, 0.033840 ], [156, -5563.010000, 0.037181, 0.043598, 0.044062 ], [157, -5563.010000, 0.037159, 0.000006, 0.044061 ], [155, -5563.010000, 0.037158, 0.012865, 0.044061 ], [165, -5563.430000, 0.024581, 0.000007, 0.043237 ] ], "n": ["FDJVGXF01CW0CE_rvcmp" ] }, {"p": [[169, -4990.570000, 0.534162, 0.009642, 0.000009 ], [154, -4991.750000, 0.165442, 0.024687, 0.000006 ], [167, -4992.520000, 0.076062, 0.029173, 0.006073 ], [157, -4992.770000, 0.059599, 0.005887, 0.006505 ], [168, -4992.770000, 0.059585, 0.003613, 0.006504 ], [155, -4992.810000, 0.057312, 0.011294, 0.007654 ], [166, -4992.990000, 0.047838, 0.001999, 0.006817 ] ], "n": ["FDJVGXF01CTZ07_rvcmp" ] }, {"p": [[169, -7392.300000, 0.216786, 0.011305, 0.192696 ], [166, -7392.730000, 0.140588, 0.001999, 0.207593 ], [168, -7392.730000, 0.140459, 0.000007, 0.207590 ], [165, -7392.730000, 0.139881, 0.005758, 0.205348 ], [160, -7392.750000, 0.138113, 0.006370, 0.206129 ], [161, -7392.760000, 0.136381, 0.027043, 0.199712 ], [157, -7393.200000, 0.087792, 0.000006, 0.206582 ] ], "n": ["FDJVGXF01AG6LK_rvcmp" ] }, {"p": [[169, -4840.700000, 0.529420, 0.009646, 0.000009 ], [154, -4841.880000, 0.164050, 0.024688, 0.000006 ], [167, -4842.630000, 0.077443, 0.029173, 0.006321 ], [157, -4842.870000, 0.060764, 0.005887, 0.006784 ], [168, -4842.870000, 0.060749, 0.003613, 0.006783 ], [155, -4842.900000, 0.058733, 0.011286, 0.007930 ], [166, -4843.090000, 0.048841, 0.001999, 0.007107 ] ], "n": ["FDJVGXF01ELS0N_rvcmp" ] }, {"p": [[169, -4842.470000, 0.372109, 0.014293, 0.000007 ], [154, -4842.950000, 0.230588, 0.024183, 0.000006 ], [159, -4843.210000, 0.177811, 0.000006, 0.013647 ], [170, -4843.320000, 0.158634, 0.000009, 0.000006 ], [156, -4844.930000, 0.031597, 0.038090, 0.007608 ], [167, -4845.700000, 0.014725, 0.030022, 0.009797 ], [168, -4845.710000, 0.014536, 0.003612, 0.009767 ] ], "n": ["FDJVGXF01A9RP7_rvcmp" ] }, {"p": [[169, -4842.470000, 0.372109, 0.014293, 0.000007 ], [154, -4842.950000, 0.230588, 0.024183, 0.000006 ], [159, -4843.210000, 0.177811, 0.000006, 0.013647 ], [170, -4843.320000, 0.158634, 0.000009, 0.000006 ], [156, -4844.930000, 0.031597, 0.038090, 0.007608 ], [167, -4845.700000, 0.014725, 0.030022, 0.009797 ], [168, -4845.710000, 0.014536, 0.003612, 0.009767 ] ], "n": ["FDJVGXF01CLCFZ_rvcmp" ] }, {"p": [[169, -4842.470000, 0.372109, 0.014293, 0.000007 ], [154, -4842.950000, 0.230588, 0.024183, 0.000006 ], [159, -4843.210000, 0.177811, 0.000006, 0.013647 ], [170, -4843.320000, 0.158634, 0.000009, 0.000006 ], [156, -4844.930000, 0.031597, 0.038090, 0.007608 ], [167, -4845.700000, 0.014725, 0.030022, 0.009797 ], [168, -4845.710000, 0.014536, 0.003612, 0.009767 ] ], "n": ["FDJVGXF01CZDGO_rvcmp" ] }, {"p": [[169, -5860.190000, 0.187111, 0.012970, 0.272142 ], [159, -5860.190000, 0.185780, 0.000006, 0.292178 ], [161, -5860.290000, 0.169015, 0.020089, 0.290334 ], [160, -5860.620000, 0.121356, 0.003502, 0.293666 ], [165, -5860.670000, 0.114941, 0.004630, 0.294351 ], [158, -5860.710000, 0.111391, 0.017422, 0.296263 ], [166, -5860.710000, 0.110405, 0.000008, 0.298244 ] ], "n": ["FDJVGXF01CH0SV" ] }, {"p": [[169, -5860.190000, 0.187111, 0.012970, 0.272142 ], [159, -5860.190000, 0.185780, 0.000006, 0.292178 ], [161, -5860.290000, 0.169015, 0.020089, 0.290334 ], [160, -5860.620000, 0.121356, 0.003502, 0.293666 ], [165, -5860.670000, 0.114941, 0.004630, 0.294351 ], [158, -5860.710000, 0.111391, 0.017422, 0.296263 ], [166, -5860.710000, 0.110405, 0.000008, 0.298244 ] ], "n": ["FDJVGXF01AYKEW" ] }, {"p": [[169, -5860.190000, 0.187111, 0.012970, 0.272142 ], [159, -5860.190000, 0.185780, 0.000006, 0.292178 ], [161, -5860.290000, 0.169015, 0.020089, 0.290334 ], [160, -5860.620000, 0.121356, 0.003502, 0.293666 ], [165, -5860.670000, 0.114941, 0.004630, 0.294351 ], [158, -5860.710000, 0.111391, 0.017422, 0.296263 ], [166, -5860.710000, 0.110405, 0.000008, 0.298244 ] ], "n": ["FDJVGXF01A24F8" ] }, {"p": [[170, -3177.370000, 0.281475, 0.008380, 0.123334 ], [198, -3177.960000, 0.155176, 0.000006, 0.124473 ], [169, -3178.090000, 0.136259, 0.016880, 0.127857 ], [149, -3178.120000, 0.132837, 0.014240, 0.119503 ], [127, -3178.160000, 0.127962, 0.040911, 0.120931 ], [154, -3178.500000, 0.091291, 0.026654, 0.129278 ], [196, -3178.690000, 0.075001, 0.044805, 0.116176 ] ], "n": ["FDJVGXF01AJKD3" ] }, {"p": [[174, -7929.590000, 0.271058, 0.000006, 0.329694 ], [177, -7929.730000, 0.235609, 0.002254, 0.326993 ], [173, -7930.430000, 0.116828, 0.022616, 0.330974 ], [183, -7930.430000, 0.116799, 0.000009, 0.330961 ], [182, -7930.440000, 0.116754, 0.007651, 0.330975 ], [176, -7930.820000, 0.079138, 0.001771, 0.331855 ], [178, -7931.040000, 0.063813, 0.000008, 0.336649 ] ], "n": ["FDJVGXF01BJZDD" ] }, {"p": [[175, -3927.680000, 0.190319, 0.002821, 0.179142 ], [174, -3927.820000, 0.166400, 0.006047, 0.171038 ], [176, -3927.820000, 0.166369, 0.000006, 0.171032 ], [185, -3928.140000, 0.120812, 0.000001, 0.179373 ], [184, -3928.140000, 0.120793, 0.000001, 0.179367 ], [177, -3928.160000, 0.117690, 0.017452, 0.167512 ], [178, -3928.160000, 0.117617, 0.000008, 0.167514 ] ], "n": ["FDJVGXF01EC7MM" ] }, {"p": [[175, -3678.710000, 0.215352, 0.003486, 0.147520 ], [174, -3678.860000, 0.186902, 0.000005, 0.135223 ], [176, -3678.860000, 0.186412, 0.000006, 0.141269 ], [177, -3679.250000, 0.126622, 0.000008, 0.121227 ], [178, -3679.250000, 0.125667, 0.000008, 0.138677 ], [181, -3679.710000, 0.079523, 0.037176, 0.138259 ], [182, -3679.710000, 0.079522, 0.000007, 0.138252 ] ], "n": ["FDJVGXF01CV5NL" ] }, {"p": [[182, -7174.310000, 0.311206, 0.000007, 0.004305 ], [178, -7174.310000, 0.310757, 0.004073, 0.004305 ], [183, -7175.110000, 0.138948, 0.002135, 0.003858 ], [173, -7175.130000, 0.137370, 0.022616, 0.004331 ], [172, -7176.190000, 0.047495, 0.005527, 0.003972 ], [187, -7176.420000, 0.037531, 0.005300, 0.000056 ], [176, -7177.230000, 0.016692, 0.006160, 0.005217 ] ], "n": ["FDJVGXF01C64GQ_rvcmp" ] }, {"p": [[183, -8665.400000, 0.198031, 0.000009, 0.003816 ], [173, -8665.400000, 0.198023, 0.022616, 0.003807 ], [182, -8665.400000, 0.197603, 0.007651, 0.003815 ], [186, -8665.440000, 0.188943, 0.008949, 0.003867 ], [187, -8665.440000, 0.188873, 0.000005, 0.003867 ], [184, -8668.030000, 0.014264, 0.000001, 0.007556 ], [185, -8668.030000, 0.014264, 0.000001, 0.007556 ] ], "n": ["FDJVGXF01ED316_rvcmp" ] }, {"p": [[185, -3387.720000, 0.171275, 0.000001, 0.237838 ], [184, -3387.720000, 0.171252, 0.000001, 0.237842 ], [186, -3387.720000, 0.171098, 0.000009, 0.237846 ], [175, -3387.850000, 0.150387, 0.000005, 0.257219 ], [121, -3388.050000, 0.123056, 0.000005, 0.326285 ], [174, -3388.190000, 0.106483, 0.003468, 0.243596 ], [176, -3388.190000, 0.106450, 0.000006, 0.246176 ] ], "n": ["FDJVGXF01A2O3J" ] }, {"p": [[186, -5792.700000, 0.230693, 0.003018, 0.213319 ], [185, -5792.850000, 0.198883, 0.000001, 0.219276 ], [184, -5792.850000, 0.198852, 0.000001, 0.219276 ], [187, -5793.180000, 0.143783, 0.000005, 0.212270 ], [183, -5793.180000, 0.143703, 0.017940, 0.212274 ], [175, -5794.140000, 0.054627, 0.000005, 0.244408 ], [188, -5794.760000, 0.029459, 0.000006, 0.218280 ] ], "n": ["FDJVGXF01A3V1Q" ] }, {"p": [[188, -8682.220000, 0.457407, 0.029949, 0.096016 ], [187, -8683.330000, 0.150678, 0.003342, 0.118691 ], [183, -8683.640000, 0.109921, 0.013947, 0.114423 ], [32, -8683.960000, 0.079919, 0.003944, 0.112708 ], [186, -8684.070000, 0.071587, 0.006865, 0.120508 ], [30, -8684.150000, 0.065864, 0.000006, 0.116524 ], [31, -8684.170000, 0.064624, 0.001925, 0.116524 ] ], "n": ["FDJVGXF01CAHH6" ] }, {"p": [[188, -7244.070000, 0.822138, 0.025533, 0.112825 ], [187, -7246.600000, 0.065583, 0.008328, 0.134491 ], [172, -7246.890000, 0.049158, 0.006306, 0.138336 ], [189, -7247.280000, 0.033277, 0.091953, 0.119600 ], [190, -7247.390000, 0.029844, 0.000008, 0.123507 ] ], "n": ["FDJVGXF01EIVTC" ] }, {"p": [[188, -6069.730000, 0.360069, 0.019094, 0.109199 ], [172, -6070.350000, 0.194647, 0.003487, 0.121334 ], [187, -6070.350000, 0.193736, 0.011025, 0.123791 ], [175, -6071.140000, 0.088305, 0.000005, 0.144535 ], [189, -6071.610000, 0.054841, 0.096145, 0.111549 ], [190, -6071.620000, 0.054817, 0.000008, 0.111557 ], [174, -6071.640000, 0.053584, 0.002409, 0.138643 ] ], "n": ["FDJVGXF01AP96B_rvcmp" ] }, {"p": [[188, -4715.760000, 0.579848, 0.020031, 0.102407 ], [187, -4717.290000, 0.124698, 0.011025, 0.137579 ], [172, -4717.290000, 0.124641, 0.008421, 0.137572 ], [186, -4718.330000, 0.044225, 0.008949, 0.147261 ], [183, -4718.330000, 0.044225, 0.017940, 0.147267 ], [184, -4718.400000, 0.041182, 0.000001, 0.148401 ], [185, -4718.400000, 0.041182, 0.000001, 0.148401 ] ], "n": ["FDJVGXF01DTFHM" ] }, {"p": [[188, -3644.130000, 0.345454, 0.048087, 0.043702 ], [189, -3644.190000, 0.327314, 0.096145, 0.044900 ], [190, -3644.190000, 0.327232, 0.000008, 0.044906 ] ], "n": ["FDJVGXF01C4DZ8" ] }, {"p": [[188, -6165.230000, 0.275797, 0.042962, 0.284427 ], [190, -6165.330000, 0.250360, 0.000008, 0.284607 ], [189, -6165.330000, 0.250352, 0.096145, 0.284599 ], [185, -6166.690000, 0.064387, 0.000001, 0.355524 ], [184, -6166.690000, 0.064382, 0.000001, 0.355522 ], [186, -6166.690000, 0.064360, 0.000009, 0.355502 ], [187, -6167.440000, 0.030362, 0.010168, 0.341888 ] ], "n": ["FDJVGXF01CE1QS" ] }, {"p": [[189, -7387.730000, 0.367287, 0.055119, 0.145803 ], [190, -7387.770000, 0.351275, 0.016253, 0.160867 ], [172, -7388.830000, 0.122234, 0.000008, 0.187072 ], [188, -7389.440000, 0.066555, 0.040161, 0.169049 ], [175, -7390.050000, 0.036093, 0.003837, 0.193222 ], [171, -7390.130000, 0.033358, 0.034630, 0.174744 ], [174, -7390.490000, 0.023197, 0.000006, 0.197038 ] ], "n": ["FDJVGXF01CTVOI_rvcmp" ] }, {"p": [[189, -8343.920000, 0.334650, 0.095112, 0.106440 ], [188, -8343.930000, 0.332693, 0.052299, 0.107571 ], [190, -8343.930000, 0.332657, 0.000008, 0.107571 ] ], "n": ["FDJVGXF01EKTAN" ] }, {"p": [[189, -8343.920000, 0.334650, 0.095112, 0.106440 ], [188, -8343.930000, 0.332693, 0.052299, 0.107571 ], [190, -8343.930000, 0.332657, 0.000008, 0.107571 ] ], "n": ["FDJVGXF01CZOX5" ] }, {"p": [[189, -5357.470000, 0.256877, 0.079975, 0.291542 ], [190, -5357.560000, 0.235041, 0.000008, 0.300127 ], [188, -5357.560000, 0.235028, 0.052299, 0.300138 ], [28, -5358.590000, 0.083451, 0.028857, 0.275674 ], [33, -5358.810000, 0.067216, 0.009908, 0.284629 ], [34, -5358.880000, 0.062616, 0.000007, 0.286027 ], [40, -5358.920000, 0.059772, 0.042326, 0.284712 ] ], "n": ["FDJVGXF01CUTHQ_rvcmp" ] }, {"p": [[189, -5095.260000, 0.464567, 0.053150, 0.070470 ], [188, -5096.550000, 0.127012, 0.029332, 0.115562 ], [185, -5096.840000, 0.095293, 0.000001, 0.148383 ], [184, -5096.840000, 0.095280, 0.000001, 0.148381 ], [186, -5096.840000, 0.095190, 0.000009, 0.148382 ], [190, -5097.160000, 0.069398, 0.000008, 0.118083 ], [172, -5097.420000, 0.053259, 0.000009, 0.128967 ] ], "n": ["FDJVGXF01CIWVJ" ] }, {"p": [[189, -5028.630000, 0.496925, 0.060065, 0.125921 ], [188, -5029.660000, 0.176477, 0.049689, 0.167948 ], [190, -5029.670000, 0.175538, 0.000008, 0.167992 ], [171, -5031.010000, 0.045759, 0.034630, 0.189987 ], [191, -5031.010000, 0.045756, 0.000008, 0.189989 ], [172, -5031.420000, 0.030322, 0.000008, 0.195077 ], [187, -5031.460000, 0.029221, 0.011025, 0.201555 ] ], "n": ["FDJVGXF01A0TPT_rvcmp" ] }, {"p": [[189, -6941.490000, 0.713053, 0.000006, 1.999990 ], [71, -6944.100000, 0.052483, 0.000010, 1.999990 ], [70, -6944.100000, 0.052483, 0.564406, 1.999990 ], [98, -6944.160000, 0.049426, 0.013678, 1.999990 ], [88, -6944.170000, 0.048559, 0.021340, 1.999990 ], [113, -6944.310000, 0.042452, 0.130263, 1.999990 ], [90, -6944.330000, 0.041544, 0.000010, 1.999990 ] ], "n": ["FDJVGXF01CGWE1_rvcmp" ] }, {"p": [[190, -7911.990000, 0.360850, 0.027692, 0.075584 ], [171, -7912.170000, 0.302957, 0.034634, 0.079197 ], [191, -7912.170000, 0.302698, 0.000008, 0.079192 ], [192, -7914.840000, 0.020958, 0.006464, 0.084638 ], [39, -7915.350000, 0.012537, 0.025399, 0.088178 ] ], "n": ["FDJVGXF01CB1TY" ] }, {"p": [[190, -7229.830000, 0.508442, 0.027584, 0.111889 ], [191, -7230.700000, 0.212408, 0.003718, 0.116181 ], [171, -7230.850000, 0.182623, 0.034630, 0.117763 ], [40, -7232.110000, 0.051814, 0.065332, 0.107648 ], [27, -7232.980000, 0.021779, 0.039995, 0.122742 ], [192, -7233.320000, 0.015543, 0.000005, 0.122788 ], [38, -7234.060000, 0.007391, 0.059467, 0.117012 ] ], "n": ["FDJVGXF01BQ9MS_rvcmp" ] }, {"p": [[190, -7916.610000, 0.350228, 0.028365, 0.081550 ], [171, -7916.750000, 0.306638, 0.034630, 0.084809 ], [191, -7916.750000, 0.306403, 0.000008, 0.084815 ], [192, -7919.350000, 0.022650, 0.006552, 0.090506 ], [39, -7919.830000, 0.014081, 0.025399, 0.093953 ] ], "n": ["FDJVGXF01ETFX3" ] }, {"p": [[190, -7144.950000, 0.556633, 0.018208, 0.134278 ], [189, -7146.690000, 0.097611, 0.096145, 0.137838 ], [188, -7146.690000, 0.097590, 0.052299, 0.137840 ], [171, -7146.850000, 0.082700, 0.034630, 0.143942 ], [191, -7146.850000, 0.082690, 0.000008, 0.143940 ], [39, -7147.500000, 0.043305, 0.018414, 0.143402 ], [29, -7147.590000, 0.039470, 0.021226, 0.124935 ] ], "n": ["FDJVGXF01EAE9F" ] }, {"p": [[190, -7862.460000, 0.425013, 0.019147, 0.182590 ], [189, -7863.600000, 0.135627, 0.083940, 0.178570 ], [40, -7863.820000, 0.108870, 0.061066, 0.177801 ], [191, -7863.990000, 0.091733, 0.000008, 0.192241 ], [171, -7863.990000, 0.091705, 0.034630, 0.192238 ], [188, -7864.080000, 0.084005, 0.052299, 0.187065 ], [29, -7864.370000, 0.063046, 0.020048, 0.177041 ] ], "n": ["FDJVGXF01AT043_rvcmp" ] }, {"p": [[190, -7637.670000, 0.276344, 0.031620, 0.139789 ], [171, -7637.690000, 0.271430, 0.034630, 0.141566 ], [191, -7637.690000, 0.271306, 0.000008, 0.141571 ], [40, -7638.440000, 0.128564, 0.068284, 0.135983 ], [192, -7639.480000, 0.045483, 0.000005, 0.149896 ], [189, -7642.060000, 0.003436, 0.096145, 0.140501 ], [188, -7642.060000, 0.003436, 0.052299, 0.140503 ] ], "n": ["FDJVGXF01E02JA_rvcmp" ] }, {"p": [[190, -6431.700000, 0.573840, 0.020809, 0.126641 ], [171, -6433.370000, 0.107847, 0.034634, 0.135002 ], [191, -6433.370000, 0.107788, 0.000008, 0.135015 ], [189, -6433.410000, 0.103842, 0.083864, 0.123373 ], [188, -6433.830000, 0.068301, 0.052299, 0.132098 ], [40, -6435.080000, 0.019488, 0.082859, 0.140923 ], [192, -6435.110000, 0.018893, 0.000005, 0.143749 ] ], "n": ["FDJVGXF01BN306_rvcmp" ] }, {"p": [[190, -6176.770000, 0.274326, 0.026089, 0.217405 ], [191, -6176.870000, 0.248539, 0.000008, 0.225945 ], [171, -6176.870000, 0.248480, 0.034630, 0.225941 ], [40, -6177.460000, 0.137942, 0.058152, 0.225075 ], [192, -6178.410000, 0.053167, 0.000005, 0.242613 ], [188, -6179.450000, 0.018773, 0.052300, 0.215678 ], [189, -6179.450000, 0.018773, 0.096145, 0.215672 ] ], "n": ["FDJVGXF01AQAQI" ] }, {"p": [[190, -3888.350000, 0.355813, 0.019974, 0.043650 ], [40, -3888.840000, 0.218453, 0.071189, 0.054377 ], [171, -3888.910000, 0.203287, 0.024237, 0.053349 ], [191, -3889.760000, 0.086864, 0.004923, 0.062474 ], [192, -3889.810000, 0.083127, 0.000005, 0.067262 ], [149, -3890.890000, 0.028091, 0.054288, 0.056863 ], [39, -3891.030000, 0.024365, 0.020409, 0.075061 ] ], "n": ["FDJVGXF01BWFPL_rvcmp" ] }, {"p": [[190, -3618.850000, 0.289104, 0.025273, 0.037790 ], [191, -3619.460000, 0.157124, 0.015648, 0.053623 ], [40, -3619.460000, 0.157120, 0.086917, 0.053634 ], [192, -3619.460000, 0.157095, 0.000005, 0.053636 ], [171, -3619.640000, 0.130641, 0.034630, 0.049503 ], [39, -3620.280000, 0.068958, 0.018698, 0.054288 ], [196, -3620.830000, 0.039958, 0.023560, 0.048142 ] ], "n": ["FDJVGXF01D8GQZ" ] }, {"p": [[191, -7610.030000, 0.172028, 0.000008, 1.999990 ], [190, -7610.030000, 0.172024, 0.034335, 1.999990 ], [205, -7610.100000, 0.160367, 0.038635, 1.999990 ], [22, -7610.100000, 0.160215, 0.028187, 1.999990 ], [35, -7610.460000, 0.112108, 0.000006, 1.999990 ], [34, -7610.460000, 0.112101, 0.014780, 1.999990 ], [194, -7610.460000, 0.111159, 0.006696, 1.999990 ] ], "n": ["FDJVGXF01C04K5_rvcmp" ] }, {"p": [[192, -6840.630000, 0.302017, 0.010746, 0.156983 ], [39, -6840.810000, 0.252684, 0.000006, 0.165704 ], [191, -6841.570000, 0.118872, 0.013262, 0.161706 ], [40, -6841.650000, 0.109800, 0.086918, 0.163476 ], [193, -6841.770000, 0.096868, 0.000008, 0.170236 ], [27, -6841.780000, 0.096003, 0.031526, 0.170789 ], [38, -6843.180000, 0.023757, 0.076823, 0.176156 ] ], "n": ["FDJVGXF01A1YA4" ] }, {"p": [[192, -3797.630000, 0.192360, 0.011955, 0.055541 ], [189, -3797.660000, 0.187806, 0.050634, 0.000007 ], [190, -3797.700000, 0.179901, 0.009907, 0.043473 ], [188, -3797.810000, 0.160357, 0.052299, 0.043009 ], [193, -3798.320000, 0.096596, 0.004535, 0.063553 ], [40, -3798.330000, 0.095738, 0.078115, 0.047103 ], [191, -3798.420000, 0.087242, 0.008873, 0.054578 ] ], "n": ["FDJVGXF01EIKZ9" ] }, {"p": [[193, -9056.910000, 0.209920, 0.000567, 0.247451 ], [192, -9056.920000, 0.209471, 0.022464, 0.248140 ], [39, -9056.920000, 0.209412, 0.025399, 0.248135 ], [27, -9057.390000, 0.130202, 0.040960, 0.229604 ], [38, -9057.680000, 0.097617, 0.054710, 0.225241 ], [29, -9057.970000, 0.073388, 0.028567, 0.238493 ], [40, -9058.010000, 0.069990, 0.069742, 0.248019 ] ], "n": ["FDJVGXF01A9GJQ_rvcmp" ] }, {"p": [[193, -5254.070000, 0.348177, 0.010077, 0.068733 ], [194, -5255.030000, 0.133231, 0.001511, 0.074084 ], [38, -5255.060000, 0.128736, 0.076823, 0.074117 ], [190, -5255.230000, 0.108675, 0.024823, 0.079069 ], [195, -5255.310000, 0.100883, 0.000009, 0.077128 ], [26, -5255.390000, 0.092402, 0.092211, 0.073043 ], [196, -5255.440000, 0.087898, 0.000010, 0.075427 ] ], "n": ["FDJVGXF01B9OVH" ] }, {"p": [[195, -3942.400000, 0.332638, 0.007000, 0.094449 ], [196, -3942.620000, 0.265835, 0.003967, 0.092096 ], [35, -3943.690000, 0.091040, 0.013080, 0.110699 ], [22, -3943.750000, 0.086194, 0.013580, 0.069052 ], [226, -3943.790000, 0.082582, 0.014774, 0.078114 ], [170, -3943.950000, 0.070858, 0.018724, 0.091974 ], [149, -3943.950000, 0.070852, 0.063739, 0.091968 ] ], "n": ["FDJVGXF01AL8PP_rvcmp" ] }, {"p": [[196, -9384.040000, 1.000000, 0.039222, 0.041231 ] ], "n": ["FDJVGXF01D13RT" ] }, {"p": [[196, -9384.040000, 1.000000, 0.039222, 0.041231 ] ], "n": ["FDJVGXF01AGSBK" ] }, {"p": [[196, -9384.040000, 1.000000, 0.039222, 0.041231 ] ], "n": ["FDJVGXF01AGYM2" ] }, {"p": [[196, -9418.490000, 1.000000, 0.040808, 0.042382 ] ], "n": ["FDJVGXF01BJKMV" ] }, {"p": [[196, -8179.640000, 0.601504, 0.013934, 0.045441 ], [195, -8180.310000, 0.307232, 0.009446, 0.051377 ], [204, -8181.960000, 0.058989, 0.014726, 0.058169 ], [23, -8183.020000, 0.020341, 0.000007, 0.065314 ], [205, -8183.560000, 0.011934, 0.010475, 0.054850 ] ], "n": ["FDJVGXF01CMLNU" ] }, {"p": [[196, -8914.460000, 1.000000, 0.032293, 0.043262 ] ], "n": ["FDJVGXF01CWWBX_rvcmp" ] }, {"p": [[196, -9453.860000, 0.494183, 0.014874, 0.106815 ], [26, -9454.500000, 0.261761, 0.088692, 0.110801 ], [195, -9454.790000, 0.196052, 0.009446, 0.119177 ], [28, -9456.420000, 0.038186, 0.026172, 0.113917 ], [34, -9457.780000, 0.009818, 0.007910, 0.125393 ] ], "n": ["FDJVGXF01DFHEL" ] }, {"p": [[196, -9482.830000, 0.496849, 0.014933, 0.105759 ], [26, -9483.470000, 0.261599, 0.088581, 0.109664 ], [195, -9483.770000, 0.193916, 0.009446, 0.118106 ], [28, -9485.400000, 0.038019, 0.026156, 0.112877 ], [34, -9486.770000, 0.009616, 0.007911, 0.124295 ] ], "n": ["FDJVGXF01ALIXY" ] }, {"p": [[196, -9482.830000, 0.496849, 0.014933, 0.105759 ], [26, -9483.470000, 0.261599, 0.088581, 0.109664 ], [195, -9483.770000, 0.193916, 0.009446, 0.118106 ], [28, -9485.400000, 0.038019, 0.026156, 0.112877 ], [34, -9486.770000, 0.009616, 0.007911, 0.124295 ] ], "n": ["FDJVGXF01D8H6T" ] }, {"p": [[196, -9164.220000, 1.000000, 0.031867, 0.049981 ] ], "n": ["FDJVGXF01C3VYL" ] }, {"p": [[196, -8941.080000, 0.673436, 0.034219, 0.062301 ], [20, -8941.880000, 0.302901, 0.002142, 0.067543 ], [21, -8944.430000, 0.023662, 0.008337, 0.068762 ] ], "n": ["FDJVGXF01BFWFZ_rvcmp" ] }, {"p": [[196, -9121.960000, 1.000000, 0.034209, 0.050494 ] ], "n": ["FDJVGXF01EFUI5" ] }, {"p": [[196, -9486.900000, 0.506301, 0.014761, 0.100444 ], [26, -9487.600000, 0.252026, 0.089150, 0.104621 ], [195, -9487.880000, 0.189122, 0.009446, 0.112786 ], [28, -9489.160000, 0.052551, 0.013749, 0.112217 ] ], "n": ["FDJVGXF01EO7B2" ] }, {"p": [[196, -9252.750000, 0.886171, 0.024262, 0.071528 ], [26, -9255.480000, 0.057735, 0.095171, 0.088236 ], [195, -9255.510000, 0.056094, 0.009446, 0.090404 ] ], "n": ["FDJVGXF01BE798" ] }, {"p": [[196, -8242.410000, 0.583997, 0.049683, 0.072746 ], [203, -8243.890000, 0.133158, 0.005725, 0.088676 ], [204, -8244.250000, 0.092694, 0.003826, 0.086102 ], [201, -8244.380000, 0.081088, 0.019126, 0.092176 ], [200, -8244.540000, 0.069423, 0.012685, 0.090236 ], [197, -8245.420000, 0.028613, 0.014493, 0.090770 ], [199, -8246.380000, 0.011026, 0.012750, 0.093027 ] ], "n": ["FDJVGXF01D9HJO_rvcmp" ] }, {"p": [[196, -9116.970000, 0.576083, 0.031595, 0.055157 ], [20, -9117.350000, 0.394636, 0.002116, 0.061160 ], [21, -9119.950000, 0.029281, 0.008254, 0.062005 ] ], "n": ["FDJVGXF01C10A6" ] }, {"p": [[196, -9116.970000, 0.576083, 0.031595, 0.055157 ], [20, -9117.350000, 0.394636, 0.002116, 0.061160 ], [21, -9119.950000, 0.029281, 0.008254, 0.062005 ] ], "n": ["FDJVGXF01B28O0" ] }, {"p": [[196, -9387.920000, 0.485203, 0.015187, 0.102023 ], [26, -9388.590000, 0.250003, 0.088174, 0.105752 ], [195, -9388.930000, 0.177872, 0.009446, 0.114704 ], [28, -9389.810000, 0.073822, 0.020649, 0.109569 ], [34, -9391.960000, 0.008545, 0.007880, 0.120995 ], [35, -9392.590000, 0.004556, 0.002539, 0.124361 ] ], "n": ["FDJVGXF01C6L6H" ] }, {"p": [[196, -8860.900000, 0.662861, 0.034229, 0.063006 ], [20, -8861.690000, 0.300537, 0.002143, 0.068169 ], [21, -8864.230000, 0.023541, 0.008335, 0.069430 ], [22, -8864.820000, 0.013061, 0.000007, 0.071508 ] ], "n": ["FDJVGXF01C8CC6" ] }, {"p": [[196, -8863.320000, 0.934798, 0.031135, 0.058639 ], [205, -8865.980000, 0.065202, 0.016827, 0.067802 ] ], "n": ["FDJVGXF01BNGHO_rvcmp" ] }, {"p": [[196, -8541.330000, 1.000000, 0.032329, 0.087571 ] ], "n": ["FDJVGXF01B77JO_rvcmp" ] }, {"p": [[196, -8192.880000, 0.471478, 0.055618, 0.052926 ], [204, -8193.770000, 0.194430, 0.005847, 0.063104 ], [20, -8194.220000, 0.123161, 0.000005, 0.058928 ], [200, -8194.490000, 0.094654, 0.012685, 0.068490 ], [21, -8195.340000, 0.040380, 0.000008, 0.059858 ], [19, -8195.340000, 0.040300, 0.012620, 0.059860 ], [22, -8195.470000, 0.035598, 0.000007, 0.059319 ] ], "n": ["FDJVGXF01CF8WG_rvcmp" ] }, {"p": [[196, -9114.160000, 0.576018, 0.031595, 0.055170 ], [20, -9114.540000, 0.394696, 0.002122, 0.061167 ], [21, -9117.140000, 0.029286, 0.008254, 0.062021 ] ], "n": ["FDJVGXF01D97CS" ] }, {"p": [[196, -9475.680000, 0.505960, 0.014752, 0.100541 ], [26, -9476.380000, 0.252033, 0.089165, 0.104730 ], [195, -9476.670000, 0.189387, 0.009446, 0.112895 ], [28, -9477.950000, 0.052620, 0.013743, 0.112319 ] ], "n": ["FDJVGXF01EEB9Z" ] }, {"p": [[196, -8454.130000, 1.000000, 0.026773, 0.024041 ] ], "n": ["FDJVGXF01ATVL8_rvcmp" ] }, {"p": [[196, -8861.450000, 0.698950, 0.023903, 0.095178 ], [26, -8862.780000, 0.184308, 0.086885, 0.099182 ], [195, -8863.240000, 0.116742, 0.009446, 0.109808 ] ], "n": ["FDJVGXF01A347I_rvcmp" ] }, {"p": [[196, -8964.040000, 0.918543, 0.031002, 0.056659 ], [20, -8966.460000, 0.081457, 0.002129, 0.066740 ] ], "n": ["FDJVGXF01BVZKQ" ] }, {"p": [[196, -8964.040000, 0.918543, 0.031002, 0.056659 ], [20, -8966.460000, 0.081457, 0.002129, 0.066740 ] ], "n": ["FDJVGXF01C9MCQ" ] }, {"p": [[196, -8895.140000, 0.547319, 0.031643, 0.063020 ], [20, -8895.440000, 0.404905, 0.002131, 0.067897 ], [21, -8898.020000, 0.030884, 0.008230, 0.069162 ], [22, -8898.620000, 0.016891, 0.000007, 0.071233 ] ], "n": ["FDJVGXF01AYCEV_rvcmp" ] }, {"p": [[196, -8890.060000, 0.544972, 0.031654, 0.063066 ], [20, -8890.350000, 0.407002, 0.002131, 0.067929 ], [21, -8892.930000, 0.031042, 0.008229, 0.069202 ], [22, -8893.530000, 0.016984, 0.000007, 0.071276 ] ], "n": ["FDJVGXF01CD86M" ] }, {"p": [[196, -8887.370000, 0.569150, 0.031610, 0.057491 ], [20, -8887.720000, 0.400866, 0.002124, 0.063238 ], [21, -8890.310000, 0.029984, 0.008249, 0.064241 ] ], "n": ["FDJVGXF01DSHXR" ] }, {"p": [[196, -8887.370000, 0.569150, 0.031610, 0.057491 ], [20, -8887.720000, 0.400866, 0.002124, 0.063238 ], [21, -8890.310000, 0.029984, 0.008249, 0.064241 ] ], "n": ["FDJVGXF01D0K44" ] }, {"p": [[196, -7803.190000, 0.806672, 0.052332, 0.028215 ], [20, -7805.360000, 0.092376, 0.000007, 0.050390 ], [202, -7806.130000, 0.042610, 0.045509, 0.035610 ], [204, -7806.300000, 0.035936, 0.008427, 0.044564 ], [22, -7807.380000, 0.012308, 0.007768, 0.047817 ], [21, -7807.570000, 0.010098, 0.000009, 0.053651 ] ], "n": ["FDJVGXF01BVKT9" ] }, {"p": [[196, -8558.730000, 0.415073, 0.037620, 0.066634 ], [170, -8559.270000, 0.241544, 0.013808, 0.087106 ], [171, -8559.760000, 0.148802, 0.006358, 0.086306 ], [149, -8560.030000, 0.113128, 0.060948, 0.086444 ], [208, -8560.710000, 0.057419, 0.011475, 0.102047 ], [206, -8562.280000, 0.012017, 0.000001, 0.112930 ], [207, -8562.280000, 0.012017, 0.000001, 0.112930 ] ], "n": ["FDJVGXF01CDB8S_rvcmp" ] }, {"p": [[196, -8520.740000, 0.867317, 0.034115, 0.058830 ], [20, -8522.700000, 0.123012, 0.002140, 0.066185 ], [21, -8525.240000, 0.009671, 0.008451, 0.067383 ] ], "n": ["FDJVGXF01BIB4C_rvcmp" ] }, {"p": [[196, -8520.740000, 0.867317, 0.034115, 0.058830 ], [20, -8522.700000, 0.123012, 0.002140, 0.066185 ], [21, -8525.240000, 0.009671, 0.008451, 0.067383 ] ], "n": ["FDJVGXF01BIIFU_rvcmp" ] }, {"p": [[196, -8900.320000, 0.332974, 0.040258, 0.060417 ], [20, -8900.970000, 0.173678, 0.003651, 0.066006 ], [21, -8901.080000, 0.156852, 0.017640, 0.063728 ], [18, -8901.080000, 0.156838, 0.051699, 0.063724 ], [22, -8901.080000, 0.156831, 0.000007, 0.063725 ], [19, -8903.000000, 0.022827, 0.012620, 0.069241 ] ], "n": ["FDJVGXF01BD9BV" ] }, {"p": [[196, -8078.700000, 1.000000, 0.048928, 0.033863 ] ], "n": ["FDJVGXF01A4UZP_rvcmp" ] }, {"p": [[196, -7831.760000, 0.844185, 0.058842, 0.051258 ], [198, -7834.370000, 0.061823, 0.000006, 0.074216 ], [204, -7834.620000, 0.048379, 0.007969, 0.064860 ], [200, -7835.550000, 0.019092, 0.007916, 0.069097 ], [203, -7835.830000, 0.014310, 0.009990, 0.071260 ], [199, -7835.990000, 0.012211, 0.013295, 0.071014 ] ], "n": ["FDJVGXF01B64PK" ] }, {"p": [[196, -8038.070000, 0.918864, 0.050132, 0.044456 ], [202, -8040.690000, 0.066821, 0.041298, 0.050293 ], [204, -8042.230000, 0.014316, 0.005133, 0.063560 ] ], "n": ["FDJVGXF01EBN6A" ] }, {"p": [[196, -8183.990000, 1.000000, 0.034859, 0.052921 ] ], "n": ["FDJVGXF01CEK8I" ] }, {"p": [[196, -7882.360000, 0.815986, 0.060068, 0.051241 ], [198, -7884.780000, 0.072821, 0.000006, 0.073682 ], [204, -7885.020000, 0.057350, 0.007953, 0.064359 ], [200, -7885.950000, 0.022580, 0.007928, 0.068540 ], [203, -7886.240000, 0.016894, 0.009990, 0.070694 ], [199, -7886.400000, 0.014369, 0.013295, 0.070447 ] ], "n": ["FDJVGXF01BL3V3" ] }, {"p": [[196, -8495.110000, 0.849726, 0.038712, 0.048477 ], [208, -8497.850000, 0.054820, 0.020489, 0.082722 ], [209, -8497.970000, 0.048462, 0.000896, 0.083838 ], [205, -8498.000000, 0.046993, 0.038635, 0.084418 ] ], "n": ["FDJVGXF01B7DVG" ] }, {"p": [[196, -7975.070000, 0.966533, 0.055388, 0.050621 ], [198, -7978.800000, 0.023234, 0.000006, 0.077885 ], [204, -7979.620000, 0.010233, 0.004927, 0.069573 ] ], "n": ["FDJVGXF01EPGLV_rvcmp" ] }, {"p": [[196, -7872.820000, 0.724998, 0.059456, 0.067867 ], [198, -7874.620000, 0.119770, 0.000006, 0.088939 ], [204, -7875.200000, 0.067332, 0.007582, 0.080507 ], [200, -7875.960000, 0.031521, 0.008012, 0.085165 ], [203, -7876.170000, 0.025441, 0.009988, 0.087110 ], [199, -7876.330000, 0.021586, 0.013298, 0.087023 ], [202, -7877.170000, 0.009353, 0.053663, 0.080803 ] ], "n": ["FDJVGXF01E0AWL" ] }, {"p": [[196, -7795.520000, 0.841211, 0.058846, 0.051724 ], [198, -7798.110000, 0.063373, 0.000006, 0.074766 ], [204, -7798.370000, 0.048923, 0.007951, 0.065377 ], [200, -7799.290000, 0.019428, 0.007918, 0.069658 ], [203, -7799.580000, 0.014606, 0.009990, 0.071826 ], [199, -7799.740000, 0.012460, 0.013295, 0.071577 ] ], "n": ["FDJVGXF01DWJ78" ] }, {"p": [[196, -9167.130000, 0.208024, 0.006316, 0.139217 ], [226, -9167.180000, 0.199064, 0.021167, 0.129895 ], [26, -9167.290000, 0.177014, 0.096855, 0.145039 ], [195, -9167.290000, 0.176785, 0.009446, 0.145563 ], [2, -9167.890000, 0.097077, 0.036220, 0.133682 ], [227, -9167.890000, 0.097076, 0.012980, 0.133689 ], [27, -9168.660000, 0.044961, 0.067692, 0.146667 ] ], "n": ["FDJVGXF01DLNEP" ] }, {"p": [[196, -7779.080000, 0.757375, 0.059418, 0.063546 ], [198, -7781.040000, 0.106602, 0.000006, 0.085149 ], [204, -7781.540000, 0.064432, 0.007682, 0.076378 ], [200, -7782.340000, 0.028991, 0.007971, 0.081003 ], [203, -7782.570000, 0.022997, 0.009988, 0.083018 ], [199, -7782.730000, 0.019602, 0.013298, 0.082885 ] ], "n": ["FDJVGXF01COG51" ] }, {"p": [[196, -8122.810000, 0.780265, 0.025961, 0.093228 ], [26, -8124.480000, 0.145857, 0.084244, 0.094682 ], [195, -8125.160000, 0.073878, 0.009446, 0.108314 ] ], "n": ["FDJVGXF01AIQNC" ] }, {"p": [[196, -7670.960000, 1.000000, 0.048685, 0.041116 ] ], "n": ["FDJVGXF01D4XPV_rvcmp" ] }, {"p": [[196, -7887.050000, 0.968112, 0.039320, 0.059778 ], [149, -7890.470000, 0.031888, 0.044821, 0.057088 ] ], "n": ["FDJVGXF01CA7H0_rvcmp" ] }, {"p": [[196, -7418.430000, 1.000000, 0.040869, 0.024153 ] ], "n": ["FDJVGXF01EC135_rvcmp" ] }, {"p": [[196, -7586.010000, 1.000000, 0.041673, 0.041796 ] ], "n": ["FDJVGXF01CTFU5_rvcmp" ] }, {"p": [[196, -7679.720000, 0.989610, 0.049375, 0.063674 ], [204, -7684.280000, 0.010390, 0.005127, 0.079546 ] ], "n": ["FDJVGXF01C5GUR" ] }, {"p": [[196, -7798.410000, 0.841327, 0.058845, 0.051710 ], [198, -7800.990000, 0.063315, 0.000006, 0.074749 ], [204, -7801.250000, 0.048899, 0.007951, 0.065361 ], [200, -7802.180000, 0.019414, 0.007927, 0.069649 ], [203, -7802.460000, 0.014595, 0.009990, 0.071808 ], [199, -7802.620000, 0.012450, 0.013295, 0.071567 ] ], "n": ["FDJVGXF01AZF0B" ] }, {"p": [[196, -8229.790000, 0.856147, 0.034116, 0.073813 ], [20, -8231.660000, 0.132701, 0.002161, 0.079774 ], [21, -8234.130000, 0.011151, 0.008414, 0.081824 ] ], "n": ["FDJVGXF01A21S9" ] }, {"p": [[196, -7994.750000, 0.979357, 0.045617, 0.072077 ], [204, -7998.610000, 0.020643, 0.003313, 0.090534 ] ], "n": ["FDJVGXF01CQLPK_rvcmp" ] }, {"p": [[196, -7824.760000, 0.843840, 0.058845, 0.051307 ], [198, -7827.370000, 0.061995, 0.000006, 0.074277 ], [204, -7827.610000, 0.048450, 0.007962, 0.064908 ], [200, -7828.540000, 0.019132, 0.007916, 0.069158 ], [203, -7828.830000, 0.014344, 0.009990, 0.071304 ], [199, -7828.990000, 0.012239, 0.013295, 0.071059 ] ], "n": ["FDJVGXF01E3CZ5" ] }, {"p": [[196, -7751.170000, 0.715831, 0.059488, 0.069044 ], [198, -7752.910000, 0.124819, 0.000006, 0.090247 ], [204, -7753.510000, 0.068536, 0.007550, 0.081784 ], [200, -7754.260000, 0.032512, 0.008021, 0.086542 ], [203, -7754.470000, 0.026381, 0.009988, 0.088488 ], [199, -7754.630000, 0.022380, 0.013298, 0.088419 ], [202, -7755.490000, 0.009542, 0.053792, 0.082228 ] ], "n": ["FDJVGXF01ECD0V" ] }, {"p": [[196, -8391.840000, 0.606154, 0.067784, 0.080409 ], [199, -8393.210000, 0.154844, 0.006848, 0.092559 ], [198, -8393.830000, 0.083075, 0.012632, 0.098469 ], [197, -8393.840000, 0.082071, 0.024513, 0.098926 ], [200, -8393.950000, 0.073856, 0.000006, 0.093069 ] ], "n": ["FDJVGXF01BUKAR" ] }, {"p": [[196, -8719.270000, 0.567337, 0.052631, 0.049382 ], [22, -8720.650000, 0.142481, 0.014308, 0.045071 ], [204, -8720.780000, 0.125484, 0.005335, 0.064227 ], [200, -8721.390000, 0.068374, 0.012685, 0.068665 ], [203, -8721.390000, 0.068250, 0.009988, 0.068660 ], [205, -8722.280000, 0.028074, 0.023598, 0.047214 ] ], "n": ["FDJVGXF01BN5PL" ] }, {"p": [[196, -7307.800000, 0.233857, 0.068361, 0.043145 ], [154, -7308.110000, 0.172324, 0.014500, 0.039653 ], [200, -7308.170000, 0.161206, 0.008413, 0.051574 ], [204, -7308.260000, 0.147579, 0.000010, 0.051803 ], [203, -7308.260000, 0.147486, 0.009988, 0.051802 ], [199, -7308.540000, 0.111651, 0.013298, 0.052841 ], [198, -7310.000000, 0.025897, 0.007680, 0.058203 ] ], "n": ["FDJVGXF01BHL3Q" ] }, {"p": [[196, -7666.600000, 0.925944, 0.029582, 0.069010 ], [171, -7669.420000, 0.054793, 0.019332, 0.078507 ], [149, -7670.470000, 0.019264, 0.051115, 0.074932 ] ], "n": ["FDJVGXF01D4TZH_rvcmp" ] }, {"p": [[196, -7947.280000, 0.985993, 0.041945, 0.096325 ], [149, -7951.530000, 0.014007, 0.038269, 0.086603 ] ], "n": ["FDJVGXF01AZERP_rvcmp" ] }, {"p": [[196, -7495.850000, 0.834743, 0.030405, 0.043397 ], [194, -7498.790000, 0.044172, 0.005468, 0.063123 ], [195, -7498.820000, 0.042697, 0.000009, 0.064093 ], [35, -7498.820000, 0.042686, 0.013080, 0.064093 ], [193, -7499.000000, 0.035702, 0.009011, 0.058959 ] ], "n": ["FDJVGXF01D1TYA_rvcmp" ] }, {"p": [[196, -7588.490000, 1.000000, 0.041817, 0.047501 ] ], "n": ["FDJVGXF01AIBBG_rvcmp" ] }, {"p": [[196, -7025.000000, 0.308301, 0.072808, 0.054051 ], [199, -7025.240000, 0.243291, 0.013298, 0.059999 ], [200, -7025.240000, 0.243153, 0.000006, 0.059997 ], [198, -7025.980000, 0.116193, 0.009824, 0.064048 ], [197, -7026.330000, 0.081561, 0.024513, 0.065661 ], [152, -7028.720000, 0.007500, 0.021274, 0.059018 ] ], "n": ["FDJVGXF01B6GF7" ] }, {"p": [[196, -7474.630000, 0.928954, 0.047800, 0.069715 ], [204, -7478.120000, 0.028116, 0.003534, 0.086173 ], [200, -7478.390000, 0.021474, 0.012685, 0.090758 ], [203, -7478.390000, 0.021455, 0.009988, 0.090760 ] ], "n": ["FDJVGXF01C4RVK_rvcmp" ] }, {"p": [[196, -8415.230000, 0.333493, 0.078189, 0.094582 ], [200, -8415.230000, 0.333403, 0.000006, 0.094584 ], [199, -8415.230000, 0.333104, 0.013298, 0.094594 ] ], "n": ["FDJVGXF01EB7TH_rvcmp" ] }, {"p": [[196, -6944.330000, 0.282072, 0.073993, 0.062249 ], [199, -6944.470000, 0.246317, 0.013298, 0.066939 ], [200, -6944.470000, 0.246166, 0.000006, 0.066937 ], [198, -6945.130000, 0.126536, 0.009840, 0.070863 ], [197, -6945.460000, 0.091423, 0.024513, 0.072550 ], [152, -6947.960000, 0.007485, 0.021245, 0.066283 ] ], "n": ["FDJVGXF01CT8Y3_rvcmp" ] }, {"p": [[196, -7958.090000, 0.848982, 0.034277, 0.072432 ], [20, -7959.900000, 0.139401, 0.002153, 0.078290 ], [21, -7962.380000, 0.011617, 0.008416, 0.080354 ] ], "n": ["FDJVGXF01CD822" ] }, {"p": [[196, -7755.640000, 1.000000, 0.026858, 0.021985 ] ], "n": ["FDJVGXF01DO2W6" ] }, {"p": [[196, -7755.640000, 1.000000, 0.026858, 0.021985 ] ], "n": ["FDJVGXF01CJ3JL_rvcmp" ] }, {"p": [[196, -7532.940000, 0.398679, 0.045657, 0.097741 ], [149, -7533.140000, 0.326713, 0.045616, 0.092047 ], [171, -7534.090000, 0.126675, 0.012998, 0.109845 ], [170, -7534.680000, 0.070209, 0.012424, 0.116945 ], [169, -7535.130000, 0.044532, 0.015914, 0.130818 ], [154, -7535.830000, 0.022199, 0.024061, 0.125489 ], [199, -7536.530000, 0.010994, 0.008070, 0.116482 ] ], "n": ["FDJVGXF01A4Y5B_rvcmp" ] }, {"p": [[196, -7755.640000, 1.000000, 0.026858, 0.021985 ] ], "n": ["FDJVGXF01DMK5Z" ] }, {"p": [[196, -7755.640000, 1.000000, 0.026858, 0.021985 ] ], "n": ["FDJVGXF01B6KYY" ] }, {"p": [[196, -7702.020000, 1.000000, 0.026862, 0.022119 ] ], "n": ["FDJVGXF01AJJZ3" ] }, {"p": [[196, -7755.640000, 1.000000, 0.026858, 0.021985 ] ], "n": ["FDJVGXF01B9WO5" ] }, {"p": [[196, -7895.370000, 0.664468, 0.066138, 0.086251 ], [199, -7897.000000, 0.130567, 0.007405, 0.100034 ], [200, -7897.600000, 0.071496, 0.000006, 0.100664 ], [198, -7897.670000, 0.066941, 0.012786, 0.106638 ], [197, -7897.670000, 0.066529, 0.024513, 0.106987 ] ], "n": ["FDJVGXF01BWVSY" ] }, {"p": [[196, -6569.210000, 0.765766, 0.054489, 0.052827 ], [204, -6571.240000, 0.100188, 0.004706, 0.062801 ], [200, -6571.780000, 0.058222, 0.012685, 0.069129 ], [203, -6571.790000, 0.058188, 0.009990, 0.069130 ], [199, -6572.980000, 0.017636, 0.013295, 0.072024 ] ], "n": ["FDJVGXF01AT5GT_rvcmp" ] }, {"p": [[196, -7496.050000, 1.000000, 0.030478, 0.025669 ] ], "n": ["FDJVGXF01A0CI8_rvcmp" ] }, {"p": [[196, -7496.050000, 1.000000, 0.030478, 0.025669 ] ], "n": ["FDJVGXF01E4QCO_rvcmp" ] }, {"p": [[196, -7399.670000, 1.000000, 0.029329, 0.023466 ] ], "n": ["FDJVGXF01C5A8J" ] }, {"p": [[196, -7630.100000, 0.897359, 0.038423, 0.060341 ], [208, -7633.320000, 0.035617, 0.021369, 0.101280 ], [205, -7633.400000, 0.033049, 0.038635, 0.102705 ], [25, -7634.350000, 0.012788, 0.004566, 0.109487 ], [23, -7634.540000, 0.010594, 0.003604, 0.114978 ], [24, -7634.540000, 0.010594, 0.001125, 0.114980 ] ], "n": ["FDJVGXF01ESOTP" ] }, {"p": [[196, -7284.440000, 1.000000, 0.029413, 0.023976 ] ], "n": ["FDJVGXF01AIUBY" ] }, {"p": [[196, -6324.510000, 0.280741, 0.022989, 0.062607 ], [195, -6324.840000, 0.200769, 0.009446, 0.067110 ], [20, -6325.100000, 0.154630, 0.000007, 0.059758 ], [204, -6325.130000, 0.150066, 0.005420, 0.066547 ], [200, -6325.740000, 0.081656, 0.012685, 0.072823 ], [21, -6325.890000, 0.070682, 0.000009, 0.060646 ], [22, -6326.030000, 0.061456, 0.000007, 0.060017 ] ], "n": ["FDJVGXF01DLPQ3" ] }, {"p": [[196, -6811.450000, 0.608285, 0.058865, 0.054420 ], [198, -6813.040000, 0.124340, 0.000006, 0.076350 ], [204, -6813.470000, 0.080993, 0.018941, 0.070598 ], [25, -6813.470000, 0.080644, 0.014128, 0.070563 ], [205, -6813.480000, 0.080318, 0.000009, 0.070751 ], [206, -6815.320000, 0.012709, 0.000002, 0.081972 ], [207, -6815.320000, 0.012709, 0.000002, 0.081972 ] ], "n": ["FDJVGXF01BUJKY" ] }, {"p": [[196, -7228.590000, 1.000000, 0.029399, 0.027380 ] ], "n": ["FDJVGXF01AY8F7_rvcmp" ] }, {"p": [[196, -6592.640000, 0.236752, 0.038604, 0.096319 ], [203, -6592.920000, 0.179034, 0.005247, 0.109319 ], [197, -6593.050000, 0.158060, 0.014336, 0.105819 ], [202, -6593.270000, 0.126664, 0.061774, 0.113307 ], [204, -6593.310000, 0.121196, 0.003749, 0.106114 ], [200, -6593.540000, 0.096820, 0.012685, 0.111285 ], [26, -6593.710000, 0.081475, 0.084336, 0.095953 ] ], "n": ["FDJVGXF01AOPC8" ] }, {"p": [[196, -5745.580000, 0.353549, 0.050931, 0.030915 ], [204, -5745.730000, 0.303290, 0.012080, 0.036370 ], [22, -5746.860000, 0.098115, 0.005098, 0.045460 ], [20, -5746.920000, 0.092907, 0.000007, 0.050495 ], [21, -5747.090000, 0.078359, 0.017640, 0.048886 ], [19, -5747.270000, 0.065599, 0.012620, 0.050740 ], [25, -5749.350000, 0.008181, 0.008146, 0.042739 ] ], "n": ["FDJVGXF01C2JDD_rvcmp" ] }, {"p": [[196, -7025.560000, 1.000000, 0.029384, 0.025805 ] ], "n": ["FDJVGXF01CC9AF_rvcmp" ] }, {"p": [[196, -7029.300000, 1.000000, 0.029397, 0.028968 ] ], "n": ["FDJVGXF01EJ8C2_rvcmp" ] }, {"p": [[196, -7095.660000, 1.000000, 0.029371, 0.025227 ] ], "n": ["FDJVGXF01CZZBW" ] }, {"p": [[196, -6577.830000, 0.320911, 0.012759, 0.114137 ], [28, -6578.130000, 0.237607, 0.004549, 0.123779 ], [26, -6578.190000, 0.225188, 0.086986, 0.118745 ], [195, -6578.440000, 0.175572, 0.009446, 0.127876 ], [20, -6580.930000, 0.014520, 0.004209, 0.148269 ], [22, -6580.970000, 0.013907, 0.008652, 0.142320 ], [18, -6581.100000, 0.012295, 0.044609, 0.140873 ] ], "n": ["FDJVGXF01EDE5P" ] }, {"p": [[196, -6960.240000, 1.000000, 0.029406, 0.026176 ] ], "n": ["FDJVGXF01DF8QT_rvcmp" ] }, {"p": [[196, -6827.000000, 1.000000, 0.029432, 0.026778 ] ], "n": ["FDJVGXF01ETELX" ] }, {"p": [[196, -5960.580000, 0.286472, 0.018574, 0.060570 ], [195, -5960.820000, 0.225982, 0.009446, 0.064389 ], [20, -5961.010000, 0.186000, 0.000005, 0.056908 ], [21, -5961.800000, 0.084424, 0.000008, 0.057793 ], [19, -5961.800000, 0.084325, 0.012620, 0.057795 ], [22, -5961.930000, 0.074416, 0.000007, 0.057091 ], [204, -5962.170000, 0.058382, 0.005438, 0.068752 ] ], "n": ["FDJVGXF01CAM4D" ] }, {"p": [[196, -5902.360000, 0.286914, 0.018495, 0.061145 ], [195, -5902.590000, 0.227063, 0.009446, 0.064956 ], [20, -5902.800000, 0.184999, 0.000005, 0.057365 ], [21, -5903.590000, 0.084066, 0.000008, 0.058264 ], [19, -5903.590000, 0.083967, 0.012620, 0.058266 ], [22, -5903.710000, 0.074039, 0.000007, 0.057563 ], [204, -5903.940000, 0.058954, 0.005408, 0.069379 ] ], "n": ["FDJVGXF01ELK3H" ] }, {"p": [[196, -5634.990000, 0.674862, 0.031027, 0.025869 ], [20, -5636.010000, 0.243426, 0.002565, 0.048538 ], [205, -5637.950000, 0.034893, 0.024064, 0.046664 ], [21, -5638.050000, 0.031494, 0.008441, 0.048607 ], [22, -5638.770000, 0.015325, 0.000007, 0.052321 ] ], "n": ["FDJVGXF01DGJ01_rvcmp" ] }, {"p": [[196, -6640.670000, 1.000000, 0.029480, 0.027799 ] ], "n": ["FDJVGXF01EF44K" ] }, {"p": [[196, -5370.700000, 0.436635, 0.052974, 0.075023 ], [198, -5370.910000, 0.353967, 0.000006, 0.094540 ], [206, -5372.980000, 0.044615, 0.000002, 0.102192 ], [207, -5372.980000, 0.044615, 0.000002, 0.102192 ], [208, -5372.980000, 0.044610, 0.000006, 0.102188 ], [25, -5373.140000, 0.037780, 0.014512, 0.096005 ], [205, -5373.140000, 0.037779, 0.000009, 0.096008 ] ], "n": ["FDJVGXF01C3NSG" ] }, {"p": [[196, -6260.970000, 1.000000, 0.028150, 0.030049 ] ], "n": ["FDJVGXF01BF7TV_rvcmp" ] }, {"p": [[196, -5331.250000, 0.354057, 0.006744, 0.070885 ], [195, -5331.280000, 0.344339, 0.009446, 0.072499 ], [20, -5332.420000, 0.110047, 0.000005, 0.064279 ], [21, -5333.190000, 0.050890, 0.000008, 0.065415 ], [19, -5333.190000, 0.050831, 0.012620, 0.065418 ], [22, -5333.290000, 0.045925, 0.000007, 0.064700 ], [204, -5333.340000, 0.043912, 0.005023, 0.078949 ] ], "n": ["FDJVGXF01CS2Q4_rvcmp" ] }, {"p": [[196, -6057.010000, 1.000000, 0.028202, 0.031115 ] ], "n": ["FDJVGXF01BKZTI" ] }, {"p": [[196, -4978.890000, 0.353148, 0.007254, 0.067571 ], [195, -4978.930000, 0.341698, 0.009446, 0.069411 ], [20, -4980.050000, 0.110976, 0.000005, 0.061052 ], [21, -4980.830000, 0.050920, 0.000008, 0.062189 ], [19, -4980.830000, 0.050860, 0.012620, 0.062192 ], [22, -4980.930000, 0.046203, 0.000007, 0.061390 ], [18, -4980.930000, 0.046195, 0.051699, 0.061396 ] ], "n": ["FDJVGXF01COYEX_rvcmp" ] }, {"p": [[196, -5550.620000, 0.896865, 0.018982, 0.024772 ], [34, -5553.520000, 0.049419, 0.009870, 0.045557 ], [35, -5553.830000, 0.036052, 0.002209, 0.046358 ], [195, -5554.550000, 0.017664, 0.006643, 0.042786 ] ], "n": ["FDJVGXF01DERCR_rvcmp" ] }, {"p": [[196, -5479.100000, 0.894452, 0.018982, 0.025053 ], [34, -5481.980000, 0.050588, 0.009865, 0.046009 ], [35, -5482.290000, 0.036941, 0.002199, 0.046826 ], [195, -5483.010000, 0.018019, 0.006631, 0.043262 ] ], "n": ["FDJVGXF01D7LWG" ] }, {"p": [[196, -3778.790000, 0.228977, 0.013876, 0.018384 ], [27, -3779.200000, 0.152242, 0.063247, 0.029150 ], [195, -3779.250000, 0.145071, 0.005000, 0.031408 ], [26, -3779.300000, 0.136961, 0.097406, 0.029571 ], [35, -3779.310000, 0.136914, 0.013080, 0.034189 ], [194, -3779.310000, 0.136859, 0.006696, 0.034189 ], [38, -3780.080000, 0.062976, 0.076823, 0.035312 ] ], "n": ["FDJVGXF01A1DVC" ] }, {"p": [[196, -2039.470000, 0.196871, 0.077870, 0.123944 ], [199, -2039.470000, 0.196799, 0.013298, 0.124374 ], [167, -2039.660000, 0.162452, 0.000008, 0.099911 ], [197, -2039.790000, 0.142507, 0.024513, 0.132986 ], [198, -2039.790000, 0.142478, 0.013117, 0.132980 ], [170, -2040.060000, 0.108479, 0.011556, 0.095374 ], [171, -2040.830000, 0.050413, 0.006155, 0.103205 ] ], "n": ["FDJVGXF01BB3AB" ] }, {"p": [[197, -6663.900000, 0.297521, 0.016536, 0.043956 ], [199, -6664.280000, 0.203574, 0.011362, 0.045596 ], [200, -6664.300000, 0.199605, 0.000006, 0.045810 ], [196, -6664.300000, 0.199592, 0.078187, 0.045811 ], [198, -6664.990000, 0.099708, 0.010289, 0.049339 ] ], "n": ["FDJVGXF01DJ34Q_rvcmp" ] }, {"p": [[197, -7035.400000, 0.257529, 0.012650, 0.048986 ], [200, -7035.850000, 0.163002, 0.008172, 0.051254 ], [204, -7035.940000, 0.149490, 0.000010, 0.051214 ], [203, -7035.940000, 0.149361, 0.009988, 0.051219 ], [199, -7036.130000, 0.124039, 0.013298, 0.052927 ], [196, -7036.130000, 0.123851, 0.078185, 0.052926 ], [198, -7037.460000, 0.032728, 0.013117, 0.056221 ] ], "n": ["FDJVGXF01D4K0O_rvcmp" ] }, {"p": [[197, -8447.030000, 0.208646, 0.024513, 0.749380 ], [199, -8447.030000, 0.208622, 0.000006, 0.749378 ], [198, -8447.030000, 0.208600, 0.013117, 0.749409 ], [196, -8447.440000, 0.138504, 0.075613, 0.783211 ], [200, -8447.450000, 0.136761, 0.000006, 0.791678 ], [14, -8448.300000, 0.058715, 0.086246, 0.762736 ], [202, -8448.680000, 0.040153, 0.000008, 0.691462 ] ], "n": ["FDJVGXF01DQXQU_rvcmp" ] }, {"p": [[197, -4176.670000, 0.619937, 0.006774, 0.113861 ], [204, -4178.540000, 0.095505, 0.003499, 0.116593 ], [200, -4178.710000, 0.080421, 0.012685, 0.124730 ], [203, -4178.710000, 0.080381, 0.009989, 0.124730 ], [196, -4178.870000, 0.068847, 0.032200, 0.113438 ], [18, -4179.760000, 0.028295, 0.045531, 0.091709 ], [22, -4179.820000, 0.026615, 0.001715, 0.091447 ] ], "n": ["FDJVGXF01EANTM_rvcmp" ] }, {"p": [[198, -6213.560000, 0.441176, 0.000006, 0.080161 ], [196, -6213.870000, 0.325307, 0.058498, 0.063041 ], [206, -6215.790000, 0.047385, 0.000002, 0.086495 ], [207, -6215.790000, 0.047385, 0.000002, 0.086495 ], [204, -6215.810000, 0.046478, 0.018959, 0.080341 ], [25, -6215.820000, 0.046137, 0.014512, 0.080488 ], [205, -6215.820000, 0.046132, 0.000009, 0.080491 ] ], "n": ["FDJVGXF01BIVZQ_rvcmp" ] }, {"p": [[198, -6213.560000, 0.441176, 0.000006, 0.080161 ], [196, -6213.870000, 0.325307, 0.058498, 0.063041 ], [206, -6215.790000, 0.047385, 0.000002, 0.086495 ], [207, -6215.790000, 0.047385, 0.000002, 0.086495 ], [204, -6215.810000, 0.046478, 0.018959, 0.080341 ], [25, -6215.820000, 0.046137, 0.014512, 0.080488 ], [205, -6215.820000, 0.046132, 0.000009, 0.080491 ] ], "n": ["FDJVGXF01BH316_rvcmp" ] }, {"p": [[198, -6213.560000, 0.441176, 0.000006, 0.080161 ], [196, -6213.870000, 0.325307, 0.058498, 0.063041 ], [206, -6215.790000, 0.047385, 0.000002, 0.086495 ], [207, -6215.790000, 0.047385, 0.000002, 0.086495 ], [204, -6215.810000, 0.046478, 0.018959, 0.080341 ], [25, -6215.820000, 0.046137, 0.014512, 0.080488 ], [205, -6215.820000, 0.046132, 0.000009, 0.080491 ] ], "n": ["FDJVGXF01BXXOZ_rvcmp" ] }, {"p": [[198, -4102.340000, 0.471711, 0.000006, 0.109432 ], [196, -4102.470000, 0.414399, 0.047843, 0.091673 ], [226, -4105.000000, 0.033151, 0.028254, 0.101862 ], [17, -4105.140000, 0.028887, 0.049256, 0.104599 ], [206, -4105.650000, 0.017285, 0.000002, 0.131758 ], [207, -4105.650000, 0.017285, 0.000002, 0.131758 ], [208, -4105.650000, 0.017284, 0.000006, 0.131755 ] ], "n": ["FDJVGXF01CTI4R_rvcmp" ] }, {"p": [[200, -4756.300000, 0.220055, 0.012685, 0.080933 ], [203, -4756.310000, 0.220009, 0.009990, 0.080936 ], [204, -4756.310000, 0.219909, 0.000009, 0.080931 ], [197, -4756.470000, 0.187171, 0.010870, 0.081325 ], [201, -4757.430000, 0.071324, 0.019126, 0.085717 ], [199, -4757.960000, 0.041985, 0.011251, 0.082851 ], [196, -4758.020000, 0.039546, 0.076825, 0.082888 ] ], "n": ["FDJVGXF01ASB9O" ] }, {"p": [[200, -3376.270000, 0.182422, 0.012685, 0.108685 ], [204, -3376.270000, 0.182359, 0.000010, 0.108682 ], [203, -3376.270000, 0.182337, 0.009988, 0.108683 ], [199, -3376.630000, 0.127655, 0.000885, 0.108589 ], [197, -3376.630000, 0.127628, 0.024089, 0.108425 ], [196, -3376.740000, 0.113979, 0.048390, 0.101581 ], [202, -3377.050000, 0.083621, 0.045735, 0.108844 ] ], "n": ["FDJVGXF01EDN70_rvcmp" ] }, {"p": [[200, -3376.270000, 0.182422, 0.012685, 0.108685 ], [204, -3376.270000, 0.182359, 0.000010, 0.108682 ], [203, -3376.270000, 0.182337, 0.009988, 0.108683 ], [199, -3376.630000, 0.127655, 0.000885, 0.108589 ], [197, -3376.630000, 0.127628, 0.024089, 0.108425 ], [196, -3376.740000, 0.113979, 0.048390, 0.101581 ], [202, -3377.050000, 0.083621, 0.045735, 0.108844 ] ], "n": ["FDJVGXF01BGV64_rvcmp" ] }, {"p": [[200, -3376.270000, 0.182422, 0.012685, 0.108685 ], [204, -3376.270000, 0.182359, 0.000010, 0.108682 ], [203, -3376.270000, 0.182337, 0.009988, 0.108683 ], [199, -3376.630000, 0.127655, 0.000885, 0.108589 ], [197, -3376.630000, 0.127628, 0.024089, 0.108425 ], [196, -3376.740000, 0.113979, 0.048390, 0.101581 ], [202, -3377.050000, 0.083621, 0.045735, 0.108844 ] ], "n": ["FDJVGXF01AWDYC_rvcmp" ] }, {"p": [[202, -7700.950000, 0.501220, 0.039127, 0.037162 ], [204, -7701.990000, 0.176831, 0.015522, 0.051750 ], [25, -7702.130000, 0.153429, 0.014512, 0.052263 ], [205, -7702.130000, 0.153400, 0.000006, 0.052266 ], [203, -7704.450000, 0.015120, 0.009615, 0.058042 ] ], "n": ["FDJVGXF01B80I4" ] }, {"p": [[202, -7554.760000, 0.459974, 0.043934, 0.032369 ], [204, -7554.910000, 0.395066, 0.010874, 0.042530 ], [203, -7557.010000, 0.048507, 0.009378, 0.048355 ], [25, -7557.090000, 0.044744, 0.014061, 0.045997 ], [205, -7557.100000, 0.044389, 0.000008, 0.046152 ], [22, -7558.900000, 0.007320, 0.011373, 0.050466 ] ], "n": ["FDJVGXF01BYGE4_rvcmp" ] }, {"p": [[202, -7113.570000, 0.254888, 0.038115, 0.040833 ], [204, -7113.590000, 0.250208, 0.015579, 0.051935 ], [205, -7113.720000, 0.217952, 0.000006, 0.052432 ], [25, -7113.720000, 0.217928, 0.014512, 0.052429 ], [226, -7115.780000, 0.027954, 0.015742, 0.040776 ], [203, -7116.040000, 0.021480, 0.009992, 0.059166 ], [210, -7116.850000, 0.009590, 0.004390, 0.056197 ] ], "n": ["FDJVGXF01B65ZD_rvcmp" ] }, {"p": [[202, -3768.090000, 0.254562, 0.015398, 0.108124 ], [196, -3768.590000, 0.154923, 0.019496, 0.104684 ], [26, -3768.700000, 0.139599, 0.097406, 0.109046 ], [195, -3768.700000, 0.139371, 0.009446, 0.109056 ], [200, -3768.790000, 0.126720, 0.012685, 0.115778 ], [203, -3768.790000, 0.126699, 0.009988, 0.115790 ], [20, -3769.570000, 0.058126, 0.000005, 0.085139 ] ], "n": ["FDJVGXF01BT8LZ" ] }, {"p": [[203, -7596.560000, 0.219382, 0.005248, 0.126265 ], [200, -7596.850000, 0.163303, 0.010835, 0.125245 ], [202, -7596.880000, 0.159791, 0.061774, 0.129660 ], [204, -7596.900000, 0.155954, 0.003469, 0.122885 ], [18, -7597.330000, 0.101319, 0.050321, 0.104151 ], [22, -7597.340000, 0.100128, 0.000007, 0.105557 ], [21, -7597.340000, 0.100122, 0.017640, 0.105552 ] ], "n": ["FDJVGXF01DHTNV_rvcmp" ] }, {"p": [[204, -8023.260000, 0.362265, 0.010815, 0.046440 ], [20, -8023.470000, 0.293405, 0.000007, 0.048613 ], [22, -8024.210000, 0.140381, 0.003996, 0.044345 ], [21, -8024.460000, 0.108743, 0.017640, 0.047509 ], [19, -8024.590000, 0.095207, 0.012620, 0.049320 ] ], "n": ["FDJVGXF01DQJK1" ] }, {"p": [[204, -7922.000000, 0.326008, 0.010795, 0.047244 ], [20, -7922.210000, 0.265854, 0.000007, 0.049364 ], [22, -7922.960000, 0.125425, 0.003943, 0.045109 ], [21, -7923.200000, 0.098180, 0.017640, 0.048278 ], [18, -7923.210000, 0.098049, 0.051699, 0.048278 ], [19, -7923.330000, 0.086484, 0.012620, 0.050099 ] ], "n": ["FDJVGXF01CQYQ6" ] }, {"p": [[204, -7648.820000, 0.420171, 0.008798, 0.050262 ], [22, -7649.210000, 0.284397, 0.009490, 0.042229 ], [196, -7649.660000, 0.181528, 0.048180, 0.045927 ], [20, -7651.100000, 0.043046, 0.000008, 0.052486 ], [200, -7651.300000, 0.035363, 0.012685, 0.061466 ], [21, -7651.800000, 0.021343, 0.017642, 0.050368 ], [19, -7652.220000, 0.014151, 0.012620, 0.053323 ] ], "n": ["FDJVGXF01BTVRT_rvcmp" ] }, {"p": [[204, -7648.820000, 0.420171, 0.008798, 0.050262 ], [22, -7649.210000, 0.284397, 0.009490, 0.042229 ], [196, -7649.660000, 0.181528, 0.048180, 0.045927 ], [20, -7651.100000, 0.043046, 0.000008, 0.052486 ], [200, -7651.300000, 0.035363, 0.012685, 0.061466 ], [21, -7651.800000, 0.021343, 0.017642, 0.050368 ], [19, -7652.220000, 0.014151, 0.012620, 0.053323 ] ], "n": ["FDJVGXF01D181H_rvcmp" ] }, {"p": [[204, -7934.660000, 0.399654, 0.004788, 0.061898 ], [200, -7935.240000, 0.225614, 0.012685, 0.067113 ], [203, -7935.240000, 0.225483, 0.009988, 0.067114 ], [202, -7936.450000, 0.066894, 0.048062, 0.058934 ], [196, -7936.570000, 0.059212, 0.060871, 0.061191 ], [199, -7937.510000, 0.023143, 0.013298, 0.069889 ] ], "n": ["FDJVGXF01EW37D_rvcmp" ] }, {"p": [[204, -7598.810000, 0.420876, 0.008790, 0.050502 ], [22, -7599.210000, 0.283311, 0.009489, 0.042424 ], [196, -7599.650000, 0.181235, 0.048188, 0.046171 ], [20, -7601.090000, 0.043203, 0.000008, 0.052712 ], [200, -7601.280000, 0.035780, 0.012685, 0.061753 ], [21, -7601.790000, 0.021382, 0.017642, 0.050602 ], [19, -7602.200000, 0.014213, 0.012620, 0.053561 ] ], "n": ["FDJVGXF01B5LRT" ] }, {"p": [[204, -7648.820000, 0.420171, 0.008798, 0.050262 ], [22, -7649.210000, 0.284397, 0.009490, 0.042229 ], [196, -7649.660000, 0.181528, 0.048180, 0.045927 ], [20, -7651.100000, 0.043046, 0.000008, 0.052486 ], [200, -7651.300000, 0.035363, 0.012685, 0.061466 ], [21, -7651.800000, 0.021343, 0.017642, 0.050368 ], [19, -7652.220000, 0.014151, 0.012620, 0.053323 ] ], "n": ["FDJVGXF01A4VUJ_rvcmp" ] }, {"p": [[204, -7930.470000, 0.747840, 0.008408, 0.055296 ], [200, -7932.540000, 0.094463, 0.012685, 0.066434 ], [203, -7932.540000, 0.094406, 0.009988, 0.066445 ], [202, -7933.800000, 0.026747, 0.048048, 0.058557 ], [196, -7933.930000, 0.023533, 0.060879, 0.060812 ], [20, -7934.520000, 0.013011, 0.000007, 0.063020 ] ], "n": ["FDJVGXF01DSZUX" ] }, {"p": [[204, -7913.530000, 0.266466, 0.015044, 0.080083 ], [25, -7913.670000, 0.230400, 0.014512, 0.080699 ], [205, -7913.670000, 0.230392, 0.000009, 0.080710 ], [200, -7914.200000, 0.135842, 0.008280, 0.080708 ], [196, -7914.760000, 0.078031, 0.058077, 0.061191 ], [203, -7915.350000, 0.042890, 0.009990, 0.086954 ], [208, -7916.340000, 0.015979, 0.009084, 0.088751 ] ], "n": ["FDJVGXF01D8SLX_rvcmp" ] }, {"p": [[204, -7687.570000, 0.882632, 0.011591, 0.075174 ], [22, -7690.140000, 0.067368, 0.006951, 0.082132 ], [25, -7691.100000, 0.025790, 0.010361, 0.083133 ], [21, -7691.760000, 0.013384, 0.017640, 0.090019 ], [20, -7691.970000, 0.010825, 0.005580, 0.092744 ] ], "n": ["FDJVGXF01EX5JR_rvcmp" ] }, {"p": [[204, -7420.140000, 0.347943, 0.004764, 0.064711 ], [200, -7420.660000, 0.207964, 0.012685, 0.069658 ], [203, -7420.660000, 0.207584, 0.009988, 0.069663 ], [196, -7420.730000, 0.193321, 0.054140, 0.058578 ], [199, -7422.460000, 0.034173, 0.012918, 0.071108 ], [20, -7423.790000, 0.009015, 0.000005, 0.065076 ] ], "n": ["FDJVGXF01DUVCA" ] }, {"p": [[204, -7443.450000, 0.508504, 0.009538, 0.051082 ], [20, -7444.200000, 0.238809, 0.000007, 0.052933 ], [22, -7445.000000, 0.107671, 0.003627, 0.048797 ], [21, -7445.200000, 0.088405, 0.017640, 0.051935 ], [200, -7446.510000, 0.023804, 0.012685, 0.064429 ], [203, -7446.510000, 0.023780, 0.009988, 0.064432 ], [196, -7447.480000, 0.009025, 0.057645, 0.057025 ] ], "n": ["FDJVGXF01DFRS3" ] }, {"p": [[204, -7697.720000, 0.732537, 0.008355, 0.056672 ], [200, -7699.740000, 0.097578, 0.012685, 0.068042 ], [203, -7699.740000, 0.097522, 0.009988, 0.068053 ], [202, -7700.750000, 0.035429, 0.046197, 0.059535 ], [196, -7701.150000, 0.023730, 0.061059, 0.062466 ], [20, -7701.740000, 0.013204, 0.000007, 0.064430 ] ], "n": ["FDJVGXF01BAYI3" ] }, {"p": [[204, -7632.920000, 0.241838, 0.005691, 0.062757 ], [196, -7633.060000, 0.210267, 0.055507, 0.050908 ], [170, -7633.520000, 0.132384, 0.007663, 0.073466 ], [200, -7633.600000, 0.121494, 0.012685, 0.068275 ], [203, -7633.610000, 0.121294, 0.009988, 0.068288 ], [154, -7633.740000, 0.105864, 0.030340, 0.079868 ], [149, -7634.200000, 0.066859, 0.059251, 0.063575 ] ], "n": ["FDJVGXF01CFIA4" ] }, {"p": [[204, -7632.920000, 0.241838, 0.005691, 0.062757 ], [196, -7633.060000, 0.210267, 0.055507, 0.050908 ], [170, -7633.520000, 0.132384, 0.007663, 0.073466 ], [200, -7633.600000, 0.121494, 0.012685, 0.068275 ], [203, -7633.610000, 0.121294, 0.009988, 0.068288 ], [154, -7633.740000, 0.105864, 0.030340, 0.079868 ], [149, -7634.200000, 0.066859, 0.059251, 0.063575 ] ], "n": ["FDJVGXF01EJUSJ" ] }, {"p": [[204, -7064.590000, 0.559992, 0.007884, 0.055268 ], [20, -7066.000000, 0.137125, 0.000007, 0.056566 ], [200, -7066.450000, 0.086726, 0.012685, 0.066457 ], [203, -7066.460000, 0.086669, 0.009988, 0.066449 ], [22, -7066.840000, 0.058751, 0.003326, 0.052596 ], [21, -7067.000000, 0.050190, 0.017640, 0.055677 ], [196, -7067.890000, 0.020546, 0.062798, 0.061038 ] ], "n": ["FDJVGXF01C3KKN" ] }, {"p": [[204, -6808.400000, 0.631413, 0.008239, 0.064466 ], [200, -6810.350000, 0.089952, 0.012685, 0.077195 ], [203, -6810.350000, 0.089804, 0.009988, 0.077200 ], [20, -6810.580000, 0.070921, 0.000007, 0.065300 ], [196, -6810.620000, 0.068039, 0.053531, 0.065816 ], [22, -6811.600000, 0.025521, 0.002388, 0.063030 ], [21, -6811.650000, 0.024350, 0.000009, 0.066516 ] ], "n": ["FDJVGXF01CR501" ] }, {"p": [[204, -6582.580000, 0.456840, 0.006772, 0.086692 ], [200, -6583.650000, 0.156358, 0.012685, 0.097393 ], [203, -6583.650000, 0.156295, 0.009988, 0.097395 ], [196, -6583.990000, 0.111738, 0.052099, 0.085503 ], [201, -6584.810000, 0.049193, 0.015349, 0.100640 ], [202, -6584.980000, 0.041201, 0.061774, 0.102303 ], [199, -6585.360000, 0.028375, 0.012860, 0.100498 ] ], "n": ["FDJVGXF01DCRDD" ] }, {"p": [[204, -5245.230000, 0.358533, 0.009132, 0.089643 ], [20, -5245.990000, 0.166478, 0.000008, 0.076998 ], [200, -5246.210000, 0.134185, 0.012685, 0.100745 ], [196, -5246.290000, 0.123680, 0.050507, 0.088756 ], [21, -5246.710000, 0.081066, 0.000008, 0.078435 ], [22, -5246.810000, 0.073263, 0.001556, 0.076993 ], [199, -5246.970000, 0.062794, 0.007651, 0.101623 ] ], "n": ["FDJVGXF01AKLWC" ] }, {"p": [[204, -4417.870000, 0.340176, 0.006738, 0.061764 ], [203, -4418.430000, 0.195884, 0.004269, 0.073199 ], [202, -4418.630000, 0.160255, 0.057550, 0.072726 ], [201, -4418.680000, 0.152150, 0.019126, 0.075889 ], [200, -4419.210000, 0.089280, 0.012685, 0.076644 ], [196, -4420.180000, 0.033772, 0.075481, 0.080266 ], [197, -4420.350000, 0.028484, 0.016494, 0.085853 ] ], "n": ["FDJVGXF01A8GGP_rvcmp" ] }, {"p": [[204, -4575.000000, 0.354340, 0.009081, 0.088204 ], [196, -4575.410000, 0.235732, 0.032940, 0.086335 ], [200, -4575.970000, 0.134127, 0.012685, 0.100900 ], [203, -4575.970000, 0.133879, 0.009988, 0.100909 ], [199, -4576.730000, 0.062831, 0.007647, 0.101952 ], [197, -4576.950000, 0.050400, 0.024513, 0.107578 ], [20, -4577.520000, 0.028691, 0.000008, 0.082530 ] ], "n": ["FDJVGXF01EPCPG_rvcmp" ] }, {"p": [[204, -4621.190000, 0.387559, 0.009056, 0.088981 ], [200, -4622.150000, 0.148336, 0.012685, 0.101719 ], [203, -4622.150000, 0.148063, 0.009988, 0.101728 ], [196, -4622.260000, 0.132448, 0.050951, 0.088611 ], [199, -4622.900000, 0.070018, 0.007526, 0.102826 ], [197, -4623.110000, 0.056811, 0.024513, 0.108356 ], [198, -4623.110000, 0.056766, 0.013117, 0.108359 ] ], "n": ["FDJVGXF01DHD7T_rvcmp" ] }, {"p": [[204, -3815.830000, 0.281582, 0.007602, 0.129995 ], [200, -3816.350000, 0.167935, 0.012685, 0.144251 ], [203, -3816.350000, 0.167808, 0.009988, 0.144267 ], [197, -3816.540000, 0.137654, 0.016553, 0.137442 ], [199, -3816.990000, 0.087810, 0.004201, 0.147176 ], [198, -3817.030000, 0.084694, 0.013117, 0.149898 ], [196, -3817.190000, 0.072518, 0.065003, 0.142972 ] ], "n": ["FDJVGXF01DPR33" ] }, {"p": [[204, -2768.810000, 0.310291, 0.013609, 0.027211 ], [25, -2769.310000, 0.187559, 0.014512, 0.029349 ], [205, -2769.310000, 0.187509, 0.000009, 0.029347 ], [39, -2769.740000, 0.121249, 0.015967, 0.028182 ], [196, -2770.140000, 0.082028, 0.011213, 0.032872 ], [195, -2770.170000, 0.079645, 0.009446, 0.035930 ], [37, -2771.090000, 0.031719, 0.000006, 0.051765 ] ], "n": ["FDJVGXF01D48Q1" ] }, {"p": [[204, -2420.400000, 0.299367, 0.013545, 0.032751 ], [25, -2420.880000, 0.184783, 0.014512, 0.035628 ], [205, -2420.880000, 0.184731, 0.000009, 0.035626 ], [39, -2421.330000, 0.117938, 0.016042, 0.034380 ], [196, -2421.640000, 0.086462, 0.006845, 0.041909 ], [195, -2421.650000, 0.085590, 0.009446, 0.043873 ], [37, -2422.380000, 0.041129, 0.000006, 0.061533 ] ], "n": ["FDJVGXF01EPCRX_rvcmp" ] }, {"p": [[204, -3162.070000, 0.512055, 0.005464, 0.168763 ], [200, -3163.440000, 0.129969, 0.012685, 0.185644 ], [203, -3163.440000, 0.129956, 0.009988, 0.185648 ], [201, -3164.100000, 0.067557, 0.017967, 0.196688 ], [202, -3164.100000, 0.067540, 0.061774, 0.196608 ], [199, -3164.470000, 0.046705, 0.003441, 0.197949 ], [196, -3164.480000, 0.046217, 0.046489, 0.189829 ] ], "n": ["FDJVGXF01B4C28" ] }, {"p": [[205, -8706.690000, 1.000000, 0.023070, 0.044057 ] ], "n": ["FDJVGXF01E06Z6_rvcmp" ] }, {"p": [[205, -8923.350000, 0.972151, 0.023197, 0.070025 ], [22, -8927.550000, 0.014637, 0.025291, 0.083019 ], [209, -8927.650000, 0.013212, 0.006837, 0.084777 ] ], "n": ["FDJVGXF01D5ED9" ] }, {"p": [[205, -7069.180000, 0.396266, 0.006289, 0.056385 ], [204, -7069.490000, 0.290818, 0.014670, 0.055977 ], [25, -7070.010000, 0.172333, 0.008344, 0.062134 ], [24, -7070.980000, 0.065310, 0.000009, 0.069006 ], [23, -7071.000000, 0.064315, 0.003604, 0.069007 ], [226, -7073.400000, 0.005804, 0.027209, 0.069703 ], [227, -7073.520000, 0.005154, 0.000005, 0.071651 ] ], "n": ["FDJVGXF01BMGFG_rvcmp" ] }, {"p": [[205, -7337.700000, 0.294046, 0.029883, 0.068329 ], [22, -7338.170000, 0.184536, 0.027378, 0.071825 ], [209, -7338.170000, 0.183154, 0.006837, 0.072137 ], [210, -7338.170000, 0.182922, 0.000009, 0.072147 ], [208, -7338.440000, 0.140986, 0.020690, 0.073992 ], [206, -7341.410000, 0.007178, 0.000001, 0.085707 ], [207, -7341.410000, 0.007178, 0.000001, 0.085707 ] ], "n": ["FDJVGXF01EGX25" ] }, {"p": [[205, -7419.430000, 0.609185, 0.013367, 0.077640 ], [204, -7420.550000, 0.198532, 0.013496, 0.086085 ], [25, -7421.120000, 0.111984, 0.014512, 0.090411 ], [200, -7421.890000, 0.051867, 0.005610, 0.089254 ], [199, -7422.490000, 0.028432, 0.012803, 0.090561 ] ], "n": ["FDJVGXF01AK5U0" ] }, {"p": [[205, -7607.900000, 0.429262, 0.026862, 0.061736 ], [152, -7608.530000, 0.229408, 0.024146, 0.075079 ], [153, -7608.600000, 0.213828, 0.006106, 0.067590 ], [151, -7609.450000, 0.091149, 0.014659, 0.077184 ], [208, -7611.220000, 0.015460, 0.020019, 0.070978 ], [209, -7611.460000, 0.012203, 0.000007, 0.072686 ], [171, -7611.800000, 0.008690, 0.020471, 0.065295 ] ], "n": ["FDJVGXF01AGPIW" ] }, {"p": [[205, -6955.700000, 0.567819, 0.014205, 0.078906 ], [204, -6956.420000, 0.276388, 0.013637, 0.083756 ], [22, -6957.100000, 0.139436, 0.014137, 0.086767 ], [25, -6959.250000, 0.016357, 0.014513, 0.091588 ] ], "n": ["FDJVGXF01CIP9R_rvcmp" ] }, {"p": [[205, -7337.790000, 0.385661, 0.026834, 0.065110 ], [152, -7338.310000, 0.229671, 0.024083, 0.079299 ], [153, -7338.440000, 0.201322, 0.005960, 0.071713 ], [151, -7339.210000, 0.092873, 0.014659, 0.081514 ], [171, -7339.840000, 0.049926, 0.019243, 0.066154 ], [40, -7340.500000, 0.025661, 0.068721, 0.065786 ], [208, -7341.050000, 0.014886, 0.020051, 0.074861 ] ], "n": ["FDJVGXF01B2SXC" ] }, {"p": [[205, -7237.020000, 1.000000, 0.019512, 0.033403 ] ], "n": ["FDJVGXF01CPE1R_rvcmp" ] }, {"p": [[205, -7418.430000, 0.363607, 0.026826, 0.069772 ], [152, -7418.810000, 0.247741, 0.024010, 0.084055 ], [153, -7419.010000, 0.201962, 0.005738, 0.076964 ], [171, -7419.740000, 0.097820, 0.021049, 0.067908 ], [40, -7420.470000, 0.047034, 0.072251, 0.068007 ], [190, -7421.260000, 0.021271, 0.029264, 0.072469 ], [191, -7421.300000, 0.020566, 0.008132, 0.076573 ] ], "n": ["FDJVGXF01AXQ6D" ] }, {"p": [[205, -5567.480000, 0.735916, 0.013145, 0.000111 ], [25, -5569.190000, 0.132170, 0.014512, 0.006967 ], [204, -5569.200000, 0.131914, 0.020143, 0.006967 ] ], "n": ["FDJVGXF01AOVEB" ] }, {"p": [[205, -5567.480000, 0.735916, 0.013145, 0.000111 ], [25, -5569.190000, 0.132170, 0.014512, 0.006967 ], [204, -5569.200000, 0.131914, 0.020143, 0.006967 ] ], "n": ["FDJVGXF01EO822" ] }, {"p": [[205, -4309.980000, 0.320871, 0.000006, 0.048000 ], [25, -4309.980000, 0.320846, 0.014512, 0.047996 ], [204, -4309.980000, 0.320733, 0.020143, 0.047996 ], [196, -4313.020000, 0.015319, 0.062930, 0.042998 ], [200, -4313.440000, 0.010071, 0.012685, 0.057148 ], [23, -4313.940000, 0.006080, 0.003604, 0.058311 ], [24, -4313.940000, 0.006080, 0.001125, 0.058312 ] ], "n": ["FDJVGXF01CU478" ] }, {"p": [[205, -6062.970000, 1.000000, 0.020023, 0.051283 ] ], "n": ["FDJVGXF01DZAZN_rvcmp" ] }, {"p": [[205, -4873.990000, 0.222671, 0.034333, 0.093321 ], [208, -4874.100000, 0.199548, 0.024224, 0.100445 ], [209, -4874.100000, 0.199418, 0.000007, 0.100444 ], [206, -4874.820000, 0.097091, 0.000001, 0.111845 ], [207, -4874.820000, 0.097091, 0.000001, 0.111845 ], [22, -4874.840000, 0.095455, 0.024327, 0.100654 ], [210, -4874.910000, 0.088726, 0.000009, 0.102512 ] ], "n": ["FDJVGXF01E11AV_rvcmp" ] }, {"p": [[205, -3388.470000, 0.215952, 0.000007, 0.042633 ], [25, -3388.470000, 0.215821, 0.014512, 0.042630 ], [204, -3388.470000, 0.215806, 0.020143, 0.042630 ], [190, -3388.610000, 0.187231, 0.021598, 0.025648 ], [191, -3389.820000, 0.056119, 0.007313, 0.037262 ], [171, -3389.840000, 0.054733, 0.034632, 0.035374 ], [192, -3389.850000, 0.054338, 0.000005, 0.040428 ] ], "n": ["FDJVGXF01DGL9L_rvcmp" ] }, {"p": [[205, -3231.020000, 0.243259, 0.000009, 0.046582 ], [25, -3231.020000, 0.243107, 0.014512, 0.046590 ], [204, -3231.020000, 0.242965, 0.020143, 0.046590 ], [190, -3232.010000, 0.090366, 0.027041, 0.040058 ], [191, -3232.310000, 0.067179, 0.015648, 0.051140 ], [192, -3232.310000, 0.067172, 0.000005, 0.051143 ], [39, -3232.690000, 0.045952, 0.019446, 0.049151 ] ], "n": ["FDJVGXF01EBB3U" ] }, {"p": [[205, -1836.300000, 0.312076, 0.000009, 0.000006 ], [204, -1836.300000, 0.312064, 0.020143, 0.000006 ], [25, -1836.300000, 0.311792, 0.014512, 0.000006 ], [206, -1839.160000, 0.017925, 0.000002, 0.016079 ], [207, -1839.160000, 0.017925, 0.000002, 0.016079 ], [208, -1839.160000, 0.017924, 0.000006, 0.016077 ], [209, -1839.710000, 0.010294, 0.000007, 0.009508 ] ], "n": ["FDJVGXF01E1J9N" ] }, {"p": [[208, -7662.010000, 0.322184, 0.006777, 0.074938 ], [206, -7662.370000, 0.224969, 0.000001, 0.079279 ], [207, -7662.370000, 0.224969, 0.000001, 0.079279 ], [205, -7663.140000, 0.104637, 0.025422, 0.072800 ], [209, -7663.660000, 0.061904, 0.000007, 0.077020 ], [22, -7664.360000, 0.030731, 0.028187, 0.076958 ], [204, -7664.370000, 0.030605, 0.016873, 0.076828 ] ], "n": ["FDJVGXF01DH0AP" ] }, {"p": [[208, -5537.520000, 0.307879, 0.009699, 0.076482 ], [22, -5538.240000, 0.148878, 0.022199, 0.076610 ], [206, -5538.490000, 0.116042, 0.000001, 0.082299 ], [207, -5538.490000, 0.116042, 0.000001, 0.082299 ], [209, -5538.600000, 0.104211, 0.000008, 0.082048 ], [205, -5538.600000, 0.104173, 0.038638, 0.082049 ], [210, -5538.610000, 0.102775, 0.000009, 0.081573 ] ], "n": ["FDJVGXF01C9WBH" ] }, {"p": [[208, -5070.520000, 0.247764, 0.009741, 0.125891 ], [22, -5071.150000, 0.131823, 0.024309, 0.129694 ], [206, -5071.170000, 0.129977, 0.000001, 0.131661 ], [207, -5071.170000, 0.129977, 0.000001, 0.131661 ], [209, -5071.240000, 0.121248, 0.000007, 0.133772 ], [205, -5071.240000, 0.121190, 0.038636, 0.133773 ], [210, -5071.260000, 0.118022, 0.000009, 0.133546 ] ], "n": ["FDJVGXF01EOYI2_rvcmp" ] }, {"p": [[208, -3253.110000, 0.193264, 0.018304, 0.059297 ], [205, -3253.410000, 0.143248, 0.038635, 0.065345 ], [209, -3253.410000, 0.143246, 0.000007, 0.065346 ], [22, -3253.470000, 0.135146, 0.028187, 0.066121 ], [23, -3253.520000, 0.128370, 0.001348, 0.067545 ], [24, -3253.520000, 0.128368, 0.000009, 0.067545 ], [25, -3253.520000, 0.128358, 0.000007, 0.067549 ] ], "n": ["FDJVGXF01CPHGI" ] }, {"p": [[209, -6518.480000, 0.143255, 0.000007, 1.999990 ], [208, -6518.480000, 0.143255, 0.024246, 1.999990 ], [210, -6518.490000, 0.143233, 0.000009, 1.999990 ], [22, -6518.490000, 0.143209, 0.028187, 1.999990 ], [206, -6518.490000, 0.142902, 0.000001, 1.999990 ], [207, -6518.490000, 0.142902, 0.000001, 1.999990 ], [225, -6518.500000, 0.141244, 0.036449, 1.999990 ] ], "n": ["FDJVGXF01DQ123" ] }, {"p": [[209, -8214.770000, 0.153733, 0.000007, 1.999990 ], [208, -8214.770000, 0.153733, 0.024246, 1.999990 ], [205, -8214.770000, 0.153713, 0.038635, 1.999990 ], [22, -8214.770000, 0.153629, 0.028187, 1.999990 ], [210, -8214.770000, 0.153604, 0.000009, 1.999990 ], [11, -8215.050000, 0.115794, 0.000001, 1.999990 ], [12, -8215.050000, 0.115794, 0.001169, 1.999990 ] ], "n": ["FDJVGXF01ELVFY" ] }, {"p": [[210, -7052.430000, 0.227704, 0.005242, 0.107803 ], [1, -7052.710000, 0.170850, 0.038659, 0.091028 ], [28, -7052.870000, 0.145984, 0.030471, 0.103485 ], [209, -7052.950000, 0.135514, 0.006837, 0.114239 ], [22, -7052.950000, 0.135437, 0.028184, 0.114236 ], [226, -7053.200000, 0.104631, 0.016951, 0.094825 ], [205, -7053.470000, 0.079880, 0.038635, 0.117809 ] ], "n": ["FDJVGXF01AKAVZ" ] }, {"p": [[210, -4496.080000, 0.204297, 0.007982, 0.054073 ], [22, -4496.250000, 0.172586, 0.019501, 0.061094 ], [18, -4496.410000, 0.146770, 0.034265, 0.057041 ], [205, -4496.450000, 0.141133, 0.037591, 0.063419 ], [209, -4496.460000, 0.139655, 0.000327, 0.064929 ], [208, -4496.460000, 0.139526, 0.024246, 0.065016 ], [226, -4497.380000, 0.056033, 0.000008, 0.054599 ] ], "n": ["FDJVGXF01BUDHC_rvcmp" ] }, {"p": [[210, -4408.380000, 0.183684, 0.003008, 0.076294 ], [209, -4408.430000, 0.175174, 0.006837, 0.079393 ], [17, -4408.620000, 0.143824, 0.042588, 0.065209 ], [227, -4408.710000, 0.132664, 0.000006, 0.070312 ], [226, -4408.710000, 0.132653, 0.032306, 0.070302 ], [2, -4408.740000, 0.128452, 0.029390, 0.071469 ], [205, -4408.950000, 0.103550, 0.034779, 0.078185 ] ], "n": ["FDJVGXF01D97QB" ] }, {"p": [[210, -4408.380000, 0.183684, 0.003008, 0.076294 ], [209, -4408.430000, 0.175174, 0.006837, 0.079393 ], [17, -4408.620000, 0.143824, 0.042588, 0.065209 ], [227, -4408.710000, 0.132664, 0.000006, 0.070312 ], [226, -4408.710000, 0.132653, 0.032306, 0.070302 ], [2, -4408.740000, 0.128452, 0.029390, 0.071469 ], [205, -4408.950000, 0.103550, 0.034779, 0.078185 ] ], "n": ["FDJVGXF01EK67K" ] }, {"p": [[212, -5446.450000, 0.177020, 0.000008, 1.875070 ], [148, -5446.600000, 0.152409, 0.000009, 1.999990 ], [147, -5446.600000, 0.152404, 0.065313, 1.999990 ], [219, -5446.760000, 0.129941, 0.000007, 1.963770 ], [222, -5446.770000, 0.129563, 0.000009, 1.964850 ], [220, -5446.770000, 0.129332, 0.000010, 1.967560 ], [221, -5446.770000, 0.129331, 0.000007, 1.967560 ] ], "n": ["FDJVGXF01EOJUM" ] }, {"p": [[212, -6687.480000, 0.201742, 0.000008, 1.758780 ], [213, -6687.670000, 0.166305, 0.023979, 1.810920 ], [225, -6687.670000, 0.166292, 0.000009, 1.810940 ], [224, -6687.670000, 0.166274, 0.010740, 1.810950 ], [216, -6688.140000, 0.103848, 0.038817, 1.925440 ], [223, -6688.140000, 0.103846, 0.016737, 1.925450 ], [217, -6688.260000, 0.091694, 0.000007, 1.960230 ] ], "n": ["FDJVGXF01DE7G6" ] }, {"p": [[212, -5844.360000, 0.218666, 0.000008, 1.392960 ], [213, -5844.850000, 0.134052, 0.000006, 1.481820 ], [211, -5844.850000, 0.134048, 0.024188, 1.481840 ], [224, -5844.870000, 0.132082, 0.010740, 1.481440 ], [223, -5844.900000, 0.127675, 0.016737, 1.465350 ], [219, -5844.910000, 0.126887, 0.000007, 1.467610 ], [221, -5844.910000, 0.126589, 0.003442, 1.468380 ] ], "n": ["FDJVGXF01BFVWC" ] }, {"p": [[216, -6190.480000, 0.153197, 0.038817, 1.956730 ], [223, -6190.480000, 0.153197, 0.016737, 1.956730 ], [217, -6190.570000, 0.139264, 0.000007, 1.986310 ], [218, -6190.580000, 0.138645, 0.000008, 1.990310 ], [219, -6190.580000, 0.138589, 0.000007, 1.988710 ], [220, -6190.580000, 0.138558, 0.000010, 1.988900 ], [221, -6190.580000, 0.138551, 0.000007, 1.988950 ] ], "n": ["FDJVGXF01DYSMW_rvcmp" ] }, {"p": [[225, -6003.560000, 0.528706, 0.021517, 0.139417 ], [226, -6004.220000, 0.273760, 0.014420, 0.138100 ], [210, -6005.360000, 0.087346, 0.018069, 0.159472 ], [213, -6006.430000, 0.029997, 0.012619, 0.157705 ], [17, -6006.480000, 0.028692, 0.045334, 0.142780 ], [227, -6006.500000, 0.027994, 0.000006, 0.145434 ], [26, -6006.680000, 0.023505, 0.062933, 0.136823 ] ], "n": ["FDJVGXF01B4C28_rvcmp" ] }, {"p": [[226, -9425.300000, 0.368314, 0.017926, 0.115035 ], [205, -9425.610000, 0.271049, 0.027844, 0.133824 ], [22, -9426.350000, 0.129463, 0.017416, 0.138592 ], [26, -9427.000000, 0.067585, 0.080697, 0.128304 ], [17, -9427.000000, 0.067367, 0.033912, 0.118917 ], [196, -9427.240000, 0.053067, 0.017550, 0.132249 ], [210, -9427.450000, 0.043155, 0.007167, 0.132912 ] ], "n": ["FDJVGXF01A39LX_rvcmp" ] }, {"p": [[226, -8838.250000, 0.371555, 0.019758, 0.047344 ], [209, -8839.030000, 0.170311, 0.004683, 0.063659 ], [22, -8839.200000, 0.142931, 0.025899, 0.064312 ], [210, -8839.210000, 0.141921, 0.001894, 0.063333 ], [205, -8839.890000, 0.072113, 0.023505, 0.062226 ], [227, -8840.110000, 0.057748, 0.000006, 0.054524 ], [204, -8840.390000, 0.043421, 0.012912, 0.063974 ] ], "n": ["FDJVGXF01AP643" ] }, {"p": [[226, -8838.250000, 0.371555, 0.019758, 0.047344 ], [209, -8839.030000, 0.170311, 0.004683, 0.063659 ], [22, -8839.200000, 0.142931, 0.025899, 0.064312 ], [210, -8839.210000, 0.141921, 0.001894, 0.063333 ], [205, -8839.890000, 0.072113, 0.023505, 0.062226 ], [227, -8840.110000, 0.057748, 0.000006, 0.054524 ], [204, -8840.390000, 0.043421, 0.012912, 0.063974 ] ], "n": ["FDJVGXF01AYG31" ] }, {"p": [[226, -8835.560000, 0.371388, 0.019762, 0.047365 ], [209, -8836.340000, 0.170363, 0.004683, 0.063674 ], [22, -8836.510000, 0.142979, 0.025899, 0.064327 ], [210, -8836.520000, 0.141962, 0.001893, 0.063348 ], [205, -8837.200000, 0.072130, 0.023499, 0.062231 ], [227, -8837.420000, 0.057741, 0.000006, 0.054529 ], [204, -8837.710000, 0.043435, 0.012908, 0.063990 ] ], "n": ["FDJVGXF01AUW88" ] }, {"p": [[226, -8844.300000, 0.760393, 0.022221, 0.039564 ], [227, -8845.580000, 0.211883, 0.000006, 0.043782 ], [210, -8848.280000, 0.014169, 0.005541, 0.056501 ], [22, -8848.320000, 0.013555, 0.021511, 0.059346 ] ], "n": ["FDJVGXF01AZKUX_rvcmp" ] }, {"p": [[226, -8749.410000, 0.615362, 0.022347, 0.045914 ], [227, -8750.580000, 0.189454, 0.000006, 0.050218 ], [204, -8751.720000, 0.060748, 0.012682, 0.059594 ], [205, -8751.730000, 0.059984, 0.013176, 0.058688 ], [209, -8752.530000, 0.027101, 0.004563, 0.063888 ], [210, -8752.600000, 0.025175, 0.003981, 0.062382 ], [22, -8752.730000, 0.022177, 0.025968, 0.064719 ] ], "n": ["FDJVGXF01B2CQ6_rvcmp" ] }, {"p": [[226, -8847.850000, 0.499970, 0.022262, 0.050335 ], [227, -8849.000000, 0.158035, 0.000006, 0.054533 ], [17, -8849.000000, 0.158001, 0.049256, 0.054539 ], [204, -8849.890000, 0.064722, 0.012861, 0.063559 ], [205, -8849.910000, 0.063647, 0.012857, 0.062608 ], [209, -8850.650000, 0.030366, 0.004619, 0.067779 ], [22, -8850.840000, 0.025259, 0.026004, 0.068609 ] ], "n": ["FDJVGXF01D6GZ5_rvcmp" ] }, {"p": [[226, -8839.580000, 0.631908, 0.022040, 0.040313 ], [227, -8840.880000, 0.171633, 0.000006, 0.044618 ], [17, -8840.880000, 0.171616, 0.049256, 0.044625 ], [210, -8843.400000, 0.013788, 0.005397, 0.057445 ], [22, -8843.620000, 0.011055, 0.024938, 0.060604 ] ], "n": ["FDJVGXF01C6QUM_rvcmp" ] }, {"p": [[226, -8954.730000, 0.657370, 0.023269, 0.037023 ], [227, -8956.070000, 0.172190, 0.000701, 0.043138 ], [17, -8956.080000, 0.170440, 0.049256, 0.043211 ] ], "n": ["FDJVGXF01E1RU5" ] }, {"p": [[226, -8954.730000, 0.657370, 0.023269, 0.037023 ], [227, -8956.070000, 0.172190, 0.000701, 0.043138 ], [17, -8956.080000, 0.170440, 0.049256, 0.043211 ] ], "n": ["FDJVGXF01DTZMC" ] }, {"p": [[226, -8954.730000, 0.657370, 0.023269, 0.037023 ], [227, -8956.070000, 0.172190, 0.000701, 0.043138 ], [17, -8956.080000, 0.170440, 0.049256, 0.043211 ] ], "n": ["FDJVGXF01BW2IU" ] }, {"p": [[226, -8954.730000, 0.657370, 0.023269, 0.037023 ], [227, -8956.070000, 0.172190, 0.000701, 0.043138 ], [17, -8956.080000, 0.170440, 0.049256, 0.043211 ] ], "n": ["FDJVGXF01B7RY8" ] }, {"p": [[226, -9100.930000, 0.700480, 0.022558, 0.036222 ], [227, -9102.470000, 0.149818, 0.000136, 0.042674 ], [17, -9102.480000, 0.149702, 0.049256, 0.042677 ] ], "n": ["FDJVGXF01B4FSY" ] }, {"p": [[226, -8960.100000, 0.599704, 0.023700, 0.047352 ], [227, -8961.210000, 0.198269, 0.000696, 0.052955 ], [17, -8961.220000, 0.196432, 0.049256, 0.053047 ], [22, -8964.780000, 0.005594, 0.024696, 0.070768 ] ], "n": ["FDJVGXF01BQME8" ] }, {"p": [[226, -8960.100000, 0.599704, 0.023700, 0.047352 ], [227, -8961.210000, 0.198269, 0.000696, 0.052955 ], [17, -8961.220000, 0.196432, 0.049256, 0.053047 ], [22, -8964.780000, 0.005594, 0.024696, 0.070768 ] ], "n": ["FDJVGXF01BS98Y" ] }, {"p": [[226, -8958.610000, 0.633335, 0.022859, 0.042092 ], [227, -8959.940000, 0.167884, 0.000661, 0.048183 ], [17, -8959.950000, 0.166411, 0.049256, 0.048248 ], [22, -8962.230000, 0.016906, 0.023438, 0.063464 ], [210, -8962.320000, 0.015463, 0.002545, 0.062214 ] ], "n": ["FDJVGXF01B54J6" ] }, {"p": [[226, -8993.280000, 0.359096, 0.027636, 0.091496 ], [17, -8993.480000, 0.295073, 0.049256, 0.092812 ], [227, -8993.480000, 0.294736, 0.000006, 0.092818 ], [210, -8996.160000, 0.020165, 0.001442, 0.111974 ], [209, -8996.180000, 0.019840, 0.006837, 0.113008 ], [2, -8997.310000, 0.006393, 0.021524, 0.093841 ], [205, -8997.620000, 0.004697, 0.017317, 0.109916 ] ], "n": ["FDJVGXF01A5PLY_rvcmp" ] }, {"p": [[226, -8687.470000, 0.484812, 0.022548, 0.052675 ], [227, -8688.540000, 0.165219, 0.000006, 0.056919 ], [17, -8688.540000, 0.165183, 0.049256, 0.056917 ], [204, -8689.480000, 0.064549, 0.012854, 0.066038 ], [205, -8689.510000, 0.062787, 0.012765, 0.065089 ], [209, -8690.210000, 0.031345, 0.004620, 0.070373 ], [22, -8690.390000, 0.026105, 0.026109, 0.071271 ] ], "n": ["FDJVGXF01BBDIC" ] }, {"p": [[226, -8647.850000, 0.390540, 0.020201, 0.047896 ], [22, -8648.790000, 0.152417, 0.023114, 0.064621 ], [209, -8648.870000, 0.141789, 0.005344, 0.064597 ], [210, -8648.940000, 0.131944, 0.001834, 0.064036 ], [227, -8649.600000, 0.068199, 0.000005, 0.055004 ], [17, -8649.600000, 0.068193, 0.049256, 0.055002 ], [205, -8649.970000, 0.046919, 0.023165, 0.063179 ] ], "n": ["FDJVGXF01BP2AX" ] }, {"p": [[226, -9128.370000, 0.317273, 0.024035, 0.120119 ], [2, -9128.820000, 0.202166, 0.030892, 0.119749 ], [227, -9128.930000, 0.181127, 0.012980, 0.124127 ], [228, -9128.930000, 0.181012, 0.000005, 0.124128 ], [17, -9129.390000, 0.114902, 0.045240, 0.121453 ], [1, -9132.870000, 0.003520, 0.066692, 0.109553 ] ], "n": ["FDJVGXF01DC3TP_rvcmp" ] }, {"p": [[226, -9128.370000, 0.317273, 0.024035, 0.120119 ], [2, -9128.820000, 0.202166, 0.030892, 0.119749 ], [227, -9128.930000, 0.181127, 0.012980, 0.124127 ], [228, -9128.930000, 0.181012, 0.000005, 0.124128 ], [17, -9129.390000, 0.114902, 0.045240, 0.121453 ], [1, -9132.870000, 0.003520, 0.066692, 0.109553 ] ], "n": ["FDJVGXF01BUJZR_rvcmp" ] }, {"p": [[226, -8147.700000, 0.310259, 0.016506, 0.075740 ], [210, -8147.890000, 0.257436, 0.006124, 0.090837 ], [209, -8148.640000, 0.122180, 0.006837, 0.097469 ], [22, -8148.640000, 0.122103, 0.028184, 0.097473 ], [208, -8148.850000, 0.098621, 0.018656, 0.096245 ], [205, -8149.200000, 0.069349, 0.038635, 0.099997 ], [17, -8150.440000, 0.020051, 0.045357, 0.081116 ] ], "n": ["FDJVGXF01DVLFF_rvcmp" ] }, {"p": [[226, -7762.390000, 0.840647, 0.017612, 0.030959 ], [210, -7765.110000, 0.055537, 0.005691, 0.048317 ], [22, -7765.230000, 0.048944, 0.022461, 0.052178 ], [209, -7765.500000, 0.037443, 0.006837, 0.053214 ], [205, -7766.270000, 0.017428, 0.015153, 0.049083 ] ], "n": ["FDJVGXF01BWU05_rvcmp" ] }, {"p": [[226, -7762.390000, 0.840647, 0.017612, 0.030959 ], [210, -7765.110000, 0.055537, 0.005691, 0.048317 ], [22, -7765.230000, 0.048944, 0.022461, 0.052178 ], [209, -7765.500000, 0.037443, 0.006837, 0.053214 ], [205, -7766.270000, 0.017428, 0.015153, 0.049083 ] ], "n": ["FDJVGXF01BW1CN_rvcmp" ] }, {"p": [[226, -7617.130000, 0.855245, 0.017272, 0.026149 ], [210, -7620.080000, 0.044799, 0.006010, 0.044504 ], [22, -7620.430000, 0.031715, 0.025318, 0.049201 ], [209, -7620.530000, 0.028560, 0.006837, 0.049957 ], [205, -7620.700000, 0.024071, 0.015412, 0.045299 ], [204, -7621.140000, 0.015610, 0.015358, 0.048486 ] ], "n": ["FDJVGXF01B1Y4W_rvcmp" ] }, {"p": [[226, -8164.820000, 0.665159, 0.017643, 0.040602 ], [210, -8166.930000, 0.080563, 0.005066, 0.056548 ], [22, -8167.130000, 0.066399, 0.025108, 0.059710 ], [209, -8167.230000, 0.060068, 0.006835, 0.060595 ], [227, -8167.400000, 0.050514, 0.000006, 0.048174 ], [205, -8167.540000, 0.043795, 0.014769, 0.056322 ], [204, -8167.810000, 0.033501, 0.014539, 0.058650 ] ], "n": ["FDJVGXF01DLDAM_rvcmp" ] }, {"p": [[226, -7741.710000, 0.788221, 0.017433, 0.031904 ], [210, -7744.260000, 0.061585, 0.005508, 0.049528 ], [22, -7744.510000, 0.048113, 0.024944, 0.053398 ], [209, -7744.630000, 0.042718, 0.006837, 0.054340 ], [205, -7744.850000, 0.034092, 0.015083, 0.049731 ], [204, -7745.150000, 0.025271, 0.014237, 0.052227 ] ], "n": ["FDJVGXF01D0TIM_rvcmp" ] }, {"p": [[226, -7758.930000, 0.551594, 0.021099, 0.096460 ], [17, -7759.830000, 0.224393, 0.049256, 0.101204 ], [227, -7759.830000, 0.224012, 0.000006, 0.101211 ] ], "n": ["FDJVGXF01BLAW1" ] }, {"p": [[226, -9345.660000, 0.476005, 0.025996, 0.064178 ], [227, -9346.300000, 0.250939, 0.000005, 0.067922 ], [17, -9346.300000, 0.250898, 0.049256, 0.067919 ], [22, -9348.730000, 0.022158, 0.009196, 0.079539 ] ], "n": ["FDJVGXF01E07G7_rvcmp" ] }, {"p": [[226, -9266.680000, 0.287583, 0.020871, 0.086761 ], [210, -9267.000000, 0.208446, 0.000009, 0.107018 ], [22, -9267.000000, 0.208372, 0.028187, 0.107025 ], [209, -9267.000000, 0.208221, 0.006837, 0.107020 ], [17, -9268.390000, 0.052027, 0.049256, 0.091910 ], [205, -9269.370000, 0.019430, 0.026742, 0.105602 ], [208, -9269.570000, 0.015920, 0.020689, 0.105504 ] ], "n": ["FDJVGXF01C7551" ] }, {"p": [[226, -9209.070000, 0.268078, 0.025935, 0.057826 ], [21, -9209.620000, 0.153975, 0.016907, 0.074566 ], [18, -9209.630000, 0.152762, 0.050954, 0.074257 ], [22, -9209.640000, 0.151724, 0.000007, 0.074890 ], [17, -9209.760000, 0.134437, 0.049256, 0.061676 ], [227, -9209.760000, 0.134432, 0.000006, 0.061679 ], [2, -9213.140000, 0.004592, 0.020772, 0.059117 ] ], "n": ["FDJVGXF01DJLDB_rvcmp" ] }, {"p": [[226, -8848.720000, 0.538745, 0.024569, 0.053849 ], [227, -8849.600000, 0.224338, 0.000425, 0.058826 ], [17, -8849.600000, 0.223507, 0.049256, 0.058890 ], [240, -8852.420000, 0.013410, 0.013508, 0.049632 ] ], "n": ["FDJVGXF01EIQP5_rvcmp" ] }, {"p": [[226, -8095.620000, 0.615465, 0.019591, 0.080560 ], [17, -8096.570000, 0.239706, 0.041771, 0.078471 ], [227, -8097.070000, 0.144828, 0.000006, 0.086379 ] ], "n": ["FDJVGXF01DVV5Y_rvcmp" ] }, {"p": [[226, -8182.470000, 0.351874, 0.027567, 0.092646 ], [17, -8182.660000, 0.288658, 0.049256, 0.094209 ], [227, -8182.660000, 0.288331, 0.000006, 0.094215 ], [210, -8185.230000, 0.022172, 0.001237, 0.114524 ], [22, -8185.240000, 0.021914, 0.028187, 0.115508 ], [209, -8185.240000, 0.021912, 0.006837, 0.115505 ], [205, -8186.690000, 0.005140, 0.017645, 0.112229 ] ], "n": ["FDJVGXF01CR3K7_rvcmp" ] }, {"p": [[226, -8393.860000, 0.460198, 0.024848, 0.077347 ], [17, -8394.390000, 0.269911, 0.045534, 0.076859 ], [227, -8394.430000, 0.259062, 0.000006, 0.079789 ], [2, -8397.600000, 0.010830, 0.015813, 0.081625 ] ], "n": ["FDJVGXF01A2ND0" ] }, {"p": [[226, -8393.860000, 0.460198, 0.024848, 0.077347 ], [17, -8394.390000, 0.269911, 0.045534, 0.076859 ], [227, -8394.430000, 0.259062, 0.000006, 0.079789 ], [2, -8397.600000, 0.010830, 0.015813, 0.081625 ] ], "n": ["FDJVGXF01EHY46" ] }, {"p": [[226, -7899.660000, 0.641751, 0.020507, 0.068135 ], [17, -7900.970000, 0.173593, 0.036024, 0.061377 ], [227, -7901.720000, 0.081895, 0.000006, 0.072150 ], [228, -7902.270000, 0.047264, 0.000005, 0.078311 ], [2, -7902.270000, 0.047263, 0.036220, 0.078312 ], [1, -7904.020000, 0.008235, 0.068839, 0.073669 ] ], "n": ["FDJVGXF01B3YSF_rvcmp" ] }, {"p": [[226, -7831.960000, 0.726600, 0.016232, 0.083842 ], [210, -7834.430000, 0.061925, 0.018069, 0.100678 ], [225, -7834.430000, 0.061921, 0.036449, 0.100684 ], [17, -7834.490000, 0.058342, 0.039442, 0.083774 ], [227, -7834.850000, 0.040654, 0.000006, 0.091917 ], [2, -7835.320000, 0.025282, 0.036220, 0.098600 ], [228, -7835.320000, 0.025277, 0.000005, 0.098604 ] ], "n": ["FDJVGXF01D2C4P" ] }, {"p": [[226, -8187.160000, 0.351812, 0.021858, 0.098210 ], [210, -8187.960000, 0.157467, 0.000009, 0.120048 ], [22, -8187.960000, 0.157392, 0.028187, 0.120056 ], [209, -8187.960000, 0.157264, 0.006837, 0.120055 ], [17, -8188.510000, 0.090886, 0.046789, 0.101647 ], [200, -8188.950000, 0.058479, 0.008675, 0.113883 ], [204, -8189.740000, 0.026700, 0.004299, 0.119800 ] ], "n": ["FDJVGXF01CY2XG" ] }, {"p": [[226, -7666.410000, 0.374970, 0.023072, 0.104550 ], [210, -7667.520000, 0.122688, 0.000009, 0.131802 ], [22, -7667.520000, 0.122661, 0.028187, 0.131810 ], [209, -7667.520000, 0.122526, 0.006837, 0.131810 ], [17, -7667.540000, 0.120896, 0.049251, 0.109450 ], [227, -7667.540000, 0.120744, 0.000006, 0.109453 ], [21, -7669.590000, 0.015515, 0.014920, 0.141860 ] ], "n": ["FDJVGXF01ETRIS_rvcmp" ] }, {"p": [[226, -5552.560000, 0.591176, 0.021814, 0.055925 ], [17, -5553.620000, 0.204520, 0.049252, 0.060839 ], [227, -5553.620000, 0.204304, 0.000006, 0.060849 ] ], "n": ["FDJVGXF01BBM1B_rvcmp" ] }, {"p": [[226, -6107.690000, 0.644055, 0.020463, 0.035835 ], [227, -6109.240000, 0.135927, 0.000006, 0.040585 ], [17, -6109.240000, 0.135922, 0.049256, 0.040583 ], [22, -6110.460000, 0.040206, 0.012667, 0.052701 ], [21, -6111.030000, 0.022697, 0.017643, 0.055999 ], [210, -6111.100000, 0.021193, 0.009487, 0.052678 ] ], "n": ["FDJVGXF01C7HFL_rvcmp" ] }, {"p": [[229, -6484.760000, 0.308300, 0.000006, 1.687020 ], [236, -6485.560000, 0.139205, 0.061433, 1.850520 ], [235, -6485.560000, 0.139202, 0.045058, 1.850560 ], [237, -6485.560000, 0.139184, 0.000010, 1.850430 ], [234, -6485.720000, 0.117731, 0.000008, 1.995650 ], [233, -6485.740000, 0.115640, 0.062297, 1.992730 ], [230, -6486.780000, 0.040737, 0.047159, 1.994230 ] ], "n": ["FDJVGXF01COS50" ] }, {"p": [[229, -6777.200000, 0.201563, 0.000006, 1.999990 ], [235, -6777.360000, 0.171282, 0.000006, 1.999990 ], [233, -6777.360000, 0.171278, 0.062297, 1.999990 ], [234, -6777.360000, 0.171277, 0.079656, 1.999990 ], [237, -6777.680000, 0.124736, 0.000006, 1.999990 ], [236, -6777.680000, 0.124727, 0.061431, 1.999990 ], [240, -6778.940000, 0.035137, 0.020199, 1.999990 ] ], "n": ["FDJVGXF01B139S" ] }, {"p": [[237, -2600.620000, 0.196217, 0.004984, 0.035760 ], [235, -2600.760000, 0.171435, 0.033033, 0.035334 ], [236, -2600.810000, 0.162601, 0.061101, 0.036501 ], [234, -2600.940000, 0.142742, 0.066879, 0.037274 ], [233, -2601.180000, 0.112090, 0.062297, 0.041235 ], [238, -2601.210000, 0.108625, 0.026413, 0.044321 ], [239, -2601.230000, 0.106289, 0.000006, 0.045176 ] ], "n": ["FDJVGXF01BHEJN" ] }, {"p": [[237, -2600.620000, 0.196217, 0.004984, 0.035760 ], [235, -2600.760000, 0.171435, 0.033033, 0.035334 ], [236, -2600.810000, 0.162601, 0.061101, 0.036501 ], [234, -2600.940000, 0.142742, 0.066879, 0.037274 ], [233, -2601.180000, 0.112090, 0.062297, 0.041235 ], [238, -2601.210000, 0.108625, 0.026413, 0.044321 ], [239, -2601.230000, 0.106289, 0.000006, 0.045176 ] ], "n": ["FDJVGXF01A2KPF" ] }, {"p": [[238, -6284.840000, 0.773704, 0.006143, 0.093370 ], [235, -6287.060000, 0.083706, 0.031479, 0.086311 ], [237, -6287.410000, 0.058873, 0.013082, 0.098341 ], [239, -6287.410000, 0.058844, 0.000006, 0.098348 ], [232, -6288.830000, 0.014342, 0.014309, 0.100514 ], [228, -6289.140000, 0.010532, 0.004961, 0.100060 ] ], "n": ["FDJVGXF01CS1OP_rvcmp" ] }, {"p": [[238, -5973.420000, 0.857507, 0.005674, 0.085892 ], [237, -5976.230000, 0.051583, 0.013082, 0.091867 ], [239, -5976.230000, 0.051551, 0.000006, 0.091869 ], [235, -5976.500000, 0.039359, 0.042794, 0.089827 ] ], "n": ["FDJVGXF01D798E" ] }, {"p": [[239, -6507.240000, 0.162787, 0.013015, 0.455661 ], [232, -6507.250000, 0.162744, 0.018799, 0.455637 ], [240, -6507.250000, 0.162692, 0.000006, 0.455663 ], [237, -6507.320000, 0.151271, 0.011406, 0.478425 ], [238, -6507.350000, 0.146875, 0.027842, 0.480591 ], [10, -6507.400000, 0.139747, 0.043940, 0.398095 ], [4, -6508.030000, 0.073884, 0.076256, 0.513393 ] ], "n": ["FDJVGXF01C9ZEB_rvcmp" ] }, {"p": [[248, -2948.110000, 0.512844, 0.051585, 0.039636 ], [249, -2948.950000, 0.221226, 0.012515, 0.058715 ], [250, -2948.950000, 0.221201, 0.021035, 0.058715 ], [228, -2951.820000, 0.012512, 0.021550, 0.074312 ], [226, -2951.920000, 0.011348, 0.022349, 0.069918 ], [17, -2951.940000, 0.011122, 0.035118, 0.064973 ], [227, -2952.070000, 0.009746, 0.000006, 0.074462 ] ], "n": ["FDJVGXF01CV89O_rvcmp" ] } ], "metadata": {"invocation": "guppy to_json" }, "version": 1, "fields": ["edge_num", "likelihood", "like_weight_ratio", "distal_length", "pendant_length" ] }pplacer-1.1.alpha19/tests/data/moran/de_rounded_control.jplace000066400000000000000000010614001303154601500244560ustar00rootroot00000000000000{"tree": "((((((Cyanophora_paradoxa_:0.0665203[0],Mesostigma_viride_:0.0962753[1]):0.0362291[2],((chloroplast_Cyanidium_sp._Monte_Rotaro.AY391365_:0.123946[3],((chloroplast_Galdieria_sulphuraria.AY541295_:0.076265[4],((chloroplast_Galdieria_sulphuraria.AY119731_:2.68035e-06[5],chloroplast_Cyanidium_caldarium.X52758_:0.0195896[6]):0.0312019[7],chloroplast_Galdieria_sulphuraria.AY541294_:0.0188214[8]):0.0324389[9]):0.133418[10],((chloroplast_Cyanidioschyzon_merolae.AY119730_:2.68035e-06[11],chloroplast_Cyanidioschyzon_merolae_strain_DBV201.AY119729_:0.00117862[12]):0.0762594[13],chloroplast_Cyanidium_caldarium.AY541290_:0.203636[14]):0.0380657[15]):0.0194682[16]):0.0492622[17],(((chloroplast_Vaucheria_litorea.AF227740_:0.0517049[18],(plastid_Tribonema_aequale.AY528860_:0.0126259[19],chloroplast_Bumilleriopsis_filiformis.X79223_:0.00666588[20]):0.017649[21]):0.0281935[22],(((chloroplast_Skeletonema_costatum.AY119761_:0.00361095[23],Thalassiosira_pseudonana_:0.00113368[24]):0.0145191[25],(((Bigelowiella_natans_:0.097412[26],((Chlamydomonas_reinhardtii_:0.0704485[27],(chloroplast_Picochlorum_sp._RCC289.EU851960_:0.0487654[28],(Chlorella_vulgaris_:0.0467075[29],(chloroplast_Chlorella_pyrenoidosa.EU043047_:0.00161427[30],chloroplast_Auxenochlorella_protothecoides.EU043045_:0.00193294[31]):0.0152331[32]):0.0200406[33]):0.0147874[34]):0.0130863[35],((chloroplast_Chlorella_vulgaris.EU043044_:0.00120893[36],chloroplast_Chlorella_pyrenoidosa.EU043049_:0.00232797[37]):0.0768327[38],(plastid_Tetraselmis_marina.AY857618_:0.0254053[39],(chloroplast_Pseudochlorella_sp._CCAP_211_1A.EU043048_:0.0869235[40],(((((Synechococcus_sp._PCC_7002___gi170076636refNC_010475_:0.0621893[41],(((Nostock_punctiforme_gi186680550refNC_010628_:0.112883[42],((Nostoc_sp._PCC_7120_gi17227497refNC_003272_:0.00889436[43],Anabaena_variabilis_A_gi75906225refNC_007413_:0.0221131[44]):0.038336[45],(Nodularia_spumige_gi119512239refNZ_AAVW01000065_:0.0504455[46],Fremyella_diplosiphon.FDIPSBA_:0.051697[47]):0.0178891[48]):0.0237368[49]):0.0326133[50],(Lyngbya_sp_PCC_8106___gi119483230refNZ_AAVU01000001_:0.231009[51],(Microcystis_aerouginosa_gi166362741refNC_010296_:0.0929627[52],((Cyanothece_sp._ATCC_51142.CAU39610_:0.0123916[53],Cyanothece_sp._CCY_0110___gi126657681refNZ_AAXW01000012_:0.0313088[54]):0.0369935[55],(Cyanothece_sp._PCC_7425_gi218437013refNC_011729_:0.0746015[56],Cyanothece_sp._PCC_8801_gi218244892refNC_011726_:0.0616473[57]):0.0148311[58]):0.0396174[59]):0.0228094[60]):0.0166279[61]):0.0233005[62],(Synechocystis_sp_PCC_6803___gi16329170refNC_000911_:0.0535075[63],((((((Cyanothece_sp._CC_gi126660325refNZ_AAXW01000053_:0.347497[64],Synechococcus_sp._PCC_7335_gi225144522refNW_002475532_:0.317895[65]):0.108045[66],Mastigocladus_laminosus.AF170924_:0.264356[67]):0.0676548[68],((Synechococcus_sp._JA-3-3Ab__gi86604733refNC_007775_:0.0973541[69],Synechococcus_sp._JA-2-3Ba____gi86607503refNC_007776_:0.564415[70]):0.0790386[71],Gloeobacter_violaceus_gi37519569refNC_005125.1_:0.263289[72]):0.11791[73]):0.0379309[74],(Thermosynechococcus_gi22297544refNC_004113_:0.11758[75],(Cyanothece_sp._PCC_7425_gi220905643refNC_011884_:0.138332[76],Acaryochloris_marina_MBIC11017.AB303650_:0.216398[77]):0.0159655[78]):0.0287204[79]):0.0341087[80],((Prochlorothrix_hollandica.X14308_:2.68035e-06[81],Prochlorothrix_hollandica.X14523_:0.00128006[82]):0.081034[83],((Synechococcus_elongatus_PCC_7942___gi81298811refNC_007604_:0.0105928[84],Synechococcus_elongatus_PCC_6301___gi56750010refNC_006576_:0.00276979[85]):0.107743[86],((Synechococcus_sp._WH_5701__gi87301761refNZ_AANO01000004_:0.0111919[87],Synechococcus_sp._WH_5701__gi87303211refNZ_AANO01000010_:0.0726788[88]):0.0147436[89],(((((Synechococcus_sp._RCC307_gi148241099refNC_009482_:0.0408099[90],((Synechococcus_sp._WH_8102_gi33864539refNC_005070_:0.0201067[91],(Synechococcus_sp._CC9902_gi78183584refNC_007513_:0.00536202[92],Synechococcus_sp._BL107_gi211594587refNZ_DS022298_:0.00246287[93]):0.0392091[94]):0.00867041[95],Synechococcus_sp._CC9605_gi78211558refNC_007516_:0.0275067[96]):0.0214861[97]):0.0346913[98],(Synechococcus_sp.__RS9916__gi116074999refNZ_AAUA01000003_:0.0477208[99],Synechococcus_sp._gi87123618refNZ_AANP01000002_:0.0406377[100]):0.0188201[101]):0.0110855[102],((Synechococcus_sp._WH_7803___gi148238336refNC_009481_:0.00753009[103],(Synechococcus_sp.__WH_7805__gi88807077refNZ_AAOK01000001_:0.00265618[104],Synechococcus_sp._WH_7805__gi88807768refNZ_AAOK01000002_:0.0026187[105]):0.00799342[106]):0.0173394[107],(Synechococcus_sp._RS9917___gi87125174refNZ_AANP01000006_:2.68035e-06[108],Synechococcus_sp._RS9917___gi87124875refNZ_AANP01000005_:0.0026301[109]):0.00794167[110]):0.0038034[111]):0.0158306[112],Synechococcus_sp._RS9917__gi87124182refNZ_AANP01000003_:0.192923[113]):0.0118268[114],Cyanobium_sp._PCC_70_gi223490194refNW_002243451_:0.0330768[115]):0.0231555[116]):0.0518051[117]):0.0453212[118]):0.0351102[119]):0.0447589[120],Microcoleus_chthonoplastes_PCC_7420___gi224400128refNW_002435220_:0.0843742[121]):0.0306188[122]):0.0369097[123]):0.0349985[124]):0.0577156[125],Trichodesmium_erythr_gi113473942refNC_008312_:0.106684[126]):0.0409208[127],(((Prochlorococcus_marinus_subsp._pastoris_str._CCMP1986_gi33860560refNC_005072_:0.00365008[128],Prochlorococcus_marinus_str._MIT_9515___gi123965234refNC_008817_:0.00483373[129]):0.0106366[130],(Prochlorococcus_marinus_str._AS9601_gi123967536refNC_008816_:2.68035e-06[131],(Prochlorococcus_marinus_str._MIT_9301__gi126695337refNC_009091_:0.0108685[132],((Procholococcus_marinus_str._MIT_9202_gi225077649refNW_002467725_:0.00240146[133],Procholococcus_marinus_str._MIT_9215___gi157412338refNC_009840_:2.68035e-06[134]):0.00591536[135],Prochlorococcus_marinus_str._MIT_9312_gi78778385refNC_007577_:0.00379511[136]):0.0049759[137]):0.00132484[138]):0.0105617[139]):0.0465879[140],((Procholococcus_marinus_str._NATL2A___gi162958048refNC_007335.2_:0.00365548[141],Prochlorococcus_marinus_str._NATL1A___gi124024712refNC_008819_:2.68035e-06[142]):0.0615085[143],(Prochlorococcus_marinus_subsp._marinus_str._CCMP1375_gi33239452refNC_005042_:0.100663[144],Procholococcus_marinus_str._MIT_9211___gi159902540refNC_009976_:0.0611398[145]):0.060931[146]):0.0653211[147]):0.148126[148]):0.0637467[149],((chloroplast_Pavlova_gyrans.AJ575575_:0.0169655[150],(chloroplast_Pavlova_lutheri.AY119755_:0.0146662[151],chloroplast_Pavlova_gyrans.AY119754_:0.0299817[152]):0.0270032[153]):0.0303472[154],((chloroplast_Chrysochromulina_polylepis.AJ575572_:0.0128709[155],chloroplast_Imantonia_rotunda.EU851963_:0.0436031[156]):0.00589301[157],(((chloroplast_Isochrysis_galbana.AJ575574_:0.0174268[158],chloroplast_Emiliania_huxleyi.AJ575573_:0.0115577[159]):0.00738805[160],(chloroplast_Phaeocystis_antarctica.AY119756_:0.0324724[161],(chloroplast_Prymnesium_parvum.AY119758_:0.0107131[162],chloroplast_Prymnesium_parvum.AJ575576_:0.00676058[163]):0.020704[164]):0.00735947[165]):0.00200676[166],chloroplast_Pleurochrysis_carterae.AY119757_:0.0339814[167]):0.00361886[168]):0.0233927[169]):0.0187331[170]):0.0346389[171],((chloroplast_Mantoniella_squamata.EU851964_:0.00842936[172],((plastid_uncultured_Prasinophyceae.AY176630_:0.0226216[173],(((chloroplast_Ostreococcus_sp._RCC344.EU851961_:0.00605274[174],Ostreococcus_tauri_:0.010265[175]):0.00616569[176],chloroplast_Ostreococcus_sp._RCC789.EU851970_:0.01746[177]):0.00408084[178],(uncultured_Prasinophyceae.AY509537_:0.0209825[179],chloroplast_Bathycoccus_prasinos.EU851955_:0.00805147[180]):0.0371846[181]):0.00765875[182]):0.0179484[183],(chloroplast_Micromonas_pusilla.EU851965_:2.68035e-06[184],plastid_uncultured_Prasinophyceae.AY176639_:2.68035e-06[185]):0.0089575[186]):0.0110303[187]):0.0523059[188],chloroplast_Pycnococcus_provasolii.EU851957_:0.0961508[189]):0.0343432[190]):0.015656[191]):0.0224695[192]):0.0167387[193]):0.00670223[194]):0.00945502[195]):0.0781944[196],(Fragilariopsis_psbA_:0.0245188[197],Pmultiseries_psbA_:0.0131238[198]):0.0133041[199]):0.0126908[200],(Phaeodactylum_tricornutum_:0.0191354[201],plastid_Ballia_callitricha.DQ787635_:0.061781[202]):0.00999794[203]):0.0201532[204]):0.0386439[205],(chloroplast_Heterosigma_akashiwo.AY119759_:2.68035e-06[206],chloroplast_Heterosigma_carterae.HCU18090_:2.68035e-06[207]):0.0242521[208]):0.00684342[209]):0.018078[210],((chloroplast_Pachydictyon_coriaceum.AY422614_:0.0241936[211],chloroplast_Dictyota_dichotoma_var._linearis.AY422632_:0.00853816[212]):0.0239851[213],((chloroplast_Fucus_vesiculosus.DQ307679_:0.0343612[214],chloroplast_Ectocarpus_siliculosus.X56695_:0.0397557[215]):0.038827[216],((plastid_Padina_japonica.AY430360_:0.0143668[217],(plastid_Padina_arborescens.AY430357_:0.0162365[218],plastid_Padina_crassa.AY430358_:0.00695945[219]):0.00495696[220]):0.00344828[221],chloroplast_Padina_crassa.AY422643_:0.00886928[222]):0.0167452[223]):0.0107453[224]):0.0364574[225]):0.032314[226]):0.0129864[227]):0.0215549[228],(chloroplast_Flintiella_sanguinaria.AY119740_:0.047233[229],chloroplast_Porphyridium_aerugineum.AY119741_:0.0471646[230]):0.0174241[231]):0.0188085[232],(((chloroplast_Erythrotrichia_carnea.AY119739_:0.0623046[233],chloroplast_Rhodochaete_parvula.AY119743_:0.0796661[234]):0.0450641[235],chloroplast_Rhodosorus_marinus.AY119744_:0.0614381[236]):0.0130888[237],chloroplast_Bangiopsis_subsimplex.AY119736_:0.0278478[238]):0.0130213[239]):0.0469411[240],(chloroplast_Palmaria_palmata.PPU28165_:0.0983928[241],(plastid_Antithamnionella_sp._A31.DQ787640_:0.0189374[242],(plastid_Carpoblepharis_flaccida.DQ787643_:0.104554[243],chloroplast_Antithamnion_sp.X55364_:0.0274272[244]):0.00842288[245]):0.0306715[246]):0.0178171[247]):0.0709634[248],Porphyra_yezoensis_:0.0125208[249],Porphyra_purpurea_:0.0210402[250]):0[251];", "placements": [{"p": [[0, -5700.010000, 0.155277, 0.000008, 1.999990 ], [2, -5700.030000, 0.153087, 0.036220, 1.999990 ], [227, -5700.030000, 0.153070, 0.012980, 1.999990 ], [228, -5700.030000, 0.153035, 0.000005, 1.999990 ], [1, -5700.040000, 0.151204, 0.096269, 1.999990 ], [17, -5700.290000, 0.117165, 0.049256, 1.999990 ], [226, -5700.290000, 0.117162, 0.032306, 1.999990 ] ], "n": ["FDJVGXF01AR46S" ] }, {"p": [[0, -2734.470000, 0.219662, 0.000008, 0.770961 ], [148, -2734.840000, 0.152975, 0.076333, 0.977053 ], [1, -2734.880000, 0.145896, 0.096269, 0.887218 ], [2, -2734.880000, 0.145895, 0.000009, 0.887199 ], [227, -2735.010000, 0.128294, 0.012980, 0.899452 ], [212, -2735.130000, 0.114269, 0.000008, 0.894439 ], [65, -2735.330000, 0.093009, 0.202930, 0.993485 ] ], "n": ["FDJVGXF01AQ80C_rvcmp" ] }, {"p": [[0, -3360.110000, 0.189998, 0.000008, 0.749450 ], [2, -3360.290000, 0.158188, 0.036220, 0.682944 ], [227, -3360.290000, 0.158145, 0.012980, 0.682953 ], [228, -3360.290000, 0.158099, 0.000005, 0.682915 ], [1, -3360.410000, 0.140083, 0.096269, 0.801723 ], [148, -3360.470000, 0.132139, 0.081697, 0.906141 ], [204, -3361.210000, 0.063349, 0.015026, 0.817513 ] ], "n": ["FDJVGXF01B0W77" ] }, {"p": [[1, -7534.320000, 0.904492, 0.057572, 0.093211 ], [2, -7537.800000, 0.027864, 0.016056, 0.108359 ], [226, -7538.140000, 0.019822, 0.025233, 0.110628 ], [17, -7538.300000, 0.017002, 0.033682, 0.099106 ], [227, -7538.390000, 0.015414, 0.012980, 0.114407 ], [228, -7538.400000, 0.015406, 0.000005, 0.114406 ] ], "n": ["FDJVGXF01D5TIW" ] }, {"p": [[1, -7350.310000, 0.843161, 0.058259, 0.089891 ], [226, -7353.340000, 0.040725, 0.024504, 0.104966 ], [2, -7353.520000, 0.034154, 0.022140, 0.105068 ], [17, -7353.590000, 0.031751, 0.033903, 0.093812 ], [227, -7353.830000, 0.025112, 0.012980, 0.109633 ], [228, -7353.830000, 0.025098, 0.000005, 0.109634 ] ], "n": ["FDJVGXF01AJUIH_rvcmp" ] }, {"p": [[1, -6830.070000, 0.365840, 0.050655, 0.106232 ], [226, -6830.090000, 0.359994, 0.016241, 0.105660 ], [225, -6831.690000, 0.072735, 0.036449, 0.121914 ], [17, -6831.750000, 0.068473, 0.036260, 0.101017 ], [227, -6832.170000, 0.045204, 0.007426, 0.115530 ], [2, -6832.200000, 0.043891, 0.036220, 0.117886 ], [228, -6832.200000, 0.043864, 0.000005, 0.117894 ] ], "n": ["FDJVGXF01BSCCI_rvcmp" ] }, {"p": [[1, -6077.210000, 0.371419, 0.050826, 0.103586 ], [226, -6077.430000, 0.298856, 0.014817, 0.106659 ], [210, -6078.620000, 0.091368, 0.016280, 0.118972 ], [225, -6078.640000, 0.089183, 0.036449, 0.119487 ], [17, -6078.670000, 0.086937, 0.027057, 0.100541 ], [227, -6079.560000, 0.035545, 0.000006, 0.115086 ], [16, -6079.850000, 0.026692, 0.016304, 0.100662 ] ], "n": ["FDJVGXF01CDOA5" ] }, {"p": [[1, -5329.660000, 0.361179, 0.046886, 0.083300 ], [226, -5330.130000, 0.225502, 0.012603, 0.093797 ], [225, -5330.420000, 0.168098, 0.034696, 0.097185 ], [210, -5330.440000, 0.164555, 0.018069, 0.099227 ], [17, -5332.120000, 0.030919, 0.044550, 0.094571 ], [227, -5332.150000, 0.029884, 0.000006, 0.097389 ], [2, -5332.560000, 0.019863, 0.036220, 0.100990 ] ], "n": ["FDJVGXF01BR9HO_rvcmp" ] }, {"p": [[1, -4710.170000, 0.882102, 0.045404, 0.085828 ], [216, -4713.330000, 0.037402, 0.010593, 0.096030 ], [214, -4713.340000, 0.037035, 0.021465, 0.101702 ], [215, -4713.580000, 0.028968, 0.034528, 0.100202 ], [2, -4714.280000, 0.014493, 0.000947, 0.107480 ] ], "n": ["FDJVGXF01A1J33" ] }, {"p": [[1, -4340.990000, 1.000000, 0.044433, 0.051054 ] ], "n": ["FDJVGXF01A46Y1" ] }, {"p": [[1, -5526.750000, 0.974852, 0.040055, 0.096719 ], [226, -5530.400000, 0.025148, 0.014279, 0.123324 ] ], "n": ["FDJVGXF01EQECW_rvcmp" ] }, {"p": [[1, -5568.110000, 0.987551, 0.039659, 0.078913 ], [226, -5572.490000, 0.012449, 0.007116, 0.107364 ] ], "n": ["FDJVGXF01A87XB_rvcmp" ] }, {"p": [[1, -5491.850000, 0.968936, 0.039023, 0.107218 ], [226, -5495.290000, 0.031064, 0.013863, 0.133929 ] ], "n": ["FDJVGXF01DUOWM" ] }, {"p": [[1, -4084.020000, 1.000000, 0.033503, 0.054114 ] ], "n": ["FDJVGXF01APO9N_rvcmp" ] }, {"p": [[1, -5825.460000, 1.000000, 0.028971, 0.084501 ] ], "n": ["FDJVGXF01BRKCL_rvcmp" ] }, {"p": [[1, -5564.800000, 1.000000, 0.028081, 0.091764 ] ], "n": ["FDJVGXF01CKP9W_rvcmp" ] }, {"p": [[1, -6144.060000, 1.000000, 0.028348, 0.087970 ] ], "n": ["FDJVGXF01A615B_rvcmp" ] }, {"p": [[1, -3901.840000, 1.000000, 0.025886, 0.075342 ] ], "n": ["FDJVGXF01D03AR" ] }, {"p": [[1, -3901.840000, 1.000000, 0.025886, 0.075342 ] ], "n": ["FDJVGXF01A149X" ] }, {"p": [[1, -5020.540000, 0.329356, 0.006667, 0.137555 ], [39, -5020.640000, 0.297083, 0.009349, 0.153063 ], [192, -5021.750000, 0.097856, 0.022464, 0.167931 ], [193, -5021.750000, 0.097852, 0.000008, 0.167932 ], [29, -5022.200000, 0.062055, 0.038654, 0.168418 ], [33, -5022.270000, 0.058241, 0.000010, 0.173834 ], [28, -5022.280000, 0.057557, 0.048759, 0.173072 ] ], "n": ["FDJVGXF01DGD2W_rvcmp" ] }, {"p": [[2, -7754.310000, 0.217329, 0.036220, 1.999990 ], [228, -7754.310000, 0.217287, 0.000005, 1.999990 ], [227, -7754.310000, 0.217267, 0.012980, 1.999990 ], [236, -7754.930000, 0.116804, 0.000007, 1.999990 ], [1, -7755.270000, 0.083651, 0.096269, 1.999990 ], [0, -7755.270000, 0.083650, 0.066512, 1.999990 ], [26, -7755.530000, 0.064013, 0.010607, 1.999990 ] ], "n": ["FDJVGXF01CWKBY" ] }, {"p": [[2, -7082.530000, 0.228511, 0.036220, 1.999990 ], [228, -7082.530000, 0.228468, 0.000005, 1.999990 ], [227, -7082.530000, 0.228447, 0.012980, 1.999990 ], [1, -7083.490000, 0.087832, 0.096269, 1.999990 ], [0, -7083.490000, 0.087831, 0.066512, 1.999990 ], [26, -7083.720000, 0.069759, 0.009954, 1.999990 ], [236, -7083.730000, 0.069152, 0.000007, 1.999990 ] ], "n": ["FDJVGXF01DTUVZ_rvcmp" ] }, {"p": [[2, -6825.070000, 0.191248, 0.036220, 1.999990 ], [228, -6825.070000, 0.191189, 0.000005, 1.999990 ], [227, -6825.070000, 0.191171, 0.012980, 1.999990 ], [1, -6825.150000, 0.176820, 0.000006, 1.999990 ], [0, -6825.370000, 0.140749, 0.066512, 1.999990 ], [226, -6826.310000, 0.055257, 0.010592, 1.999990 ], [225, -6826.340000, 0.053566, 0.036449, 1.999990 ] ], "n": ["FDJVGXF01AQSZU_rvcmp" ] }, {"p": [[2, -7559.780000, 0.198092, 0.036220, 1.999990 ], [228, -7559.780000, 0.198032, 0.000005, 1.999990 ], [227, -7559.780000, 0.198013, 0.012980, 1.999990 ], [0, -7560.090000, 0.144928, 0.066512, 1.999990 ], [1, -7560.090000, 0.144927, 0.096269, 1.999990 ], [226, -7560.990000, 0.058583, 0.008703, 1.999990 ], [225, -7561.010000, 0.057425, 0.036449, 1.999990 ] ], "n": ["FDJVGXF01DRZRX_rvcmp" ] }, {"p": [[2, -7584.580000, 0.178121, 0.036220, 1.999990 ], [228, -7584.590000, 0.178066, 0.000005, 1.999990 ], [227, -7584.590000, 0.178050, 0.012980, 1.999990 ], [0, -7584.900000, 0.130179, 0.066512, 1.999990 ], [1, -7584.900000, 0.130179, 0.096269, 1.999990 ], [212, -7585.070000, 0.109323, 0.000008, 1.999990 ], [140, -7585.200000, 0.096083, 0.000006, 1.999990 ] ], "n": ["FDJVGXF01AU61H" ] }, {"p": [[2, -7125.950000, 0.201960, 0.036220, 1.999990 ], [228, -7125.950000, 0.201898, 0.000005, 1.999990 ], [227, -7125.950000, 0.201879, 0.012980, 1.999990 ], [0, -7126.240000, 0.150119, 0.000008, 1.999990 ], [1, -7126.270000, 0.146505, 0.096269, 1.999990 ], [226, -7127.370000, 0.048820, 0.032306, 1.999990 ], [17, -7127.370000, 0.048820, 0.049256, 1.999990 ] ], "n": ["FDJVGXF01CIEJT" ] }, {"p": [[2, -6893.490000, 0.190998, 0.036220, 1.987900 ], [228, -6893.490000, 0.190940, 0.000005, 1.987960 ], [227, -6893.490000, 0.190922, 0.012980, 1.987960 ], [0, -6893.790000, 0.140970, 0.000008, 1.999990 ], [1, -6893.810000, 0.138175, 0.096269, 1.999990 ], [39, -6894.250000, 0.089534, 0.000006, 1.999990 ], [236, -6894.670000, 0.058462, 0.000007, 1.999990 ] ], "n": ["FDJVGXF01D3WTC_rvcmp" ] }, {"p": [[2, -2319.500000, 0.428546, 0.018691, 0.021661 ], [227, -2320.730000, 0.125308, 0.012980, 0.036105 ], [228, -2320.730000, 0.125279, 0.000005, 0.036112 ], [226, -2321.040000, 0.091860, 0.032306, 0.036947 ], [17, -2321.040000, 0.091849, 0.049256, 0.036947 ], [225, -2321.070000, 0.089561, 0.027302, 0.028114 ], [210, -2321.700000, 0.047597, 0.018069, 0.038507 ] ], "n": ["FDJVGXF01CFZ5I_rvcmp" ] }, {"p": [[2, -8322.960000, 0.784951, 0.017529, 0.049601 ], [22, -8324.370000, 0.191576, 0.014528, 0.063248 ], [227, -8327.080000, 0.012682, 0.004689, 0.065348 ], [226, -8327.240000, 0.010790, 0.029250, 0.064825 ] ], "n": ["FDJVGXF01BSXC6_rvcmp" ] }, {"p": [[2, -8253.370000, 0.795980, 0.018019, 0.046663 ], [22, -8254.910000, 0.170990, 0.013896, 0.059852 ], [227, -8257.440000, 0.013679, 0.004586, 0.061103 ], [226, -8257.580000, 0.011822, 0.028973, 0.060323 ], [18, -8258.030000, 0.007529, 0.042784, 0.067881 ] ], "n": ["FDJVGXF01AKP12_rvcmp" ] }, {"p": [[2, -8253.370000, 0.795980, 0.018019, 0.046663 ], [22, -8254.910000, 0.170990, 0.013896, 0.059852 ], [227, -8257.440000, 0.013679, 0.004586, 0.061103 ], [226, -8257.580000, 0.011822, 0.028973, 0.060323 ], [18, -8258.030000, 0.007529, 0.042784, 0.067881 ] ], "n": ["FDJVGXF01BLH1N_rvcmp" ] }, {"p": [[2, -8255.220000, 0.786494, 0.017444, 0.050169 ], [22, -8256.640000, 0.190088, 0.014515, 0.064033 ], [227, -8259.350000, 0.012660, 0.004687, 0.066102 ], [226, -8259.510000, 0.010758, 0.029312, 0.065605 ] ], "n": ["FDJVGXF01B9YL9_rvcmp" ] }, {"p": [[2, -7317.910000, 0.792759, 0.014799, 0.053653 ], [22, -7319.370000, 0.184882, 0.013452, 0.069710 ], [18, -7322.050000, 0.012630, 0.041906, 0.078552 ], [227, -7322.310000, 0.009729, 0.004366, 0.070870 ] ], "n": ["FDJVGXF01CZ9O4_rvcmp" ] }, {"p": [[2, -7712.790000, 0.883852, 0.014640, 0.049668 ], [22, -7714.820000, 0.116148, 0.013694, 0.064873 ] ], "n": ["FDJVGXF01BUW8J" ] }, {"p": [[2, -7582.780000, 0.852815, 0.014049, 0.054796 ], [22, -7584.530000, 0.147185, 0.014067, 0.071155 ] ], "n": ["FDJVGXF01DIV21_rvcmp" ] }, {"p": [[4, -5865.650000, 0.379359, 0.000009, 1.195070 ], [6, -5866.630000, 0.142877, 0.000010, 1.502030 ], [9, -5866.930000, 0.105563, 0.032431, 1.515360 ], [10, -5866.930000, 0.105556, 0.000008, 1.515370 ], [8, -5867.010000, 0.097852, 0.018812, 1.564030 ], [7, -5867.010000, 0.097850, 0.031194, 1.564020 ], [5, -5867.330000, 0.070942, 0.000001, 1.632330 ] ], "n": ["FDJVGXF01A51R9_rvcmp" ] }, {"p": [[5, -8635.630000, 0.169083, 0.000001, 1.762920 ], [6, -8635.630000, 0.169083, 0.000010, 1.762910 ], [7, -8635.630000, 0.169064, 0.000008, 1.762940 ], [4, -8635.910000, 0.127654, 0.076256, 1.768260 ], [9, -8635.910000, 0.127649, 0.032431, 1.768270 ], [10, -8635.910000, 0.127642, 0.000008, 1.768260 ], [8, -8636.060000, 0.109825, 0.000009, 1.839190 ] ], "n": ["FDJVGXF01CDR6W" ] }, {"p": [[17, -6592.980000, 0.344063, 0.041282, 0.104860 ], [226, -6593.070000, 0.316607, 0.031123, 0.110801 ], [227, -6593.080000, 0.311338, 0.000006, 0.111220 ], [2, -6596.300000, 0.012517, 0.017926, 0.113731 ], [210, -6597.170000, 0.005246, 0.002151, 0.143325 ], [22, -6597.190000, 0.005117, 0.028187, 0.145327 ], [209, -6597.190000, 0.005111, 0.006837, 0.145327 ] ], "n": ["FDJVGXF01B500Z" ] }, {"p": [[17, -8474.300000, 0.614349, 0.034732, 0.085322 ], [226, -8475.450000, 0.193496, 0.031646, 0.098796 ], [227, -8475.460000, 0.192155, 0.000006, 0.098944 ] ], "n": ["FDJVGXF01EFJFC" ] }, {"p": [[17, -6215.670000, 0.550917, 0.031377, 0.079741 ], [226, -6216.640000, 0.210639, 0.027077, 0.092727 ], [227, -6216.910000, 0.160179, 0.000006, 0.095417 ], [16, -6218.310000, 0.039349, 0.017811, 0.079631 ], [3, -6218.320000, 0.038916, 0.123938, 0.080816 ] ], "n": ["FDJVGXF01EJVTA_rvcmp" ] }, {"p": [[18, -6749.270000, 0.350601, 0.048560, 0.063242 ], [22, -6749.330000, 0.328473, 0.002367, 0.064802 ], [21, -6749.350000, 0.320926, 0.016831, 0.065869 ] ], "n": ["FDJVGXF01DA10A" ] }, {"p": [[18, -8985.560000, 0.362090, 0.045212, 0.134997 ], [22, -8985.650000, 0.329178, 0.003070, 0.135397 ], [21, -8985.720000, 0.308732, 0.017640, 0.138657 ] ], "n": ["FDJVGXF01AXBUQ" ] }, {"p": [[18, -6958.920000, 0.891405, 0.000006, 0.272210 ], [202, -6961.390000, 0.074915, 0.023119, 0.286868 ], [196, -6962.730000, 0.019566, 0.032002, 0.286802 ], [10, -6963.060000, 0.014114, 0.064427, 0.239780 ] ], "n": ["FDJVGXF01C6BVV_rvcmp" ] }, {"p": [[19, -5907.270000, 0.285611, 0.000006, 0.336734 ], [22, -5907.630000, 0.198338, 0.010261, 0.327181 ], [21, -5907.890000, 0.152619, 0.002886, 0.346591 ], [20, -5907.910000, 0.150211, 0.006659, 0.350749 ], [18, -5908.330000, 0.099093, 0.051699, 0.352205 ], [38, -5908.880000, 0.057068, 0.076823, 0.354397 ], [193, -5908.880000, 0.057060, 0.016731, 0.354408 ] ], "n": ["FDJVGXF01EJ0WT_rvcmp" ] }, {"p": [[19, -5982.550000, 0.325158, 0.000006, 0.327313 ], [22, -5983.020000, 0.202501, 0.009215, 0.319262 ], [21, -5983.190000, 0.170974, 0.003177, 0.336098 ], [20, -5983.210000, 0.167443, 0.006659, 0.340610 ], [18, -5983.640000, 0.109223, 0.051699, 0.341409 ], [38, -5985.810000, 0.012384, 0.074343, 0.369984 ], [193, -5985.820000, 0.012317, 0.016731, 0.373520 ] ], "n": ["FDJVGXF01BVJSL_rvcmp" ] }, {"p": [[19, -7122.190000, 0.629362, 0.000006, 0.297979 ], [20, -7123.410000, 0.185332, 0.006659, 0.316409 ], [21, -7123.410000, 0.185306, 0.000009, 0.316394 ] ], "n": ["FDJVGXF01DSGZT" ] }, {"p": [[20, -6657.860000, 0.214367, 0.005452, 0.065365 ], [21, -6657.890000, 0.207852, 0.000009, 0.065687 ], [19, -6657.890000, 0.207542, 0.012620, 0.065689 ], [22, -6658.110000, 0.167861, 0.001648, 0.064386 ], [18, -6658.120000, 0.165099, 0.051699, 0.065232 ], [205, -6659.980000, 0.025678, 0.022564, 0.066624 ], [204, -6660.780000, 0.011600, 0.009560, 0.086873 ] ], "n": ["FDJVGXF01DDLP3_rvcmp" ] }, {"p": [[20, -6483.400000, 0.254133, 0.005394, 0.061007 ], [21, -6483.430000, 0.245510, 0.000008, 0.061328 ], [19, -6483.430000, 0.245135, 0.012620, 0.061330 ], [22, -6483.630000, 0.201786, 0.002135, 0.059671 ], [205, -6485.530000, 0.030153, 0.022599, 0.061902 ], [196, -6486.450000, 0.011992, 0.054783, 0.075214 ], [204, -6486.510000, 0.011290, 0.009716, 0.082480 ] ], "n": ["FDJVGXF01D2F9J_rvcmp" ] }, {"p": [[20, -7991.920000, 0.226374, 0.005272, 0.056413 ], [21, -7991.960000, 0.216847, 0.000008, 0.056668 ], [19, -7991.960000, 0.216424, 0.012620, 0.056674 ], [22, -7992.230000, 0.166383, 0.000007, 0.056187 ], [18, -7992.230000, 0.166220, 0.051699, 0.056191 ], [196, -7995.290000, 0.007751, 0.047586, 0.063102 ] ], "n": ["FDJVGXF01CJHZG_rvcmp" ] }, {"p": [[20, -7504.760000, 0.228280, 0.005264, 0.056019 ], [21, -7504.810000, 0.218607, 0.000008, 0.056296 ], [19, -7504.810000, 0.218180, 0.012620, 0.056298 ], [22, -7505.070000, 0.167549, 0.000007, 0.055786 ], [18, -7505.070000, 0.167384, 0.051699, 0.055790 ] ], "n": ["FDJVGXF01A6W2D" ] }, {"p": [[20, -8061.750000, 0.226940, 0.005258, 0.055615 ], [21, -8061.800000, 0.217229, 0.000008, 0.055869 ], [19, -8061.800000, 0.216804, 0.012620, 0.055871 ], [22, -8062.060000, 0.166853, 0.000007, 0.055379 ], [18, -8062.060000, 0.166687, 0.051699, 0.055388 ], [196, -8065.480000, 0.005487, 0.050156, 0.062604 ] ], "n": ["FDJVGXF01DNP11" ] }, {"p": [[20, -8061.750000, 0.226940, 0.005258, 0.055615 ], [21, -8061.800000, 0.217229, 0.000008, 0.055869 ], [19, -8061.800000, 0.216804, 0.012620, 0.055871 ], [22, -8062.060000, 0.166853, 0.000007, 0.055379 ], [18, -8062.060000, 0.166687, 0.051699, 0.055388 ], [196, -8065.480000, 0.005487, 0.050156, 0.062604 ] ], "n": ["FDJVGXF01AXT7W" ] }, {"p": [[20, -7346.080000, 0.228361, 0.005219, 0.052363 ], [21, -7346.130000, 0.217917, 0.000008, 0.052635 ], [19, -7346.130000, 0.217485, 0.012620, 0.052637 ], [22, -7346.390000, 0.168207, 0.000007, 0.052065 ], [18, -7346.390000, 0.168031, 0.051699, 0.052070 ] ], "n": ["FDJVGXF01EAHUW_rvcmp" ] }, {"p": [[20, -8713.380000, 0.228455, 0.005202, 0.050899 ], [21, -8713.430000, 0.217694, 0.000008, 0.051116 ], [19, -8713.430000, 0.217260, 0.012620, 0.051122 ], [22, -8713.680000, 0.168386, 0.000007, 0.050615 ], [18, -8713.680000, 0.168206, 0.051699, 0.050619 ] ], "n": ["FDJVGXF01A1O4M" ] }, {"p": [[20, -9168.740000, 0.444129, 0.002140, 0.065787 ], [22, -9169.080000, 0.316010, 0.011397, 0.060297 ], [205, -9170.020000, 0.122547, 0.025926, 0.062733 ], [196, -9170.790000, 0.056788, 0.031633, 0.063014 ], [21, -9171.080000, 0.042665, 0.010039, 0.065795 ], [19, -9171.950000, 0.017862, 0.012620, 0.070053 ] ], "n": ["FDJVGXF01DXDA3_rvcmp" ] }, {"p": [[20, -9173.420000, 0.649986, 0.002139, 0.065747 ], [22, -9174.660000, 0.187954, 0.008443, 0.063354 ], [196, -9175.820000, 0.058955, 0.031217, 0.064574 ], [21, -9175.840000, 0.057829, 0.009450, 0.066118 ], [19, -9176.630000, 0.026113, 0.012620, 0.070026 ], [205, -9176.940000, 0.019163, 0.026033, 0.067544 ] ], "n": ["FDJVGXF01B5Z58" ] }, {"p": [[20, -8648.250000, 0.671613, 0.002128, 0.065710 ], [22, -8649.930000, 0.126077, 0.005626, 0.063497 ], [196, -8650.410000, 0.077535, 0.032683, 0.064763 ], [21, -8650.660000, 0.060533, 0.009672, 0.066099 ], [18, -8651.140000, 0.037608, 0.051699, 0.067756 ], [19, -8651.480000, 0.026634, 0.012620, 0.070291 ] ], "n": ["FDJVGXF01C9YBP_rvcmp" ] }, {"p": [[20, -8829.380000, 0.694192, 0.002126, 0.064447 ], [22, -8831.050000, 0.130136, 0.005657, 0.062202 ], [21, -8831.790000, 0.062028, 0.009625, 0.064754 ], [196, -8832.040000, 0.048587, 0.030455, 0.063577 ], [18, -8832.280000, 0.038050, 0.051699, 0.066369 ], [19, -8832.630000, 0.027007, 0.012620, 0.068879 ] ], "n": ["FDJVGXF01CBX1F_rvcmp" ] }, {"p": [[20, -8889.620000, 0.694774, 0.002125, 0.063644 ], [22, -8891.290000, 0.130933, 0.005669, 0.061361 ], [21, -8892.040000, 0.061982, 0.009631, 0.063891 ], [196, -8892.300000, 0.047744, 0.030477, 0.062592 ], [18, -8892.530000, 0.037866, 0.051699, 0.065488 ], [19, -8892.880000, 0.026702, 0.012620, 0.067987 ] ], "n": ["FDJVGXF01BYCO7" ] }, {"p": [[20, -8889.620000, 0.694774, 0.002125, 0.063644 ], [22, -8891.290000, 0.130933, 0.005669, 0.061361 ], [21, -8892.040000, 0.061982, 0.009631, 0.063891 ], [196, -8892.300000, 0.047744, 0.030477, 0.062592 ], [18, -8892.530000, 0.037866, 0.051699, 0.065488 ], [19, -8892.880000, 0.026702, 0.012620, 0.067987 ] ], "n": ["FDJVGXF01AELJM" ] }, {"p": [[20, -9179.430000, 0.646073, 0.002134, 0.061422 ], [22, -9180.630000, 0.194400, 0.008485, 0.058725 ], [196, -9181.810000, 0.059417, 0.031252, 0.059233 ], [21, -9181.850000, 0.057227, 0.009490, 0.061524 ], [19, -9182.710000, 0.024347, 0.012620, 0.065491 ], [205, -9182.980000, 0.018536, 0.025964, 0.062752 ] ], "n": ["FDJVGXF01A7QII_rvcmp" ] }, {"p": [[20, -9179.430000, 0.646073, 0.002134, 0.061422 ], [22, -9180.630000, 0.194400, 0.008485, 0.058725 ], [196, -9181.810000, 0.059417, 0.031252, 0.059233 ], [21, -9181.850000, 0.057227, 0.009490, 0.061524 ], [19, -9182.710000, 0.024347, 0.012620, 0.065491 ], [205, -9182.980000, 0.018536, 0.025964, 0.062752 ] ], "n": ["FDJVGXF01BQVWT_rvcmp" ] }, {"p": [[20, -9179.430000, 0.646073, 0.002134, 0.061422 ], [22, -9180.630000, 0.194400, 0.008485, 0.058725 ], [196, -9181.810000, 0.059417, 0.031252, 0.059233 ], [21, -9181.850000, 0.057227, 0.009490, 0.061524 ], [19, -9182.710000, 0.024347, 0.012620, 0.065491 ], [205, -9182.980000, 0.018536, 0.025964, 0.062752 ] ], "n": ["FDJVGXF01BHQ5C_rvcmp" ] }, {"p": [[20, -8809.930000, 0.693433, 0.002121, 0.059804 ], [22, -8811.570000, 0.135037, 0.005735, 0.057229 ], [21, -8812.350000, 0.061692, 0.009669, 0.059798 ], [196, -8812.610000, 0.047789, 0.030531, 0.057821 ], [18, -8812.870000, 0.036889, 0.051699, 0.061405 ], [19, -8813.250000, 0.025161, 0.012620, 0.063986 ] ], "n": ["FDJVGXF01A1U38" ] }, {"p": [[20, -6813.430000, 0.371533, 0.000007, 0.061604 ], [204, -6814.480000, 0.129920, 0.005294, 0.072664 ], [21, -6814.530000, 0.122985, 0.000009, 0.062794 ], [196, -6814.580000, 0.117936, 0.044809, 0.065739 ], [22, -6814.660000, 0.108196, 0.000009, 0.062215 ], [200, -6815.030000, 0.074779, 0.012685, 0.078680 ], [203, -6815.030000, 0.074651, 0.009988, 0.078676 ] ], "n": ["FDJVGXF01CS3NG" ] }, {"p": [[20, -4633.000000, 0.284052, 0.000005, 0.059136 ], [21, -4633.780000, 0.129725, 0.000008, 0.060334 ], [19, -4633.780000, 0.129572, 0.012620, 0.060341 ], [22, -4633.880000, 0.117856, 0.000007, 0.059459 ], [18, -4633.880000, 0.117832, 0.051699, 0.059461 ], [196, -4633.920000, 0.113303, 0.009594, 0.074759 ], [195, -4633.970000, 0.107660, 0.009446, 0.077152 ] ], "n": ["FDJVGXF01EP157_rvcmp" ] }, {"p": [[20, -4711.160000, 0.265598, 0.000005, 0.058329 ], [204, -4711.840000, 0.134673, 0.005222, 0.073914 ], [196, -4711.890000, 0.127930, 0.024267, 0.071129 ], [21, -4711.950000, 0.121090, 0.000008, 0.059498 ], [19, -4711.950000, 0.120944, 0.012620, 0.059500 ], [22, -4712.000000, 0.114908, 0.000007, 0.058582 ], [18, -4712.000000, 0.114857, 0.051699, 0.058588 ] ], "n": ["FDJVGXF01B5ZPX" ] }, {"p": [[20, -6206.060000, 0.338424, 0.000005, 0.056786 ], [204, -6206.850000, 0.153702, 0.005474, 0.068323 ], [21, -6207.180000, 0.110240, 0.000008, 0.058002 ], [19, -6207.180000, 0.110016, 0.012620, 0.058005 ], [22, -6207.260000, 0.101875, 0.000007, 0.057284 ], [18, -6207.260000, 0.101763, 0.051699, 0.057284 ], [200, -6207.450000, 0.083978, 0.012685, 0.075100 ] ], "n": ["FDJVGXF01COB4U" ] }, {"p": [[20, -6235.790000, 0.485949, 0.000005, 0.056344 ], [21, -6236.910000, 0.158009, 0.000008, 0.057541 ], [19, -6236.920000, 0.157690, 0.012620, 0.057549 ], [22, -6237.030000, 0.140088, 0.000007, 0.056847 ], [204, -6238.810000, 0.023633, 0.005180, 0.074652 ], [196, -6238.950000, 0.020584, 0.046374, 0.067115 ], [200, -6239.330000, 0.014047, 0.012685, 0.081216 ] ], "n": ["FDJVGXF01EJR5M" ] }, {"p": [[20, -5082.600000, 0.301061, 0.000005, 0.052830 ], [21, -5083.400000, 0.135331, 0.000008, 0.053791 ], [19, -5083.400000, 0.135167, 0.012620, 0.053789 ], [22, -5083.480000, 0.124414, 0.000007, 0.052891 ], [18, -5083.480000, 0.124378, 0.051699, 0.052901 ], [196, -5083.770000, 0.093233, 0.011326, 0.065491 ], [195, -5083.850000, 0.086416, 0.009446, 0.068185 ] ], "n": ["FDJVGXF01AWJHN" ] }, {"p": [[20, -7788.040000, 0.768616, 0.000007, 0.050459 ], [21, -7790.250000, 0.084015, 0.000009, 0.053723 ], [19, -7790.250000, 0.083951, 0.012620, 0.053724 ], [22, -7790.830000, 0.046894, 0.002360, 0.052617 ], [196, -7792.400000, 0.009808, 0.053012, 0.040083 ], [204, -7792.780000, 0.006717, 0.011669, 0.049572 ] ], "n": ["FDJVGXF01A0HKE" ] }, {"p": [[20, -8108.800000, 0.380342, 0.000005, 0.049950 ], [21, -8109.950000, 0.120935, 0.000009, 0.050725 ], [19, -8109.950000, 0.120685, 0.012620, 0.050723 ], [22, -8110.050000, 0.109196, 0.000007, 0.050101 ], [18, -8110.050000, 0.109082, 0.051699, 0.050105 ], [196, -8110.050000, 0.109071, 0.057308, 0.048154 ], [204, -8110.820000, 0.050689, 0.006091, 0.058115 ] ], "n": ["FDJVGXF01B687C" ] }, {"p": [[20, -6345.380000, 0.498605, 0.000005, 0.049213 ], [21, -6346.530000, 0.158197, 0.000008, 0.050218 ], [19, -6346.530000, 0.157869, 0.012620, 0.050225 ], [22, -6346.640000, 0.142479, 0.000007, 0.049437 ], [204, -6348.760000, 0.017109, 0.005529, 0.066029 ], [196, -6348.780000, 0.016629, 0.046111, 0.058333 ], [200, -6349.390000, 0.009110, 0.012685, 0.072601 ] ], "n": ["FDJVGXF01DH3DF_rvcmp" ] }, {"p": [[20, -5487.710000, 0.347264, 0.000005, 0.049417 ], [21, -5488.520000, 0.154710, 0.000008, 0.050249 ], [19, -5488.520000, 0.154522, 0.012620, 0.050246 ], [22, -5488.630000, 0.138315, 0.000007, 0.049376 ], [18, -5488.630000, 0.138237, 0.051699, 0.049381 ], [196, -5489.570000, 0.054077, 0.021806, 0.059651 ], [204, -5491.000000, 0.012874, 0.005393, 0.068791 ] ], "n": ["FDJVGXF01D1UNE_rvcmp" ] }, {"p": [[20, -7502.900000, 0.410102, 0.000007, 0.048206 ], [21, -7504.020000, 0.132875, 0.000009, 0.048978 ], [19, -7504.030000, 0.132658, 0.012620, 0.048975 ], [22, -7504.140000, 0.117963, 0.000008, 0.048301 ], [18, -7504.140000, 0.117854, 0.051699, 0.048305 ], [204, -7504.430000, 0.088548, 0.010777, 0.050597 ] ], "n": ["FDJVGXF01DF939_rvcmp" ] }, {"p": [[20, -7763.720000, 0.412044, 0.000007, 0.046922 ], [21, -7764.850000, 0.132906, 0.000009, 0.047653 ], [19, -7764.850000, 0.132688, 0.012620, 0.047649 ], [22, -7764.980000, 0.116811, 0.000008, 0.046980 ], [18, -7764.980000, 0.116688, 0.051699, 0.046984 ], [204, -7765.250000, 0.088863, 0.010812, 0.049090 ] ], "n": ["FDJVGXF01C8XFL_rvcmp" ] }, {"p": [[20, -7862.870000, 0.414092, 0.000007, 0.046058 ], [21, -7864.010000, 0.133165, 0.000009, 0.046762 ], [19, -7864.010000, 0.132946, 0.012620, 0.046758 ], [22, -7864.140000, 0.116718, 0.000008, 0.046086 ], [18, -7864.140000, 0.116592, 0.051699, 0.046095 ], [204, -7864.440000, 0.086487, 0.010854, 0.048084 ] ], "n": ["FDJVGXF01EQ0TT_rvcmp" ] }, {"p": [[20, -7841.330000, 0.431985, 0.000007, 0.045802 ], [21, -7842.460000, 0.138766, 0.000009, 0.046498 ], [19, -7842.460000, 0.138539, 0.012620, 0.046500 ], [22, -7842.610000, 0.119361, 0.000008, 0.045836 ], [18, -7842.610000, 0.119218, 0.051699, 0.045840 ], [204, -7843.440000, 0.052130, 0.010770, 0.048283 ] ], "n": ["FDJVGXF01BKUCP_rvcmp" ] }, {"p": [[21, -8360.510000, 0.276947, 0.017640, 0.068484 ], [22, -8360.510000, 0.276896, 0.000007, 0.068480 ], [18, -8360.510000, 0.276642, 0.051699, 0.068484 ], [20, -8361.960000, 0.065329, 0.005597, 0.073092 ], [19, -8361.980000, 0.063720, 0.012620, 0.073310 ], [196, -8362.440000, 0.040466, 0.046564, 0.073127 ] ], "n": ["FDJVGXF01BSS33" ] }, {"p": [[21, -8764.250000, 0.241191, 0.017640, 0.064045 ], [22, -8764.250000, 0.241137, 0.000007, 0.064042 ], [18, -8764.250000, 0.240919, 0.051699, 0.064041 ], [196, -8764.600000, 0.170275, 0.043558, 0.062879 ], [20, -8765.750000, 0.053984, 0.005541, 0.068370 ], [19, -8765.770000, 0.052493, 0.012620, 0.068579 ] ], "n": ["FDJVGXF01EQVCZ" ] }, {"p": [[21, -8764.250000, 0.241191, 0.017640, 0.064045 ], [22, -8764.250000, 0.241137, 0.000007, 0.064042 ], [18, -8764.250000, 0.240919, 0.051699, 0.064041 ], [196, -8764.600000, 0.170275, 0.043558, 0.062879 ], [20, -8765.750000, 0.053984, 0.005541, 0.068370 ], [19, -8765.770000, 0.052493, 0.012620, 0.068579 ] ], "n": ["FDJVGXF01A3P8N" ] }, {"p": [[21, -8857.520000, 0.241756, 0.017640, 0.063147 ], [22, -8857.520000, 0.241705, 0.000007, 0.063148 ], [18, -8857.520000, 0.241484, 0.051699, 0.063151 ], [196, -8857.870000, 0.169731, 0.043505, 0.061825 ], [20, -8859.030000, 0.053416, 0.005530, 0.067425 ], [19, -8859.060000, 0.051909, 0.012620, 0.067624 ] ], "n": ["FDJVGXF01EMP0L" ] }, {"p": [[21, -8756.560000, 0.298567, 0.017640, 0.050185 ], [22, -8756.560000, 0.298561, 0.000007, 0.050186 ], [18, -8756.570000, 0.298231, 0.051699, 0.050190 ], [20, -8758.290000, 0.053301, 0.005391, 0.054467 ], [19, -8758.320000, 0.051340, 0.012620, 0.054636 ] ], "n": ["FDJVGXF01DYC5M_rvcmp" ] }, {"p": [[21, -8756.560000, 0.298567, 0.017640, 0.050185 ], [22, -8756.560000, 0.298561, 0.000007, 0.050186 ], [18, -8756.570000, 0.298231, 0.051699, 0.050190 ], [20, -8758.290000, 0.053301, 0.005391, 0.054467 ], [19, -8758.320000, 0.051340, 0.012620, 0.054636 ] ], "n": ["FDJVGXF01AYXVW_rvcmp" ] }, {"p": [[21, -9393.890000, 0.335770, 0.016952, 0.077000 ], [18, -9393.900000, 0.332727, 0.051153, 0.076860 ], [22, -9393.910000, 0.331502, 0.000007, 0.077313 ] ], "n": ["FDJVGXF01DFDUU_rvcmp" ] }, {"p": [[21, -9049.150000, 0.545070, 0.014824, 0.128769 ], [18, -9050.260000, 0.178560, 0.049070, 0.128461 ], [22, -9050.300000, 0.172684, 0.000006, 0.130199 ], [196, -9051.070000, 0.079736, 0.033559, 0.089578 ], [170, -9052.700000, 0.015638, 0.009104, 0.110595 ], [208, -9053.810000, 0.005143, 0.015849, 0.127643 ], [171, -9054.290000, 0.003170, 0.007158, 0.109472 ] ], "n": ["FDJVGXF01DR5DG_rvcmp" ] }, {"p": [[21, -5096.750000, 0.680130, 0.009659, 0.105775 ], [19, -5098.440000, 0.125415, 0.007818, 0.127615 ], [20, -5098.770000, 0.090584, 0.006659, 0.132604 ], [22, -5099.670000, 0.036703, 0.004488, 0.106745 ], [151, -5099.710000, 0.035412, 0.000007, 0.126940 ], [18, -5099.820000, 0.031756, 0.050158, 0.114060 ] ], "n": ["FDJVGXF01AK7Z0" ] }, {"p": [[21, -5096.750000, 0.680130, 0.009659, 0.105775 ], [19, -5098.440000, 0.125415, 0.007818, 0.127615 ], [20, -5098.770000, 0.090584, 0.006659, 0.132604 ], [22, -5099.670000, 0.036703, 0.004488, 0.106745 ], [151, -5099.710000, 0.035412, 0.000007, 0.126940 ], [18, -5099.820000, 0.031756, 0.050158, 0.114060 ] ], "n": ["FDJVGXF01CI761" ] }, {"p": [[21, -5174.880000, 0.685963, 0.009681, 0.104253 ], [19, -5176.610000, 0.122703, 0.007801, 0.125831 ], [20, -5176.940000, 0.088018, 0.006659, 0.130750 ], [22, -5177.810000, 0.036974, 0.004606, 0.104939 ], [151, -5177.870000, 0.034679, 0.000007, 0.125188 ], [18, -5177.960000, 0.031663, 0.050060, 0.112306 ] ], "n": ["FDJVGXF01DQNVD" ] }, {"p": [[21, -5586.930000, 0.525919, 0.009466, 0.119094 ], [151, -5587.840000, 0.210875, 0.000007, 0.129028 ], [19, -5588.420000, 0.118469, 0.007921, 0.138188 ], [20, -5588.710000, 0.088721, 0.006659, 0.142648 ], [22, -5589.820000, 0.029139, 0.003531, 0.121782 ], [18, -5589.900000, 0.026878, 0.050786, 0.127034 ] ], "n": ["FDJVGXF01EEXIW_rvcmp" ] }, {"p": [[21, -8760.780000, 0.764831, 0.009283, 0.113684 ], [20, -8762.920000, 0.089692, 0.006659, 0.130551 ], [19, -8762.920000, 0.089654, 0.012620, 0.130551 ], [18, -8764.090000, 0.027983, 0.050809, 0.119543 ], [22, -8764.090000, 0.027839, 0.000007, 0.120118 ] ], "n": ["FDJVGXF01C5K53" ] }, {"p": [[22, -2915.980000, 0.167996, 0.023900, 0.048112 ], [210, -2916.020000, 0.161655, 0.017507, 0.056369 ], [225, -2916.020000, 0.161619, 0.036449, 0.056488 ], [226, -2916.020000, 0.161540, 0.000008, 0.056493 ], [208, -2916.120000, 0.146836, 0.011944, 0.051939 ], [209, -2916.200000, 0.134710, 0.006837, 0.054137 ], [206, -2916.920000, 0.065644, 0.000001, 0.075954 ] ], "n": ["FDJVGXF01EKSSX_rvcmp" ] }, {"p": [[22, -2915.980000, 0.167996, 0.023900, 0.048112 ], [210, -2916.020000, 0.161655, 0.017507, 0.056369 ], [225, -2916.020000, 0.161619, 0.036449, 0.056488 ], [226, -2916.020000, 0.161540, 0.000008, 0.056493 ], [208, -2916.120000, 0.146836, 0.011944, 0.051939 ], [209, -2916.200000, 0.134710, 0.006837, 0.054137 ], [206, -2916.920000, 0.065644, 0.000001, 0.075954 ] ], "n": ["FDJVGXF01B68CK_rvcmp" ] }, {"p": [[22, -2915.980000, 0.167996, 0.023900, 0.048112 ], [210, -2916.020000, 0.161655, 0.017507, 0.056369 ], [225, -2916.020000, 0.161619, 0.036449, 0.056488 ], [226, -2916.020000, 0.161540, 0.000008, 0.056493 ], [208, -2916.120000, 0.146836, 0.011944, 0.051939 ], [209, -2916.200000, 0.134710, 0.006837, 0.054137 ], [206, -2916.920000, 0.065644, 0.000001, 0.075954 ] ], "n": ["FDJVGXF01BI0WX_rvcmp" ] }, {"p": [[22, -2915.980000, 0.167996, 0.023900, 0.048112 ], [210, -2916.020000, 0.161655, 0.017507, 0.056369 ], [225, -2916.020000, 0.161619, 0.036449, 0.056488 ], [226, -2916.020000, 0.161540, 0.000008, 0.056493 ], [208, -2916.120000, 0.146836, 0.011944, 0.051939 ], [209, -2916.200000, 0.134710, 0.006837, 0.054137 ], [206, -2916.920000, 0.065644, 0.000001, 0.075954 ] ], "n": ["FDJVGXF01CBQYG_rvcmp" ] }, {"p": [[22, -9367.150000, 0.299014, 0.020167, 0.125235 ], [210, -9367.290000, 0.260603, 0.008701, 0.114952 ], [226, -9367.800000, 0.156182, 0.013928, 0.102518 ], [205, -9368.340000, 0.091177, 0.034259, 0.126778 ], [208, -9368.440000, 0.082744, 0.022260, 0.129085 ], [209, -9368.470000, 0.079838, 0.001012, 0.130155 ], [18, -9369.440000, 0.030442, 0.039566, 0.133067 ] ], "n": ["FDJVGXF01DHZEC_rvcmp" ] }, {"p": [[22, -8749.080000, 0.943543, 0.015018, 0.058031 ], [226, -8752.790000, 0.023113, 0.019501, 0.055572 ], [18, -8753.000000, 0.018753, 0.046923, 0.068025 ], [21, -8753.250000, 0.014591, 0.017643, 0.072504 ] ], "n": ["FDJVGXF01DNYHY" ] }, {"p": [[22, -6966.420000, 0.654951, 0.014096, 0.073132 ], [2, -6967.240000, 0.288348, 0.014318, 0.061974 ], [18, -6969.070000, 0.046428, 0.039858, 0.083710 ], [226, -6970.580000, 0.010273, 0.027924, 0.079237 ] ], "n": ["FDJVGXF01DGBP7_rvcmp" ] }, {"p": [[22, -6964.780000, 0.631228, 0.013526, 0.067780 ], [2, -6965.570000, 0.287010, 0.014967, 0.057475 ], [18, -6967.300000, 0.050529, 0.039609, 0.076551 ], [226, -6968.820000, 0.011115, 0.027573, 0.072719 ], [17, -6968.920000, 0.010060, 0.049256, 0.074865 ], [227, -6968.920000, 0.010058, 0.000009, 0.074868 ] ], "n": ["FDJVGXF01DUF87_rvcmp" ] }, {"p": [[22, -9441.470000, 0.647056, 0.013638, 0.066579 ], [226, -9442.680000, 0.192521, 0.023682, 0.058617 ], [227, -9443.700000, 0.069329, 0.000005, 0.062512 ], [17, -9443.700000, 0.069326, 0.049256, 0.062509 ], [18, -9444.860000, 0.021769, 0.047504, 0.076894 ] ], "n": ["FDJVGXF01DPQJQ" ] }, {"p": [[22, -9441.470000, 0.647056, 0.013638, 0.066579 ], [226, -9442.680000, 0.192521, 0.023682, 0.058617 ], [227, -9443.700000, 0.069329, 0.000005, 0.062512 ], [17, -9443.700000, 0.069326, 0.049256, 0.062509 ], [18, -9444.860000, 0.021769, 0.047504, 0.076894 ] ], "n": ["FDJVGXF01EUBGX" ] }, {"p": [[22, -9441.470000, 0.647056, 0.013638, 0.066579 ], [226, -9442.680000, 0.192521, 0.023682, 0.058617 ], [227, -9443.700000, 0.069329, 0.000005, 0.062512 ], [17, -9443.700000, 0.069326, 0.049256, 0.062509 ], [18, -9444.860000, 0.021769, 0.047504, 0.076894 ] ], "n": ["FDJVGXF01DG1KE" ] }, {"p": [[22, -7971.610000, 0.833365, 0.012877, 0.045942 ], [205, -7973.380000, 0.141658, 0.016486, 0.040738 ], [204, -7975.120000, 0.024977, 0.012657, 0.047316 ] ], "n": ["FDJVGXF01A2K5F_rvcmp" ] }, {"p": [[22, -9083.850000, 0.341257, 0.011880, 0.112346 ], [196, -9084.010000, 0.288788, 0.037225, 0.078003 ], [18, -9084.540000, 0.170038, 0.051699, 0.120338 ], [208, -9085.550000, 0.062069, 0.019500, 0.111303 ], [205, -9085.830000, 0.047090, 0.038635, 0.114857 ], [209, -9085.830000, 0.047080, 0.000007, 0.114860 ], [170, -9085.900000, 0.043679, 0.010216, 0.104607 ] ], "n": ["FDJVGXF01DX64R" ] }, {"p": [[22, -9493.480000, 0.503611, 0.012101, 0.110554 ], [18, -9493.530000, 0.478967, 0.031586, 0.103810 ], [226, -9496.840000, 0.017422, 0.017080, 0.102923 ] ], "n": ["FDJVGXF01BF7RQ_rvcmp" ] }, {"p": [[22, -5582.050000, 0.491019, 0.011540, 0.083643 ], [28, -5583.220000, 0.151923, 0.000006, 0.059147 ], [2, -5583.300000, 0.139896, 0.013198, 0.069440 ], [18, -5583.930000, 0.075040, 0.040262, 0.094530 ], [21, -5584.210000, 0.056564, 0.016509, 0.099343 ], [154, -5584.230000, 0.055650, 0.020817, 0.095971 ], [170, -5584.850000, 0.029908, 0.001994, 0.098123 ] ], "n": ["FDJVGXF01C9I07" ] }, {"p": [[22, -6053.370000, 0.697262, 0.011585, 0.075418 ], [2, -6054.870000, 0.154421, 0.014645, 0.063296 ], [18, -6055.640000, 0.071773, 0.047143, 0.087533 ], [21, -6055.670000, 0.069455, 0.016361, 0.089888 ], [226, -6057.960000, 0.007089, 0.027422, 0.081533 ] ], "n": ["FDJVGXF01BAPDX_rvcmp" ] }, {"p": [[22, -6799.140000, 0.680899, 0.012082, 0.075222 ], [2, -6800.720000, 0.140079, 0.014257, 0.064586 ], [18, -6800.870000, 0.120855, 0.039424, 0.080774 ], [21, -6801.600000, 0.058167, 0.016482, 0.089068 ] ], "n": ["FDJVGXF01A0X4A_rvcmp" ] }, {"p": [[22, -6375.530000, 0.716238, 0.012317, 0.074751 ], [2, -6377.000000, 0.164205, 0.014093, 0.062778 ], [18, -6378.000000, 0.060739, 0.047216, 0.087721 ], [21, -6378.030000, 0.058819, 0.016382, 0.089903 ] ], "n": ["FDJVGXF01BXZSF" ] }, {"p": [[22, -4490.610000, 0.627871, 0.011733, 0.074100 ], [2, -4492.140000, 0.136292, 0.016529, 0.066055 ], [18, -4492.290000, 0.117437, 0.033063, 0.088367 ], [21, -4492.920000, 0.062721, 0.016440, 0.094638 ], [226, -4493.730000, 0.027865, 0.031612, 0.081953 ], [227, -4493.730000, 0.027813, 0.000006, 0.082228 ] ], "n": ["FDJVGXF01CP2D6_rvcmp" ] }, {"p": [[22, -5283.330000, 0.823992, 0.011834, 0.067054 ], [18, -5285.450000, 0.099020, 0.039871, 0.078540 ], [21, -5285.820000, 0.068439, 0.016299, 0.083946 ], [2, -5287.900000, 0.008550, 0.017422, 0.070203 ] ], "n": ["FDJVGXF01DEQXQ" ] }, {"p": [[22, -4906.210000, 0.828014, 0.011880, 0.064839 ], [18, -4908.360000, 0.096591, 0.039895, 0.077724 ], [21, -4908.730000, 0.066721, 0.016296, 0.083616 ], [2, -4910.770000, 0.008673, 0.017237, 0.068477 ] ], "n": ["FDJVGXF01A5GV4_rvcmp" ] }, {"p": [[22, -5397.850000, 0.837648, 0.011875, 0.064819 ], [18, -5400.010000, 0.096656, 0.039824, 0.075969 ], [21, -5400.400000, 0.065696, 0.016266, 0.081312 ] ], "n": ["FDJVGXF01CTOLS" ] }, {"p": [[22, -5397.850000, 0.837648, 0.011875, 0.064819 ], [18, -5400.010000, 0.096656, 0.039824, 0.075969 ], [21, -5400.400000, 0.065696, 0.016266, 0.081312 ] ], "n": ["FDJVGXF01BY8LZ" ] }, {"p": [[22, -5397.850000, 0.837648, 0.011875, 0.064819 ], [18, -5400.010000, 0.096656, 0.039824, 0.075969 ], [21, -5400.400000, 0.065696, 0.016266, 0.081312 ] ], "n": ["FDJVGXF01DEQXN" ] }, {"p": [[22, -5397.850000, 0.837648, 0.011875, 0.064819 ], [18, -5400.010000, 0.096656, 0.039824, 0.075969 ], [21, -5400.400000, 0.065696, 0.016266, 0.081312 ] ], "n": ["FDJVGXF01EP3G9_rvcmp" ] }, {"p": [[22, -5622.340000, 0.497746, 0.012218, 0.063494 ], [205, -5622.590000, 0.389629, 0.023497, 0.070181 ], [21, -5624.600000, 0.052065, 0.017642, 0.072396 ], [19, -5624.650000, 0.049277, 0.012620, 0.074766 ], [209, -5626.130000, 0.011283, 0.006837, 0.077110 ] ], "n": ["FDJVGXF01D44GE_rvcmp" ] }, {"p": [[22, -5614.660000, 0.505089, 0.012299, 0.055552 ], [205, -5615.020000, 0.354677, 0.023520, 0.062338 ], [21, -5617.060000, 0.045857, 0.017641, 0.064524 ], [20, -5617.120000, 0.043193, 0.005469, 0.066727 ], [19, -5617.150000, 0.041861, 0.012620, 0.067124 ], [209, -5618.660000, 0.009323, 0.006837, 0.068705 ] ], "n": ["FDJVGXF01EHQS6_rvcmp" ] }, {"p": [[22, -5614.660000, 0.505089, 0.012299, 0.055552 ], [205, -5615.020000, 0.354677, 0.023520, 0.062338 ], [21, -5617.060000, 0.045857, 0.017641, 0.064524 ], [20, -5617.120000, 0.043193, 0.005469, 0.066727 ], [19, -5617.150000, 0.041861, 0.012620, 0.067124 ], [209, -5618.660000, 0.009323, 0.006837, 0.068705 ] ], "n": ["FDJVGXF01D3DDV_rvcmp" ] }, {"p": [[22, -5614.660000, 0.505089, 0.012299, 0.055552 ], [205, -5615.020000, 0.354677, 0.023520, 0.062338 ], [21, -5617.060000, 0.045857, 0.017641, 0.064524 ], [20, -5617.120000, 0.043193, 0.005469, 0.066727 ], [19, -5617.150000, 0.041861, 0.012620, 0.067124 ], [209, -5618.660000, 0.009323, 0.006837, 0.068705 ] ], "n": ["FDJVGXF01B2QGK_rvcmp" ] }, {"p": [[22, -5614.660000, 0.505089, 0.012299, 0.055552 ], [205, -5615.020000, 0.354677, 0.023520, 0.062338 ], [21, -5617.060000, 0.045857, 0.017641, 0.064524 ], [20, -5617.120000, 0.043193, 0.005469, 0.066727 ], [19, -5617.150000, 0.041861, 0.012620, 0.067124 ], [209, -5618.660000, 0.009323, 0.006837, 0.068705 ] ], "n": ["FDJVGXF01AYXKC_rvcmp" ] }, {"p": [[22, -5614.660000, 0.505089, 0.012299, 0.055552 ], [205, -5615.020000, 0.354677, 0.023520, 0.062338 ], [21, -5617.060000, 0.045857, 0.017641, 0.064524 ], [20, -5617.120000, 0.043193, 0.005469, 0.066727 ], [19, -5617.150000, 0.041861, 0.012620, 0.067124 ], [209, -5618.660000, 0.009323, 0.006837, 0.068705 ] ], "n": ["FDJVGXF01ERHT8_rvcmp" ] }, {"p": [[22, -5628.620000, 0.322446, 0.011036, 0.335857 ], [19, -5629.280000, 0.166040, 0.000006, 0.373100 ], [21, -5629.360000, 0.153771, 0.017642, 0.366053 ], [18, -5629.360000, 0.153758, 0.051699, 0.366048 ], [38, -5630.170000, 0.068000, 0.076823, 0.376496 ], [193, -5630.170000, 0.067993, 0.016731, 0.376501 ], [194, -5630.170000, 0.067993, 0.000007, 0.376515 ] ], "n": ["FDJVGXF01EA5M3" ] }, {"p": [[22, -7717.090000, 0.567396, 0.011448, 0.244312 ], [21, -7718.190000, 0.188560, 0.017644, 0.262479 ], [38, -7719.430000, 0.054502, 0.073275, 0.257869 ], [193, -7719.460000, 0.052837, 0.016731, 0.263198 ], [194, -7719.460000, 0.052826, 0.000007, 0.263210 ], [28, -7719.640000, 0.044197, 0.000006, 0.246324 ], [35, -7719.750000, 0.039684, 0.011822, 0.265900 ] ], "n": ["FDJVGXF01D3ERO" ] }, {"p": [[22, -7414.900000, 0.473150, 0.011299, 0.240073 ], [18, -7416.000000, 0.158222, 0.051699, 0.258545 ], [21, -7416.000000, 0.158207, 0.017644, 0.258549 ], [208, -7416.930000, 0.062156, 0.005868, 0.244548 ], [206, -7417.100000, 0.052354, 0.000001, 0.255476 ], [207, -7417.100000, 0.052354, 0.000001, 0.255476 ], [38, -7417.290000, 0.043559, 0.074250, 0.255960 ] ], "n": ["FDJVGXF01DRUVX_rvcmp" ] }, {"p": [[22, -8634.790000, 0.732384, 0.011183, 0.106522 ], [18, -8636.690000, 0.109276, 0.051173, 0.116562 ], [21, -8636.700000, 0.108994, 0.017641, 0.116941 ], [226, -8638.550000, 0.017101, 0.005563, 0.110058 ], [210, -8638.560000, 0.016956, 0.014839, 0.113096 ], [225, -8638.660000, 0.015289, 0.036449, 0.114309 ] ], "n": ["FDJVGXF01CF0XW_rvcmp" ] }, {"p": [[22, -8441.960000, 0.829793, 0.011352, 0.097676 ], [18, -8443.990000, 0.108013, 0.050447, 0.107426 ], [226, -8445.510000, 0.023776, 0.011511, 0.098419 ], [2, -8445.620000, 0.021300, 0.019434, 0.095146 ], [210, -8445.840000, 0.017119, 0.014632, 0.104562 ] ], "n": ["FDJVGXF01CMX3V" ] }, {"p": [[22, -6656.310000, 0.666910, 0.011432, 0.071236 ], [18, -6657.880000, 0.138927, 0.039218, 0.075260 ], [2, -6657.930000, 0.131925, 0.014937, 0.061318 ], [21, -6658.690000, 0.062238, 0.016399, 0.083872 ] ], "n": ["FDJVGXF01A4IF9_rvcmp" ] }, {"p": [[22, -8981.030000, 0.695748, 0.010849, 0.066999 ], [226, -8982.920000, 0.105435, 0.023384, 0.058442 ], [18, -8983.330000, 0.069652, 0.047324, 0.072922 ], [21, -8983.530000, 0.057143, 0.017643, 0.076983 ], [17, -8983.990000, 0.036013, 0.049256, 0.062614 ], [227, -8983.990000, 0.036008, 0.000006, 0.062617 ] ], "n": ["FDJVGXF01EVFCB" ] }, {"p": [[22, -7141.920000, 0.788321, 0.011313, 0.066880 ], [18, -7143.230000, 0.211679, 0.036486, 0.069322 ] ], "n": ["FDJVGXF01CWNZP_rvcmp" ] }, {"p": [[22, -7141.920000, 0.788321, 0.011313, 0.066880 ], [18, -7143.230000, 0.211679, 0.036486, 0.069322 ] ], "n": ["FDJVGXF01B1WZO_rvcmp" ] }, {"p": [[22, -3786.790000, 0.767111, 0.011062, 0.065583 ], [18, -3788.440000, 0.146934, 0.034299, 0.079558 ], [21, -3788.980000, 0.085955, 0.015308, 0.086274 ] ], "n": ["FDJVGXF01BDGXM_rvcmp" ] }, {"p": [[22, -6393.510000, 0.437025, 0.010321, 0.291393 ], [21, -6394.310000, 0.196139, 0.017639, 0.312046 ], [18, -6394.310000, 0.196121, 0.051696, 0.312057 ], [148, -6395.580000, 0.054895, 0.073715, 0.287845 ], [194, -6395.810000, 0.043760, 0.000007, 0.317668 ], [149, -6395.960000, 0.037536, 0.034304, 0.272688 ], [210, -6396.040000, 0.034524, 0.006050, 0.306459 ] ], "n": ["FDJVGXF01A61OK_rvcmp" ] }, {"p": [[22, -6518.670000, 0.450850, 0.010198, 0.284949 ], [18, -6519.480000, 0.201661, 0.051699, 0.305331 ], [21, -6519.480000, 0.201654, 0.017644, 0.305328 ], [193, -6521.080000, 0.040538, 0.016731, 0.313063 ], [194, -6521.080000, 0.040532, 0.000007, 0.313082 ], [35, -6521.310000, 0.032386, 0.013080, 0.317575 ], [195, -6521.310000, 0.032380, 0.000009, 0.317572 ] ], "n": ["FDJVGXF01ENFXJ" ] }, {"p": [[22, -8098.260000, 0.624693, 0.008892, 0.092349 ], [18, -8099.530000, 0.175998, 0.046542, 0.096620 ], [21, -8099.690000, 0.149878, 0.017640, 0.099328 ], [208, -8101.390000, 0.027529, 0.015759, 0.098554 ], [205, -8102.310000, 0.010967, 0.037983, 0.103660 ], [209, -8102.310000, 0.010935, 0.000007, 0.104082 ] ], "n": ["FDJVGXF01B1SI3_rvcmp" ] }, {"p": [[22, -7742.180000, 0.830428, 0.009385, 0.072561 ], [18, -7744.690000, 0.067295, 0.050523, 0.082882 ], [21, -7744.700000, 0.066638, 0.017640, 0.083492 ], [20, -7745.330000, 0.035639, 0.004941, 0.088199 ] ], "n": ["FDJVGXF01BGCWG_rvcmp" ] }, {"p": [[22, -8116.320000, 0.432899, 0.007415, 0.043692 ], [196, -8116.890000, 0.243117, 0.052776, 0.044010 ], [20, -8117.270000, 0.166579, 0.000008, 0.050211 ], [21, -8118.120000, 0.071382, 0.017642, 0.048837 ], [19, -8118.420000, 0.052969, 0.012620, 0.050994 ], [204, -8119.250000, 0.022986, 0.006195, 0.058276 ], [200, -8120.080000, 0.010069, 0.012685, 0.063975 ] ], "n": ["FDJVGXF01EK578_rvcmp" ] }, {"p": [[22, -8116.320000, 0.432899, 0.007415, 0.043692 ], [196, -8116.890000, 0.243117, 0.052776, 0.044010 ], [20, -8117.270000, 0.166579, 0.000008, 0.050211 ], [21, -8118.120000, 0.071382, 0.017642, 0.048837 ], [19, -8118.420000, 0.052969, 0.012620, 0.050994 ], [204, -8119.250000, 0.022986, 0.006195, 0.058276 ], [200, -8120.080000, 0.010069, 0.012685, 0.063975 ] ], "n": ["FDJVGXF01BMIPR_rvcmp" ] }, {"p": [[22, -7700.000000, 0.259307, 0.006053, 0.067207 ], [18, -7700.020000, 0.253999, 0.044938, 0.067186 ], [21, -7700.390000, 0.175992, 0.017641, 0.071790 ], [19, -7700.570000, 0.146840, 0.012620, 0.074896 ], [20, -7700.570000, 0.146595, 0.006657, 0.074889 ], [204, -7702.710000, 0.017267, 0.012282, 0.068861 ] ], "n": ["FDJVGXF01A17E7" ] }, {"p": [[22, -6282.140000, 0.265651, 0.000007, 0.312496 ], [18, -6282.140000, 0.265602, 0.051699, 0.312511 ], [21, -6282.140000, 0.265314, 0.017640, 0.312514 ], [149, -6283.110000, 0.100244, 0.019491, 0.297416 ], [148, -6283.730000, 0.054248, 0.119619, 0.316263 ], [127, -6284.160000, 0.034979, 0.040911, 0.317481 ], [208, -6285.080000, 0.013962, 0.004882, 0.304195 ] ], "n": ["FDJVGXF01CXCEM" ] }, {"p": [[25, -7548.420000, 0.322884, 0.013577, 0.070185 ], [205, -7548.440000, 0.316332, 0.000009, 0.070531 ], [204, -7548.440000, 0.316284, 0.020145, 0.070531 ], [202, -7551.400000, 0.016409, 0.035634, 0.062473 ], [209, -7551.860000, 0.010377, 0.002327, 0.079589 ], [22, -7551.900000, 0.009939, 0.019245, 0.080059 ], [24, -7552.140000, 0.007775, 0.000009, 0.086799 ] ], "n": ["FDJVGXF01E0TI0" ] }, {"p": [[25, -5881.700000, 0.288593, 0.011895, 0.056320 ], [205, -5881.840000, 0.251127, 0.000007, 0.057142 ], [204, -5881.840000, 0.250948, 0.020143, 0.057141 ], [20, -5882.480000, 0.133119, 0.000007, 0.064712 ], [226, -5883.890000, 0.032552, 0.015797, 0.043371 ], [22, -5884.280000, 0.021949, 0.016434, 0.064604 ], [24, -5884.290000, 0.021713, 0.000009, 0.071494 ] ], "n": ["FDJVGXF01BER0Y" ] }, {"p": [[25, -7196.200000, 0.323894, 0.011291, 0.074983 ], [204, -7196.230000, 0.313467, 0.016776, 0.073899 ], [205, -7196.430000, 0.257122, 0.000009, 0.075721 ], [208, -7198.510000, 0.032148, 0.005063, 0.086473 ], [206, -7198.710000, 0.026425, 0.000001, 0.089984 ], [207, -7198.710000, 0.026425, 0.000001, 0.089984 ], [24, -7198.960000, 0.020518, 0.000009, 0.090029 ] ], "n": ["FDJVGXF01CX8JF_rvcmp" ] }, {"p": [[25, -6501.510000, 0.331815, 0.011347, 0.063491 ], [204, -6501.520000, 0.331760, 0.016586, 0.062138 ], [205, -6501.760000, 0.258412, 0.000009, 0.064228 ], [208, -6504.100000, 0.025023, 0.005638, 0.075996 ], [206, -6504.370000, 0.019090, 0.000001, 0.080257 ], [207, -6504.370000, 0.019090, 0.000001, 0.080257 ], [24, -6504.620000, 0.014810, 0.000009, 0.080313 ] ], "n": ["FDJVGXF01A523Y_rvcmp" ] }, {"p": [[25, -7294.250000, 0.305122, 0.005501, 0.073479 ], [24, -7294.900000, 0.158889, 0.000009, 0.079530 ], [23, -7294.920000, 0.156492, 0.003604, 0.079522 ], [150, -7294.940000, 0.153350, 0.007819, 0.072550 ], [154, -7295.560000, 0.082156, 0.003047, 0.071342 ], [153, -7295.690000, 0.072281, 0.026997, 0.074671 ], [204, -7295.700000, 0.071709, 0.018581, 0.075710 ] ], "n": ["FDJVGXF01CY5JN" ] }, {"p": [[25, -4663.070000, 0.415364, 0.006242, 0.028094 ], [204, -4663.950000, 0.171527, 0.016945, 0.028270 ], [205, -4664.110000, 0.146471, 0.000006, 0.029536 ], [24, -4664.200000, 0.134337, 0.000009, 0.034388 ], [23, -4664.210000, 0.132301, 0.003604, 0.034372 ] ], "n": ["FDJVGXF01EN425" ] }, {"p": [[25, -5279.500000, 0.384556, 0.004185, 0.047567 ], [24, -5280.030000, 0.227282, 0.000009, 0.052484 ], [23, -5280.040000, 0.223664, 0.003604, 0.052477 ], [204, -5281.120000, 0.076202, 0.017952, 0.049224 ], [205, -5281.190000, 0.071240, 0.000006, 0.050023 ], [196, -5282.620000, 0.017056, 0.041669, 0.030225 ] ], "n": ["FDJVGXF01EQDJB" ] }, {"p": [[25, -2720.170000, 0.199961, 0.002591, 0.165221 ], [23, -2720.200000, 0.192676, 0.003604, 0.169054 ], [24, -2720.200000, 0.192676, 0.001125, 0.169054 ], [39, -2720.320000, 0.170961, 0.000006, 0.170057 ], [204, -2720.760000, 0.110516, 0.020143, 0.175797 ], [205, -2720.760000, 0.110507, 0.000009, 0.175796 ], [197, -2722.340000, 0.022703, 0.000006, 0.210278 ] ], "n": ["FDJVGXF01B8PSX_rvcmp" ] }, {"p": [[26, -7188.250000, 0.386827, 0.087265, 0.065688 ], [196, -7188.800000, 0.221806, 0.002452, 0.071176 ], [195, -7188.820000, 0.217057, 0.009446, 0.073209 ], [35, -7190.060000, 0.063148, 0.003882, 0.081949 ], [38, -7190.250000, 0.051923, 0.052037, 0.077211 ], [171, -7190.810000, 0.029755, 0.028664, 0.067591 ], [194, -7190.820000, 0.029484, 0.006266, 0.082479 ] ], "n": ["FDJVGXF01AY8A2" ] }, {"p": [[26, -9785.140000, 0.378815, 0.085621, 0.125408 ], [196, -9785.200000, 0.355986, 0.013721, 0.127073 ], [195, -9785.870000, 0.182999, 0.009446, 0.137527 ], [28, -9787.330000, 0.042319, 0.024823, 0.131278 ], [226, -9788.090000, 0.019911, 0.018198, 0.110773 ], [22, -9788.770000, 0.010087, 0.013555, 0.133021 ], [34, -9788.790000, 0.009883, 0.007060, 0.143981 ] ], "n": ["FDJVGXF01D9CL6" ] }, {"p": [[26, -7437.980000, 0.502622, 0.082239, 0.097808 ], [196, -7438.590000, 0.271218, 0.010533, 0.108413 ], [195, -7438.770000, 0.226160, 0.009446, 0.114154 ] ], "n": ["FDJVGXF01D4M9I_rvcmp" ] }, {"p": [[26, -7415.530000, 0.520418, 0.080891, 0.095791 ], [196, -7416.170000, 0.274383, 0.013660, 0.105985 ], [195, -7416.460000, 0.205199, 0.009446, 0.113181 ] ], "n": ["FDJVGXF01DPKM4_rvcmp" ] }, {"p": [[26, -8650.750000, 0.668765, 0.073940, 0.100025 ], [196, -8652.270000, 0.146170, 0.015581, 0.111131 ], [195, -8653.300000, 0.052139, 0.009446, 0.124997 ], [226, -8653.490000, 0.042994, 0.021774, 0.099733 ], [34, -8653.630000, 0.037669, 0.000007, 0.128628 ], [33, -8653.630000, 0.037620, 0.020031, 0.128631 ], [17, -8654.570000, 0.014643, 0.036770, 0.097095 ] ], "n": ["FDJVGXF01C3ZUR_rvcmp" ] }, {"p": [[26, -8544.590000, 0.501009, 0.064494, 0.115150 ], [189, -8544.790000, 0.408167, 0.069580, 0.107416 ], [188, -8547.280000, 0.034000, 0.043171, 0.134307 ], [190, -8547.300000, 0.033131, 0.013901, 0.134622 ], [40, -8547.640000, 0.023692, 0.059244, 0.123122 ] ], "n": ["FDJVGXF01B1LFA" ] }, {"p": [[26, -6492.670000, 0.674984, 0.059215, 0.121916 ], [38, -6494.440000, 0.115589, 0.056011, 0.124175 ], [189, -6494.920000, 0.071300, 0.080055, 0.138213 ], [193, -6495.500000, 0.039743, 0.009724, 0.143873 ], [188, -6495.510000, 0.039322, 0.041639, 0.149450 ], [195, -6495.720000, 0.032099, 0.009446, 0.146900 ], [190, -6495.890000, 0.026962, 0.000153, 0.153334 ] ], "n": ["FDJVGXF01CUK8T_rvcmp" ] }, {"p": [[26, -7543.650000, 1.000000, 0.012900, 0.004624 ] ], "n": ["FDJVGXF01CB6R6_rvcmp" ] }, {"p": [[26, -6148.540000, 0.393406, 0.000006, 1.999990 ], [14, -6149.500000, 0.149561, 0.000006, 1.999990 ], [2, -6149.870000, 0.103705, 0.036220, 1.999990 ], [228, -6149.870000, 0.103674, 0.000005, 1.999990 ], [39, -6149.910000, 0.099593, 0.000006, 1.999990 ], [1, -6150.190000, 0.075030, 0.096269, 1.999990 ], [0, -6150.190000, 0.075030, 0.066512, 1.999990 ] ], "n": ["FDJVGXF01AFNGW" ] }, {"p": [[26, -7408.260000, 0.591385, 0.000006, 1.999990 ], [14, -7409.740000, 0.135109, 0.000006, 1.999990 ], [2, -7410.470000, 0.065269, 0.036220, 1.999990 ], [38, -7410.680000, 0.052552, 0.003874, 1.999990 ], [36, -7410.680000, 0.052546, 0.000009, 1.999990 ], [37, -7410.680000, 0.052546, 0.000009, 1.999990 ], [195, -7410.720000, 0.050593, 0.000009, 1.999990 ] ], "n": ["FDJVGXF01ETYCA" ] }, {"p": [[26, -7539.030000, 0.269078, 0.000006, 1.999990 ], [2, -7539.610000, 0.150161, 0.036220, 1.999990 ], [228, -7539.610000, 0.150115, 0.000005, 1.999990 ], [227, -7539.610000, 0.150101, 0.012980, 1.999990 ], [1, -7539.940000, 0.108320, 0.096269, 1.999990 ], [0, -7539.940000, 0.108319, 0.066512, 1.999990 ], [14, -7540.470000, 0.063906, 0.048824, 1.999990 ] ], "n": ["FDJVGXF01DZUNB" ] }, {"p": [[27, -5502.140000, 0.319339, 0.057286, 0.054812 ], [34, -5502.560000, 0.209897, 0.011137, 0.063932 ], [35, -5502.930000, 0.146168, 0.002260, 0.064910 ], [38, -5503.020000, 0.133263, 0.042277, 0.065028 ], [196, -5503.720000, 0.066049, 0.008533, 0.054450 ], [194, -5503.730000, 0.065586, 0.000007, 0.068670 ], [195, -5503.820000, 0.059697, 0.004561, 0.063798 ] ], "n": ["FDJVGXF01DYDV9_rvcmp" ] }, {"p": [[27, -8753.250000, 0.480622, 0.050950, 0.345543 ], [196, -8754.490000, 0.138849, 0.024994, 0.298571 ], [195, -8754.900000, 0.092407, 0.003437, 0.323949 ], [35, -8754.990000, 0.084673, 0.013080, 0.329554 ], [194, -8754.990000, 0.084592, 0.006696, 0.329553 ], [204, -8755.320000, 0.060648, 0.003601, 0.326005 ], [26, -8755.360000, 0.058209, 0.097406, 0.319995 ] ], "n": ["FDJVGXF01COGD3" ] }, {"p": [[27, -8753.250000, 0.480622, 0.050950, 0.345543 ], [196, -8754.490000, 0.138849, 0.024994, 0.298571 ], [195, -8754.900000, 0.092407, 0.003437, 0.323949 ], [35, -8754.990000, 0.084673, 0.013080, 0.329554 ], [194, -8754.990000, 0.084592, 0.006696, 0.329553 ], [204, -8755.320000, 0.060648, 0.003601, 0.326005 ], [26, -8755.360000, 0.058209, 0.097406, 0.319995 ] ], "n": ["FDJVGXF01DB5FM" ] }, {"p": [[27, -7541.970000, 1.000000, 0.051013, 0.102601 ] ], "n": ["FDJVGXF01E2POB_rvcmp" ] }, {"p": [[27, -8252.080000, 1.000000, 0.044840, 0.119610 ] ], "n": ["FDJVGXF01DFJYN" ] }, {"p": [[27, -8575.950000, 0.441439, 0.041832, 0.110988 ], [191, -8577.400000, 0.103152, 0.002698, 0.128775 ], [190, -8577.440000, 0.099045, 0.034335, 0.129588 ], [171, -8577.440000, 0.099044, 0.034630, 0.129585 ], [192, -8577.450000, 0.098275, 0.016900, 0.132782 ], [193, -8577.510000, 0.093008, 0.000730, 0.134753 ], [33, -8577.850000, 0.066038, 0.012553, 0.125908 ] ], "n": ["FDJVGXF01BT0P0" ] }, {"p": [[27, -4263.960000, 0.564470, 0.041935, 0.058075 ], [34, -4265.300000, 0.147662, 0.009810, 0.072352 ], [36, -4266.040000, 0.070694, 0.000009, 0.084567 ], [38, -4266.040000, 0.070474, 0.000009, 0.084563 ], [28, -4266.290000, 0.054819, 0.042091, 0.073487 ], [29, -4266.440000, 0.047307, 0.025261, 0.079211 ], [33, -4266.500000, 0.044574, 0.020031, 0.081548 ] ], "n": ["FDJVGXF01BFWNO_rvcmp" ] }, {"p": [[27, -7461.450000, 1.000000, 0.035734, 0.198678 ] ], "n": ["FDJVGXF01E1PZO" ] }, {"p": [[27, -4417.180000, 0.296322, 0.036107, 0.188909 ], [1, -4417.780000, 0.162792, 0.056749, 0.138474 ], [40, -4417.900000, 0.144268, 0.049608, 0.215464 ], [191, -4418.120000, 0.116404, 0.005550, 0.226032 ], [190, -4418.170000, 0.110253, 0.034335, 0.228249 ], [192, -4418.280000, 0.099065, 0.000005, 0.228487 ], [189, -4418.610000, 0.070897, 0.053508, 0.189541 ] ], "n": ["FDJVGXF01DPAGA" ] }, {"p": [[27, -8146.750000, 0.886981, 0.033031, 0.171195 ], [29, -8150.370000, 0.023772, 0.026137, 0.191592 ], [34, -8150.420000, 0.022558, 0.014780, 0.202076 ], [190, -8150.630000, 0.018381, 0.013225, 0.199783 ], [38, -8150.630000, 0.018248, 0.054964, 0.185963 ], [33, -8150.810000, 0.015294, 0.016076, 0.198447 ], [188, -8150.840000, 0.014766, 0.030099, 0.194250 ] ], "n": ["FDJVGXF01B0502_rvcmp" ] }, {"p": [[27, -8480.600000, 0.987834, 0.033353, 0.125391 ], [171, -8485.000000, 0.012166, 0.027474, 0.111686 ] ], "n": ["FDJVGXF01BEWVV" ] }, {"p": [[27, -8873.900000, 0.984622, 0.031482, 0.161094 ], [29, -8878.060000, 0.015378, 0.011348, 0.175154 ] ], "n": ["FDJVGXF01C3UNG" ] }, {"p": [[27, -7658.150000, 0.496547, 0.025129, 0.226669 ], [191, -7659.270000, 0.161940, 0.006116, 0.219079 ], [190, -7659.590000, 0.117591, 0.034335, 0.223343 ], [171, -7659.590000, 0.117553, 0.034630, 0.223348 ], [192, -7660.410000, 0.052044, 0.005630, 0.223407 ], [40, -7660.580000, 0.044019, 0.086016, 0.226846 ], [39, -7662.030000, 0.010305, 0.011861, 0.238159 ] ], "n": ["FDJVGXF01EE4Q1_rvcmp" ] }, {"p": [[27, -7658.150000, 0.496547, 0.025129, 0.226669 ], [191, -7659.270000, 0.161940, 0.006116, 0.219079 ], [190, -7659.590000, 0.117591, 0.034335, 0.223343 ], [171, -7659.590000, 0.117553, 0.034630, 0.223348 ], [192, -7660.410000, 0.052044, 0.005630, 0.223407 ], [40, -7660.580000, 0.044019, 0.086016, 0.226846 ], [39, -7662.030000, 0.010305, 0.011861, 0.238159 ] ], "n": ["FDJVGXF01CG2V8_rvcmp" ] }, {"p": [[27, -8494.520000, 1.000000, 0.024380, 0.160097 ] ], "n": ["FDJVGXF01B4NK4" ] }, {"p": [[27, -8069.610000, 0.982754, 0.020683, 0.354160 ], [202, -8073.650000, 0.017246, 0.008546, 0.294292 ] ], "n": ["FDJVGXF01EHNCM" ] }, {"p": [[27, -8794.890000, 0.948750, 0.018039, 0.168500 ], [189, -8797.810000, 0.051250, 0.031566, 0.122540 ] ], "n": ["FDJVGXF01CXKE2_rvcmp" ] }, {"p": [[27, -8113.830000, 1.000000, 0.011034, 0.248635 ] ], "n": ["FDJVGXF01BPCLK_rvcmp" ] }, {"p": [[27, -8130.950000, 1.000000, 0.003503, 0.209133 ] ], "n": ["FDJVGXF01DVR9S_rvcmp" ] }, {"p": [[27, -7570.730000, 0.639660, 0.001875, 0.255345 ], [191, -7572.630000, 0.095670, 0.007141, 0.242888 ], [40, -7572.740000, 0.085202, 0.057089, 0.228434 ], [190, -7573.110000, 0.058757, 0.033150, 0.248040 ], [171, -7573.120000, 0.058551, 0.034630, 0.248905 ], [192, -7573.460000, 0.041758, 0.000005, 0.249257 ], [29, -7574.170000, 0.020402, 0.008150, 0.221989 ] ], "n": ["FDJVGXF01ADV5J" ] }, {"p": [[27, -8016.640000, 0.778360, 0.000009, 0.333906 ], [189, -8018.040000, 0.191564, 0.016830, 0.312409 ], [190, -8020.580000, 0.015038, 0.000008, 0.353306 ], [188, -8020.580000, 0.015038, 0.052299, 0.353304 ] ], "n": ["FDJVGXF01ET3VX_rvcmp" ] }, {"p": [[27, -5875.360000, 1.000000, 0.000009, 0.291627 ] ], "n": ["FDJVGXF01EKMU2" ] }, {"p": [[27, -6304.870000, 1.000000, 0.000009, 0.277141 ] ], "n": ["FDJVGXF01DD0OW" ] }, {"p": [[27, -8519.870000, 0.797720, 0.000009, 0.223913 ], [191, -8522.370000, 0.065216, 0.000008, 0.209334 ], [171, -8522.370000, 0.065204, 0.034630, 0.209332 ], [190, -8522.370000, 0.065146, 0.034335, 0.209334 ], [40, -8524.640000, 0.006713, 0.066534, 0.207001 ] ], "n": ["FDJVGXF01B7K9G" ] }, {"p": [[28, -7087.020000, 0.208578, 0.029011, 0.286693 ], [29, -7087.170000, 0.180399, 0.036116, 0.297542 ], [33, -7087.280000, 0.160913, 0.000010, 0.305114 ], [32, -7087.280000, 0.160901, 0.015226, 0.305105 ], [31, -7087.730000, 0.103004, 0.001925, 0.313224 ], [30, -7087.730000, 0.103004, 0.001608, 0.313224 ], [40, -7087.940000, 0.083201, 0.066894, 0.319652 ] ], "n": ["FDJVGXF01E4PPJ_rvcmp" ] }, {"p": [[28, -7154.900000, 0.213921, 0.028682, 0.280870 ], [29, -7155.070000, 0.182092, 0.035805, 0.291756 ], [33, -7155.190000, 0.160769, 0.000010, 0.299549 ], [32, -7155.190000, 0.160757, 0.015226, 0.299555 ], [31, -7155.650000, 0.101727, 0.001925, 0.307674 ], [30, -7155.650000, 0.101727, 0.001608, 0.307681 ], [27, -7155.900000, 0.079008, 0.038892, 0.298900 ] ], "n": ["FDJVGXF01ELF81_rvcmp" ] }, {"p": [[28, -7621.560000, 0.784069, 0.020793, 0.105895 ], [226, -7623.610000, 0.101207, 0.017045, 0.101445 ], [210, -7624.600000, 0.037569, 0.010185, 0.120880 ], [1, -7624.970000, 0.025894, 0.050442, 0.098915 ], [34, -7625.270000, 0.019192, 0.000849, 0.128410 ], [17, -7625.430000, 0.016283, 0.038141, 0.103179 ], [26, -7625.470000, 0.015785, 0.072570, 0.113443 ] ], "n": ["FDJVGXF01DU45W" ] }, {"p": [[28, -8150.130000, 0.857109, 0.020590, 0.097505 ], [226, -8152.760000, 0.061399, 0.014270, 0.094204 ], [210, -8153.420000, 0.031874, 0.010110, 0.110986 ], [34, -8154.150000, 0.015311, 0.001184, 0.118005 ], [205, -8154.430000, 0.011535, 0.037133, 0.124377 ], [208, -8154.450000, 0.011396, 0.023820, 0.126001 ], [209, -8154.450000, 0.011376, 0.000008, 0.126217 ] ], "n": ["FDJVGXF01DDHVB_rvcmp" ] }, {"p": [[28, -8732.760000, 0.401198, 0.018383, 0.111358 ], [226, -8733.310000, 0.232012, 0.014155, 0.104019 ], [210, -8733.830000, 0.138400, 0.010059, 0.120409 ], [208, -8734.490000, 0.071140, 0.018540, 0.131322 ], [205, -8734.720000, 0.056702, 0.038282, 0.134115 ], [209, -8734.720000, 0.056643, 0.000007, 0.134525 ], [225, -8734.970000, 0.043905, 0.036449, 0.118523 ] ], "n": ["FDJVGXF01EPNHK_rvcmp" ] }, {"p": [[28, -8735.770000, 0.401269, 0.018383, 0.111327 ], [226, -8736.320000, 0.232132, 0.014150, 0.103981 ], [210, -8736.840000, 0.138367, 0.010060, 0.120374 ], [208, -8737.500000, 0.071088, 0.018539, 0.131285 ], [205, -8737.730000, 0.056653, 0.038277, 0.134073 ], [209, -8737.730000, 0.056592, 0.000007, 0.134494 ], [225, -8737.980000, 0.043898, 0.036449, 0.118496 ] ], "n": ["FDJVGXF01C55VE_rvcmp" ] }, {"p": [[28, -8686.640000, 0.251000, 0.015457, 0.285717 ], [27, -8686.950000, 0.184268, 0.037601, 0.288896 ], [38, -8687.090000, 0.159867, 0.054112, 0.279957 ], [34, -8687.460000, 0.110353, 0.000007, 0.301796 ], [33, -8687.460000, 0.110324, 0.020031, 0.301797 ], [26, -8687.640000, 0.092098, 0.097406, 0.307066 ], [195, -8687.640000, 0.092091, 0.009446, 0.307071 ] ], "n": ["FDJVGXF01D2V22" ] }, {"p": [[28, -6758.460000, 0.961130, 0.015403, 0.107414 ], [1, -6761.670000, 0.038870, 0.023967, 0.109655 ] ], "n": ["FDJVGXF01EHYHY_rvcmp" ] }, {"p": [[28, -6830.530000, 1.000000, 0.015382, 0.105398 ] ], "n": ["FDJVGXF01EW47W_rvcmp" ] }, {"p": [[28, -6830.530000, 1.000000, 0.015382, 0.105398 ] ], "n": ["FDJVGXF01A3SD0_rvcmp" ] }, {"p": [[28, -6830.530000, 1.000000, 0.015382, 0.105398 ] ], "n": ["FDJVGXF01DG74P_rvcmp" ] }, {"p": [[28, -6830.530000, 1.000000, 0.015382, 0.105398 ] ], "n": ["FDJVGXF01CW7A1_rvcmp" ] }, {"p": [[28, -7052.400000, 1.000000, 0.015369, 0.101695 ] ], "n": ["FDJVGXF01BC051" ] }, {"p": [[28, -4264.790000, 0.563518, 0.000006, 0.030971 ], [22, -4266.200000, 0.137728, 0.012974, 0.071761 ], [38, -4266.730000, 0.080549, 0.062722, 0.067609 ], [27, -4266.920000, 0.066417, 0.057149, 0.067303 ], [35, -4267.060000, 0.057861, 0.005345, 0.070558 ], [193, -4267.270000, 0.047125, 0.015824, 0.080709 ], [194, -4267.270000, 0.046801, 0.000007, 0.080829 ] ], "n": ["FDJVGXF01AK3EJ_rvcmp" ] }, {"p": [[29, -7075.160000, 0.316776, 0.040951, 0.124289 ], [32, -7075.310000, 0.271848, 0.014936, 0.129256 ], [33, -7075.310000, 0.271390, 0.000010, 0.129346 ], [31, -7077.130000, 0.044039, 0.001925, 0.140845 ], [30, -7077.130000, 0.044017, 0.001608, 0.140845 ], [190, -7077.480000, 0.031031, 0.018935, 0.132868 ], [171, -7077.870000, 0.020898, 0.026287, 0.137670 ] ], "n": ["FDJVGXF01CJZMI" ] }, {"p": [[29, -4272.950000, 0.178561, 0.029909, 0.274528 ], [33, -4273.040000, 0.163512, 0.000010, 0.282634 ], [32, -4273.040000, 0.163478, 0.015226, 0.282639 ], [28, -4273.100000, 0.154448, 0.048759, 0.283219 ], [34, -4273.100000, 0.154362, 0.000007, 0.283233 ], [31, -4273.610000, 0.092819, 0.001925, 0.299591 ], [30, -4273.610000, 0.092819, 0.001608, 0.299584 ] ], "n": ["FDJVGXF01ATIJK_rvcmp" ] }, {"p": [[29, -4245.760000, 0.183923, 0.029112, 0.257568 ], [33, -4245.870000, 0.164292, 0.000010, 0.266315 ], [32, -4245.870000, 0.164256, 0.015226, 0.266320 ], [28, -4245.930000, 0.154939, 0.048759, 0.266804 ], [34, -4245.930000, 0.154846, 0.000007, 0.266817 ], [31, -4246.480000, 0.088872, 0.001925, 0.283134 ], [30, -4246.480000, 0.088872, 0.001608, 0.283127 ] ], "n": ["FDJVGXF01B3QSM_rvcmp" ] }, {"p": [[29, -4871.430000, 0.579528, 0.019369, 0.174551 ], [28, -4873.320000, 0.087510, 0.023571, 0.175732 ], [26, -4873.390000, 0.081443, 0.039661, 0.198622 ], [27, -4873.450000, 0.076387, 0.046675, 0.176235 ], [33, -4873.470000, 0.074640, 0.010873, 0.197984 ], [34, -4873.610000, 0.065482, 0.000007, 0.196667 ], [39, -4874.230000, 0.035011, 0.000006, 0.220005 ] ], "n": ["FDJVGXF01AK9MM" ] }, {"p": [[29, -4871.430000, 0.579528, 0.019369, 0.174551 ], [28, -4873.320000, 0.087510, 0.023571, 0.175732 ], [26, -4873.390000, 0.081443, 0.039661, 0.198622 ], [27, -4873.450000, 0.076387, 0.046675, 0.176235 ], [33, -4873.470000, 0.074640, 0.010873, 0.197984 ], [34, -4873.610000, 0.065482, 0.000007, 0.196667 ], [39, -4874.230000, 0.035011, 0.000006, 0.220005 ] ], "n": ["FDJVGXF01EAP1T" ] }, {"p": [[29, -8090.520000, 0.451493, 0.000006, 0.404868 ], [28, -8091.120000, 0.246879, 0.000006, 0.401663 ], [40, -8092.100000, 0.092673, 0.009897, 0.427511 ], [34, -8092.590000, 0.057112, 0.000007, 0.432758 ], [33, -8092.590000, 0.057110, 0.020031, 0.432752 ], [38, -8092.750000, 0.048307, 0.069299, 0.433190 ], [26, -8092.790000, 0.046426, 0.080460, 0.429622 ] ], "n": ["FDJVGXF01AYDNG" ] }, {"p": [[29, -8815.800000, 1.000000, 0.000006, 0.288753 ] ], "n": ["FDJVGXF01BKLB9_rvcmp" ] }, {"p": [[29, -5761.260000, 0.898807, 0.000006, 0.258513 ], [40, -5764.410000, 0.038425, 0.057750, 0.255693 ], [192, -5764.890000, 0.023772, 0.001042, 0.275250 ], [191, -5764.900000, 0.023715, 0.015648, 0.275874 ], [190, -5765.340000, 0.015281, 0.028144, 0.277102 ] ], "n": ["FDJVGXF01B7XA4_rvcmp" ] }, {"p": [[29, -6499.070000, 0.834613, 0.000006, 0.257147 ], [28, -6502.050000, 0.042232, 0.029109, 0.269024 ], [33, -6502.310000, 0.032687, 0.000010, 0.286191 ], [32, -6502.310000, 0.032680, 0.015226, 0.286194 ], [34, -6502.520000, 0.026437, 0.000007, 0.288807 ], [31, -6503.050000, 0.015676, 0.001925, 0.300005 ], [30, -6503.050000, 0.015676, 0.001608, 0.300001 ] ], "n": ["FDJVGXF01DI1YF_rvcmp" ] }, {"p": [[31, -8045.170000, 0.330072, 0.000008, 0.308291 ], [29, -8045.950000, 0.151520, 0.028068, 0.306626 ], [40, -8046.040000, 0.138221, 0.000720, 0.316620 ], [32, -8046.240000, 0.113836, 0.008482, 0.313236 ], [33, -8046.310000, 0.106154, 0.000010, 0.314181 ], [30, -8046.350000, 0.102107, 0.001608, 0.317904 ], [177, -8046.910000, 0.058090, 0.000009, 0.355336 ] ], "n": ["FDJVGXF01DOJCP" ] }, {"p": [[31, -4726.800000, 0.194414, 0.000008, 0.250616 ], [30, -4726.800000, 0.194414, 0.000006, 0.250616 ], [32, -4726.810000, 0.194348, 0.000007, 0.250617 ], [27, -4727.380000, 0.109759, 0.027251, 0.234662 ], [28, -4727.430000, 0.103547, 0.035953, 0.243550 ], [33, -4727.450000, 0.101759, 0.000010, 0.257401 ], [29, -4727.450000, 0.101758, 0.046702, 0.257394 ] ], "n": ["FDJVGXF01AW2QG" ] }, {"p": [[31, -6288.280000, 0.186718, 0.000008, 0.246558 ], [30, -6288.280000, 0.186718, 0.000006, 0.246558 ], [32, -6288.280000, 0.186679, 0.000007, 0.246553 ], [28, -6288.650000, 0.128559, 0.035942, 0.240041 ], [29, -6288.700000, 0.122409, 0.041188, 0.245345 ], [33, -6288.750000, 0.117081, 0.000010, 0.249271 ], [189, -6289.230000, 0.071837, 0.054112, 0.226860 ] ], "n": ["FDJVGXF01EOSEH_rvcmp" ] }, {"p": [[31, -4169.380000, 0.218182, 0.000008, 0.182375 ], [30, -4169.380000, 0.218182, 0.000006, 0.182375 ], [32, -4169.380000, 0.218104, 0.000007, 0.182374 ], [29, -4170.160000, 0.099773, 0.046702, 0.187393 ], [33, -4170.160000, 0.099762, 0.000010, 0.187402 ], [28, -4170.460000, 0.073866, 0.044395, 0.185578 ], [34, -4170.490000, 0.072131, 0.000007, 0.190970 ] ], "n": ["FDJVGXF01EVSH3_rvcmp" ] }, {"p": [[33, -8208.690000, 0.486362, 0.008908, 0.092767 ], [32, -8209.880000, 0.147711, 0.015226, 0.100686 ], [194, -8210.180000, 0.109723, 0.002533, 0.103308 ], [28, -8210.350000, 0.092525, 0.045337, 0.096891 ], [34, -8210.400000, 0.087712, 0.000007, 0.098753 ], [193, -8210.840000, 0.056853, 0.016731, 0.105309 ], [192, -8211.930000, 0.019115, 0.009166, 0.095966 ] ], "n": ["FDJVGXF01DCTSU" ] }, {"p": [[33, -2691.780000, 0.250596, 0.000010, 0.000008 ], [29, -2691.780000, 0.250561, 0.046702, 0.000006 ], [32, -2691.780000, 0.250547, 0.015226, 0.000006 ], [34, -2691.860000, 0.230000, 0.000006, 0.000008 ], [35, -2694.850000, 0.011614, 0.000006, 0.000009 ], [31, -2696.100000, 0.003341, 0.001925, 0.012214 ], [30, -2696.100000, 0.003341, 0.001608, 0.012214 ] ], "n": ["FDJVGXF01BB0IM_rvcmp" ] }, {"p": [[33, -2691.780000, 0.250596, 0.000010, 0.000008 ], [29, -2691.780000, 0.250561, 0.046702, 0.000006 ], [32, -2691.780000, 0.250547, 0.015226, 0.000006 ], [34, -2691.860000, 0.230000, 0.000006, 0.000008 ], [35, -2694.850000, 0.011614, 0.000006, 0.000009 ], [31, -2696.100000, 0.003341, 0.001925, 0.012214 ], [30, -2696.100000, 0.003341, 0.001608, 0.012214 ] ], "n": ["FDJVGXF01DWWKJ_rvcmp" ] }, {"p": [[33, -2691.780000, 0.250596, 0.000010, 0.000008 ], [29, -2691.780000, 0.250561, 0.046702, 0.000006 ], [32, -2691.780000, 0.250547, 0.015226, 0.000006 ], [34, -2691.860000, 0.230000, 0.000006, 0.000008 ], [35, -2694.850000, 0.011614, 0.000006, 0.000009 ], [31, -2696.100000, 0.003341, 0.001925, 0.012214 ], [30, -2696.100000, 0.003341, 0.001608, 0.012214 ] ], "n": ["FDJVGXF01BQIGM_rvcmp" ] }, {"p": [[34, -3775.760000, 0.279284, 0.013488, 0.009167 ], [35, -3775.760000, 0.277579, 0.000006, 0.009191 ], [27, -3775.760000, 0.277568, 0.070440, 0.009191 ], [33, -3777.370000, 0.055799, 0.020031, 0.009875 ], [28, -3777.370000, 0.055791, 0.048759, 0.009884 ], [38, -3777.980000, 0.030182, 0.017966, 0.011942 ], [36, -3778.220000, 0.023797, 0.000009, 0.018156 ] ], "n": ["FDJVGXF01E0FKB" ] }, {"p": [[34, -5009.290000, 0.336056, 0.010012, 0.034424 ], [35, -5009.640000, 0.236740, 0.002293, 0.035065 ], [196, -5009.830000, 0.196693, 0.008756, 0.027162 ], [195, -5010.640000, 0.087359, 0.005082, 0.034088 ], [33, -5011.090000, 0.055689, 0.020031, 0.041990 ], [194, -5011.200000, 0.049703, 0.006696, 0.038883 ], [38, -5011.480000, 0.037758, 0.048406, 0.040167 ] ], "n": ["FDJVGXF01BOA9N_rvcmp" ] }, {"p": [[34, -4856.530000, 0.279036, 0.010173, 0.026730 ], [196, -4856.850000, 0.203294, 0.008684, 0.018685 ], [35, -4856.900000, 0.194173, 0.002471, 0.027037 ], [27, -4857.000000, 0.174673, 0.070440, 0.027959 ], [195, -4857.860000, 0.073979, 0.005360, 0.025621 ], [33, -4858.530000, 0.038016, 0.020031, 0.034971 ], [194, -4858.560000, 0.036830, 0.006696, 0.031053 ] ], "n": ["FDJVGXF01BF4ZH_rvcmp" ] }, {"p": [[34, -4856.530000, 0.279036, 0.010173, 0.026730 ], [196, -4856.850000, 0.203294, 0.008684, 0.018685 ], [35, -4856.900000, 0.194173, 0.002471, 0.027037 ], [27, -4857.000000, 0.174673, 0.070440, 0.027959 ], [195, -4857.860000, 0.073979, 0.005360, 0.025621 ], [33, -4858.530000, 0.038016, 0.020031, 0.034971 ], [194, -4858.560000, 0.036830, 0.006696, 0.031053 ] ], "n": ["FDJVGXF01D2AEW_rvcmp" ] }, {"p": [[34, -4856.530000, 0.279036, 0.010173, 0.026730 ], [196, -4856.850000, 0.203294, 0.008684, 0.018685 ], [35, -4856.900000, 0.194173, 0.002471, 0.027037 ], [27, -4857.000000, 0.174673, 0.070440, 0.027959 ], [195, -4857.860000, 0.073979, 0.005360, 0.025621 ], [33, -4858.530000, 0.038016, 0.020031, 0.034971 ], [194, -4858.560000, 0.036830, 0.006696, 0.031053 ] ], "n": ["FDJVGXF01AN94K_rvcmp" ] }, {"p": [[34, -4686.420000, 0.324557, 0.008734, 0.024076 ], [196, -4686.880000, 0.204798, 0.009562, 0.016903 ], [27, -4687.110000, 0.162362, 0.070440, 0.025798 ], [35, -4687.250000, 0.141531, 0.006526, 0.028935 ], [195, -4687.990000, 0.067468, 0.005151, 0.023701 ], [33, -4688.020000, 0.065508, 0.020031, 0.029062 ], [194, -4688.690000, 0.033776, 0.006696, 0.028746 ] ], "n": ["FDJVGXF01DNF8C_rvcmp" ] }, {"p": [[34, -4689.110000, 0.323398, 0.008734, 0.024066 ], [196, -4689.570000, 0.204135, 0.009572, 0.016895 ], [27, -4689.800000, 0.161769, 0.070440, 0.025796 ], [35, -4689.910000, 0.144563, 0.006526, 0.022794 ], [195, -4690.680000, 0.067229, 0.005151, 0.023690 ], [33, -4690.710000, 0.065259, 0.020031, 0.029045 ], [194, -4691.370000, 0.033648, 0.006696, 0.028739 ] ], "n": ["FDJVGXF01C6JWZ" ] }, {"p": [[34, -4480.410000, 0.515996, 0.006122, 0.014612 ], [33, -4481.400000, 0.192943, 0.020031, 0.016072 ], [35, -4481.630000, 0.152838, 0.000006, 0.016126 ], [29, -4482.620000, 0.056934, 0.043740, 0.020382 ], [32, -4482.670000, 0.054059, 0.015226, 0.021360 ], [195, -4483.780000, 0.017797, 0.005612, 0.014244 ], [38, -4484.420000, 0.009432, 0.018786, 0.024949 ] ], "n": ["FDJVGXF01EF2ZF_rvcmp" ] }, {"p": [[34, -4385.160000, 0.551948, 0.005601, 0.007911 ], [33, -4386.110000, 0.213932, 0.020031, 0.008380 ], [35, -4386.600000, 0.131372, 0.000006, 0.009309 ], [29, -4387.580000, 0.049037, 0.042951, 0.011890 ], [32, -4387.690000, 0.044285, 0.015226, 0.013395 ], [38, -4389.870000, 0.004987, 0.014439, 0.019023 ], [36, -4389.990000, 0.004438, 0.000009, 0.023562 ] ], "n": ["FDJVGXF01CPIPJ" ] }, {"p": [[34, -4385.160000, 0.551948, 0.005601, 0.007911 ], [33, -4386.110000, 0.213932, 0.020031, 0.008380 ], [35, -4386.600000, 0.131372, 0.000006, 0.009309 ], [29, -4387.580000, 0.049037, 0.042951, 0.011890 ], [32, -4387.690000, 0.044285, 0.015226, 0.013395 ], [38, -4389.870000, 0.004987, 0.014439, 0.019023 ], [36, -4389.990000, 0.004438, 0.000009, 0.023562 ] ], "n": ["FDJVGXF01DRUD1" ] }, {"p": [[34, -2751.070000, 0.612253, 0.005977, 0.000008 ], [33, -2752.150000, 0.207854, 0.020031, 0.000008 ], [35, -2752.560000, 0.137506, 0.000006, 0.000009 ], [195, -2754.600000, 0.017932, 0.000009, 0.011486 ], [194, -2754.600000, 0.017926, 0.006696, 0.011487 ], [38, -2755.610000, 0.006529, 0.076823, 0.013352 ] ], "n": ["FDJVGXF01E32DQ_rvcmp" ] }, {"p": [[34, -2751.070000, 0.612253, 0.005977, 0.000008 ], [33, -2752.150000, 0.207854, 0.020031, 0.000008 ], [35, -2752.560000, 0.137506, 0.000006, 0.000009 ], [195, -2754.600000, 0.017932, 0.000009, 0.011486 ], [194, -2754.600000, 0.017926, 0.006696, 0.011487 ], [38, -2755.610000, 0.006529, 0.076823, 0.013352 ] ], "n": ["FDJVGXF01DZ5JQ_rvcmp" ] }, {"p": [[34, -3379.210000, 0.610403, 0.005989, 0.000008 ], [33, -3380.290000, 0.207005, 0.020031, 0.000008 ], [35, -3380.700000, 0.137841, 0.000006, 0.000009 ], [32, -3382.820000, 0.016494, 0.015226, 0.004956 ], [195, -3382.980000, 0.014131, 0.000009, 0.008851 ], [194, -3382.980000, 0.014126, 0.006696, 0.008856 ] ], "n": ["FDJVGXF01BOPK9" ] }, {"p": [[34, -3379.210000, 0.610403, 0.005989, 0.000008 ], [33, -3380.290000, 0.207005, 0.020031, 0.000008 ], [35, -3380.700000, 0.137841, 0.000006, 0.000009 ], [32, -3382.820000, 0.016494, 0.015226, 0.004956 ], [195, -3382.980000, 0.014131, 0.000009, 0.008851 ], [194, -3382.980000, 0.014126, 0.006696, 0.008856 ] ], "n": ["FDJVGXF01CS07I_rvcmp" ] }, {"p": [[34, -3737.670000, 0.609757, 0.005964, 0.000008 ], [33, -3738.740000, 0.207846, 0.020031, 0.000008 ], [35, -3739.160000, 0.137024, 0.000006, 0.000009 ], [32, -3741.330000, 0.015677, 0.015226, 0.003920 ], [195, -3741.530000, 0.012780, 0.000009, 0.007750 ], [194, -3741.530000, 0.012776, 0.006696, 0.007751 ], [38, -3742.660000, 0.004140, 0.076825, 0.009051 ] ], "n": ["FDJVGXF01DG78X" ] }, {"p": [[37, -2941.210000, 0.205062, 0.001050, 0.011100 ], [36, -2941.210000, 0.205055, 0.000392, 0.011102 ], [38, -2941.210000, 0.205046, 0.000005, 0.011108 ], [194, -2941.780000, 0.116069, 0.000007, 0.011074 ], [193, -2941.780000, 0.116034, 0.016731, 0.011074 ], [35, -2942.190000, 0.076374, 0.013078, 0.010893 ], [195, -2942.190000, 0.076359, 0.000009, 0.010887 ] ], "n": ["FDJVGXF01DK2IL_rvcmp" ] }, {"p": [[37, -3002.860000, 0.207747, 0.001057, 0.010760 ], [36, -3002.860000, 0.207740, 0.000398, 0.010762 ], [38, -3002.860000, 0.207731, 0.000005, 0.010762 ], [194, -3003.430000, 0.117592, 0.000007, 0.010719 ], [193, -3003.430000, 0.117556, 0.016731, 0.010720 ], [35, -3003.850000, 0.077417, 0.013078, 0.010537 ], [27, -3004.040000, 0.064216, 0.070440, 0.010211 ] ], "n": ["FDJVGXF01BKUZO_rvcmp" ] }, {"p": [[38, -4389.820000, 0.622291, 0.036927, 0.168334 ], [27, -4391.290000, 0.142084, 0.031389, 0.195385 ], [37, -4392.180000, 0.058621, 0.002319, 0.231171 ], [36, -4392.180000, 0.058621, 0.001199, 0.231167 ], [33, -4392.530000, 0.041216, 0.014141, 0.204838 ], [193, -4392.570000, 0.039606, 0.004247, 0.215666 ], [192, -4392.620000, 0.037560, 0.022464, 0.219012 ] ], "n": ["FDJVGXF01AX1XU" ] }, {"p": [[38, -5005.960000, 0.272955, 0.036152, 0.045702 ], [35, -5006.490000, 0.161323, 0.004278, 0.047279 ], [196, -5006.610000, 0.141864, 0.009466, 0.033773 ], [27, -5006.690000, 0.131723, 0.070440, 0.049071 ], [194, -5006.940000, 0.102720, 0.000007, 0.048326 ], [193, -5006.940000, 0.102644, 0.016731, 0.048324 ], [195, -5007.110000, 0.086772, 0.003416, 0.043918 ] ], "n": ["FDJVGXF01A14WV" ] }, {"p": [[39, -4598.410000, 0.169965, 0.015889, 0.278196 ], [193, -4598.590000, 0.142036, 0.000008, 0.293331 ], [192, -4598.590000, 0.142015, 0.022464, 0.293333 ], [38, -4598.630000, 0.136764, 0.076823, 0.297622 ], [194, -4598.630000, 0.136744, 0.000007, 0.297627 ], [196, -4598.630000, 0.136247, 0.000010, 0.293277 ], [195, -4598.630000, 0.136229, 0.009446, 0.293287 ] ], "n": ["FDJVGXF01B0VT1_rvcmp" ] }, {"p": [[39, -4661.100000, 0.172658, 0.015769, 0.270216 ], [193, -4661.300000, 0.141802, 0.000008, 0.285076 ], [192, -4661.300000, 0.141781, 0.022464, 0.285078 ], [196, -4661.340000, 0.136034, 0.000010, 0.284980 ], [195, -4661.340000, 0.136014, 0.009446, 0.284985 ], [38, -4661.340000, 0.135866, 0.076823, 0.289323 ], [194, -4661.340000, 0.135845, 0.000007, 0.289333 ] ], "n": ["FDJVGXF01DI2Q5" ] }, {"p": [[39, -4661.100000, 0.172658, 0.015769, 0.270216 ], [193, -4661.300000, 0.141802, 0.000008, 0.285076 ], [192, -4661.300000, 0.141781, 0.022464, 0.285078 ], [196, -4661.340000, 0.136034, 0.000010, 0.284980 ], [195, -4661.340000, 0.136014, 0.009446, 0.284985 ], [38, -4661.340000, 0.135866, 0.076823, 0.289323 ], [194, -4661.340000, 0.135845, 0.000007, 0.289333 ] ], "n": ["FDJVGXF01APVY4" ] }, {"p": [[39, -2616.910000, 0.371083, 0.011719, 0.029263 ], [190, -2617.240000, 0.267240, 0.009321, 0.027562 ], [205, -2618.520000, 0.073822, 0.000007, 0.043403 ], [204, -2618.520000, 0.073797, 0.020143, 0.043398 ], [25, -2618.520000, 0.073768, 0.014512, 0.043407 ], [196, -2618.570000, 0.070169, 0.000010, 0.041398 ], [195, -2618.570000, 0.070121, 0.009446, 0.041400 ] ], "n": ["FDJVGXF01EFQH4_rvcmp" ] }, {"p": [[39, -3901.470000, 0.251301, 0.009835, 0.109960 ], [190, -3901.690000, 0.201958, 0.018101, 0.108118 ], [34, -3902.180000, 0.123774, 0.000608, 0.130203 ], [33, -3902.180000, 0.123491, 0.020031, 0.130829 ], [29, -3902.350000, 0.103864, 0.046702, 0.134200 ], [171, -3902.390000, 0.099611, 0.031112, 0.113474 ], [191, -3902.430000, 0.096000, 0.000008, 0.116689 ] ], "n": ["FDJVGXF01CLTHA" ] }, {"p": [[39, -6492.780000, 1.000000, 0.005258, 0.024366 ] ], "n": ["FDJVGXF01AFET7" ] }, {"p": [[39, -3751.040000, 0.239880, 0.000006, 0.295663 ], [29, -3751.120000, 0.222172, 0.000006, 0.310543 ], [167, -3751.670000, 0.127800, 0.000008, 0.281584 ], [151, -3751.770000, 0.115081, 0.000007, 0.340280 ], [171, -3751.930000, 0.098439, 0.001538, 0.344289 ], [149, -3751.930000, 0.098314, 0.063739, 0.345315 ], [170, -3751.930000, 0.098313, 0.018724, 0.345319 ] ], "n": ["FDJVGXF01CD0V5" ] }, {"p": [[40, -7351.360000, 0.243770, 0.064968, 0.138430 ], [192, -7351.520000, 0.207621, 0.012056, 0.150422 ], [149, -7351.780000, 0.160413, 0.038290, 0.114484 ], [171, -7352.130000, 0.113366, 0.020146, 0.143555 ], [39, -7352.190000, 0.106637, 0.021827, 0.160322 ], [193, -7352.240000, 0.100737, 0.000008, 0.162317 ], [191, -7352.640000, 0.067457, 0.007862, 0.153095 ] ], "n": ["FDJVGXF01DA51F" ] }, {"p": [[40, -5927.500000, 0.264380, 0.062612, 0.142518 ], [192, -5927.810000, 0.193444, 0.012191, 0.157604 ], [149, -5927.900000, 0.177115, 0.039103, 0.120925 ], [39, -5928.410000, 0.106030, 0.021179, 0.169849 ], [193, -5928.470000, 0.100253, 0.000008, 0.171827 ], [171, -5928.490000, 0.098728, 0.017591, 0.153717 ], [191, -5928.980000, 0.060051, 0.011998, 0.163414 ] ], "n": ["FDJVGXF01AOYHI" ] }, {"p": [[40, -6917.390000, 0.513125, 0.060544, 0.129058 ], [192, -6918.840000, 0.120271, 0.005055, 0.149334 ], [191, -6918.950000, 0.107874, 0.015648, 0.150823 ], [190, -6919.310000, 0.075084, 0.034335, 0.152179 ], [171, -6919.310000, 0.075026, 0.034630, 0.152186 ], [39, -6919.410000, 0.067658, 0.012365, 0.156288 ], [28, -6919.920000, 0.040962, 0.030353, 0.159886 ] ], "n": ["FDJVGXF01C794H" ] }, {"p": [[40, -6743.190000, 0.326190, 0.054919, 0.103919 ], [38, -6743.550000, 0.229056, 0.059882, 0.108165 ], [193, -6744.120000, 0.129299, 0.008136, 0.121297 ], [26, -6744.240000, 0.113878, 0.097406, 0.129670 ], [195, -6744.240000, 0.113863, 0.009446, 0.129676 ], [192, -6745.070000, 0.049903, 0.013478, 0.126012 ], [189, -6745.350000, 0.037811, 0.059105, 0.101751 ] ], "n": ["FDJVGXF01BHLXE" ] }, {"p": [[40, -5092.630000, 0.308732, 0.044753, 0.473982 ], [192, -5093.020000, 0.209361, 0.000005, 0.508740 ], [191, -5093.020000, 0.209317, 0.015648, 0.508741 ], [193, -5094.060000, 0.073576, 0.000008, 0.526621 ], [39, -5094.060000, 0.073575, 0.025399, 0.526627 ], [38, -5094.130000, 0.069037, 0.076823, 0.526439 ], [29, -5094.330000, 0.056402, 0.000006, 0.527534 ] ], "n": ["FDJVGXF01A3XD4" ] }, {"p": [[40, -4726.410000, 0.760962, 0.038868, 0.141689 ], [189, -4728.920000, 0.061545, 0.029295, 0.159271 ], [191, -4729.350000, 0.040127, 0.015648, 0.185840 ], [192, -4729.350000, 0.040114, 0.000005, 0.185845 ], [27, -4729.490000, 0.035029, 0.020378, 0.189434 ], [190, -4729.590000, 0.031557, 0.030632, 0.185317 ], [171, -4729.620000, 0.030667, 0.034630, 0.189743 ] ], "n": ["FDJVGXF01A4I83" ] }, {"p": [[40, -8851.540000, 0.875607, 0.020885, 0.282963 ], [38, -8854.460000, 0.047061, 0.047732, 0.292386 ], [193, -8855.270000, 0.021034, 0.006850, 0.322703 ], [29, -8855.420000, 0.018065, 0.005765, 0.316543 ], [192, -8855.570000, 0.015578, 0.022464, 0.329483 ], [191, -8855.800000, 0.012401, 0.000008, 0.329554 ], [34, -8855.990000, 0.010254, 0.014240, 0.330980 ] ], "n": ["FDJVGXF01CCFV1" ] }, {"p": [[40, -2816.800000, 0.423833, 0.019033, 0.133227 ], [149, -2817.070000, 0.324398, 0.024917, 0.094660 ], [191, -2818.520000, 0.076319, 0.012681, 0.150562 ], [192, -2818.610000, 0.069967, 0.000005, 0.153313 ], [148, -2819.200000, 0.038771, 0.029076, 0.101645 ], [162, -2819.350000, 0.033356, 0.000005, 0.182495 ], [163, -2819.350000, 0.033356, 0.000007, 0.182495 ] ], "n": ["FDJVGXF01E3HCE" ] }, {"p": [[40, -5682.820000, 0.956613, 0.017061, 0.218498 ], [151, -5686.870000, 0.016766, 0.006743, 0.257700 ], [152, -5686.950000, 0.015368, 0.007516, 0.256068 ], [153, -5687.270000, 0.011253, 0.004451, 0.261264 ] ], "n": ["FDJVGXF01AOJEQ_rvcmp" ] }, {"p": [[50, -5253.880000, 0.274406, 0.000008, 1.582230 ], [51, -5254.470000, 0.151137, 0.196060, 1.634300 ], [60, -5254.700000, 0.121000, 0.000006, 1.668060 ], [52, -5254.700000, 0.121000, 0.092957, 1.668050 ], [59, -5254.700000, 0.121000, 0.039608, 1.668050 ], [53, -5254.830000, 0.105892, 0.000006, 1.685530 ], [56, -5254.830000, 0.105565, 0.000009, 1.689540 ] ], "n": ["FDJVGXF01CNQFK" ] }, {"p": [[65, -4705.050000, 0.177114, 0.223601, 1.999990 ], [37, -4705.210000, 0.151343, 0.000009, 1.999990 ], [36, -4705.210000, 0.151343, 0.000009, 1.999990 ], [38, -4705.210000, 0.151320, 0.000009, 1.999990 ], [66, -4705.330000, 0.133482, 0.000007, 1.999990 ], [64, -4705.330000, 0.133478, 0.347492, 1.999990 ], [9, -4705.600000, 0.101921, 0.000008, 1.999990 ] ], "n": ["FDJVGXF01EZU4N_rvcmp" ] }, {"p": [[65, -4705.050000, 0.177114, 0.223601, 1.999990 ], [37, -4705.210000, 0.151343, 0.000009, 1.999990 ], [36, -4705.210000, 0.151343, 0.000009, 1.999990 ], [38, -4705.210000, 0.151320, 0.000009, 1.999990 ], [66, -4705.330000, 0.133482, 0.000007, 1.999990 ], [64, -4705.330000, 0.133478, 0.347492, 1.999990 ], [9, -4705.600000, 0.101921, 0.000008, 1.999990 ] ], "n": ["FDJVGXF01B0X78_rvcmp" ] }, {"p": [[65, -7187.180000, 0.434361, 0.057306, 1.999990 ], [73, -7188.700000, 0.094971, 0.065085, 1.999990 ], [68, -7188.710000, 0.094527, 0.067647, 1.999990 ], [74, -7188.710000, 0.094524, 0.000009, 1.999990 ], [72, -7188.710000, 0.094252, 0.263281, 1.999990 ], [71, -7188.710000, 0.094249, 0.079029, 1.999990 ], [70, -7188.720000, 0.093115, 0.490388, 1.999990 ] ], "n": ["FDJVGXF01BU5S3" ] }, {"p": [[70, -7142.740000, 0.351172, 0.530580, 1.452650 ], [71, -7142.860000, 0.310021, 0.000010, 1.530600 ], [73, -7144.160000, 0.084655, 0.000007, 1.693500 ], [72, -7144.160000, 0.084644, 0.263281, 1.693490 ], [68, -7144.290000, 0.073869, 0.067647, 1.740840 ], [74, -7144.290000, 0.073867, 0.000009, 1.740840 ], [66, -7145.520000, 0.021772, 0.108039, 1.856570 ] ], "n": ["FDJVGXF01B16PZ_rvcmp" ] }, {"p": [[76, -5729.170000, 0.958801, 0.050177, 0.350206 ], [77, -5732.960000, 0.021518, 0.207696, 0.360811 ], [19, -5733.050000, 0.019682, 0.000006, 0.324320 ] ], "n": ["FDJVGXF01EZGSA" ] }, {"p": [[76, -5729.170000, 0.958801, 0.050177, 0.350206 ], [77, -5732.960000, 0.021518, 0.207696, 0.360811 ], [19, -5733.050000, 0.019682, 0.000006, 0.324320 ] ], "n": ["FDJVGXF01DHOIS" ] }, {"p": [[76, -5729.170000, 0.958801, 0.050177, 0.350206 ], [77, -5732.960000, 0.021518, 0.207696, 0.360811 ], [19, -5733.050000, 0.019682, 0.000006, 0.324320 ] ], "n": ["FDJVGXF01EN2KD" ] }, {"p": [[76, -5729.170000, 0.958801, 0.050177, 0.350206 ], [77, -5732.960000, 0.021518, 0.207696, 0.360811 ], [19, -5733.050000, 0.019682, 0.000006, 0.324320 ] ], "n": ["FDJVGXF01BGP0B" ] }, {"p": [[76, -5729.170000, 0.958801, 0.050177, 0.350206 ], [77, -5732.960000, 0.021518, 0.207696, 0.360811 ], [19, -5733.050000, 0.019682, 0.000006, 0.324320 ] ], "n": ["FDJVGXF01CYI70" ] }, {"p": [[77, -2525.760000, 0.197960, 0.210163, 0.404921 ], [76, -2525.760000, 0.197743, 0.138323, 0.406483 ], [78, -2525.760000, 0.197603, 0.000008, 0.406483 ], [57, -2526.090000, 0.142237, 0.003602, 0.428880 ], [86, -2526.240000, 0.122371, 0.000007, 0.485847 ], [56, -2526.460000, 0.098211, 0.074592, 0.418339 ], [67, -2527.260000, 0.043874, 0.124498, 0.320033 ] ], "n": ["FDJVGXF01DNDT7" ] }, {"p": [[80, -4604.640000, 0.661735, 0.027934, 0.017933 ], [98, -4605.670000, 0.235997, 0.020494, 0.030096 ], [101, -4607.660000, 0.032174, 0.018812, 0.042387 ], [102, -4607.660000, 0.032148, 0.000005, 0.042381 ], [100, -4608.220000, 0.018487, 0.035413, 0.043297 ], [106, -4608.690000, 0.011563, 0.002434, 0.051403 ], [107, -4609.070000, 0.007895, 0.009012, 0.049026 ] ], "n": ["FDJVGXF01EWN6U" ] }, {"p": [[88, -7380.950000, 0.831891, 0.012117, 0.174910 ], [99, -7382.550000, 0.168109, 0.000006, 0.201624 ] ], "n": ["FDJVGXF01D7743" ] }, {"p": [[91, -4271.070000, 0.315406, 0.020097, 0.000009 ], [94, -4271.070000, 0.315272, 0.039199, 0.000006 ], [95, -4271.080000, 0.315134, 0.000007, 0.000009 ], [96, -4273.530000, 0.027106, 0.027498, 0.000006 ], [97, -4273.530000, 0.027082, 0.000006, 0.000009 ] ], "n": ["FDJVGXF01COAXF" ] }, {"p": [[91, -4790.420000, 0.265379, 0.018578, 0.083840 ], [94, -4790.430000, 0.263825, 0.039199, 0.083871 ], [95, -4790.430000, 0.263772, 0.000008, 0.083871 ], [96, -4791.540000, 0.086629, 0.027500, 0.087459 ], [97, -4791.540000, 0.086588, 0.000005, 0.087458 ], [92, -4793.150000, 0.017282, 0.000005, 0.096662 ], [93, -4793.200000, 0.016525, 0.002453, 0.096667 ] ], "n": ["FDJVGXF01CDXTH" ] }, {"p": [[91, -6557.310000, 0.311233, 0.017470, 0.064477 ], [94, -6557.330000, 0.305814, 0.039199, 0.064531 ], [95, -6557.330000, 0.305529, 0.000008, 0.064531 ], [96, -6559.880000, 0.023827, 0.027500, 0.069617 ], [97, -6559.880000, 0.023805, 0.000005, 0.069608 ], [92, -6560.350000, 0.014918, 0.005357, 0.072940 ], [93, -6560.350000, 0.014875, 0.002453, 0.072931 ] ], "n": ["FDJVGXF01DBSFJ" ] }, {"p": [[91, -8560.370000, 0.364627, 0.014868, 0.039063 ], [95, -8560.550000, 0.304691, 0.001827, 0.037973 ], [94, -8560.720000, 0.257789, 0.039199, 0.038827 ], [96, -8562.680000, 0.036455, 0.027500, 0.041880 ], [97, -8562.680000, 0.036438, 0.000005, 0.041874 ] ], "n": ["FDJVGXF01BX0MO_rvcmp" ] }, {"p": [[91, -6972.830000, 0.351256, 0.014913, 0.005056 ], [94, -6972.910000, 0.324775, 0.039199, 0.005129 ], [95, -6972.910000, 0.323969, 0.000008, 0.005129 ] ], "n": ["FDJVGXF01CSHXA_rvcmp" ] }, {"p": [[91, -8780.350000, 0.642793, 0.013949, 0.045399 ], [95, -8781.830000, 0.146511, 0.000008, 0.048708 ], [94, -8781.830000, 0.146413, 0.039199, 0.048703 ], [96, -8783.350000, 0.032149, 0.027500, 0.051441 ], [97, -8783.350000, 0.032133, 0.000005, 0.051444 ] ], "n": ["FDJVGXF01AIDG8_rvcmp" ] }, {"p": [[91, -8780.350000, 0.642793, 0.013949, 0.045399 ], [95, -8781.830000, 0.146511, 0.000008, 0.048708 ], [94, -8781.830000, 0.146413, 0.039199, 0.048703 ], [96, -8783.350000, 0.032149, 0.027500, 0.051441 ], [97, -8783.350000, 0.032133, 0.000005, 0.051444 ] ], "n": ["FDJVGXF01DXA5V_rvcmp" ] }, {"p": [[91, -8551.810000, 0.709247, 0.013971, 0.033195 ], [95, -8553.490000, 0.133045, 0.000008, 0.036348 ], [94, -8553.490000, 0.132891, 0.039199, 0.036347 ], [96, -8555.160000, 0.024816, 0.027500, 0.039177 ] ], "n": ["FDJVGXF01DSJSA" ] }, {"p": [[91, -4031.760000, 0.598185, 0.013190, 0.018968 ], [103, -4032.710000, 0.230729, 0.000007, 0.027634 ], [95, -4033.760000, 0.080418, 0.000008, 0.024651 ], [97, -4034.450000, 0.040645, 0.000005, 0.028925 ], [96, -4034.450000, 0.040626, 0.027500, 0.028932 ], [112, -4035.910000, 0.009395, 0.007821, 0.028428 ] ], "n": ["FDJVGXF01CQPYV" ] }, {"p": [[91, -8770.720000, 1.000000, 0.007056, 0.061371 ] ], "n": ["FDJVGXF01CD42S_rvcmp" ] }, {"p": [[91, -8435.690000, 1.000000, 0.006508, 0.003112 ] ], "n": ["FDJVGXF01DDIQU_rvcmp" ] }, {"p": [[91, -8045.590000, 1.000000, 0.005559, 0.023239 ] ], "n": ["FDJVGXF01AKE7H_rvcmp" ] }, {"p": [[91, -7654.100000, 0.981270, 0.004268, 0.014477 ], [98, -7658.060000, 0.018730, 0.028308, 0.018154 ] ], "n": ["FDJVGXF01DZWVS_rvcmp" ] }, {"p": [[91, -7668.570000, 0.985688, 0.004399, 0.009574 ], [98, -7672.800000, 0.014312, 0.028008, 0.012959 ] ], "n": ["FDJVGXF01BNVHS_rvcmp" ] }, {"p": [[91, -7668.570000, 0.985688, 0.004399, 0.009574 ], [98, -7672.800000, 0.014312, 0.028008, 0.012959 ] ], "n": ["FDJVGXF01BN1TA_rvcmp" ] }, {"p": [[91, -7458.550000, 1.000000, 0.002194, 0.009349 ] ], "n": ["FDJVGXF01EB87R_rvcmp" ] }, {"p": [[91, -3147.970000, 0.932996, 0.000010, 0.010161 ], [107, -3150.610000, 0.067004, 0.011338, 0.006548 ] ], "n": ["FDJVGXF01CT8L2" ] }, {"p": [[91, -3878.730000, 0.345262, 0.000010, 0.000010 ], [95, -3879.330000, 0.189186, 0.000008, 0.000006 ], [94, -3879.330000, 0.189049, 0.039199, 0.000006 ], [97, -3879.760000, 0.122924, 0.000005, 0.000006 ], [96, -3879.760000, 0.122823, 0.027500, 0.000006 ], [90, -3881.840000, 0.015380, 0.040800, 0.000006 ], [98, -3881.840000, 0.015375, 0.000006, 0.000007 ] ], "n": ["FDJVGXF01BA67J_rvcmp" ] }, {"p": [[91, -3878.730000, 0.345262, 0.000010, 0.000010 ], [95, -3879.330000, 0.189186, 0.000008, 0.000006 ], [94, -3879.330000, 0.189049, 0.039199, 0.000006 ], [97, -3879.760000, 0.122924, 0.000005, 0.000006 ], [96, -3879.760000, 0.122823, 0.027500, 0.000006 ], [90, -3881.840000, 0.015380, 0.040800, 0.000006 ], [98, -3881.840000, 0.015375, 0.000006, 0.000007 ] ], "n": ["FDJVGXF01EJGZO_rvcmp" ] }, {"p": [[91, -3567.400000, 0.535857, 0.000010, 0.000010 ], [95, -3568.350000, 0.208224, 0.000008, 0.000006 ], [94, -3568.350000, 0.208136, 0.039199, 0.000006 ], [97, -3570.510000, 0.023901, 0.000005, 0.000006 ], [96, -3570.510000, 0.023882, 0.027500, 0.000006 ] ], "n": ["FDJVGXF01BN5NS" ] }, {"p": [[91, -3567.400000, 0.535857, 0.000010, 0.000010 ], [95, -3568.350000, 0.208224, 0.000008, 0.000006 ], [94, -3568.350000, 0.208136, 0.039199, 0.000006 ], [97, -3570.510000, 0.023901, 0.000005, 0.000006 ], [96, -3570.510000, 0.023882, 0.027500, 0.000006 ] ], "n": ["FDJVGXF01CBW0V" ] }, {"p": [[92, -7385.460000, 0.437230, 0.000005, 0.375406 ], [94, -7386.070000, 0.236897, 0.011266, 0.387712 ], [93, -7386.530000, 0.149695, 0.002453, 0.395694 ], [96, -7386.680000, 0.128911, 0.000007, 0.430910 ], [95, -7387.680000, 0.047267, 0.000008, 0.442571 ] ], "n": ["FDJVGXF01DYW39_rvcmp" ] }, {"p": [[92, -3171.330000, 0.191206, 0.000005, 0.066052 ], [91, -3171.330000, 0.191191, 0.000010, 0.066052 ], [94, -3171.380000, 0.183008, 0.000010, 0.066075 ], [93, -3171.380000, 0.182330, 0.002453, 0.066078 ], [95, -3171.600000, 0.147055, 0.000008, 0.066480 ], [90, -3172.080000, 0.090116, 0.032365, 0.054778 ], [97, -3173.870000, 0.015093, 0.009613, 0.072928 ] ], "n": ["FDJVGXF01BHQHK_rvcmp" ] }, {"p": [[92, -3149.800000, 0.208580, 0.000005, 0.061622 ], [91, -3149.800000, 0.208563, 0.000010, 0.061626 ], [94, -3149.850000, 0.199617, 0.000010, 0.061647 ], [93, -3149.850000, 0.198875, 0.002453, 0.061649 ], [95, -3150.070000, 0.159968, 0.000008, 0.061995 ], [97, -3152.640000, 0.012199, 0.000005, 0.071541 ], [96, -3152.640000, 0.012198, 0.027500, 0.071544 ] ], "n": ["FDJVGXF01CIWT1" ] }, {"p": [[94, -4303.370000, 0.415424, 0.016196, 0.110324 ], [92, -4304.400000, 0.147428, 0.003101, 0.121184 ], [93, -4304.680000, 0.112071, 0.002453, 0.127032 ], [96, -4304.900000, 0.089370, 0.012969, 0.128662 ], [97, -4304.930000, 0.087230, 0.015024, 0.130123 ], [90, -4304.980000, 0.083185, 0.040800, 0.132911 ], [95, -4305.220000, 0.065291, 0.003223, 0.129745 ] ], "n": ["FDJVGXF01E4CX1_rvcmp" ] }, {"p": [[96, -6812.330000, 0.318743, 0.027500, 0.062015 ], [97, -6812.330000, 0.318462, 0.000005, 0.062013 ], [95, -6812.330000, 0.318398, 0.008662, 0.062017 ], [91, -6814.990000, 0.022200, 0.020097, 0.069709 ], [94, -6814.990000, 0.022197, 0.039199, 0.069708 ] ], "n": ["FDJVGXF01EPE9H_rvcmp" ] }, {"p": [[96, -3398.990000, 0.270657, 0.027500, 0.057707 ], [97, -3398.990000, 0.270602, 0.000005, 0.057704 ], [95, -3398.990000, 0.270487, 0.008662, 0.057708 ], [94, -3400.490000, 0.060573, 0.039199, 0.065527 ], [91, -3400.490000, 0.060567, 0.020097, 0.065528 ], [92, -3401.060000, 0.034342, 0.000005, 0.072279 ], [93, -3401.100000, 0.032773, 0.002453, 0.072309 ] ], "n": ["FDJVGXF01AQEN6_rvcmp" ] }, {"p": [[96, -8436.950000, 0.296251, 0.027500, 0.037727 ], [95, -8436.950000, 0.296170, 0.008662, 0.037728 ], [97, -8436.950000, 0.296153, 0.000005, 0.037725 ], [91, -8438.620000, 0.055719, 0.020097, 0.039723 ], [94, -8438.630000, 0.055707, 0.039199, 0.039722 ] ], "n": ["FDJVGXF01DYJC3" ] }, {"p": [[96, -4931.260000, 0.293513, 0.027500, 0.023659 ], [95, -4931.260000, 0.293359, 0.008662, 0.023659 ], [97, -4931.260000, 0.293211, 0.000005, 0.023659 ], [91, -4932.850000, 0.059965, 0.020097, 0.026076 ], [94, -4932.850000, 0.059953, 0.039199, 0.026076 ] ], "n": ["FDJVGXF01CY75H_rvcmp" ] }, {"p": [[97, -6900.410000, 0.757300, 0.007090, 0.070911 ], [95, -6902.710000, 0.076110, 0.005228, 0.084481 ], [96, -6902.960000, 0.058821, 0.027500, 0.085255 ], [91, -6903.190000, 0.047104, 0.020097, 0.088585 ], [94, -6903.190000, 0.047095, 0.039199, 0.088589 ], [92, -6904.430000, 0.013570, 0.000005, 0.093427 ] ], "n": ["FDJVGXF01B6WPS" ] }, {"p": [[98, -7415.430000, 0.287386, 0.026731, 0.060709 ], [101, -7415.580000, 0.246916, 0.009940, 0.065004 ], [99, -7416.040000, 0.155747, 0.047715, 0.066873 ], [100, -7416.050000, 0.155583, 0.040628, 0.066874 ], [102, -7416.050000, 0.154369, 0.000005, 0.066932 ] ], "n": ["FDJVGXF01A9CN5_rvcmp" ] }, {"p": [[98, -7986.790000, 0.764732, 0.016719, 0.058849 ], [101, -7989.070000, 0.078481, 0.000005, 0.073333 ], [99, -7989.070000, 0.078439, 0.047715, 0.073334 ], [100, -7989.070000, 0.078348, 0.040628, 0.073337 ] ], "n": ["FDJVGXF01BG5L2_rvcmp" ] }, {"p": [[98, -5457.430000, 0.794994, 0.016481, 0.042794 ], [101, -5460.170000, 0.051327, 0.018813, 0.057717 ], [102, -5460.170000, 0.051306, 0.000005, 0.057710 ], [99, -5460.470000, 0.038252, 0.033057, 0.053265 ], [107, -5460.570000, 0.034566, 0.008820, 0.056280 ], [106, -5461.010000, 0.022159, 0.004361, 0.057596 ], [111, -5462.110000, 0.007396, 0.000007, 0.067823 ] ], "n": ["FDJVGXF01DGPDX_rvcmp" ] }, {"p": [[98, -6851.070000, 0.928888, 0.015176, 0.024296 ], [99, -6853.920000, 0.053971, 0.026970, 0.034854 ], [101, -6855.750000, 0.008581, 0.003975, 0.037003 ], [100, -6855.760000, 0.008561, 0.040628, 0.037107 ] ], "n": ["FDJVGXF01BEMTE" ] }, {"p": [[98, -8256.620000, 0.981437, 0.013147, 0.029377 ], [91, -8260.590000, 0.018563, 0.000010, 0.040407 ] ], "n": ["FDJVGXF01BLNDV" ] }, {"p": [[98, -8037.810000, 0.483180, 0.010748, 0.068080 ], [101, -8039.060000, 0.138712, 0.004768, 0.075958 ], [91, -8039.230000, 0.117186, 0.000367, 0.076499 ], [99, -8039.510000, 0.088153, 0.047715, 0.080405 ], [100, -8039.510000, 0.088107, 0.040628, 0.080410 ], [95, -8040.230000, 0.043004, 0.007119, 0.072969 ], [97, -8040.260000, 0.041658, 0.002846, 0.073160 ] ], "n": ["FDJVGXF01BLA1W_rvcmp" ] }, {"p": [[98, -8037.810000, 0.483180, 0.010748, 0.068080 ], [101, -8039.060000, 0.138712, 0.004768, 0.075958 ], [91, -8039.230000, 0.117186, 0.000367, 0.076499 ], [99, -8039.510000, 0.088153, 0.047715, 0.080405 ], [100, -8039.510000, 0.088107, 0.040628, 0.080410 ], [95, -8040.230000, 0.043004, 0.007119, 0.072969 ], [97, -8040.260000, 0.041658, 0.002846, 0.073160 ] ], "n": ["FDJVGXF01CXNXZ_rvcmp" ] }, {"p": [[98, -8113.060000, 0.975528, 0.010740, 0.036212 ], [96, -8117.390000, 0.012841, 0.021706, 0.038782 ], [97, -8117.490000, 0.011631, 0.013213, 0.040634 ] ], "n": ["FDJVGXF01D4DWZ_rvcmp" ] }, {"p": [[98, -8129.970000, 0.975763, 0.010743, 0.035591 ], [96, -8134.310000, 0.012753, 0.021709, 0.038102 ], [97, -8134.420000, 0.011485, 0.013182, 0.039923 ] ], "n": ["FDJVGXF01DK0CF_rvcmp" ] }, {"p": [[98, -8129.970000, 0.975763, 0.010743, 0.035591 ], [96, -8134.310000, 0.012753, 0.021709, 0.038102 ], [97, -8134.420000, 0.011485, 0.013182, 0.039923 ] ], "n": ["FDJVGXF01D4J8L_rvcmp" ] }, {"p": [[98, -7713.010000, 0.532546, 0.010055, 0.055415 ], [96, -7714.250000, 0.153885, 0.023774, 0.052968 ], [95, -7714.400000, 0.132600, 0.006710, 0.054358 ], [97, -7714.540000, 0.114871, 0.000005, 0.055683 ], [91, -7715.260000, 0.055967, 0.008268, 0.059538 ], [90, -7716.970000, 0.010130, 0.034866, 0.060120 ] ], "n": ["FDJVGXF01A6VRG" ] }, {"p": [[98, -5572.670000, 0.926148, 0.009797, 0.039998 ], [116, -5575.970000, 0.034019, 0.004166, 0.049851 ], [115, -5576.350000, 0.023200, 0.020395, 0.053567 ], [97, -5576.690000, 0.016633, 0.021481, 0.045176 ] ], "n": ["FDJVGXF01DZTOW_rvcmp" ] }, {"p": [[98, -7305.260000, 0.909458, 0.010308, 0.039954 ], [95, -7308.980000, 0.022059, 0.006472, 0.043999 ], [96, -7309.100000, 0.019402, 0.026069, 0.043982 ], [97, -7309.110000, 0.019275, 0.006137, 0.044288 ], [91, -7309.360000, 0.015043, 0.003834, 0.049662 ], [90, -7309.380000, 0.014764, 0.032931, 0.043551 ] ], "n": ["FDJVGXF01C8RIL_rvcmp" ] }, {"p": [[98, -7310.330000, 0.552111, 0.004438, 0.013636 ], [90, -7310.610000, 0.416978, 0.019300, 0.015954 ], [97, -7313.210000, 0.030911, 0.019052, 0.015130 ] ], "n": ["FDJVGXF01COCCL" ] }, {"p": [[99, -5134.700000, 0.333457, 0.047715, 0.117445 ], [101, -5134.700000, 0.333392, 0.000009, 0.117432 ], [100, -5134.700000, 0.333151, 0.040628, 0.117443 ] ], "n": ["FDJVGXF01EE1C0" ] }, {"p": [[99, -5134.700000, 0.333457, 0.047715, 0.117445 ], [101, -5134.700000, 0.333392, 0.000009, 0.117432 ], [100, -5134.700000, 0.333151, 0.040628, 0.117443 ] ], "n": ["FDJVGXF01DMENF" ] }, {"p": [[99, -7577.130000, 0.335096, 0.046718, 0.043163 ], [100, -7577.140000, 0.332461, 0.040628, 0.043301 ], [101, -7577.140000, 0.332442, 0.000009, 0.043299 ] ], "n": ["FDJVGXF01CNATM_rvcmp" ] }, {"p": [[99, -8401.450000, 0.502724, 0.038108, 0.027041 ], [100, -8401.670000, 0.405831, 0.036342, 0.027534 ], [101, -8403.160000, 0.091446, 0.000947, 0.029564 ] ], "n": ["FDJVGXF01ADQBO_rvcmp" ] }, {"p": [[99, -8295.650000, 0.766979, 0.037756, 0.025098 ], [101, -8297.380000, 0.136462, 0.004531, 0.029294 ], [100, -8297.730000, 0.096560, 0.038517, 0.030743 ] ], "n": ["FDJVGXF01DOZP0_rvcmp" ] }, {"p": [[99, -8925.760000, 0.786011, 0.035736, 0.032897 ], [100, -8927.370000, 0.156484, 0.036700, 0.038702 ], [101, -8928.380000, 0.057506, 0.002473, 0.039503 ] ], "n": ["FDJVGXF01C6K5T" ] }, {"p": [[99, -7734.930000, 0.477771, 0.035422, 0.045134 ], [100, -7735.410000, 0.295308, 0.037856, 0.044215 ], [101, -7735.680000, 0.226921, 0.003618, 0.043543 ] ], "n": ["FDJVGXF01DCCT9_rvcmp" ] }, {"p": [[99, -7907.590000, 0.809185, 0.034962, 0.042337 ], [100, -7909.620000, 0.105566, 0.037962, 0.049213 ], [101, -7909.840000, 0.085250, 0.001595, 0.049467 ] ], "n": ["FDJVGXF01DJFWS_rvcmp" ] }, {"p": [[99, -8205.290000, 0.816739, 0.034938, 0.040531 ], [100, -8207.370000, 0.101449, 0.037959, 0.047119 ], [101, -8207.590000, 0.081812, 0.001662, 0.047310 ] ], "n": ["FDJVGXF01D8OH4" ] }, {"p": [[99, -6475.180000, 0.869666, 0.034852, 0.024661 ], [100, -6477.640000, 0.074250, 0.037446, 0.032531 ], [101, -6477.930000, 0.056084, 0.002065, 0.032135 ] ], "n": ["FDJVGXF01AW1AC" ] }, {"p": [[99, -6475.180000, 0.869666, 0.034852, 0.024661 ], [100, -6477.640000, 0.074250, 0.037446, 0.032531 ], [101, -6477.930000, 0.056084, 0.002065, 0.032135 ] ], "n": ["FDJVGXF01AWUYU" ] }, {"p": [[99, -7449.140000, 0.576704, 0.029292, 0.158120 ], [100, -7450.200000, 0.200837, 0.030836, 0.163007 ], [101, -7450.810000, 0.108383, 0.000009, 0.172028 ], [98, -7451.040000, 0.086836, 0.017357, 0.166713 ], [94, -7453.130000, 0.010738, 0.012681, 0.158291 ], [93, -7453.220000, 0.009761, 0.000010, 0.167494 ], [88, -7453.590000, 0.006741, 0.035470, 0.177038 ] ], "n": ["FDJVGXF01DGA00_rvcmp" ] }, {"p": [[99, -6817.930000, 1.000000, 0.028675, 0.061645 ] ], "n": ["FDJVGXF01C55EU_rvcmp" ] }, {"p": [[99, -7479.330000, 0.692567, 0.027296, 0.107768 ], [98, -7480.800000, 0.158012, 0.017151, 0.118360 ], [100, -7481.250000, 0.100908, 0.030912, 0.117834 ], [101, -7481.990000, 0.048513, 0.003228, 0.124599 ] ], "n": ["FDJVGXF01BW7BG" ] }, {"p": [[99, -6960.640000, 1.000000, 0.013256, 0.075130 ] ], "n": ["FDJVGXF01ATCR1" ] }, {"p": [[99, -7850.950000, 0.356968, 0.000006, 0.072210 ], [98, -7851.010000, 0.336633, 0.008039, 0.055350 ], [96, -7851.370000, 0.233977, 0.016912, 0.048694 ], [97, -7853.240000, 0.036233, 0.000005, 0.054018 ], [95, -7853.240000, 0.036189, 0.008662, 0.054025 ] ], "n": ["FDJVGXF01CH8LC" ] }, {"p": [[100, -3460.800000, 0.333409, 0.040633, 0.133589 ], [99, -3460.800000, 0.333337, 0.047715, 0.133600 ], [101, -3460.800000, 0.333254, 0.000009, 0.133576 ] ], "n": ["FDJVGXF01B5B3E" ] }, {"p": [[100, -3470.380000, 0.333398, 0.040628, 0.069134 ], [101, -3470.380000, 0.333358, 0.000009, 0.069136 ], [99, -3470.380000, 0.333244, 0.047715, 0.069139 ] ], "n": ["FDJVGXF01BMHW5_rvcmp" ] }, {"p": [[100, -7873.340000, 0.401226, 0.035142, 0.053974 ], [101, -7873.640000, 0.299453, 0.000009, 0.056924 ], [99, -7873.640000, 0.299321, 0.047715, 0.056919 ] ], "n": ["FDJVGXF01CTU6F" ] }, {"p": [[100, -8353.190000, 0.317740, 0.033186, 0.176914 ], [99, -8353.470000, 0.238844, 0.042975, 0.179036 ], [101, -8353.540000, 0.222732, 0.000009, 0.182839 ], [104, -8354.650000, 0.073579, 0.002651, 0.179816 ], [105, -8354.650000, 0.073579, 0.002614, 0.179816 ], [106, -8354.650000, 0.073525, 0.000008, 0.179802 ] ], "n": ["FDJVGXF01BHQGA" ] }, {"p": [[100, -3415.710000, 0.430176, 0.029911, 0.045156 ], [99, -3416.130000, 0.284979, 0.047715, 0.051596 ], [101, -3416.130000, 0.284845, 0.000009, 0.051596 ] ], "n": ["FDJVGXF01A8NFC_rvcmp" ] }, {"p": [[100, -2591.760000, 0.549550, 0.028277, 0.013756 ], [99, -2592.650000, 0.225276, 0.047715, 0.020423 ], [101, -2592.650000, 0.225174, 0.000009, 0.020422 ] ], "n": ["FDJVGXF01D39J6_rvcmp" ] }, {"p": [[101, -7726.680000, 0.783055, 0.005842, 0.048733 ], [99, -7728.650000, 0.108480, 0.047715, 0.052038 ], [100, -7728.650000, 0.108465, 0.040628, 0.052034 ] ], "n": ["FDJVGXF01EXJTF_rvcmp" ] }, {"p": [[101, -8748.940000, 0.439425, 0.003706, 0.094270 ], [99, -8749.390000, 0.280365, 0.047715, 0.099951 ], [100, -8749.390000, 0.280210, 0.040628, 0.099956 ] ], "n": ["FDJVGXF01BNHRU_rvcmp" ] }, {"p": [[101, -8573.730000, 0.404302, 0.003058, 0.102933 ], [100, -8574.030000, 0.298490, 0.040038, 0.106855 ], [99, -8574.040000, 0.297208, 0.047715, 0.107441 ] ], "n": ["FDJVGXF01BJU15" ] }, {"p": [[101, -8270.160000, 0.402417, 0.002678, 0.079404 ], [100, -8270.460000, 0.298911, 0.040628, 0.082534 ], [99, -8270.460000, 0.298672, 0.047715, 0.082548 ] ], "n": ["FDJVGXF01BMACA" ] }, {"p": [[101, -8270.160000, 0.402417, 0.002678, 0.079404 ], [100, -8270.460000, 0.298911, 0.040628, 0.082534 ], [99, -8270.460000, 0.298672, 0.047715, 0.082548 ] ], "n": ["FDJVGXF01DVROI_rvcmp" ] }, {"p": [[101, -7246.420000, 0.343654, 0.001573, 0.095897 ], [99, -7246.460000, 0.328257, 0.047715, 0.097423 ], [100, -7246.460000, 0.328089, 0.040628, 0.097412 ] ], "n": ["FDJVGXF01ENOD3" ] }, {"p": [[101, -7311.370000, 0.335414, 0.000654, 0.101429 ], [100, -7311.380000, 0.332359, 0.040542, 0.102192 ], [99, -7311.380000, 0.332227, 0.047715, 0.102260 ] ], "n": ["FDJVGXF01C9KOS" ] }, {"p": [[101, -7175.140000, 0.336424, 0.000807, 0.096768 ], [100, -7175.150000, 0.331997, 0.040277, 0.097545 ], [99, -7175.160000, 0.331579, 0.047715, 0.097811 ] ], "n": ["FDJVGXF01BN8R7" ] }, {"p": [[101, -7175.140000, 0.336424, 0.000807, 0.096768 ], [100, -7175.150000, 0.331997, 0.040277, 0.097545 ], [99, -7175.160000, 0.331579, 0.047715, 0.097811 ] ], "n": ["FDJVGXF01BTWF0" ] }, {"p": [[101, -7136.700000, 0.334893, 0.000555, 0.086486 ], [99, -7136.700000, 0.333024, 0.046998, 0.087070 ], [100, -7136.700000, 0.332084, 0.040628, 0.087112 ] ], "n": ["FDJVGXF01A0JQI" ] }, {"p": [[101, -7196.810000, 0.333723, 0.000277, 0.111901 ], [100, -7196.810000, 0.333156, 0.040628, 0.112261 ], [99, -7196.810000, 0.333121, 0.047715, 0.112268 ] ], "n": ["FDJVGXF01A1OR6_rvcmp" ] }, {"p": [[107, -7979.530000, 0.529791, 0.013015, 0.044003 ], [102, -7981.030000, 0.117777, 0.009128, 0.043840 ], [110, -7981.100000, 0.109741, 0.007352, 0.047090 ], [111, -7981.120000, 0.107016, 0.000007, 0.047231 ], [112, -7981.420000, 0.079668, 0.000008, 0.047399 ], [114, -7981.940000, 0.047293, 0.000006, 0.048560 ], [100, -7983.630000, 0.008714, 0.027596, 0.045589 ] ], "n": ["FDJVGXF01CVK05" ] }, {"p": [[107, -8053.210000, 0.561968, 0.013067, 0.033004 ], [102, -8054.680000, 0.129037, 0.008897, 0.032193 ], [110, -8054.940000, 0.099976, 0.007316, 0.035618 ], [111, -8054.970000, 0.096883, 0.000007, 0.035736 ], [112, -8055.260000, 0.072071, 0.000008, 0.035783 ], [114, -8055.850000, 0.040064, 0.000006, 0.036941 ] ], "n": ["FDJVGXF01BE4X9" ] }, {"p": [[107, -8053.210000, 0.561968, 0.013067, 0.033004 ], [102, -8054.680000, 0.129037, 0.008897, 0.032193 ], [110, -8054.940000, 0.099976, 0.007316, 0.035618 ], [111, -8054.970000, 0.096883, 0.000007, 0.035736 ], [112, -8055.260000, 0.072071, 0.000008, 0.035783 ], [114, -8055.850000, 0.040064, 0.000006, 0.036941 ] ], "n": ["FDJVGXF01BTEPV" ] }, {"p": [[107, -7666.300000, 0.339984, 0.013106, 0.023752 ], [98, -7666.900000, 0.186902, 0.031155, 0.021802 ], [102, -7666.940000, 0.178340, 0.005627, 0.021885 ], [101, -7667.470000, 0.105591, 0.018811, 0.023346 ], [91, -7667.470000, 0.105427, 0.000155, 0.027085 ], [111, -7668.210000, 0.050231, 0.000007, 0.026199 ], [100, -7668.610000, 0.033526, 0.040628, 0.026867 ] ], "n": ["FDJVGXF01DJB6P_rvcmp" ] }, {"p": [[107, -7662.070000, 0.923548, 0.006196, 0.018721 ], [103, -7665.630000, 0.026357, 0.007523, 0.024783 ], [106, -7665.630000, 0.026357, 0.007986, 0.024783 ], [104, -7665.730000, 0.023738, 0.000005, 0.025393 ] ], "n": ["FDJVGXF01ENS3X" ] }, {"p": [[107, -7662.070000, 0.923548, 0.006196, 0.018721 ], [103, -7665.630000, 0.026357, 0.007523, 0.024783 ], [106, -7665.630000, 0.026357, 0.007986, 0.024783 ], [104, -7665.730000, 0.023738, 0.000005, 0.025393 ] ], "n": ["FDJVGXF01EVR7E" ] }, {"p": [[108, -6986.020000, 0.144091, 0.000001, 1.487940 ], [109, -6986.020000, 0.144091, 0.002625, 1.487950 ], [110, -6986.020000, 0.144090, 0.000008, 1.487940 ], [111, -6986.020000, 0.143993, 0.003796, 1.482470 ], [102, -6986.020000, 0.143985, 0.011080, 1.482460 ], [107, -6986.030000, 0.142921, 0.017331, 1.486640 ], [103, -6986.070000, 0.136827, 0.000007, 1.509300 ] ], "n": ["FDJVGXF01DQ4QQ" ] }, {"p": [[114, -7013.340000, 0.265268, 0.003600, 0.773263 ], [113, -7013.510000, 0.224139, 0.180105, 0.773938 ], [112, -7013.520000, 0.220693, 0.015823, 0.782841 ], [103, -7014.160000, 0.116650, 0.000007, 0.727390 ], [106, -7014.840000, 0.059205, 0.007986, 0.789788 ], [105, -7014.850000, 0.058540, 0.002614, 0.791176 ], [72, -7014.900000, 0.055506, 0.199553, 0.828865 ] ], "n": ["FDJVGXF01E0ZLL" ] }, {"p": [[114, -6624.070000, 0.303042, 0.003346, 1.070590 ], [113, -6624.070000, 0.302732, 0.128195, 1.047670 ], [112, -6624.200000, 0.265406, 0.015823, 1.084740 ], [73, -6626.060000, 0.041225, 0.041274, 1.183910 ], [71, -6626.320000, 0.031788, 0.073878, 1.239120 ], [72, -6626.320000, 0.031713, 0.263281, 1.236990 ], [70, -6626.600000, 0.024095, 0.549790, 1.298720 ] ], "n": ["FDJVGXF01DCDRY" ] }, {"p": [[116, -7058.890000, 0.241249, 0.023150, 0.872170 ], [117, -7058.890000, 0.241180, 0.000006, 0.872196 ], [115, -7059.190000, 0.178494, 0.033069, 0.854725 ], [114, -7059.190000, 0.178463, 0.011821, 0.854733 ], [113, -7060.040000, 0.075749, 0.120561, 0.817583 ], [112, -7060.320000, 0.057414, 0.015823, 0.857944 ], [103, -7061.060000, 0.027451, 0.000007, 0.797855 ] ], "n": ["FDJVGXF01DSMLK" ] }, {"p": [[118, -3952.440000, 0.754659, 0.025388, 0.153619 ], [83, -3954.250000, 0.123939, 0.075511, 0.171413 ], [119, -3954.270000, 0.121402, 0.000009, 0.174132 ] ], "n": ["FDJVGXF01BHVQB_rvcmp" ] }, {"p": [[127, -7779.010000, 0.527838, 0.033938, 0.091159 ], [149, -7779.120000, 0.472162, 0.000008, 0.093477 ] ], "n": ["FDJVGXF01BMGRR_rvcmp" ] }, {"p": [[127, -3351.200000, 0.301469, 0.033073, 0.032593 ], [149, -3351.260000, 0.284458, 0.000008, 0.033805 ], [126, -3351.850000, 0.156698, 0.083114, 0.035490 ], [29, -3352.310000, 0.099656, 0.026610, 0.057379 ], [196, -3352.870000, 0.056406, 0.032853, 0.042738 ], [31, -3352.980000, 0.050733, 0.000008, 0.074705 ], [32, -3352.980000, 0.050579, 0.000007, 0.074701 ] ], "n": ["FDJVGXF01EF0UY" ] }, {"p": [[127, -7205.960000, 0.683272, 0.021436, 0.026696 ], [149, -7207.150000, 0.208535, 0.004237, 0.030194 ], [125, -7207.800000, 0.108193, 0.055019, 0.032376 ] ], "n": ["FDJVGXF01EDQRP_rvcmp" ] }, {"p": [[128, -6538.650000, 0.145734, 0.000007, 1.999990 ], [130, -6538.650000, 0.145710, 0.000005, 1.999990 ], [129, -6538.650000, 0.145707, 0.004824, 1.999990 ], [140, -6538.660000, 0.145339, 0.000006, 1.999990 ], [2, -6538.660000, 0.144116, 0.036220, 1.999990 ], [147, -6538.720000, 0.136698, 0.065313, 1.999990 ], [148, -6538.720000, 0.136696, 0.000009, 1.999990 ] ], "n": ["FDJVGXF01E417W" ] }, {"p": [[128, -6066.250000, 0.919074, 0.000007, 0.005351 ], [130, -6069.380000, 0.040471, 0.000005, 0.006452 ], [129, -6069.380000, 0.040455, 0.004824, 0.006454 ] ], "n": ["FDJVGXF01CLDZW_rvcmp" ] }, {"p": [[128, -7515.000000, 0.351482, 0.000007, 0.000006 ], [130, -7515.070000, 0.325020, 0.000005, 0.000006 ], [129, -7515.080000, 0.323498, 0.004824, 0.000006 ] ], "n": ["FDJVGXF01C8LKU_rvcmp" ] }, {"p": [[128, -7515.000000, 0.351482, 0.000007, 0.000006 ], [130, -7515.070000, 0.325020, 0.000005, 0.000006 ], [129, -7515.080000, 0.323498, 0.004824, 0.000006 ] ], "n": ["FDJVGXF01EL3RG" ] }, {"p": [[130, -7367.820000, 0.157818, 0.010632, 1.999990 ], [140, -7367.820000, 0.157818, 0.000006, 1.999990 ], [139, -7367.820000, 0.157797, 0.010556, 1.999990 ], [148, -7367.870000, 0.149674, 0.000009, 1.999990 ], [147, -7367.870000, 0.149673, 0.065313, 1.999990 ], [131, -7368.140000, 0.113612, 0.000001, 1.999990 ], [138, -7368.140000, 0.113609, 0.001320, 1.999990 ] ], "n": ["FDJVGXF01DL2MT_rvcmp" ] }, {"p": [[130, -7375.020000, 0.475927, 0.005093, 0.008358 ], [140, -7375.830000, 0.212971, 0.000006, 0.008607 ], [139, -7375.830000, 0.212795, 0.010556, 0.008608 ], [128, -7377.290000, 0.049298, 0.003643, 0.011932 ], [129, -7377.290000, 0.049010, 0.004824, 0.011933 ] ], "n": ["FDJVGXF01ECZV4" ] }, {"p": [[130, -7528.290000, 0.666633, 0.005110, 0.003992 ], [139, -7529.120000, 0.289798, 0.010556, 0.004124 ], [128, -7531.020000, 0.043569, 0.003643, 0.007219 ] ], "n": ["FDJVGXF01BDJTA" ] }, {"p": [[130, -7310.840000, 0.312938, 0.000010, 0.004331 ], [128, -7310.840000, 0.312766, 0.003643, 0.004325 ], [129, -7310.840000, 0.312140, 0.004824, 0.004331 ], [140, -7313.150000, 0.031082, 0.000006, 0.004453 ], [139, -7313.150000, 0.031075, 0.010556, 0.004454 ] ], "n": ["FDJVGXF01CXZHA_rvcmp" ] }, {"p": [[131, -5420.840000, 0.144016, 0.000001, 0.025524 ], [138, -5420.840000, 0.144014, 0.001320, 0.025524 ], [139, -5420.850000, 0.143632, 0.000009, 0.025524 ], [137, -5420.850000, 0.143510, 0.004966, 0.025525 ], [132, -5420.850000, 0.143320, 0.010863, 0.025526 ], [135, -5420.870000, 0.140790, 0.005910, 0.025533 ], [136, -5420.870000, 0.140718, 0.003789, 0.025533 ] ], "n": ["FDJVGXF01AIGJT" ] }, {"p": [[131, -7215.640000, 0.262641, 0.000001, 0.013227 ], [139, -7215.640000, 0.262331, 0.000005, 0.013218 ], [138, -7215.650000, 0.261556, 0.001320, 0.013218 ], [132, -7216.110000, 0.164009, 0.008607, 0.010233 ], [130, -7218.000000, 0.024733, 0.010632, 0.013131 ], [140, -7218.000000, 0.024729, 0.000006, 0.013130 ] ], "n": ["FDJVGXF01BRHTY_rvcmp" ] }, {"p": [[131, -5733.610000, 0.143915, 0.000001, 0.005704 ], [138, -5733.610000, 0.143912, 0.001320, 0.005704 ], [139, -5733.620000, 0.143788, 0.000005, 0.005704 ], [137, -5733.620000, 0.143756, 0.004966, 0.005704 ], [132, -5733.620000, 0.143672, 0.010862, 0.005704 ], [135, -5733.640000, 0.140547, 0.005910, 0.005706 ], [136, -5733.640000, 0.140410, 0.003788, 0.005706 ] ], "n": ["FDJVGXF01DPLLJ_rvcmp" ] }, {"p": [[131, -5733.610000, 0.143915, 0.000001, 0.005704 ], [138, -5733.610000, 0.143912, 0.001320, 0.005704 ], [139, -5733.620000, 0.143788, 0.000005, 0.005704 ], [137, -5733.620000, 0.143756, 0.004966, 0.005704 ], [132, -5733.620000, 0.143672, 0.010862, 0.005704 ], [135, -5733.640000, 0.140547, 0.005910, 0.005706 ], [136, -5733.640000, 0.140410, 0.003788, 0.005706 ] ], "n": ["FDJVGXF01BKQDZ" ] }, {"p": [[131, -5135.980000, 0.143907, 0.000001, 0.006357 ], [138, -5135.980000, 0.143904, 0.001320, 0.006357 ], [137, -5135.980000, 0.143750, 0.004966, 0.006357 ], [139, -5135.980000, 0.143734, 0.000009, 0.006357 ], [132, -5135.980000, 0.143689, 0.010863, 0.006357 ], [135, -5136.010000, 0.140547, 0.005910, 0.006359 ], [136, -5136.010000, 0.140469, 0.003789, 0.006359 ] ], "n": ["FDJVGXF01DX3O4" ] }, {"p": [[131, -5902.580000, 0.143914, 0.000001, 0.005533 ], [138, -5902.580000, 0.143912, 0.001320, 0.005533 ], [137, -5902.580000, 0.143760, 0.004966, 0.005533 ], [132, -5902.580000, 0.143698, 0.010863, 0.005533 ], [139, -5902.580000, 0.143693, 0.000009, 0.005533 ], [135, -5902.600000, 0.140551, 0.005910, 0.005534 ], [136, -5902.600000, 0.140473, 0.003789, 0.005535 ] ], "n": ["FDJVGXF01D3855_rvcmp" ] }, {"p": [[131, -5902.580000, 0.143914, 0.000001, 0.005533 ], [138, -5902.580000, 0.143912, 0.001320, 0.005533 ], [137, -5902.580000, 0.143760, 0.004966, 0.005533 ], [132, -5902.580000, 0.143698, 0.010863, 0.005533 ], [139, -5902.580000, 0.143693, 0.000009, 0.005533 ], [135, -5902.600000, 0.140551, 0.005910, 0.005534 ], [136, -5902.600000, 0.140473, 0.003789, 0.005535 ] ], "n": ["FDJVGXF01BZHST_rvcmp" ] }, {"p": [[131, -5902.580000, 0.143914, 0.000001, 0.005533 ], [138, -5902.580000, 0.143912, 0.001320, 0.005533 ], [137, -5902.580000, 0.143760, 0.004966, 0.005533 ], [132, -5902.580000, 0.143698, 0.010863, 0.005533 ], [139, -5902.580000, 0.143693, 0.000009, 0.005533 ], [135, -5902.600000, 0.140551, 0.005910, 0.005534 ], [136, -5902.600000, 0.140473, 0.003789, 0.005535 ] ], "n": ["FDJVGXF01E193F_rvcmp" ] }, {"p": [[131, -5902.580000, 0.143914, 0.000001, 0.005533 ], [138, -5902.580000, 0.143912, 0.001320, 0.005533 ], [137, -5902.580000, 0.143760, 0.004966, 0.005533 ], [132, -5902.580000, 0.143698, 0.010863, 0.005533 ], [139, -5902.580000, 0.143693, 0.000009, 0.005533 ], [135, -5902.600000, 0.140551, 0.005910, 0.005534 ], [136, -5902.600000, 0.140473, 0.003789, 0.005535 ] ], "n": ["FDJVGXF01CVSFI_rvcmp" ] }, {"p": [[131, -5902.580000, 0.143914, 0.000001, 0.005533 ], [138, -5902.580000, 0.143912, 0.001320, 0.005533 ], [137, -5902.580000, 0.143760, 0.004966, 0.005533 ], [132, -5902.580000, 0.143698, 0.010863, 0.005533 ], [139, -5902.580000, 0.143693, 0.000009, 0.005533 ], [135, -5902.600000, 0.140551, 0.005910, 0.005534 ], [136, -5902.600000, 0.140473, 0.003789, 0.005535 ] ], "n": ["FDJVGXF01CQZLD_rvcmp" ] }, {"p": [[131, -5902.580000, 0.143914, 0.000001, 0.005533 ], [138, -5902.580000, 0.143912, 0.001320, 0.005533 ], [137, -5902.580000, 0.143760, 0.004966, 0.005533 ], [132, -5902.580000, 0.143698, 0.010863, 0.005533 ], [139, -5902.580000, 0.143693, 0.000009, 0.005533 ], [135, -5902.600000, 0.140551, 0.005910, 0.005534 ], [136, -5902.600000, 0.140473, 0.003789, 0.005535 ] ], "n": ["FDJVGXF01A5U3U_rvcmp" ] }, {"p": [[131, -5902.580000, 0.143914, 0.000001, 0.005533 ], [138, -5902.580000, 0.143912, 0.001320, 0.005533 ], [137, -5902.580000, 0.143760, 0.004966, 0.005533 ], [132, -5902.580000, 0.143698, 0.010863, 0.005533 ], [139, -5902.580000, 0.143693, 0.000009, 0.005533 ], [135, -5902.600000, 0.140551, 0.005910, 0.005534 ], [136, -5902.600000, 0.140473, 0.003789, 0.005535 ] ], "n": ["FDJVGXF01CXMMU_rvcmp" ] }, {"p": [[131, -5919.040000, 0.152183, 0.000001, 0.005211 ], [138, -5919.050000, 0.152095, 0.001317, 0.005211 ], [139, -5919.050000, 0.152075, 0.000009, 0.005210 ], [137, -5919.140000, 0.137822, 0.004966, 0.005215 ], [132, -5919.150000, 0.137590, 0.010862, 0.005215 ], [136, -5919.170000, 0.134217, 0.003788, 0.005216 ], [135, -5919.170000, 0.134017, 0.005909, 0.005216 ] ], "n": ["FDJVGXF01BPT51" ] }, {"p": [[131, -4343.850000, 0.149701, 0.000001, 0.000005 ], [138, -4343.850000, 0.149701, 0.001319, 0.000005 ], [137, -4343.850000, 0.149696, 0.004966, 0.000005 ], [139, -4343.850000, 0.149686, 0.000006, 0.000005 ], [132, -4343.850000, 0.149680, 0.000005, 0.000006 ], [130, -4344.030000, 0.125795, 0.010632, 0.000006 ], [140, -4344.030000, 0.125742, 0.000006, 0.000006 ] ], "n": ["FDJVGXF01CKX81" ] }, {"p": [[131, -5023.500000, 0.194397, 0.000001, 0.000005 ], [138, -5023.500000, 0.194387, 0.001319, 0.000005 ], [132, -5023.500000, 0.194365, 0.000005, 0.000006 ], [139, -5023.500000, 0.194257, 0.000006, 0.000005 ], [137, -5023.520000, 0.190556, 0.004966, 0.000005 ], [140, -5025.990000, 0.016022, 0.000006, 0.000006 ], [130, -5026.000000, 0.016015, 0.010632, 0.000006 ] ], "n": ["FDJVGXF01D6I11" ] }, {"p": [[131, -5023.500000, 0.194397, 0.000001, 0.000005 ], [138, -5023.500000, 0.194387, 0.001319, 0.000005 ], [132, -5023.500000, 0.194365, 0.000005, 0.000006 ], [139, -5023.500000, 0.194257, 0.000006, 0.000005 ], [137, -5023.520000, 0.190556, 0.004966, 0.000005 ], [140, -5025.990000, 0.016022, 0.000006, 0.000006 ], [130, -5026.000000, 0.016015, 0.010632, 0.000006 ] ], "n": ["FDJVGXF01DQG0M" ] }, {"p": [[132, -9045.610000, 0.647220, 0.008211, 0.003637 ], [137, -9047.760000, 0.074839, 0.004966, 0.006919 ], [138, -9047.760000, 0.074839, 0.000005, 0.006920 ], [131, -9047.820000, 0.070515, 0.000001, 0.007148 ], [135, -9047.880000, 0.066422, 0.005910, 0.007149 ], [136, -9047.890000, 0.066165, 0.003788, 0.007150 ] ], "n": ["FDJVGXF01A8ZUE" ] }, {"p": [[132, -6977.680000, 0.955968, 0.007570, 0.000006 ], [138, -6981.170000, 0.029134, 0.000620, 0.004440 ], [137, -6982.450000, 0.008163, 0.004966, 0.004512 ], [131, -6982.640000, 0.006736, 0.000001, 0.008874 ] ], "n": ["FDJVGXF01BCIP2_rvcmp" ] }, {"p": [[132, -7237.450000, 0.435326, 0.007381, 0.013640 ], [138, -7238.950000, 0.096709, 0.000005, 0.017737 ], [137, -7238.950000, 0.096707, 0.004966, 0.017737 ], [131, -7238.970000, 0.094587, 0.000001, 0.017859 ], [139, -7238.980000, 0.094394, 0.000005, 0.017859 ], [135, -7239.010000, 0.091269, 0.005910, 0.017864 ], [136, -7239.010000, 0.091010, 0.003788, 0.017864 ] ], "n": ["FDJVGXF01AO7VS_rvcmp" ] }, {"p": [[132, -7396.450000, 0.442109, 0.006866, 0.005039 ], [135, -7396.930000, 0.274154, 0.002119, 0.008360 ], [138, -7397.530000, 0.150308, 0.000428, 0.005424 ], [137, -7398.440000, 0.060565, 0.004966, 0.005636 ], [134, -7399.190000, 0.028774, 0.000001, 0.012451 ], [139, -7399.250000, 0.026978, 0.002614, 0.009089 ], [131, -7399.710000, 0.017111, 0.000001, 0.012338 ] ], "n": ["FDJVGXF01B0F8P_rvcmp" ] }, {"p": [[132, -4764.280000, 0.840060, 0.007262, 0.000006 ], [137, -4767.500000, 0.033580, 0.004966, 0.006191 ], [138, -4767.500000, 0.033569, 0.000010, 0.006194 ], [131, -4767.560000, 0.031419, 0.000001, 0.006665 ], [135, -4767.590000, 0.030697, 0.005908, 0.006663 ], [136, -4767.590000, 0.030674, 0.003788, 0.006663 ] ], "n": ["FDJVGXF01DJR9E" ] }, {"p": [[132, -8083.600000, 0.925088, 0.007266, 0.000006 ], [137, -8087.590000, 0.017024, 0.004966, 0.003192 ], [138, -8087.590000, 0.017018, 0.000005, 0.003186 ], [131, -8087.790000, 0.013994, 0.000001, 0.003984 ], [135, -8087.830000, 0.013458, 0.005910, 0.003977 ], [136, -8087.830000, 0.013419, 0.003788, 0.003977 ] ], "n": ["FDJVGXF01BOZD6_rvcmp" ] }, {"p": [[132, -7014.870000, 0.665444, 0.006377, 0.010918 ], [139, -7016.690000, 0.108621, 0.004004, 0.014688 ], [138, -7017.100000, 0.071550, 0.001021, 0.016736 ], [131, -7017.170000, 0.066777, 0.000001, 0.017978 ], [130, -7017.440000, 0.051018, 0.008840, 0.014089 ], [135, -7018.420000, 0.019213, 0.003201, 0.018300 ], [137, -7018.520000, 0.017377, 0.004966, 0.016505 ] ], "n": ["FDJVGXF01BAPJZ" ] }, {"p": [[132, -4936.860000, 0.142950, 0.005435, 0.013257 ], [135, -4936.860000, 0.142864, 0.002961, 0.013290 ], [137, -4936.860000, 0.142853, 0.002486, 0.013294 ], [136, -4936.860000, 0.142843, 0.001902, 0.013299 ], [133, -4936.860000, 0.142833, 0.001201, 0.013302 ], [138, -4936.860000, 0.142829, 0.000645, 0.013304 ], [134, -4936.860000, 0.142827, 0.000001, 0.013305 ] ], "n": ["FDJVGXF01EOS1A_rvcmp" ] }, {"p": [[132, -4936.860000, 0.142950, 0.005435, 0.013257 ], [135, -4936.860000, 0.142864, 0.002961, 0.013290 ], [137, -4936.860000, 0.142853, 0.002486, 0.013294 ], [136, -4936.860000, 0.142843, 0.001902, 0.013299 ], [133, -4936.860000, 0.142833, 0.001201, 0.013302 ], [138, -4936.860000, 0.142829, 0.000645, 0.013304 ], [134, -4936.860000, 0.142827, 0.000001, 0.013305 ] ], "n": ["FDJVGXF01B3VIU_rvcmp" ] }, {"p": [[132, -7151.250000, 0.919704, 0.005418, 0.004600 ], [138, -7154.740000, 0.028049, 0.000007, 0.008783 ], [131, -7154.810000, 0.026132, 0.000001, 0.009165 ], [139, -7154.810000, 0.026115, 0.000006, 0.009165 ] ], "n": ["FDJVGXF01BSJSQ_rvcmp" ] }, {"p": [[132, -6669.930000, 0.725590, 0.005458, 0.004846 ], [137, -6672.650000, 0.047777, 0.004966, 0.009456 ], [138, -6672.650000, 0.047777, 0.000005, 0.009457 ], [131, -6672.690000, 0.045658, 0.000001, 0.009688 ], [139, -6672.690000, 0.045601, 0.000005, 0.009694 ], [135, -6672.730000, 0.043862, 0.005910, 0.009690 ], [136, -6672.740000, 0.043735, 0.003788, 0.009691 ] ], "n": ["FDJVGXF01BYQBX_rvcmp" ] }, {"p": [[132, -7777.730000, 0.933986, 0.005437, 0.000006 ], [137, -7781.910000, 0.014321, 0.004966, 0.003638 ], [138, -7781.910000, 0.014319, 0.000005, 0.003632 ], [131, -7782.020000, 0.012806, 0.000001, 0.004103 ], [135, -7782.060000, 0.012302, 0.005910, 0.004100 ], [136, -7782.070000, 0.012266, 0.003788, 0.004100 ] ], "n": ["FDJVGXF01ANWZP_rvcmp" ] }, {"p": [[132, -5141.110000, 0.668522, 0.000005, 0.012804 ], [140, -5142.500000, 0.166838, 0.017164, 0.000006 ], [139, -5143.290000, 0.075854, 0.007324, 0.013431 ], [138, -5144.500000, 0.022567, 0.000005, 0.019272 ], [137, -5144.500000, 0.022567, 0.004966, 0.019272 ], [131, -5144.520000, 0.022089, 0.000001, 0.019421 ], [136, -5144.550000, 0.021564, 0.003788, 0.019429 ] ], "n": ["FDJVGXF01DRG7K" ] }, {"p": [[132, -8290.540000, 0.937456, 0.000007, 0.003936 ], [139, -8294.070000, 0.027381, 0.005647, 0.003680 ], [130, -8294.550000, 0.016992, 0.008326, 0.003416 ], [138, -8295.550000, 0.006241, 0.000010, 0.007498 ], [137, -8295.560000, 0.006196, 0.004966, 0.007496 ], [131, -8295.630000, 0.005734, 0.000001, 0.007877 ] ], "n": ["FDJVGXF01EMKP2" ] }, {"p": [[133, -7261.180000, 0.201025, 0.001210, 0.009050 ], [134, -7261.180000, 0.201016, 0.000001, 0.009052 ], [135, -7261.180000, 0.201013, 0.000006, 0.009052 ], [136, -7261.180000, 0.201009, 0.000007, 0.009052 ], [137, -7261.200000, 0.195937, 0.000010, 0.009053 ] ], "n": ["FDJVGXF01CXPZZ_rvcmp" ] }, {"p": [[133, -8258.370000, 0.201059, 0.001201, 0.007917 ], [134, -8258.370000, 0.201007, 0.000001, 0.007920 ], [135, -8258.370000, 0.201004, 0.000008, 0.007920 ], [136, -8258.370000, 0.201001, 0.000007, 0.007920 ], [137, -8258.400000, 0.195929, 0.000010, 0.007921 ] ], "n": ["FDJVGXF01E3CEA" ] }, {"p": [[133, -7027.850000, 0.312249, 0.001185, 0.004537 ], [134, -7027.850000, 0.312211, 0.000001, 0.004540 ], [135, -7027.850000, 0.311902, 0.000006, 0.004540 ], [132, -7029.740000, 0.047172, 0.007297, 0.004624 ], [137, -7031.830000, 0.005795, 0.000010, 0.008068 ], [136, -7031.840000, 0.005771, 0.003788, 0.008069 ], [138, -7032.000000, 0.004901, 0.000005, 0.008915 ] ], "n": ["FDJVGXF01BP62Q_rvcmp" ] }, {"p": [[133, -7690.830000, 0.347298, 0.000009, 0.021059 ], [136, -7691.270000, 0.224953, 0.000007, 0.021157 ], [135, -7691.340000, 0.209867, 0.005910, 0.021122 ], [137, -7691.340000, 0.209021, 0.000010, 0.021110 ], [134, -7694.500000, 0.008861, 0.000001, 0.025533 ] ], "n": ["FDJVGXF01B7EYW_rvcmp" ] }, {"p": [[133, -6211.610000, 0.967791, 0.000009, 0.020053 ], [134, -6215.020000, 0.032209, 0.000001, 0.025203 ] ], "n": ["FDJVGXF01A9H7J" ] }, {"p": [[133, -7621.030000, 0.806433, 0.000009, 0.016875 ], [135, -7622.850000, 0.131052, 0.002991, 0.017215 ], [136, -7624.590000, 0.022921, 0.003788, 0.020855 ], [137, -7624.600000, 0.022803, 0.000010, 0.020844 ], [134, -7624.910000, 0.016790, 0.000001, 0.021319 ] ], "n": ["FDJVGXF01B2CX4" ] }, {"p": [[133, -6664.220000, 0.353396, 0.000009, 0.009683 ], [136, -6664.670000, 0.226117, 0.000007, 0.009738 ], [135, -6664.750000, 0.208599, 0.005910, 0.009736 ], [137, -6664.760000, 0.207247, 0.000010, 0.009735 ], [134, -6668.560000, 0.004642, 0.000001, 0.014700 ] ], "n": ["FDJVGXF01EHE28_rvcmp" ] }, {"p": [[133, -6237.740000, 0.972919, 0.000009, 0.010256 ], [134, -6242.020000, 0.013547, 0.000001, 0.015576 ], [135, -6242.020000, 0.013534, 0.000008, 0.015575 ] ], "n": ["FDJVGXF01B9U2G" ] }, {"p": [[133, -7904.640000, 0.967795, 0.000009, 0.008199 ], [135, -7909.140000, 0.010738, 0.000006, 0.012420 ], [134, -7909.140000, 0.010735, 0.000001, 0.012426 ], [136, -7909.140000, 0.010732, 0.000007, 0.012423 ] ], "n": ["FDJVGXF01A3B1Y_rvcmp" ] }, {"p": [[134, -5777.390000, 0.250244, 0.000001, 0.011578 ], [135, -5777.390000, 0.250240, 0.000006, 0.011578 ], [136, -5777.390000, 0.250237, 0.000007, 0.011573 ], [133, -5777.400000, 0.249279, 0.002392, 0.011573 ] ], "n": ["FDJVGXF01BSBSB" ] }, {"p": [[134, -7873.070000, 0.325384, 0.000001, 0.008218 ], [135, -7873.070000, 0.324953, 0.000008, 0.008218 ], [133, -7873.070000, 0.324123, 0.002392, 0.008218 ], [136, -7875.610000, 0.025540, 0.003788, 0.009198 ] ], "n": ["FDJVGXF01CUFN8" ] }, {"p": [[134, -4661.580000, 0.333940, 0.000001, 0.000008 ], [135, -4661.580000, 0.333428, 0.000006, 0.000006 ], [133, -4661.590000, 0.332632, 0.002392, 0.000008 ] ], "n": ["FDJVGXF01CMIYW" ] }, {"p": [[134, -4661.580000, 0.333940, 0.000001, 0.000008 ], [135, -4661.580000, 0.333428, 0.000006, 0.000006 ], [133, -4661.590000, 0.332632, 0.002392, 0.000008 ] ], "n": ["FDJVGXF01ER03M" ] }, {"p": [[134, -7260.760000, 0.201019, 0.000001, 0.009038 ], [133, -7260.760000, 0.201019, 0.000007, 0.009043 ], [135, -7260.760000, 0.201015, 0.000006, 0.009038 ], [136, -7260.760000, 0.201012, 0.000007, 0.009038 ], [137, -7260.780000, 0.195936, 0.000010, 0.009040 ] ], "n": ["FDJVGXF01EK9LF_rvcmp" ] }, {"p": [[134, -6194.170000, 0.142879, 0.000001, 0.000006 ], [133, -6194.170000, 0.142879, 0.000009, 0.000006 ], [136, -6194.170000, 0.142878, 0.000007, 0.000006 ], [135, -6194.170000, 0.142878, 0.000006, 0.000006 ], [137, -6194.170000, 0.142873, 0.004966, 0.000006 ], [138, -6194.170000, 0.142813, 0.001320, 0.000009 ], [132, -6194.170000, 0.142800, 0.000005, 0.000009 ] ], "n": ["FDJVGXF01B2KWB_rvcmp" ] }, {"p": [[135, -8615.520000, 0.544410, 0.002958, 0.007607 ], [132, -8616.330000, 0.241301, 0.008267, 0.007720 ], [137, -8617.850000, 0.053011, 0.000010, 0.010616 ], [138, -8617.970000, 0.047004, 0.000005, 0.011179 ], [131, -8618.010000, 0.045296, 0.000001, 0.011338 ], [133, -8618.280000, 0.034492, 0.001418, 0.011317 ], [134, -8618.280000, 0.034486, 0.000001, 0.011325 ] ], "n": ["FDJVGXF01DRNY6_rvcmp" ] }, {"p": [[135, -8615.520000, 0.544410, 0.002958, 0.007607 ], [132, -8616.330000, 0.241301, 0.008267, 0.007720 ], [137, -8617.850000, 0.053011, 0.000010, 0.010616 ], [138, -8617.970000, 0.047004, 0.000005, 0.011179 ], [131, -8618.010000, 0.045296, 0.000001, 0.011338 ], [133, -8618.280000, 0.034492, 0.001418, 0.011317 ], [134, -8618.280000, 0.034486, 0.000001, 0.011325 ] ], "n": ["FDJVGXF01BTTJJ_rvcmp" ] }, {"p": [[135, -6187.250000, 0.142931, 0.002982, 0.005267 ], [137, -6187.250000, 0.142906, 0.002482, 0.005272 ], [136, -6187.250000, 0.142880, 0.001921, 0.005276 ], [138, -6187.250000, 0.142849, 0.000616, 0.005282 ], [134, -6187.250000, 0.142844, 0.000001, 0.005283 ], [131, -6187.250000, 0.142844, 0.000001, 0.005283 ], [139, -6187.250000, 0.142745, 0.000006, 0.005283 ] ], "n": ["FDJVGXF01DH8UR" ] }, {"p": [[135, -7918.580000, 0.391273, 0.003235, 0.003943 ], [132, -7919.380000, 0.175716, 0.009607, 0.003972 ], [137, -7919.630000, 0.137398, 0.001383, 0.004052 ], [136, -7919.640000, 0.136601, 0.003788, 0.004058 ], [138, -7919.640000, 0.136373, 0.000010, 0.004063 ], [134, -7921.900000, 0.014187, 0.000001, 0.007860 ], [131, -7922.420000, 0.008451, 0.000001, 0.007833 ] ], "n": ["FDJVGXF01AVDK2" ] }, {"p": [[135, -7450.450000, 0.392870, 0.002040, 0.008612 ], [139, -7451.180000, 0.189836, 0.005812, 0.007434 ], [130, -7451.510000, 0.135679, 0.008241, 0.006318 ], [140, -7451.740000, 0.107816, 0.000006, 0.006577 ], [138, -7452.130000, 0.073215, 0.000934, 0.010978 ], [131, -7452.280000, 0.062966, 0.000001, 0.012722 ], [134, -7452.800000, 0.037617, 0.000001, 0.012753 ] ], "n": ["FDJVGXF01ETCRK" ] }, {"p": [[135, -7450.450000, 0.392870, 0.002040, 0.008612 ], [139, -7451.180000, 0.189836, 0.005812, 0.007434 ], [130, -7451.510000, 0.135679, 0.008241, 0.006318 ], [140, -7451.740000, 0.107816, 0.000006, 0.006577 ], [138, -7452.130000, 0.073215, 0.000934, 0.010978 ], [131, -7452.280000, 0.062966, 0.000001, 0.012722 ], [134, -7452.800000, 0.037617, 0.000001, 0.012753 ] ], "n": ["FDJVGXF01AXXCX" ] }, {"p": [[135, -7450.450000, 0.392870, 0.002040, 0.008612 ], [139, -7451.180000, 0.189836, 0.005812, 0.007434 ], [130, -7451.510000, 0.135679, 0.008241, 0.006318 ], [140, -7451.740000, 0.107816, 0.000006, 0.006577 ], [138, -7452.130000, 0.073215, 0.000934, 0.010978 ], [131, -7452.280000, 0.062966, 0.000001, 0.012722 ], [134, -7452.800000, 0.037617, 0.000001, 0.012753 ] ], "n": ["FDJVGXF01CQ9NP" ] }, {"p": [[135, -7320.250000, 0.724536, 0.002359, 0.007737 ], [136, -7322.080000, 0.116134, 0.001922, 0.008799 ], [134, -7322.650000, 0.065519, 0.000001, 0.012991 ], [133, -7322.660000, 0.065270, 0.002392, 0.012991 ], [137, -7324.070000, 0.015902, 0.000010, 0.011082 ], [132, -7324.300000, 0.012641, 0.009039, 0.013228 ] ], "n": ["FDJVGXF01BIKH0" ] }, {"p": [[135, -7404.360000, 0.557954, 0.002054, 0.004229 ], [132, -7404.790000, 0.361276, 0.005627, 0.004225 ], [134, -7407.060000, 0.037284, 0.000001, 0.008372 ], [133, -7407.070000, 0.037143, 0.002392, 0.008372 ], [137, -7408.840000, 0.006343, 0.000010, 0.007635 ] ], "n": ["FDJVGXF01A6BE9_rvcmp" ] }, {"p": [[135, -7476.470000, 0.689104, 0.001496, 0.012515 ], [134, -7478.070000, 0.140201, 0.000001, 0.016331 ], [133, -7478.070000, 0.139766, 0.002394, 0.016331 ], [132, -7479.580000, 0.030928, 0.003697, 0.016699 ] ], "n": ["FDJVGXF01EP4MK" ] }, {"p": [[136, -6675.570000, 0.462885, 0.001918, 0.009913 ], [140, -6676.370000, 0.206595, 0.015066, 0.000006 ], [139, -6676.840000, 0.129733, 0.003653, 0.010135 ], [137, -6677.560000, 0.062916, 0.000010, 0.012441 ], [135, -6677.560000, 0.062881, 0.005910, 0.012440 ], [138, -6678.080000, 0.037537, 0.000005, 0.014652 ], [131, -6678.080000, 0.037452, 0.000001, 0.014674 ] ], "n": ["FDJVGXF01DSKDH_rvcmp" ] }, {"p": [[136, -7347.020000, 0.727639, 0.001924, 0.004400 ], [137, -7349.320000, 0.072616, 0.000010, 0.005938 ], [135, -7349.320000, 0.072588, 0.005910, 0.005937 ], [138, -7350.140000, 0.031889, 0.000005, 0.008672 ], [132, -7350.150000, 0.031860, 0.010863, 0.008672 ], [131, -7350.150000, 0.031722, 0.000001, 0.008704 ], [139, -7350.150000, 0.031686, 0.000005, 0.008704 ] ], "n": ["FDJVGXF01CFDMV" ] }, {"p": [[136, -5274.870000, 0.825498, 0.001925, 0.000006 ], [135, -5277.140000, 0.085351, 0.004128, 0.001699 ], [137, -5277.820000, 0.043072, 0.000010, 0.000134 ], [132, -5278.180000, 0.030089, 0.007997, 0.005897 ], [138, -5278.820000, 0.015989, 0.000010, 0.006150 ] ], "n": ["FDJVGXF01A9GJ5" ] }, {"p": [[136, -5995.640000, 0.344277, 0.000007, 0.016503 ], [135, -5995.720000, 0.317724, 0.005910, 0.016509 ], [137, -5995.730000, 0.315622, 0.000010, 0.016513 ], [134, -5999.070000, 0.011210, 0.000001, 0.022165 ], [133, -5999.070000, 0.011167, 0.002392, 0.022165 ] ], "n": ["FDJVGXF01B4HXX" ] }, {"p": [[136, -5995.640000, 0.344277, 0.000007, 0.016503 ], [135, -5995.720000, 0.317724, 0.005910, 0.016509 ], [137, -5995.730000, 0.315622, 0.000010, 0.016513 ], [134, -5999.070000, 0.011210, 0.000001, 0.022165 ], [133, -5999.070000, 0.011167, 0.002392, 0.022165 ] ], "n": ["FDJVGXF01DHESL" ] }, {"p": [[136, -8058.720000, 0.503946, 0.000007, 0.016173 ], [135, -8058.800000, 0.465083, 0.005910, 0.016181 ], [134, -8062.200000, 0.015515, 0.000001, 0.020324 ], [133, -8062.200000, 0.015456, 0.002392, 0.020321 ] ], "n": ["FDJVGXF01D7MYF" ] }, {"p": [[136, -8058.720000, 0.503946, 0.000007, 0.016173 ], [135, -8058.800000, 0.465083, 0.005910, 0.016181 ], [134, -8062.200000, 0.015515, 0.000001, 0.020324 ], [133, -8062.200000, 0.015456, 0.002392, 0.020321 ] ], "n": ["FDJVGXF01CHDUO" ] }, {"p": [[136, -8150.660000, 0.342137, 0.000007, 0.011747 ], [135, -8150.720000, 0.321357, 0.005910, 0.011672 ], [137, -8150.720000, 0.320687, 0.000010, 0.011653 ], [134, -8154.430000, 0.007925, 0.000001, 0.015739 ], [133, -8154.430000, 0.007895, 0.002392, 0.015739 ] ], "n": ["FDJVGXF01DZISV" ] }, {"p": [[136, -8036.580000, 0.351447, 0.000007, 0.003987 ], [135, -8036.670000, 0.323624, 0.005910, 0.003996 ], [137, -8036.670000, 0.321427, 0.000010, 0.003996 ], [134, -8041.190000, 0.003502, 0.000001, 0.008014 ] ], "n": ["FDJVGXF01DRGTB" ] }, {"p": [[138, -7213.990000, 0.278223, 0.000682, 0.009227 ], [136, -7214.000000, 0.275582, 0.001748, 0.009190 ], [139, -7214.930000, 0.109077, 0.001229, 0.011257 ], [131, -7214.980000, 0.102956, 0.000001, 0.012711 ], [132, -7215.010000, 0.100786, 0.009507, 0.009742 ], [137, -7215.260000, 0.078297, 0.004966, 0.009841 ], [135, -7215.610000, 0.055079, 0.004575, 0.011640 ] ], "n": ["FDJVGXF01AWLKR" ] }, {"p": [[138, -7193.460000, 0.345995, 0.000643, 0.004662 ], [134, -7194.370000, 0.138515, 0.000001, 0.008559 ], [133, -7194.380000, 0.137990, 0.002392, 0.008559 ], [132, -7194.510000, 0.121165, 0.009535, 0.004986 ], [137, -7194.770000, 0.093307, 0.004966, 0.005034 ], [139, -7194.900000, 0.081559, 0.000005, 0.008519 ], [131, -7194.900000, 0.081470, 0.000001, 0.008528 ] ], "n": ["FDJVGXF01E1IMM" ] }, {"p": [[138, -5130.640000, 0.143922, 0.001320, 0.000007 ], [131, -5130.640000, 0.143904, 0.000001, 0.000008 ], [139, -5130.640000, 0.143847, 0.000005, 0.000006 ], [137, -5130.640000, 0.143761, 0.004966, 0.000007 ], [132, -5130.640000, 0.143720, 0.010863, 0.000006 ], [135, -5130.670000, 0.140492, 0.005910, 0.000008 ], [136, -5130.670000, 0.140353, 0.003788, 0.000008 ] ], "n": ["FDJVGXF01AVMLL" ] }, {"p": [[138, -5130.640000, 0.143922, 0.001320, 0.000007 ], [131, -5130.640000, 0.143904, 0.000001, 0.000008 ], [139, -5130.640000, 0.143847, 0.000005, 0.000006 ], [137, -5130.640000, 0.143761, 0.004966, 0.000007 ], [132, -5130.640000, 0.143720, 0.010863, 0.000006 ], [135, -5130.670000, 0.140492, 0.005910, 0.000008 ], [136, -5130.670000, 0.140353, 0.003788, 0.000008 ] ], "n": ["FDJVGXF01C374J" ] }, {"p": [[138, -5130.640000, 0.143922, 0.001320, 0.000007 ], [131, -5130.640000, 0.143904, 0.000001, 0.000008 ], [139, -5130.640000, 0.143847, 0.000005, 0.000006 ], [137, -5130.640000, 0.143761, 0.004966, 0.000007 ], [132, -5130.640000, 0.143720, 0.010863, 0.000006 ], [135, -5130.670000, 0.140492, 0.005910, 0.000008 ], [136, -5130.670000, 0.140353, 0.003788, 0.000008 ] ], "n": ["FDJVGXF01D8C14" ] }, {"p": [[138, -5130.640000, 0.143922, 0.001320, 0.000007 ], [131, -5130.640000, 0.143904, 0.000001, 0.000008 ], [139, -5130.640000, 0.143847, 0.000005, 0.000006 ], [137, -5130.640000, 0.143761, 0.004966, 0.000007 ], [132, -5130.640000, 0.143720, 0.010863, 0.000006 ], [135, -5130.670000, 0.140492, 0.005910, 0.000008 ], [136, -5130.670000, 0.140353, 0.003788, 0.000008 ] ], "n": ["FDJVGXF01CLDTB_rvcmp" ] }, {"p": [[138, -5130.640000, 0.143922, 0.001320, 0.000007 ], [131, -5130.640000, 0.143904, 0.000001, 0.000008 ], [139, -5130.640000, 0.143847, 0.000005, 0.000006 ], [137, -5130.640000, 0.143761, 0.004966, 0.000007 ], [132, -5130.640000, 0.143720, 0.010863, 0.000006 ], [135, -5130.670000, 0.140492, 0.005910, 0.000008 ], [136, -5130.670000, 0.140353, 0.003788, 0.000008 ] ], "n": ["FDJVGXF01BNNUV" ] }, {"p": [[138, -5130.640000, 0.143922, 0.001320, 0.000007 ], [131, -5130.640000, 0.143904, 0.000001, 0.000008 ], [139, -5130.640000, 0.143847, 0.000005, 0.000006 ], [137, -5130.640000, 0.143761, 0.004966, 0.000007 ], [132, -5130.640000, 0.143720, 0.010863, 0.000006 ], [135, -5130.670000, 0.140492, 0.005910, 0.000008 ], [136, -5130.670000, 0.140353, 0.003788, 0.000008 ] ], "n": ["FDJVGXF01BK9IG" ] }, {"p": [[138, -5130.640000, 0.143922, 0.001320, 0.000007 ], [131, -5130.640000, 0.143904, 0.000001, 0.000008 ], [139, -5130.640000, 0.143847, 0.000005, 0.000006 ], [137, -5130.640000, 0.143761, 0.004966, 0.000007 ], [132, -5130.640000, 0.143720, 0.010863, 0.000006 ], [135, -5130.670000, 0.140492, 0.005910, 0.000008 ], [136, -5130.670000, 0.140353, 0.003788, 0.000008 ] ], "n": ["FDJVGXF01BO5BO" ] }, {"p": [[138, -2821.380000, 0.143316, 0.001320, 0.000007 ], [131, -2821.380000, 0.143307, 0.000001, 0.000008 ], [135, -2821.380000, 0.143306, 0.000006, 0.000008 ], [139, -2821.380000, 0.143247, 0.000005, 0.000006 ], [137, -2821.380000, 0.143164, 0.004966, 0.000007 ], [132, -2821.380000, 0.143111, 0.010863, 0.000006 ], [136, -2821.400000, 0.140548, 0.003788, 0.000008 ] ], "n": ["FDJVGXF01ADS38_rvcmp" ] }, {"p": [[139, -4245.940000, 0.331825, 0.010556, 0.000008 ], [130, -4245.940000, 0.331813, 0.010631, 0.000008 ], [140, -4245.940000, 0.331757, 0.000006, 0.000008 ], [128, -4250.900000, 0.002304, 0.003643, 0.005370 ], [129, -4250.910000, 0.002300, 0.004824, 0.005370 ] ], "n": ["FDJVGXF01DYONQ_rvcmp" ] }, {"p": [[139, -6419.500000, 0.375121, 0.004541, 0.005335 ], [138, -6420.220000, 0.182778, 0.000818, 0.006641 ], [130, -6420.230000, 0.180870, 0.008777, 0.005141 ], [131, -6420.540000, 0.132706, 0.000001, 0.009468 ], [132, -6421.240000, 0.065833, 0.009250, 0.005875 ], [137, -6421.710000, 0.041151, 0.004966, 0.006472 ], [135, -6422.360000, 0.021541, 0.004279, 0.009767 ] ], "n": ["FDJVGXF01CKG1U" ] }, {"p": [[139, -7484.580000, 0.661269, 0.005013, 0.003366 ], [130, -7485.430000, 0.284324, 0.010632, 0.002826 ], [138, -7487.290000, 0.044152, 0.000660, 0.004433 ], [131, -7488.750000, 0.010255, 0.000001, 0.008116 ] ], "n": ["FDJVGXF01CJ2JL" ] }, {"p": [[139, -7133.220000, 0.386195, 0.004938, 0.000006 ], [130, -7133.910000, 0.193915, 0.008812, 0.000006 ], [140, -7134.070000, 0.164996, 0.000006, 0.000006 ], [138, -7134.150000, 0.152569, 0.000630, 0.000006 ], [132, -7134.990000, 0.066026, 0.009235, 0.000006 ], [131, -7135.590000, 0.036299, 0.000001, 0.004172 ] ], "n": ["FDJVGXF01A01TX_rvcmp" ] }, {"p": [[139, -9133.970000, 0.582142, 0.002371, 0.007206 ], [132, -9134.810000, 0.251177, 0.008229, 0.007453 ], [136, -9136.670000, 0.038967, 0.003054, 0.010781 ], [137, -9136.840000, 0.032941, 0.004966, 0.010734 ], [138, -9136.840000, 0.032935, 0.000005, 0.010734 ], [135, -9136.900000, 0.031159, 0.005910, 0.010991 ], [131, -9136.910000, 0.030679, 0.000001, 0.011008 ] ], "n": ["FDJVGXF01DQPJF_rvcmp" ] }, {"p": [[140, -6170.920000, 0.188502, 0.027039, 0.115191 ], [148, -6171.020000, 0.171047, 0.024050, 0.107844 ], [137, -6171.300000, 0.128451, 0.004909, 0.124897 ], [138, -6171.310000, 0.128341, 0.000005, 0.125256 ], [132, -6171.310000, 0.128291, 0.010863, 0.125256 ], [131, -6171.310000, 0.127717, 0.000001, 0.125371 ], [139, -6171.310000, 0.127651, 0.000005, 0.125373 ] ], "n": ["FDJVGXF01DVG07" ] }, {"p": [[140, -5070.950000, 0.314561, 0.019597, 0.526614 ], [143, -5071.520000, 0.178109, 0.017650, 0.616520 ], [66, -5071.830000, 0.131399, 0.070198, 0.657958 ], [147, -5071.890000, 0.123350, 0.059057, 0.576223 ], [148, -5071.910000, 0.120709, 0.000009, 0.576876 ], [202, -5072.280000, 0.083664, 0.000006, 0.520545 ], [128, -5072.830000, 0.048208, 0.000007, 0.516921 ] ], "n": ["FDJVGXF01D1IUI" ] }, {"p": [[140, -4188.430000, 0.503578, 0.010319, 0.006123 ], [139, -4189.180000, 0.236240, 0.010556, 0.014473 ], [130, -4189.180000, 0.236231, 0.010632, 0.014473 ], [135, -4191.940000, 0.015025, 0.003000, 0.015190 ], [128, -4192.460000, 0.008927, 0.003643, 0.021883 ] ], "n": ["FDJVGXF01ETMYH" ] }, {"p": [[140, -4443.080000, 0.406181, 0.008476, 0.013241 ], [134, -4444.490000, 0.098970, 0.000001, 0.022409 ], [131, -4444.490000, 0.098970, 0.000001, 0.022409 ], [138, -4444.490000, 0.098970, 0.001319, 0.022409 ], [133, -4444.490000, 0.098970, 0.000009, 0.022409 ], [136, -4444.490000, 0.098970, 0.000007, 0.022409 ], [135, -4444.490000, 0.098970, 0.000006, 0.022409 ] ], "n": ["FDJVGXF01D4RB1_rvcmp" ] }, {"p": [[140, -2661.580000, 0.370956, 0.007635, 0.000006 ], [139, -2662.800000, 0.108861, 0.010556, 0.011499 ], [130, -2662.800000, 0.108860, 0.010632, 0.011495 ], [135, -2662.860000, 0.102840, 0.002986, 0.012395 ], [136, -2662.860000, 0.102832, 0.001875, 0.012403 ], [131, -2662.860000, 0.102826, 0.000001, 0.012412 ], [134, -2662.860000, 0.102825, 0.000001, 0.012408 ] ], "n": ["FDJVGXF01ETSPE" ] }, {"p": [[141, -2625.550000, 0.307988, 0.001828, 0.012296 ], [142, -2625.550000, 0.307926, 0.000001, 0.012308 ], [143, -2625.550000, 0.307922, 0.000006, 0.012304 ], [147, -2627.610000, 0.038923, 0.003682, 0.000006 ], [146, -2627.660000, 0.037242, 0.060923, 0.000006 ] ], "n": ["FDJVGXF01BK6PN_rvcmp" ] }, {"p": [[141, -2891.930000, 0.972896, 0.001828, 0.000006 ], [142, -2895.510000, 0.027104, 0.000001, 0.010915 ] ], "n": ["FDJVGXF01AX3NN_rvcmp" ] }, {"p": [[141, -6435.950000, 1.000000, 0.001219, 0.000006 ] ], "n": ["FDJVGXF01BTIP8" ] }, {"p": [[142, -6869.600000, 0.333718, 0.000001, 0.013546 ], [143, -6869.600000, 0.333377, 0.000008, 0.013543 ], [141, -6869.600000, 0.332904, 0.003648, 0.013547 ] ], "n": ["FDJVGXF01CFAI1" ] }, {"p": [[142, -3385.750000, 0.319812, 0.000001, 0.000007 ], [141, -3385.750000, 0.319811, 0.000007, 0.000007 ], [143, -3385.750000, 0.319750, 0.000006, 0.000006 ], [146, -3388.510000, 0.020315, 0.060923, 0.000006 ], [147, -3388.510000, 0.020312, 0.000008, 0.000006 ] ], "n": ["FDJVGXF01DQ6TF" ] }, {"p": [[142, -3385.750000, 0.319812, 0.000001, 0.000007 ], [141, -3385.750000, 0.319811, 0.000007, 0.000007 ], [143, -3385.750000, 0.319750, 0.000006, 0.000006 ], [146, -3388.510000, 0.020315, 0.060923, 0.000006 ], [147, -3388.510000, 0.020312, 0.000008, 0.000006 ] ], "n": ["FDJVGXF01A51QA" ] }, {"p": [[142, -9034.580000, 0.333482, 0.000001, 0.000006 ], [141, -9034.580000, 0.333479, 0.000007, 0.000006 ], [143, -9034.580000, 0.333039, 0.000008, 0.000006 ] ], "n": ["FDJVGXF01DJVG4_rvcmp" ] }, {"p": [[142, -7234.100000, 0.333368, 0.000001, 0.013247 ], [141, -7234.100000, 0.333368, 0.000007, 0.013255 ], [143, -7234.100000, 0.333264, 0.000009, 0.013243 ] ], "n": ["FDJVGXF01BGWOV" ] }, {"p": [[142, -7234.100000, 0.333368, 0.000001, 0.013247 ], [141, -7234.100000, 0.333368, 0.000007, 0.013255 ], [143, -7234.100000, 0.333264, 0.000009, 0.013243 ] ], "n": ["FDJVGXF01CLRF7" ] }, {"p": [[143, -6865.440000, 0.855030, 0.025097, 0.000006 ], [147, -6868.020000, 0.065253, 0.000008, 0.000006 ], [146, -6868.020000, 0.065159, 0.060923, 0.000006 ], [141, -6870.210000, 0.007280, 0.001842, 0.014159 ], [142, -6870.210000, 0.007278, 0.000001, 0.014165 ] ], "n": ["FDJVGXF01AQ3LC_rvcmp" ] }, {"p": [[143, -6865.440000, 0.855030, 0.025097, 0.000006 ], [147, -6868.020000, 0.065253, 0.000008, 0.000006 ], [146, -6868.020000, 0.065159, 0.060923, 0.000006 ], [141, -6870.210000, 0.007280, 0.001842, 0.014159 ], [142, -6870.210000, 0.007278, 0.000001, 0.014165 ] ], "n": ["FDJVGXF01AFXQZ_rvcmp" ] }, {"p": [[143, -7365.040000, 0.830853, 0.013805, 0.000006 ], [142, -7366.630000, 0.169147, 0.000001, 0.008446 ] ], "n": ["FDJVGXF01BYR1G_rvcmp" ] }, {"p": [[143, -8098.340000, 0.652953, 0.011527, 0.005205 ], [141, -8099.660000, 0.173529, 0.001876, 0.012145 ], [142, -8099.660000, 0.173518, 0.000001, 0.012155 ] ], "n": ["FDJVGXF01EW1Z2" ] }, {"p": [[143, -8098.340000, 0.652953, 0.011527, 0.005205 ], [141, -8099.660000, 0.173529, 0.001876, 0.012145 ], [142, -8099.660000, 0.173518, 0.000001, 0.012155 ] ], "n": ["FDJVGXF01EX20I" ] }, {"p": [[143, -7689.270000, 0.414132, 0.004400, 0.007355 ], [142, -7689.610000, 0.293291, 0.000001, 0.012144 ], [141, -7689.610000, 0.292576, 0.003648, 0.012149 ] ], "n": ["FDJVGXF01DI8GN_rvcmp" ] }, {"p": [[143, -6609.850000, 0.746332, 0.004229, 0.000006 ], [142, -6611.620000, 0.127245, 0.000001, 0.004846 ], [141, -6611.620000, 0.126423, 0.003648, 0.004846 ] ], "n": ["FDJVGXF01DIQTM_rvcmp" ] }, {"p": [[143, -6609.850000, 0.746332, 0.004229, 0.000006 ], [142, -6611.620000, 0.127245, 0.000001, 0.004846 ], [141, -6611.620000, 0.126423, 0.003648, 0.004846 ] ], "n": ["FDJVGXF01AJGH5_rvcmp" ] }, {"p": [[148, -7299.210000, 0.205856, 0.085601, 1.558440 ], [22, -7299.300000, 0.187430, 0.028187, 1.590720 ], [56, -7299.430000, 0.165121, 0.035411, 1.398180 ], [13, -7299.570000, 0.143655, 0.000009, 1.536740 ], [225, -7299.870000, 0.106000, 0.036449, 1.654230 ], [52, -7299.970000, 0.096260, 0.003885, 1.575010 ], [149, -7299.980000, 0.095678, 0.010240, 1.525030 ] ], "n": ["FDJVGXF01BWPPJ_rvcmp" ] }, {"p": [[148, -3315.640000, 0.293596, 0.078751, 0.165776 ], [167, -3315.700000, 0.276687, 0.014138, 0.211653 ], [155, -3316.350000, 0.144339, 0.000006, 0.207621 ], [162, -3316.500000, 0.123884, 0.000005, 0.233272 ], [156, -3317.260000, 0.057997, 0.043598, 0.226445 ], [157, -3317.260000, 0.057996, 0.000006, 0.226444 ], [169, -3317.500000, 0.045500, 0.005276, 0.230866 ] ], "n": ["FDJVGXF01B503G" ] }, {"p": [[148, -5372.700000, 0.443335, 0.054279, 0.259461 ], [140, -5373.680000, 0.166111, 0.046581, 0.267004 ], [147, -5373.680000, 0.166042, 0.065313, 0.267001 ], [149, -5374.470000, 0.075243, 0.000008, 0.333858 ], [127, -5374.470000, 0.075220, 0.040911, 0.333870 ], [132, -5374.920000, 0.048087, 0.003188, 0.291572 ], [138, -5375.530000, 0.025961, 0.000005, 0.296234 ] ], "n": ["FDJVGXF01D8LWK_rvcmp" ] }, {"p": [[148, -5736.550000, 0.275929, 0.024601, 0.116279 ], [140, -5736.790000, 0.216993, 0.033314, 0.125225 ], [138, -5737.550000, 0.101587, 0.000005, 0.137563 ], [137, -5737.550000, 0.101560, 0.004968, 0.137516 ], [132, -5737.550000, 0.101549, 0.010863, 0.137563 ], [131, -5737.550000, 0.101216, 0.000001, 0.137678 ], [139, -5737.550000, 0.101166, 0.000005, 0.137679 ] ], "n": ["FDJVGXF01CJJ11" ] }, {"p": [[148, -5964.790000, 0.186827, 0.000009, 1.999990 ], [225, -5965.090000, 0.138428, 0.036449, 1.999990 ], [222, -5965.110000, 0.135073, 0.000009, 1.999990 ], [224, -5965.110000, 0.135034, 0.010740, 1.999990 ], [213, -5965.110000, 0.135034, 0.023979, 1.999990 ], [223, -5965.110000, 0.134804, 0.016737, 1.999990 ], [216, -5965.110000, 0.134799, 0.038817, 1.999990 ] ], "n": ["FDJVGXF01EHCC7_rvcmp" ] }, {"p": [[148, -3702.190000, 0.183650, 0.000009, 1.999990 ], [147, -3702.190000, 0.183646, 0.065313, 1.999990 ], [140, -3702.190000, 0.183641, 0.046582, 1.999990 ], [143, -3702.370000, 0.153443, 0.000008, 1.999990 ], [146, -3702.400000, 0.149451, 0.060923, 1.999990 ], [0, -3703.100000, 0.074343, 0.000008, 1.960390 ], [126, -3703.130000, 0.071825, 0.047265, 1.816950 ] ], "n": ["FDJVGXF01DCAR9_rvcmp" ] }, {"p": [[148, -6078.330000, 0.163256, 0.000009, 1.868790 ], [147, -6078.330000, 0.163250, 0.065313, 1.868830 ], [140, -6078.330000, 0.163247, 0.046582, 1.868800 ], [212, -6078.340000, 0.162756, 0.000008, 1.736350 ], [225, -6078.670000, 0.116609, 0.036449, 1.795480 ], [222, -6078.680000, 0.115916, 0.000009, 1.803950 ], [224, -6078.690000, 0.114966, 0.010740, 1.809520 ] ], "n": ["FDJVGXF01BCLYU_rvcmp" ] }, {"p": [[148, -5479.490000, 0.172235, 0.000009, 1.697450 ], [147, -5479.490000, 0.172227, 0.065313, 1.697490 ], [213, -5479.740000, 0.133518, 0.000006, 1.582040 ], [225, -5479.760000, 0.131687, 0.000009, 1.594760 ], [224, -5479.760000, 0.131687, 0.010740, 1.594770 ], [222, -5479.770000, 0.130063, 0.000009, 1.604550 ], [223, -5479.780000, 0.128583, 0.016737, 1.607350 ] ], "n": ["FDJVGXF01CKKZS" ] }, {"p": [[149, -7892.020000, 0.243928, 0.063738, 0.199750 ], [171, -7892.020000, 0.243909, 0.000008, 0.199760 ], [170, -7892.020000, 0.243794, 0.018724, 0.199759 ], [191, -7892.750000, 0.117453, 0.000008, 0.206784 ], [190, -7892.750000, 0.117434, 0.034335, 0.206774 ], [39, -7894.630000, 0.017934, 0.013859, 0.220401 ], [192, -7894.780000, 0.015548, 0.009937, 0.220919 ] ], "n": ["FDJVGXF01D7DG8_rvcmp" ] }, {"p": [[149, -3027.000000, 0.308670, 0.042582, 0.037480 ], [171, -3027.600000, 0.169575, 0.004336, 0.058110 ], [153, -3027.660000, 0.159548, 0.019512, 0.059828 ], [170, -3027.670000, 0.158471, 0.018724, 0.060576 ], [154, -3028.320000, 0.082852, 0.000007, 0.070365 ], [150, -3028.320000, 0.082788, 0.016957, 0.070358 ], [169, -3029.090000, 0.038097, 0.023387, 0.074562 ] ], "n": ["FDJVGXF01CDHY3" ] }, {"p": [[149, -7616.070000, 0.365816, 0.024579, 0.115179 ], [127, -7616.690000, 0.195900, 0.040911, 0.113790 ], [171, -7617.210000, 0.116644, 0.024563, 0.138173 ], [190, -7617.240000, 0.113961, 0.031426, 0.138584 ], [191, -7617.260000, 0.110699, 0.000008, 0.140486 ], [170, -7617.510000, 0.086430, 0.018724, 0.137474 ], [40, -7619.620000, 0.010551, 0.071825, 0.140047 ] ], "n": ["FDJVGXF01D5RDK_rvcmp" ] }, {"p": [[149, -7859.470000, 0.714002, 0.023643, 0.065584 ], [127, -7860.460000, 0.266646, 0.040911, 0.065541 ], [171, -7863.080000, 0.019352, 0.000008, 0.091486 ] ], "n": ["FDJVGXF01A31Z8_rvcmp" ] }, {"p": [[149, -6105.790000, 0.557956, 0.021300, 0.262656 ], [148, -6106.530000, 0.266359, 0.116820, 0.285370 ], [127, -6107.030000, 0.161365, 0.040911, 0.284073 ], [154, -6109.960000, 0.008658, 0.002126, 0.301759 ], [170, -6110.380000, 0.005661, 0.010643, 0.293237 ] ], "n": ["FDJVGXF01CD7FN_rvcmp" ] }, {"p": [[149, -4692.820000, 0.156258, 0.001277, 0.267483 ], [148, -4692.820000, 0.156162, 0.148117, 0.268221 ], [127, -4692.820000, 0.156128, 0.040911, 0.268234 ], [30, -4692.960000, 0.135807, 0.000006, 0.287788 ], [31, -4692.960000, 0.135807, 0.000008, 0.287806 ], [32, -4692.960000, 0.135797, 0.000007, 0.287807 ], [33, -4693.050000, 0.124041, 0.000010, 0.289128 ] ], "n": ["FDJVGXF01EXALQ_rvcmp" ] }, {"p": [[150, -4565.290000, 0.201967, 0.013936, 0.116502 ], [153, -4565.320000, 0.195101, 0.026997, 0.117676 ], [154, -4565.320000, 0.195065, 0.000007, 0.117677 ], [18, -4565.540000, 0.156286, 0.042159, 0.128399 ], [22, -4565.770000, 0.124913, 0.000007, 0.137235 ], [21, -4565.770000, 0.124878, 0.017640, 0.137231 ], [170, -4570.010000, 0.001789, 0.000009, 0.140219 ] ], "n": ["FDJVGXF01BP94M" ] }, {"p": [[152, -8500.510000, 0.334684, 0.022798, 0.124098 ], [153, -8500.950000, 0.215715, 0.010005, 0.129694 ], [151, -8501.170000, 0.173555, 0.014659, 0.132171 ], [154, -8501.350000, 0.143933, 0.005629, 0.129717 ], [150, -8501.480000, 0.126625, 0.016957, 0.133630 ], [170, -8504.620000, 0.005487, 0.003859, 0.130961 ] ], "n": ["FDJVGXF01A3BDZ_rvcmp" ] }, {"p": [[152, -8500.510000, 0.334684, 0.022798, 0.124098 ], [153, -8500.950000, 0.215715, 0.010005, 0.129694 ], [151, -8501.170000, 0.173555, 0.014659, 0.132171 ], [154, -8501.350000, 0.143933, 0.005629, 0.129717 ], [150, -8501.480000, 0.126625, 0.016957, 0.133630 ], [170, -8504.620000, 0.005487, 0.003859, 0.130961 ] ], "n": ["FDJVGXF01AU0X5_rvcmp" ] }, {"p": [[152, -8500.510000, 0.334684, 0.022798, 0.124098 ], [153, -8500.950000, 0.215715, 0.010005, 0.129694 ], [151, -8501.170000, 0.173555, 0.014659, 0.132171 ], [154, -8501.350000, 0.143933, 0.005629, 0.129717 ], [150, -8501.480000, 0.126625, 0.016957, 0.133630 ], [170, -8504.620000, 0.005487, 0.003859, 0.130961 ] ], "n": ["FDJVGXF01EXELD_rvcmp" ] }, {"p": [[152, -6120.540000, 0.477929, 0.021592, 0.168350 ], [151, -6120.730000, 0.393266, 0.000007, 0.170925 ], [153, -6121.850000, 0.128804, 0.000005, 0.176441 ] ], "n": ["FDJVGXF01AKJDE" ] }, {"p": [[152, -6120.540000, 0.477929, 0.021592, 0.168350 ], [151, -6120.730000, 0.393266, 0.000007, 0.170925 ], [153, -6121.850000, 0.128804, 0.000005, 0.176441 ] ], "n": ["FDJVGXF01A4L25" ] }, {"p": [[152, -6215.320000, 0.468801, 0.022146, 0.094871 ], [151, -6215.890000, 0.263296, 0.009833, 0.095493 ], [153, -6216.360000, 0.164896, 0.000504, 0.096766 ], [196, -6217.610000, 0.047316, 0.026079, 0.082851 ], [38, -6218.260000, 0.024567, 0.031199, 0.112056 ], [40, -6218.630000, 0.017110, 0.061559, 0.089980 ], [205, -6218.830000, 0.014014, 0.019823, 0.095344 ] ], "n": ["FDJVGXF01A92O9" ] }, {"p": [[152, -7336.720000, 0.526145, 0.022468, 0.076251 ], [151, -7337.310000, 0.291753, 0.009891, 0.076898 ], [153, -7337.820000, 0.174920, 0.001007, 0.076657 ], [40, -7341.010000, 0.007182, 0.068956, 0.071776 ] ], "n": ["FDJVGXF01CA5RL" ] }, {"p": [[152, -4886.180000, 0.431038, 0.020505, 0.079776 ], [153, -4886.610000, 0.280584, 0.001055, 0.081496 ], [151, -4886.640000, 0.272372, 0.014659, 0.084184 ], [40, -4889.470000, 0.016006, 0.049556, 0.071326 ] ], "n": ["FDJVGXF01B6FHY" ] }, {"p": [[152, -7894.430000, 0.371874, 0.016894, 0.094034 ], [149, -7895.320000, 0.152010, 0.049239, 0.066945 ], [154, -7895.600000, 0.114819, 0.015837, 0.088348 ], [153, -7895.690000, 0.105185, 0.006429, 0.093230 ], [151, -7895.760000, 0.098160, 0.011601, 0.093952 ], [171, -7895.810000, 0.093381, 0.012125, 0.080318 ], [170, -7896.180000, 0.064571, 0.010043, 0.087387 ] ], "n": ["FDJVGXF01B561Z" ] }, {"p": [[153, -8554.990000, 0.924246, 0.011753, 0.080980 ], [149, -8558.550000, 0.026380, 0.050852, 0.074461 ], [171, -8558.690000, 0.022849, 0.010727, 0.086074 ], [152, -8558.970000, 0.017355, 0.029974, 0.101303 ], [170, -8559.600000, 0.009170, 0.015306, 0.093924 ] ], "n": ["FDJVGXF01CO5FC_rvcmp" ] }, {"p": [[153, -2477.970000, 0.226548, 0.011446, 0.159988 ], [151, -2478.430000, 0.144427, 0.014659, 0.186928 ], [152, -2478.430000, 0.144407, 0.029974, 0.186930 ], [149, -2478.510000, 0.132905, 0.063739, 0.178142 ], [171, -2478.510000, 0.132888, 0.000008, 0.178151 ], [170, -2478.510000, 0.132872, 0.018724, 0.178148 ], [39, -2478.940000, 0.085953, 0.003187, 0.195799 ] ], "n": ["FDJVGXF01EMJ2U" ] }, {"p": [[153, -2764.170000, 0.305109, 0.000007, 0.081293 ], [152, -2764.170000, 0.305099, 0.029974, 0.081310 ], [151, -2764.170000, 0.304989, 0.014659, 0.081308 ], [18, -2766.690000, 0.024757, 0.051699, 0.098316 ], [22, -2766.690000, 0.024757, 0.000007, 0.098313 ], [21, -2766.690000, 0.024740, 0.017640, 0.098320 ], [209, -2767.540000, 0.010549, 0.006837, 0.106067 ] ], "n": ["FDJVGXF01CDHY3_rvcmp" ] }, {"p": [[154, -6945.420000, 0.959355, 0.019746, 0.019332 ], [169, -6948.580000, 0.040645, 0.018628, 0.024577 ] ], "n": ["FDJVGXF01ES1QJ_rvcmp" ] }, {"p": [[154, -5001.520000, 0.327181, 0.019700, 0.013094 ], [169, -5001.550000, 0.315792, 0.014044, 0.015714 ], [159, -5002.490000, 0.123708, 0.006002, 0.028360 ], [167, -5002.920000, 0.080613, 0.027435, 0.028412 ], [168, -5003.350000, 0.052544, 0.003613, 0.030329 ], [157, -5003.350000, 0.052539, 0.005887, 0.030329 ], [155, -5003.450000, 0.047623, 0.012864, 0.030665 ] ], "n": ["FDJVGXF01D298Z_rvcmp" ] }, {"p": [[154, -5001.520000, 0.327181, 0.019700, 0.013094 ], [169, -5001.550000, 0.315792, 0.014044, 0.015714 ], [159, -5002.490000, 0.123708, 0.006002, 0.028360 ], [167, -5002.920000, 0.080613, 0.027435, 0.028412 ], [168, -5003.350000, 0.052544, 0.003613, 0.030329 ], [157, -5003.350000, 0.052539, 0.005887, 0.030329 ], [155, -5003.450000, 0.047623, 0.012864, 0.030665 ] ], "n": ["FDJVGXF01EJRS5_rvcmp" ] }, {"p": [[154, -5001.520000, 0.327181, 0.019700, 0.013094 ], [169, -5001.550000, 0.315792, 0.014044, 0.015714 ], [159, -5002.490000, 0.123708, 0.006002, 0.028360 ], [167, -5002.920000, 0.080613, 0.027435, 0.028412 ], [168, -5003.350000, 0.052544, 0.003613, 0.030329 ], [157, -5003.350000, 0.052539, 0.005887, 0.030329 ], [155, -5003.450000, 0.047623, 0.012864, 0.030665 ] ], "n": ["FDJVGXF01EUN41_rvcmp" ] }, {"p": [[154, -5001.520000, 0.327181, 0.019700, 0.013094 ], [169, -5001.550000, 0.315792, 0.014044, 0.015714 ], [159, -5002.490000, 0.123708, 0.006002, 0.028360 ], [167, -5002.920000, 0.080613, 0.027435, 0.028412 ], [168, -5003.350000, 0.052544, 0.003613, 0.030329 ], [157, -5003.350000, 0.052539, 0.005887, 0.030329 ], [155, -5003.450000, 0.047623, 0.012864, 0.030665 ] ], "n": ["FDJVGXF01EFXAW_rvcmp" ] }, {"p": [[154, -7637.840000, 1.000000, 0.013700, 0.051007 ] ], "n": ["FDJVGXF01C5HGH_rvcmp" ] }, {"p": [[154, -7036.670000, 0.972908, 0.013202, 0.043934 ], [153, -7040.260000, 0.027092, 0.026997, 0.054951 ] ], "n": ["FDJVGXF01EJMGG" ] }, {"p": [[154, -3816.820000, 0.487098, 0.011617, 0.106240 ], [153, -3818.020000, 0.146889, 0.017579, 0.114027 ], [149, -3818.430000, 0.097182, 0.052552, 0.102683 ], [170, -3818.690000, 0.074904, 0.005639, 0.124997 ], [169, -3818.730000, 0.072088, 0.023387, 0.128691 ], [171, -3818.860000, 0.063177, 0.000008, 0.121621 ], [152, -3818.930000, 0.058662, 0.029974, 0.121505 ] ], "n": ["FDJVGXF01CJ582" ] }, {"p": [[154, -7417.770000, 0.924403, 0.010692, 0.047037 ], [153, -7420.270000, 0.075597, 0.018477, 0.055214 ] ], "n": ["FDJVGXF01EOB14" ] }, {"p": [[154, -7417.770000, 0.924403, 0.010692, 0.047037 ], [153, -7420.270000, 0.075597, 0.018477, 0.055214 ] ], "n": ["FDJVGXF01C63HA" ] }, {"p": [[154, -7417.770000, 0.924403, 0.010692, 0.047037 ], [153, -7420.270000, 0.075597, 0.018477, 0.055214 ] ], "n": ["FDJVGXF01ET7SO" ] }, {"p": [[155, -8033.050000, 0.158475, 0.010865, 0.051495 ], [156, -8033.070000, 0.155828, 0.042365, 0.050258 ], [157, -8033.100000, 0.151109, 0.000006, 0.051603 ], [169, -8033.170000, 0.139899, 0.000005, 0.051751 ], [168, -8033.170000, 0.139725, 0.003613, 0.051755 ], [165, -8033.200000, 0.136551, 0.003002, 0.049728 ], [167, -8033.340000, 0.118414, 0.023649, 0.044340 ] ], "n": ["FDJVGXF01E4IKQ_rvcmp" ] }, {"p": [[155, -6988.150000, 0.919910, 0.010101, 0.004780 ], [156, -6990.690000, 0.072056, 0.040757, 0.005474 ], [161, -6992.890000, 0.008035, 0.016182, 0.007528 ] ], "n": ["FDJVGXF01BDPG4" ] }, {"p": [[155, -6918.030000, 0.889692, 0.010172, 0.000009 ], [156, -6920.780000, 0.056705, 0.041414, 0.000005 ], [157, -6920.840000, 0.053602, 0.000006, 0.000006 ] ], "n": ["FDJVGXF01EU9B9" ] }, {"p": [[155, -6210.550000, 0.777879, 0.009087, 0.017610 ], [160, -6212.440000, 0.117759, 0.002863, 0.029434 ], [157, -6213.190000, 0.055689, 0.000622, 0.020088 ], [161, -6213.320000, 0.048673, 0.003698, 0.025183 ] ], "n": ["FDJVGXF01DVCVF_rvcmp" ] }, {"p": [[155, -6969.330000, 0.970924, 0.008545, 0.000009 ], [156, -6972.840000, 0.029076, 0.042552, 0.000005 ] ], "n": ["FDJVGXF01DKR11" ] }, {"p": [[155, -6841.200000, 0.953691, 0.009424, 0.000009 ], [156, -6844.220000, 0.046309, 0.041439, 0.000005 ] ], "n": ["FDJVGXF01CO480" ] }, {"p": [[155, -7196.940000, 0.312306, 0.008290, 0.000009 ], [157, -7197.240000, 0.230141, 0.000006, 0.000006 ], [169, -7197.340000, 0.209888, 0.000006, 0.000006 ], [168, -7197.340000, 0.209671, 0.003612, 0.000006 ], [166, -7199.650000, 0.020721, 0.001999, 0.000006 ], [160, -7199.830000, 0.017272, 0.007381, 0.000006 ] ], "n": ["FDJVGXF01DS0II" ] }, {"p": [[155, -7055.290000, 0.254017, 0.008301, 0.000009 ], [157, -7055.590000, 0.187403, 0.000006, 0.000006 ], [156, -7055.590000, 0.187112, 0.043598, 0.000006 ], [169, -7055.690000, 0.170410, 0.000006, 0.000006 ], [168, -7055.690000, 0.170233, 0.003612, 0.000006 ], [166, -7058.000000, 0.016811, 0.001999, 0.000006 ], [160, -7058.190000, 0.014013, 0.007381, 0.000006 ] ], "n": ["FDJVGXF01APT00" ] }, {"p": [[155, -8859.610000, 1.000000, 0.006133, 0.000009 ] ], "n": ["FDJVGXF01BS1BC_rvcmp" ] }, {"p": [[155, -6483.730000, 1.000000, 0.003777, 0.000009 ] ], "n": ["FDJVGXF01DRYOS_rvcmp" ] }, {"p": [[155, -6301.120000, 0.345452, 0.000006, 0.033775 ], [156, -6301.350000, 0.274016, 0.043598, 0.033846 ], [157, -6301.350000, 0.273834, 0.000006, 0.033847 ], [169, -6303.090000, 0.048099, 0.000006, 0.035537 ], [168, -6303.100000, 0.047940, 0.003612, 0.035538 ], [159, -6304.600000, 0.010659, 0.002352, 0.043944 ] ], "n": ["FDJVGXF01EXALQ" ] }, {"p": [[155, -8152.240000, 0.480363, 0.000006, 0.011923 ], [157, -8153.320000, 0.163391, 0.001530, 0.009646 ], [156, -8153.430000, 0.145576, 0.043598, 0.010882 ], [168, -8153.510000, 0.134337, 0.002660, 0.008259 ], [169, -8154.080000, 0.076333, 0.003110, 0.005582 ] ], "n": ["FDJVGXF01DR7NL_rvcmp" ] }, {"p": [[155, -5445.870000, 0.380729, 0.000006, 0.000006 ], [156, -5446.130000, 0.292637, 0.043598, 0.000006 ], [157, -5446.130000, 0.292383, 0.000006, 0.000006 ], [169, -5448.280000, 0.034251, 0.000006, 0.000006 ] ], "n": ["FDJVGXF01ATTC2_rvcmp" ] }, {"p": [[155, -7043.480000, 0.957203, 0.000006, 0.000006 ], [156, -7047.280000, 0.021418, 0.043598, 0.000006 ], [157, -7047.280000, 0.021380, 0.000006, 0.000006 ] ], "n": ["FDJVGXF01AXQF5_rvcmp" ] }, {"p": [[156, -7940.960000, 0.192084, 0.043598, 0.162312 ], [157, -7940.960000, 0.191852, 0.000006, 0.162323 ], [152, -7941.200000, 0.150875, 0.027190, 0.166036 ], [153, -7941.250000, 0.143757, 0.010694, 0.166671 ], [151, -7941.410000, 0.121927, 0.014659, 0.169808 ], [150, -7941.600000, 0.100815, 0.016562, 0.169695 ], [161, -7941.630000, 0.098690, 0.003142, 0.165592 ] ], "n": ["FDJVGXF01DD17R" ] }, {"p": [[156, -7107.690000, 0.331161, 0.039004, 0.000006 ], [157, -7107.860000, 0.279472, 0.000006, 0.000006 ], [155, -7107.860000, 0.279254, 0.012864, 0.000009 ], [161, -7108.790000, 0.110114, 0.014144, 0.000006 ] ], "n": ["FDJVGXF01BUUSC" ] }, {"p": [[156, -7188.430000, 0.459423, 0.039024, 0.000006 ], [155, -7188.600000, 0.387899, 0.012864, 0.000009 ], [161, -7189.530000, 0.152678, 0.014142, 0.000006 ] ], "n": ["FDJVGXF01BINP8" ] }, {"p": [[156, -8631.280000, 0.787774, 0.035424, 0.029829 ], [155, -8632.590000, 0.212226, 0.011646, 0.033031 ] ], "n": ["FDJVGXF01A0WFN" ] }, {"p": [[156, -8535.470000, 0.484013, 0.035236, 0.007529 ], [161, -8536.060000, 0.267888, 0.019096, 0.012456 ], [155, -8536.500000, 0.172465, 0.011277, 0.014959 ], [160, -8537.870000, 0.043903, 0.004443, 0.023010 ], [157, -8538.190000, 0.031731, 0.000547, 0.016482 ] ], "n": ["FDJVGXF01EUT0Q_rvcmp" ] }, {"p": [[156, -7348.850000, 0.409794, 0.033189, 0.000006 ], [155, -7349.290000, 0.263450, 0.012864, 0.000009 ], [157, -7349.290000, 0.263364, 0.000006, 0.000009 ], [169, -7351.400000, 0.031748, 0.000005, 0.000007 ], [168, -7351.410000, 0.031644, 0.003612, 0.000009 ] ], "n": ["FDJVGXF01ELZQ3" ] }, {"p": [[156, -7505.930000, 0.988029, 0.029827, 0.021579 ], [164, -7510.340000, 0.011971, 0.011055, 0.034218 ] ], "n": ["FDJVGXF01CPK4B" ] }, {"p": [[156, -8157.270000, 1.000000, 0.028362, 0.017192 ] ], "n": ["FDJVGXF01BOUVN" ] }, {"p": [[156, -8450.420000, 0.963382, 0.026244, 0.029413 ], [169, -8453.690000, 0.036618, 0.012719, 0.033335 ] ], "n": ["FDJVGXF01DIEMZ" ] }, {"p": [[156, -8533.640000, 0.618499, 0.026223, 0.017319 ], [160, -8534.430000, 0.280603, 0.003124, 0.041606 ], [158, -8535.720000, 0.077125, 0.016009, 0.044188 ], [161, -8536.900000, 0.023773, 0.021910, 0.034458 ] ], "n": ["FDJVGXF01BM0LU" ] }, {"p": [[156, -4932.190000, 0.969805, 0.025642, 0.000008 ], [157, -4935.660000, 0.030195, 0.000006, 0.000006 ] ], "n": ["FDJVGXF01A50J2_rvcmp" ] }, {"p": [[156, -5751.870000, 0.925523, 0.023127, 0.030889 ], [169, -5754.550000, 0.063596, 0.014680, 0.038096 ], [154, -5756.320000, 0.010882, 0.030340, 0.040912 ] ], "n": ["FDJVGXF01CAXIU" ] }, {"p": [[156, -8026.240000, 1.000000, 0.021424, 0.030421 ] ], "n": ["FDJVGXF01BTHJI" ] }, {"p": [[156, -7886.970000, 1.000000, 0.019536, 0.032334 ] ], "n": ["FDJVGXF01CV576" ] }, {"p": [[156, -7044.040000, 0.984531, 0.017995, 0.016303 ], [169, -7048.190000, 0.015469, 0.015766, 0.018549 ] ], "n": ["FDJVGXF01D8ZRC" ] }, {"p": [[156, -3368.160000, 0.206274, 0.000009, 0.000009 ], [155, -3368.260000, 0.186481, 0.012865, 0.000006 ], [157, -3368.260000, 0.186440, 0.000006, 0.000009 ], [169, -3368.680000, 0.122347, 0.000006, 0.000008 ], [168, -3368.680000, 0.122122, 0.003613, 0.000009 ], [154, -3369.010000, 0.088172, 0.030340, 0.000006 ], [170, -3369.010000, 0.088164, 0.000009, 0.000005 ] ], "n": ["FDJVGXF01DWGJY" ] }, {"p": [[156, -7016.410000, 0.372866, 0.000008, 0.000006 ], [155, -7016.690000, 0.280191, 0.012864, 0.000009 ], [157, -7016.690000, 0.279957, 0.000006, 0.000009 ], [169, -7018.820000, 0.033558, 0.000005, 0.000007 ], [168, -7018.820000, 0.033429, 0.003612, 0.000009 ] ], "n": ["FDJVGXF01A1ZF5_rvcmp" ] }, {"p": [[158, -8531.270000, 0.844369, 0.010577, 0.025817 ], [160, -8532.960000, 0.155631, 0.004116, 0.031472 ] ], "n": ["FDJVGXF01ARWGQ_rvcmp" ] }, {"p": [[158, -5112.460000, 0.229320, 0.007237, 0.447277 ], [167, -5112.770000, 0.168601, 0.023906, 0.428526 ], [149, -5112.970000, 0.138961, 0.063739, 0.444914 ], [170, -5112.970000, 0.138948, 0.018724, 0.444922 ], [171, -5112.970000, 0.138946, 0.000008, 0.444909 ], [166, -5113.300000, 0.099158, 0.001999, 0.477735 ], [159, -5113.440000, 0.086067, 0.000006, 0.485093 ] ], "n": ["FDJVGXF01DH8C7_rvcmp" ] }, {"p": [[158, -9036.680000, 0.932177, 0.006238, 0.026953 ], [160, -9039.300000, 0.067823, 0.003932, 0.029348 ] ], "n": ["FDJVGXF01A9Y23" ] }, {"p": [[158, -4581.990000, 0.311999, 0.004914, 0.291159 ], [159, -4582.470000, 0.191965, 0.011552, 0.311146 ], [160, -4582.470000, 0.191879, 0.000007, 0.311139 ], [149, -4583.160000, 0.096084, 0.045181, 0.225341 ], [150, -4583.490000, 0.069380, 0.016957, 0.245361 ], [154, -4583.490000, 0.069362, 0.000007, 0.245370 ], [171, -4583.490000, 0.069331, 0.000008, 0.244944 ] ], "n": ["FDJVGXF01D4AN8" ] }, {"p": [[158, -4581.990000, 0.311999, 0.004914, 0.291159 ], [159, -4582.470000, 0.191965, 0.011552, 0.311146 ], [160, -4582.470000, 0.191879, 0.000007, 0.311139 ], [149, -4583.160000, 0.096084, 0.045181, 0.225341 ], [150, -4583.490000, 0.069380, 0.016957, 0.245361 ], [154, -4583.490000, 0.069362, 0.000007, 0.245370 ], [171, -4583.490000, 0.069331, 0.000008, 0.244944 ] ], "n": ["FDJVGXF01EG76B" ] }, {"p": [[158, -4581.990000, 0.311999, 0.004914, 0.291159 ], [159, -4582.470000, 0.191965, 0.011552, 0.311146 ], [160, -4582.470000, 0.191879, 0.000007, 0.311139 ], [149, -4583.160000, 0.096084, 0.045181, 0.225341 ], [150, -4583.490000, 0.069380, 0.016957, 0.245361 ], [154, -4583.490000, 0.069362, 0.000007, 0.245370 ], [171, -4583.490000, 0.069331, 0.000008, 0.244944 ] ], "n": ["FDJVGXF01A0XE2" ] }, {"p": [[158, -5813.630000, 0.945899, 0.001957, 0.059647 ], [160, -5817.060000, 0.030814, 0.002770, 0.064356 ], [159, -5817.340000, 0.023287, 0.006775, 0.066761 ] ], "n": ["FDJVGXF01COJV0" ] }, {"p": [[159, -5370.700000, 0.889906, 0.004818, 0.006163 ], [160, -5373.270000, 0.067538, 0.000007, 0.009471 ], [165, -5374.820000, 0.014437, 0.007352, 0.012499 ], [166, -5374.820000, 0.014398, 0.000008, 0.012500 ], [161, -5374.870000, 0.013721, 0.032465, 0.012493 ] ], "n": ["FDJVGXF01B9JIG_rvcmp" ] }, {"p": [[159, -6998.240000, 0.928119, 0.004795, 0.004597 ], [160, -7000.970000, 0.060594, 0.000007, 0.006671 ], [165, -7002.650000, 0.011287, 0.007352, 0.009290 ] ], "n": ["FDJVGXF01CLVU7" ] }, {"p": [[159, -6998.240000, 0.928119, 0.004795, 0.004597 ], [160, -7000.970000, 0.060594, 0.000007, 0.006671 ], [165, -7002.650000, 0.011287, 0.007352, 0.009290 ] ], "n": ["FDJVGXF01EYURC" ] }, {"p": [[159, -6998.240000, 0.928119, 0.004795, 0.004597 ], [160, -7000.970000, 0.060594, 0.000007, 0.006671 ], [165, -7002.650000, 0.011287, 0.007352, 0.009290 ] ], "n": ["FDJVGXF01EVEMN" ] }, {"p": [[159, -6052.700000, 0.985910, 0.000530, 0.021940 ], [165, -6056.950000, 0.014090, 0.002472, 0.021961 ] ], "n": ["FDJVGXF01ARS8Z" ] }, {"p": [[159, -8542.780000, 0.932740, 0.001412, 0.018049 ], [169, -8546.430000, 0.024153, 0.005425, 0.014448 ], [155, -8546.910000, 0.014930, 0.012455, 0.018731 ], [157, -8546.920000, 0.014872, 0.000006, 0.018693 ], [168, -8547.030000, 0.013304, 0.003612, 0.018783 ] ], "n": ["FDJVGXF01CTDOF_rvcmp" ] }, {"p": [[159, -7568.320000, 0.990820, 0.001192, 0.016023 ], [165, -7573.000000, 0.009180, 0.003255, 0.015806 ] ], "n": ["FDJVGXF01DZWUU" ] }, {"p": [[159, -4955.890000, 0.812681, 0.000006, 0.020157 ], [167, -4957.970000, 0.101618, 0.018717, 0.018124 ], [165, -4958.970000, 0.037247, 0.003907, 0.023138 ], [169, -4959.320000, 0.026334, 0.012507, 0.015444 ], [157, -4960.560000, 0.007588, 0.005887, 0.026436 ], [168, -4960.560000, 0.007588, 0.003613, 0.026437 ], [155, -4960.650000, 0.006944, 0.012865, 0.026740 ] ], "n": ["FDJVGXF01ELR2H_rvcmp" ] }, {"p": [[159, -3443.790000, 0.621391, 0.000006, 0.009450 ], [154, -3444.800000, 0.225733, 0.017821, 0.000006 ], [169, -3445.240000, 0.144701, 0.017012, 0.000007 ], [150, -3448.120000, 0.008175, 0.000742, 0.019032 ] ], "n": ["FDJVGXF01DA570_rvcmp" ] }, {"p": [[159, -4066.730000, 0.713471, 0.000006, 0.008048 ], [169, -4067.850000, 0.231738, 0.014337, 0.000006 ], [165, -4070.780000, 0.012421, 0.005354, 0.008859 ], [157, -4070.890000, 0.011088, 0.005887, 0.010452 ], [168, -4070.890000, 0.011083, 0.003612, 0.010461 ], [160, -4070.980000, 0.010104, 0.007224, 0.010084 ], [166, -4070.990000, 0.010095, 0.000008, 0.010256 ] ], "n": ["FDJVGXF01BHCBT_rvcmp" ] }, {"p": [[159, -4947.330000, 0.918133, 0.000006, 0.006578 ], [165, -4951.390000, 0.015839, 0.005224, 0.006110 ], [155, -4951.540000, 0.013611, 0.010797, 0.008971 ], [157, -4951.540000, 0.013582, 0.005887, 0.007789 ], [168, -4951.540000, 0.013576, 0.003612, 0.007779 ], [160, -4951.600000, 0.012778, 0.005934, 0.005993 ], [166, -4951.620000, 0.012482, 0.000008, 0.007409 ] ], "n": ["FDJVGXF01BHKG4_rvcmp" ] }, {"p": [[159, -4061.620000, 0.995177, 0.000006, 0.000006 ], [169, -4066.950000, 0.004823, 0.013046, 0.000006 ] ], "n": ["FDJVGXF01AZOG4_rvcmp" ] }, {"p": [[160, -3727.940000, 0.613450, 0.004383, 0.060260 ], [158, -3729.420000, 0.139129, 0.014806, 0.069386 ], [159, -3729.630000, 0.112835, 0.011552, 0.073669 ], [169, -3730.300000, 0.057607, 0.012311, 0.036944 ], [164, -3730.710000, 0.038366, 0.012850, 0.050574 ], [161, -3731.320000, 0.020798, 0.029300, 0.054239 ], [165, -3731.480000, 0.017815, 0.000007, 0.058462 ] ], "n": ["FDJVGXF01B33FQ" ] }, {"p": [[160, -6455.770000, 0.162556, 0.003397, 0.228094 ], [165, -6455.830000, 0.152105, 0.003926, 0.228200 ], [159, -6455.900000, 0.142856, 0.009976, 0.230720 ], [158, -6455.910000, 0.141520, 0.017418, 0.230701 ], [166, -6455.940000, 0.136905, 0.000008, 0.232599 ], [168, -6455.970000, 0.132620, 0.000007, 0.232950 ], [164, -6455.980000, 0.131436, 0.020696, 0.228464 ] ], "n": ["FDJVGXF01DD617_rvcmp" ] }, {"p": [[160, -8788.090000, 0.628820, 0.002934, 0.040213 ], [158, -8789.180000, 0.210606, 0.015393, 0.042175 ], [159, -8789.460000, 0.160574, 0.011552, 0.043977 ] ], "n": ["FDJVGXF01D07AB_rvcmp" ] }, {"p": [[160, -8892.780000, 0.678355, 0.003001, 0.026701 ], [158, -8894.030000, 0.195054, 0.015228, 0.027971 ], [159, -8894.460000, 0.126591, 0.011552, 0.029900 ] ], "n": ["FDJVGXF01EU8BE" ] }, {"p": [[160, -8392.660000, 0.688401, 0.003007, 0.023981 ], [158, -8393.940000, 0.192038, 0.015204, 0.025171 ], [159, -8394.410000, 0.119562, 0.011551, 0.027245 ] ], "n": ["FDJVGXF01CW7IC_rvcmp" ] }, {"p": [[160, -7585.130000, 0.360042, 0.002066, 0.181552 ], [158, -7585.160000, 0.346508, 0.011388, 0.183853 ], [159, -7585.330000, 0.293450, 0.011199, 0.186653 ] ], "n": ["FDJVGXF01A424Q" ] }, {"p": [[160, -7192.250000, 0.211070, 0.000007, 0.004300 ], [159, -7192.250000, 0.210865, 0.011552, 0.004306 ], [169, -7192.480000, 0.166924, 0.004577, 0.000005 ], [165, -7192.940000, 0.105617, 0.007352, 0.004333 ], [166, -7192.940000, 0.105350, 0.000008, 0.004333 ], [164, -7192.990000, 0.100122, 0.020699, 0.004324 ], [161, -7192.990000, 0.100052, 0.032465, 0.004323 ] ], "n": ["FDJVGXF01ETJB9" ] }, {"p": [[161, -7291.310000, 0.373441, 0.026980, 0.156572 ], [164, -7291.650000, 0.266476, 0.017955, 0.159797 ], [165, -7291.780000, 0.233991, 0.000007, 0.162231 ], [166, -7293.600000, 0.038012, 0.001999, 0.176984 ], [168, -7293.600000, 0.037981, 0.000007, 0.176980 ], [155, -7293.770000, 0.032106, 0.004739, 0.175935 ], [157, -7294.350000, 0.017993, 0.005887, 0.179634 ] ], "n": ["FDJVGXF01EO8BI_rvcmp" ] }, {"p": [[161, -4994.790000, 0.700340, 0.026141, 0.006909 ], [165, -4996.610000, 0.113123, 0.000008, 0.014344 ], [164, -4996.610000, 0.113045, 0.020699, 0.014346 ], [159, -4997.540000, 0.044543, 0.000006, 0.020090 ], [169, -4997.970000, 0.028949, 0.015647, 0.004757 ] ], "n": ["FDJVGXF01ARGFQ_rvcmp" ] }, {"p": [[161, -8394.210000, 0.775393, 0.026397, 0.005462 ], [165, -8396.150000, 0.111314, 0.001053, 0.008620 ], [164, -8396.230000, 0.103015, 0.020699, 0.009275 ], [159, -8398.530000, 0.010278, 0.005966, 0.012148 ] ], "n": ["FDJVGXF01AS3FJ" ] }, {"p": [[161, -4982.390000, 0.905858, 0.025920, 0.000005 ], [165, -4985.350000, 0.047082, 0.000008, 0.003727 ], [164, -4985.350000, 0.047060, 0.020699, 0.003725 ] ], "n": ["FDJVGXF01DLG57" ] }, {"p": [[161, -4982.390000, 0.905858, 0.025920, 0.000005 ], [165, -4985.350000, 0.047082, 0.000008, 0.003727 ], [164, -4985.350000, 0.047060, 0.020699, 0.003725 ] ], "n": ["FDJVGXF01AEFP2" ] }, {"p": [[161, -4067.170000, 0.914465, 0.024982, 0.000005 ], [165, -4070.230000, 0.042773, 0.000008, 0.006456 ], [164, -4070.230000, 0.042762, 0.020699, 0.006455 ] ], "n": ["FDJVGXF01CYHI1_rvcmp" ] }, {"p": [[161, -4067.170000, 0.914465, 0.024982, 0.000005 ], [165, -4070.230000, 0.042773, 0.000008, 0.006456 ], [164, -4070.230000, 0.042762, 0.020699, 0.006455 ] ], "n": ["FDJVGXF01EBZRV_rvcmp" ] }, {"p": [[161, -3866.160000, 0.618062, 0.025090, 0.000005 ], [159, -3866.810000, 0.324682, 0.000006, 0.008524 ], [164, -3869.150000, 0.031186, 0.020699, 0.007315 ], [165, -3869.330000, 0.026070, 0.002816, 0.005999 ] ], "n": ["FDJVGXF01D1JBL" ] }, {"p": [[161, -3175.110000, 0.951152, 0.024236, 0.000006 ], [164, -3178.780000, 0.024435, 0.020699, 0.006992 ], [165, -3178.780000, 0.024413, 0.000007, 0.007003 ] ], "n": ["FDJVGXF01DQEP4_rvcmp" ] }, {"p": [[161, -4374.740000, 0.518755, 0.023666, 0.000007 ], [159, -4375.140000, 0.346898, 0.004411, 0.006254 ], [165, -4377.260000, 0.041486, 0.003676, 0.007237 ], [169, -4377.770000, 0.025039, 0.010859, 0.000009 ], [160, -4377.770000, 0.024864, 0.006981, 0.008990 ], [166, -4377.780000, 0.024816, 0.000008, 0.009402 ], [164, -4378.090000, 0.018142, 0.020699, 0.006849 ] ], "n": ["FDJVGXF01EKR2F" ] }, {"p": [[161, -7998.160000, 0.840548, 0.022222, 0.036180 ], [169, -8001.010000, 0.048555, 0.010237, 0.034509 ], [164, -8001.530000, 0.028973, 0.020699, 0.047130 ], [165, -8001.530000, 0.028956, 0.000007, 0.047128 ], [168, -8001.700000, 0.024439, 0.001107, 0.043464 ], [166, -8002.110000, 0.016195, 0.001999, 0.046240 ], [155, -8002.380000, 0.012336, 0.000006, 0.048614 ] ], "n": ["FDJVGXF01C2SQT_rvcmp" ] }, {"p": [[161, -6169.100000, 0.498806, 0.017709, 0.164975 ], [164, -6170.340000, 0.144797, 0.020699, 0.174954 ], [165, -6170.340000, 0.144726, 0.000007, 0.174961 ], [166, -6171.290000, 0.055755, 0.000008, 0.184401 ], [160, -6171.290000, 0.055702, 0.007381, 0.184409 ], [168, -6171.340000, 0.053375, 0.000007, 0.184722 ], [169, -6171.470000, 0.046840, 0.006367, 0.178465 ] ], "n": ["FDJVGXF01BWLKH_rvcmp" ] }, {"p": [[161, -9013.270000, 0.968884, 0.015180, 0.015739 ], [157, -9016.710000, 0.031116, 0.003472, 0.023588 ] ], "n": ["FDJVGXF01A1GA0" ] }, {"p": [[161, -8495.250000, 1.000000, 0.013932, 0.010939 ] ], "n": ["FDJVGXF01DQ8PK_rvcmp" ] }, {"p": [[161, -7047.640000, 0.619269, 0.013304, 0.162386 ], [165, -7049.590000, 0.088116, 0.000007, 0.175950 ], [164, -7049.590000, 0.088045, 0.020699, 0.175958 ], [160, -7050.090000, 0.053578, 0.007381, 0.182682 ], [166, -7050.090000, 0.053552, 0.000008, 0.182695 ], [159, -7050.110000, 0.052502, 0.000006, 0.183253 ], [167, -7050.260000, 0.044939, 0.033973, 0.184594 ] ], "n": ["FDJVGXF01B07MY" ] }, {"p": [[161, -5630.660000, 1.000000, 0.010894, 0.018145 ] ], "n": ["FDJVGXF01AS2WY_rvcmp" ] }, {"p": [[161, -4229.040000, 1.000000, 0.005904, 0.028610 ] ], "n": ["FDJVGXF01BA6QW_rvcmp" ] }, {"p": [[161, -3607.280000, 1.000000, 0.003628, 0.010436 ] ], "n": ["FDJVGXF01E2A59_rvcmp" ] }, {"p": [[161, -6206.450000, 0.552176, 0.000007, 0.005202 ], [156, -6207.750000, 0.149290, 0.043594, 0.005125 ], [157, -6207.750000, 0.149274, 0.000006, 0.005126 ], [155, -6207.750000, 0.149260, 0.012864, 0.005126 ] ], "n": ["FDJVGXF01A256J_rvcmp" ] }, {"p": [[162, -6838.770000, 0.975351, 0.004054, 0.013034 ], [164, -6842.450000, 0.024649, 0.007643, 0.008987 ] ], "n": ["FDJVGXF01DALMR" ] }, {"p": [[162, -4723.890000, 0.343597, 0.000005, 0.234764 ], [163, -4723.890000, 0.343050, 0.000007, 0.234767 ], [164, -4724.490000, 0.189588, 0.000005, 0.246051 ], [150, -4725.550000, 0.065657, 0.000008, 0.274790 ], [161, -4725.880000, 0.047070, 0.015729, 0.251220 ], [201, -4727.800000, 0.006878, 0.000009, 0.251761 ], [202, -4728.310000, 0.004161, 0.061774, 0.258122 ] ], "n": ["FDJVGXF01D4YQ1" ] }, {"p": [[162, -4722.670000, 0.337342, 0.000005, 0.225788 ], [163, -4722.670000, 0.336806, 0.000007, 0.225792 ], [164, -4723.290000, 0.180915, 0.000005, 0.236769 ], [150, -4724.420000, 0.058523, 0.000008, 0.265070 ], [161, -4724.700000, 0.044396, 0.015557, 0.240610 ], [165, -4725.350000, 0.022983, 0.000007, 0.267900 ], [154, -4725.540000, 0.019034, 0.000007, 0.271727 ] ], "n": ["FDJVGXF01B27AA" ] }, {"p": [[164, -7527.090000, 0.255544, 0.014989, 0.129580 ], [155, -7527.300000, 0.206866, 0.004847, 0.133944 ], [161, -7527.450000, 0.178279, 0.029713, 0.133233 ], [165, -7527.680000, 0.141941, 0.000007, 0.135995 ], [157, -7528.280000, 0.077262, 0.000006, 0.137809 ], [166, -7528.380000, 0.070078, 0.001999, 0.142445 ], [168, -7528.380000, 0.070030, 0.000007, 0.142445 ] ], "n": ["FDJVGXF01C3PES_rvcmp" ] }, {"p": [[164, -7151.620000, 0.295355, 0.014941, 0.123827 ], [161, -7152.000000, 0.201714, 0.029693, 0.127686 ], [165, -7152.250000, 0.158200, 0.000007, 0.130662 ], [155, -7152.370000, 0.139764, 0.004880, 0.131964 ], [166, -7152.970000, 0.076587, 0.001999, 0.137476 ], [168, -7152.970000, 0.076512, 0.000007, 0.137479 ], [157, -7153.360000, 0.051868, 0.000006, 0.135897 ] ], "n": ["FDJVGXF01DLGO6_rvcmp" ] }, {"p": [[164, -3757.020000, 0.503438, 0.013914, 0.009277 ], [169, -3757.830000, 0.225570, 0.012326, 0.000006 ], [161, -3758.360000, 0.132759, 0.032465, 0.014534 ], [165, -3758.360000, 0.132641, 0.000007, 0.014536 ], [168, -3761.520000, 0.005593, 0.003612, 0.026007 ] ], "n": ["FDJVGXF01C6KKI" ] }, {"p": [[164, -5683.770000, 0.825483, 0.012195, 0.005991 ], [155, -5685.320000, 0.174517, 0.008300, 0.011393 ] ], "n": ["FDJVGXF01D97BL_rvcmp" ] }, {"p": [[164, -5683.770000, 0.825483, 0.012195, 0.005991 ], [155, -5685.320000, 0.174517, 0.008300, 0.011393 ] ], "n": ["FDJVGXF01D4VRH_rvcmp" ] }, {"p": [[164, -5550.060000, 0.900699, 0.007894, 0.012676 ], [162, -5553.160000, 0.040709, 0.010708, 0.022973 ], [163, -5553.160000, 0.040651, 0.006754, 0.022974 ], [155, -5553.980000, 0.017941, 0.006009, 0.024389 ] ], "n": ["FDJVGXF01BUGF0_rvcmp" ] }, {"p": [[165, -5414.350000, 0.229090, 0.005750, 0.000006 ], [166, -5414.520000, 0.194957, 0.000008, 0.000006 ], [160, -5414.520000, 0.194827, 0.007381, 0.000006 ], [167, -5414.600000, 0.179701, 0.033973, 0.000006 ], [168, -5414.600000, 0.179649, 0.000007, 0.000006 ], [169, -5417.160000, 0.013819, 0.000006, 0.000006 ], [158, -5417.710000, 0.007958, 0.017418, 0.002107 ] ], "n": ["FDJVGXF01DXHE5_rvcmp" ] }, {"p": [[165, -6176.870000, 0.421826, 0.005089, 0.016222 ], [167, -6177.570000, 0.207874, 0.026670, 0.016546 ], [168, -6178.180000, 0.113803, 0.000007, 0.018092 ], [166, -6178.180000, 0.113776, 0.001999, 0.018094 ], [160, -6179.040000, 0.048156, 0.005415, 0.021215 ], [158, -6179.050000, 0.047294, 0.017418, 0.022042 ], [159, -6179.050000, 0.047272, 0.011552, 0.022042 ] ], "n": ["FDJVGXF01D027R_rvcmp" ] }, {"p": [[165, -6501.580000, 0.177577, 0.003466, 0.193929 ], [164, -6501.730000, 0.153458, 0.020699, 0.194264 ], [161, -6501.730000, 0.153396, 0.032465, 0.194270 ], [166, -6501.760000, 0.148655, 0.000008, 0.198777 ], [160, -6501.760000, 0.148504, 0.007381, 0.198776 ], [168, -6501.790000, 0.144317, 0.000007, 0.199009 ], [169, -6502.460000, 0.074094, 0.009563, 0.190624 ] ], "n": ["FDJVGXF01E3DCK_rvcmp" ] }, {"p": [[167, -7282.000000, 0.370541, 0.023082, 0.080586 ], [158, -7282.230000, 0.294312, 0.013941, 0.085157 ], [160, -7283.310000, 0.099315, 0.002620, 0.087322 ], [159, -7283.510000, 0.081898, 0.011552, 0.089460 ], [154, -7283.790000, 0.061892, 0.017615, 0.082518 ], [165, -7284.080000, 0.046049, 0.007352, 0.090987 ], [166, -7284.080000, 0.045993, 0.000008, 0.090994 ] ], "n": ["FDJVGXF01EGVNK_rvcmp" ] }, {"p": [[167, -7394.210000, 0.381657, 0.018893, 0.031414 ], [158, -7394.320000, 0.343279, 0.000009, 0.038715 ], [169, -7395.760000, 0.081009, 0.007403, 0.034166 ], [156, -7396.150000, 0.054934, 0.040755, 0.037894 ], [157, -7396.320000, 0.046602, 0.005887, 0.040976 ], [168, -7396.320000, 0.046539, 0.003613, 0.040977 ], [155, -7396.330000, 0.045979, 0.012864, 0.040981 ] ], "n": ["FDJVGXF01DE4E1" ] }, {"p": [[167, -7819.850000, 1.000000, 0.016748, 0.054861 ] ], "n": ["FDJVGXF01DDYJ5_rvcmp" ] }, {"p": [[167, -7819.850000, 1.000000, 0.016748, 0.054861 ] ], "n": ["FDJVGXF01ATROJ_rvcmp" ] }, {"p": [[167, -2380.180000, 0.552422, 0.017055, 0.033289 ], [23, -2381.930000, 0.096157, 0.000007, 0.050451 ], [24, -2381.930000, 0.096156, 0.000009, 0.050451 ], [158, -2382.330000, 0.063889, 0.008393, 0.062730 ], [159, -2382.330000, 0.063856, 0.005298, 0.062798 ], [160, -2382.340000, 0.063825, 0.000007, 0.062847 ], [166, -2382.340000, 0.063695, 0.000008, 0.062759 ] ], "n": ["FDJVGXF01AJDEO_rvcmp" ] }, {"p": [[167, -8252.900000, 1.000000, 0.016413, 0.037819 ] ], "n": ["FDJVGXF01BSD6A" ] }, {"p": [[167, -7793.760000, 1.000000, 0.013598, 0.039140 ] ], "n": ["FDJVGXF01DYDVU" ] }, {"p": [[167, -6294.240000, 0.474035, 0.000008, 1.391180 ], [26, -6295.260000, 0.171650, 0.024915, 1.742300 ], [73, -6296.060000, 0.076706, 0.028578, 1.607230 ], [72, -6296.140000, 0.071414, 0.263281, 1.638850 ], [71, -6296.140000, 0.071409, 0.079029, 1.638870 ], [148, -6296.190000, 0.067394, 0.148117, 1.462050 ], [127, -6296.190000, 0.067392, 0.040911, 1.462060 ] ], "n": ["FDJVGXF01BGO8N_rvcmp" ] }, {"p": [[168, -8106.150000, 0.373918, 0.002754, 0.016079 ], [169, -8106.440000, 0.278475, 0.001721, 0.014961 ], [157, -8106.470000, 0.272040, 0.005887, 0.016372 ], [156, -8108.830000, 0.025702, 0.043598, 0.018777 ], [155, -8108.830000, 0.025691, 0.012865, 0.018779 ], [166, -8109.190000, 0.017861, 0.001999, 0.019159 ], [165, -8110.230000, 0.006313, 0.004985, 0.018711 ] ], "n": ["FDJVGXF01CA81S_rvcmp" ] }, {"p": [[168, -7808.700000, 0.391834, 0.002737, 0.008242 ], [169, -7809.060000, 0.274885, 0.000005, 0.008441 ], [157, -7809.060000, 0.274839, 0.005887, 0.008441 ], [156, -7811.660000, 0.020309, 0.043598, 0.010116 ], [155, -7811.660000, 0.020296, 0.012864, 0.010110 ], [166, -7812.130000, 0.012696, 0.001999, 0.010662 ], [165, -7813.040000, 0.005142, 0.005116, 0.009763 ] ], "n": ["FDJVGXF01C1PAH" ] }, {"p": [[168, -6793.990000, 0.401006, 0.002720, 0.004654 ], [169, -6794.370000, 0.274802, 0.000005, 0.004850 ], [157, -6794.370000, 0.274732, 0.005887, 0.004851 ], [156, -6797.130000, 0.017287, 0.043598, 0.006315 ], [155, -6797.140000, 0.017274, 0.012864, 0.006316 ], [166, -6797.650000, 0.010315, 0.001999, 0.006838 ], [165, -6798.460000, 0.004584, 0.005176, 0.005758 ] ], "n": ["FDJVGXF01BIS5A" ] }, {"p": [[168, -7944.410000, 0.403745, 0.002713, 0.003873 ], [169, -7944.790000, 0.274686, 0.000005, 0.004038 ], [157, -7944.790000, 0.274629, 0.005887, 0.004038 ], [156, -7947.610000, 0.016425, 0.043598, 0.005104 ], [155, -7947.610000, 0.016414, 0.012864, 0.005105 ], [166, -7948.140000, 0.009662, 0.001999, 0.005427 ], [165, -7948.920000, 0.004439, 0.005207, 0.004606 ] ], "n": ["FDJVGXF01DT4AR_rvcmp" ] }, {"p": [[168, -5481.210000, 0.393179, 0.002123, 0.005606 ], [169, -5481.880000, 0.201446, 0.000007, 0.005637 ], [157, -5481.880000, 0.201366, 0.005887, 0.005639 ], [156, -5482.230000, 0.142326, 0.034851, 0.000006 ], [166, -5483.060000, 0.061683, 0.001999, 0.008571 ] ], "n": ["FDJVGXF01CK4HZ_rvcmp" ] }, {"p": [[168, -6783.890000, 0.453762, 0.002085, 0.004608 ], [169, -6784.590000, 0.226440, 0.000005, 0.004715 ], [157, -6784.590000, 0.226282, 0.005887, 0.004719 ], [166, -6785.810000, 0.066451, 0.001999, 0.006491 ], [156, -6787.400000, 0.013538, 0.043598, 0.005994 ], [155, -6787.410000, 0.013527, 0.012864, 0.005995 ] ], "n": ["FDJVGXF01CWS9R_rvcmp" ] }, {"p": [[168, -7205.520000, 0.333633, 0.002093, 0.004340 ], [169, -7205.710000, 0.276059, 0.011517, 0.000006 ], [170, -7206.210000, 0.166604, 0.000009, 0.000006 ], [157, -7206.220000, 0.166329, 0.005887, 0.004433 ], [166, -7207.470000, 0.047606, 0.001999, 0.006080 ], [156, -7209.050000, 0.009769, 0.043598, 0.005603 ] ], "n": ["FDJVGXF01E3W9Q_rvcmp" ] }, {"p": [[168, -7376.950000, 0.380124, 0.002136, 0.004098 ], [169, -7377.620000, 0.194927, 0.000007, 0.004057 ], [157, -7377.620000, 0.194834, 0.005887, 0.004058 ], [156, -7377.710000, 0.178257, 0.034979, 0.000006 ], [166, -7378.940000, 0.051859, 0.001999, 0.006018 ] ], "n": ["FDJVGXF01BZPLE" ] }, {"p": [[168, -7243.450000, 0.474199, 0.002101, 0.000009 ], [169, -7244.170000, 0.230915, 0.000005, 0.000007 ], [157, -7244.170000, 0.230721, 0.005887, 0.000009 ], [166, -7245.850000, 0.043342, 0.001999, 0.000006 ], [156, -7247.270000, 0.010420, 0.043598, 0.000006 ], [155, -7247.270000, 0.010403, 0.012864, 0.000009 ] ], "n": ["FDJVGXF01EVTOH_rvcmp" ] }, {"p": [[168, -7243.450000, 0.474199, 0.002101, 0.000009 ], [169, -7244.170000, 0.230915, 0.000005, 0.000007 ], [157, -7244.170000, 0.230721, 0.005887, 0.000009 ], [166, -7245.850000, 0.043342, 0.001999, 0.000006 ], [156, -7247.270000, 0.010420, 0.043598, 0.000006 ], [155, -7247.270000, 0.010403, 0.012864, 0.000009 ] ], "n": ["FDJVGXF01D7MRO" ] }, {"p": [[168, -7243.450000, 0.474199, 0.002101, 0.000009 ], [169, -7244.170000, 0.230915, 0.000005, 0.000007 ], [157, -7244.170000, 0.230721, 0.005887, 0.000009 ], [166, -7245.850000, 0.043342, 0.001999, 0.000006 ], [156, -7247.270000, 0.010420, 0.043598, 0.000006 ], [155, -7247.270000, 0.010403, 0.012864, 0.000009 ] ], "n": ["FDJVGXF01A8SQ3" ] }, {"p": [[168, -7243.450000, 0.474199, 0.002101, 0.000009 ], [169, -7244.170000, 0.230915, 0.000005, 0.000007 ], [157, -7244.170000, 0.230721, 0.005887, 0.000009 ], [166, -7245.850000, 0.043342, 0.001999, 0.000006 ], [156, -7247.270000, 0.010420, 0.043598, 0.000006 ], [155, -7247.270000, 0.010403, 0.012864, 0.000009 ] ], "n": ["FDJVGXF01CEVXD" ] }, {"p": [[168, -7341.430000, 0.501062, 0.001912, 0.000009 ], [169, -7342.290000, 0.212390, 0.000005, 0.000007 ], [157, -7342.290000, 0.212203, 0.005887, 0.000009 ], [166, -7343.660000, 0.053927, 0.001896, 0.000006 ], [156, -7345.260000, 0.010879, 0.039706, 0.000006 ], [155, -7345.390000, 0.009539, 0.012864, 0.000009 ] ], "n": ["FDJVGXF01CCEGB_rvcmp" ] }, {"p": [[168, -7469.280000, 0.508581, 0.001867, 0.000009 ], [169, -7470.180000, 0.208215, 0.000005, 0.000007 ], [157, -7470.180000, 0.208120, 0.005887, 0.000009 ], [166, -7471.470000, 0.056820, 0.001895, 0.000006 ], [156, -7473.300000, 0.009198, 0.042695, 0.000006 ], [155, -7473.310000, 0.009065, 0.012864, 0.000009 ] ], "n": ["FDJVGXF01B6BK0" ] }, {"p": [[168, -7469.280000, 0.508581, 0.001867, 0.000009 ], [169, -7470.180000, 0.208215, 0.000005, 0.000007 ], [157, -7470.180000, 0.208120, 0.005887, 0.000009 ], [166, -7471.470000, 0.056820, 0.001895, 0.000006 ], [156, -7473.300000, 0.009198, 0.042695, 0.000006 ], [155, -7473.310000, 0.009065, 0.012864, 0.000009 ] ], "n": ["FDJVGXF01AP6X8_rvcmp" ] }, {"p": [[169, -9192.910000, 0.669984, 0.019992, 0.099478 ], [170, -9194.330000, 0.162186, 0.000009, 0.101826 ], [154, -9194.330000, 0.162120, 0.030340, 0.101833 ], [149, -9197.670000, 0.005710, 0.045329, 0.084529 ] ], "n": ["FDJVGXF01DR66X_rvcmp" ] }, {"p": [[169, -8322.520000, 0.725974, 0.015607, 0.008671 ], [154, -8324.190000, 0.137148, 0.030340, 0.010608 ], [170, -8324.190000, 0.136878, 0.000009, 0.010610 ] ], "n": ["FDJVGXF01BYRHV_rvcmp" ] }, {"p": [[169, -7221.840000, 0.453381, 0.015762, 0.000006 ], [170, -7222.260000, 0.299408, 0.004074, 0.000005 ], [156, -7222.540000, 0.225109, 0.021859, 0.003763 ], [171, -7225.070000, 0.018045, 0.000008, 0.002259 ], [157, -7226.560000, 0.004057, 0.004604, 0.005047 ] ], "n": ["FDJVGXF01DLFZ5_rvcmp" ] }, {"p": [[169, -5560.040000, 0.726153, 0.013593, 0.023332 ], [164, -5561.700000, 0.137767, 0.012782, 0.033840 ], [156, -5563.010000, 0.037181, 0.043598, 0.044062 ], [157, -5563.010000, 0.037159, 0.000006, 0.044061 ], [155, -5563.010000, 0.037158, 0.012865, 0.044061 ], [165, -5563.430000, 0.024581, 0.000007, 0.043237 ] ], "n": ["FDJVGXF01CW0CE_rvcmp" ] }, {"p": [[169, -5223.070000, 0.447610, 0.013991, 0.018289 ], [154, -5223.590000, 0.267726, 0.022877, 0.018556 ], [170, -5224.300000, 0.131798, 0.000009, 0.022347 ], [163, -5224.330000, 0.127631, 0.000007, 0.030849 ], [168, -5226.850000, 0.010199, 0.003612, 0.023857 ], [160, -5226.990000, 0.008883, 0.000007, 0.032660 ], [164, -5227.360000, 0.006152, 0.013389, 0.028987 ] ], "n": ["FDJVGXF01BGLYC_rvcmp" ] }, {"p": [[169, -5223.070000, 0.447610, 0.013991, 0.018289 ], [154, -5223.590000, 0.267726, 0.022877, 0.018556 ], [170, -5224.300000, 0.131798, 0.000009, 0.022347 ], [163, -5224.330000, 0.127631, 0.000007, 0.030849 ], [168, -5226.850000, 0.010199, 0.003612, 0.023857 ], [160, -5226.990000, 0.008883, 0.000007, 0.032660 ], [164, -5227.360000, 0.006152, 0.013389, 0.028987 ] ], "n": ["FDJVGXF01B6IAB_rvcmp" ] }, {"p": [[169, -4842.470000, 0.372109, 0.014293, 0.000007 ], [154, -4842.950000, 0.230588, 0.024183, 0.000006 ], [159, -4843.210000, 0.177811, 0.000006, 0.013647 ], [170, -4843.320000, 0.158634, 0.000009, 0.000006 ], [156, -4844.930000, 0.031597, 0.038090, 0.007608 ], [167, -4845.700000, 0.014725, 0.030022, 0.009797 ], [168, -4845.710000, 0.014536, 0.003612, 0.009767 ] ], "n": ["FDJVGXF01A9RP7_rvcmp" ] }, {"p": [[169, -4842.470000, 0.372109, 0.014293, 0.000007 ], [154, -4842.950000, 0.230588, 0.024183, 0.000006 ], [159, -4843.210000, 0.177811, 0.000006, 0.013647 ], [170, -4843.320000, 0.158634, 0.000009, 0.000006 ], [156, -4844.930000, 0.031597, 0.038090, 0.007608 ], [167, -4845.700000, 0.014725, 0.030022, 0.009797 ], [168, -4845.710000, 0.014536, 0.003612, 0.009767 ] ], "n": ["FDJVGXF01CLCFZ_rvcmp" ] }, {"p": [[169, -4842.470000, 0.372109, 0.014293, 0.000007 ], [154, -4842.950000, 0.230588, 0.024183, 0.000006 ], [159, -4843.210000, 0.177811, 0.000006, 0.013647 ], [170, -4843.320000, 0.158634, 0.000009, 0.000006 ], [156, -4844.930000, 0.031597, 0.038090, 0.007608 ], [167, -4845.700000, 0.014725, 0.030022, 0.009797 ], [168, -4845.710000, 0.014536, 0.003612, 0.009767 ] ], "n": ["FDJVGXF01CZDGO_rvcmp" ] }, {"p": [[169, -5860.190000, 0.187111, 0.012970, 0.272142 ], [159, -5860.190000, 0.185780, 0.000006, 0.292178 ], [161, -5860.290000, 0.169015, 0.020089, 0.290334 ], [160, -5860.620000, 0.121356, 0.003502, 0.293666 ], [165, -5860.670000, 0.114941, 0.004630, 0.294351 ], [158, -5860.710000, 0.111391, 0.017422, 0.296263 ], [166, -5860.710000, 0.110405, 0.000008, 0.298244 ] ], "n": ["FDJVGXF01CH0SV" ] }, {"p": [[169, -5860.190000, 0.187111, 0.012970, 0.272142 ], [159, -5860.190000, 0.185780, 0.000006, 0.292178 ], [161, -5860.290000, 0.169015, 0.020089, 0.290334 ], [160, -5860.620000, 0.121356, 0.003502, 0.293666 ], [165, -5860.670000, 0.114941, 0.004630, 0.294351 ], [158, -5860.710000, 0.111391, 0.017422, 0.296263 ], [166, -5860.710000, 0.110405, 0.000008, 0.298244 ] ], "n": ["FDJVGXF01AYKEW" ] }, {"p": [[169, -5860.190000, 0.187111, 0.012970, 0.272142 ], [159, -5860.190000, 0.185780, 0.000006, 0.292178 ], [161, -5860.290000, 0.169015, 0.020089, 0.290334 ], [160, -5860.620000, 0.121356, 0.003502, 0.293666 ], [165, -5860.670000, 0.114941, 0.004630, 0.294351 ], [158, -5860.710000, 0.111391, 0.017422, 0.296263 ], [166, -5860.710000, 0.110405, 0.000008, 0.298244 ] ], "n": ["FDJVGXF01A24F8" ] }, {"p": [[169, -7135.180000, 0.372418, 0.013024, 0.001964 ], [168, -7135.600000, 0.245804, 0.002073, 0.013226 ], [157, -7136.240000, 0.128543, 0.005887, 0.013458 ], [170, -7136.320000, 0.118738, 0.000009, 0.000006 ], [156, -7136.740000, 0.078120, 0.023734, 0.011522 ], [166, -7137.070000, 0.056377, 0.001999, 0.016017 ] ], "n": ["FDJVGXF01A1M91_rvcmp" ] }, {"p": [[169, -6471.260000, 0.664118, 0.013160, 0.000008 ], [170, -6472.780000, 0.145363, 0.000009, 0.000084 ], [157, -6473.400000, 0.078067, 0.005887, 0.009379 ], [168, -6473.400000, 0.078001, 0.003613, 0.009378 ], [156, -6474.420000, 0.028150, 0.036582, 0.009421 ], [166, -6475.910000, 0.006301, 0.001668, 0.012321 ] ], "n": ["FDJVGXF01EG01C" ] }, {"p": [[169, -7083.240000, 0.697960, 0.012060, 0.027418 ], [167, -7085.190000, 0.099132, 0.019595, 0.030412 ], [158, -7085.540000, 0.069859, 0.000009, 0.039164 ], [154, -7085.740000, 0.057435, 0.025688, 0.028309 ], [170, -7085.910000, 0.048044, 0.000707, 0.028503 ], [157, -7087.130000, 0.014198, 0.004538, 0.039627 ], [159, -7087.190000, 0.013371, 0.005607, 0.036686 ] ], "n": ["FDJVGXF01BTULW" ] }, {"p": [[169, -5220.230000, 0.653058, 0.012382, 0.013599 ], [163, -5221.540000, 0.175109, 0.000007, 0.024457 ], [154, -5221.830000, 0.131600, 0.030340, 0.018308 ], [168, -5223.740000, 0.019418, 0.003612, 0.016044 ], [160, -5224.270000, 0.011504, 0.000007, 0.025924 ], [164, -5224.480000, 0.009312, 0.012209, 0.020770 ] ], "n": ["FDJVGXF01DD6V5_rvcmp" ] }, {"p": [[169, -7392.300000, 0.216786, 0.011305, 0.192696 ], [166, -7392.730000, 0.140588, 0.001999, 0.207593 ], [168, -7392.730000, 0.140459, 0.000007, 0.207590 ], [165, -7392.730000, 0.139881, 0.005758, 0.205348 ], [160, -7392.750000, 0.138113, 0.006370, 0.206129 ], [161, -7392.760000, 0.136381, 0.027043, 0.199712 ], [157, -7393.200000, 0.087792, 0.000006, 0.206582 ] ], "n": ["FDJVGXF01AG6LK_rvcmp" ] }, {"p": [[169, -8459.780000, 0.578540, 0.010578, 0.037236 ], [154, -8460.300000, 0.341665, 0.020053, 0.034242 ], [168, -8462.590000, 0.034693, 0.003612, 0.043790 ], [161, -8463.540000, 0.013435, 0.024284, 0.044690 ], [160, -8463.720000, 0.011245, 0.006055, 0.047821 ], [166, -8463.810000, 0.010230, 0.000282, 0.048569 ], [165, -8463.820000, 0.010192, 0.007352, 0.048516 ] ], "n": ["FDJVGXF01AM4AD_rvcmp" ] }, {"p": [[169, -4990.570000, 0.534162, 0.009642, 0.000009 ], [154, -4991.750000, 0.165442, 0.024687, 0.000006 ], [167, -4992.520000, 0.076062, 0.029173, 0.006073 ], [157, -4992.770000, 0.059599, 0.005887, 0.006505 ], [168, -4992.770000, 0.059585, 0.003613, 0.006504 ], [155, -4992.810000, 0.057312, 0.011294, 0.007654 ], [166, -4992.990000, 0.047838, 0.001999, 0.006817 ] ], "n": ["FDJVGXF01CTZ07_rvcmp" ] }, {"p": [[169, -4990.570000, 0.534162, 0.009642, 0.000009 ], [154, -4991.750000, 0.165442, 0.024687, 0.000006 ], [167, -4992.520000, 0.076062, 0.029173, 0.006073 ], [157, -4992.770000, 0.059599, 0.005887, 0.006505 ], [168, -4992.770000, 0.059585, 0.003613, 0.006504 ], [155, -4992.810000, 0.057312, 0.011294, 0.007654 ], [166, -4992.990000, 0.047838, 0.001999, 0.006817 ] ], "n": ["FDJVGXF01ELS0N_rvcmp" ] }, {"p": [[169, -5221.500000, 0.372691, 0.009266, 0.015173 ], [160, -5222.360000, 0.157881, 0.000007, 0.024789 ], [159, -5222.360000, 0.157733, 0.011552, 0.024789 ], [164, -5222.870000, 0.094793, 0.015388, 0.022994 ], [165, -5223.020000, 0.082068, 0.007352, 0.025005 ], [166, -5223.020000, 0.081880, 0.000008, 0.025006 ], [168, -5223.450000, 0.052955, 0.003612, 0.021364 ] ], "n": ["FDJVGXF01CU2T7_rvcmp" ] }, {"p": [[169, -7245.180000, 0.718688, 0.009227, 0.014142 ], [159, -7246.890000, 0.129591, 0.007927, 0.018815 ], [160, -7248.010000, 0.042390, 0.000007, 0.021796 ], [157, -7248.060000, 0.040165, 0.005887, 0.016048 ], [168, -7248.060000, 0.040150, 0.003613, 0.016057 ], [164, -7248.940000, 0.016658, 0.014353, 0.019064 ], [165, -7249.240000, 0.012358, 0.007352, 0.023266 ] ], "n": ["FDJVGXF01AGMX4_rvcmp" ] }, {"p": [[169, -7212.620000, 0.373919, 0.007352, 0.009064 ], [155, -7213.310000, 0.187631, 0.011303, 0.014999 ], [157, -7213.360000, 0.179038, 0.000006, 0.014947 ], [168, -7213.460000, 0.161489, 0.003613, 0.015025 ], [165, -7214.430000, 0.061505, 0.004066, 0.013150 ], [167, -7215.590000, 0.019251, 0.032083, 0.015305 ], [166, -7215.700000, 0.017167, 0.001999, 0.015890 ] ], "n": ["FDJVGXF01B0W9G_rvcmp" ] }, {"p": [[169, -7212.620000, 0.373919, 0.007352, 0.009064 ], [155, -7213.310000, 0.187631, 0.011303, 0.014999 ], [157, -7213.360000, 0.179038, 0.000006, 0.014947 ], [168, -7213.460000, 0.161489, 0.003613, 0.015025 ], [165, -7214.430000, 0.061505, 0.004066, 0.013150 ], [167, -7215.590000, 0.019251, 0.032083, 0.015305 ], [166, -7215.700000, 0.017167, 0.001999, 0.015890 ] ], "n": ["FDJVGXF01DPKAW_rvcmp" ] }, {"p": [[169, -7890.220000, 0.836287, 0.005637, 0.004195 ], [168, -7892.380000, 0.095821, 0.002767, 0.006554 ], [157, -7892.730000, 0.067892, 0.005887, 0.006678 ] ], "n": ["FDJVGXF01DDX2Q" ] }, {"p": [[169, -7890.220000, 0.836287, 0.005637, 0.004195 ], [168, -7892.380000, 0.095821, 0.002767, 0.006554 ], [157, -7892.730000, 0.067892, 0.005887, 0.006678 ] ], "n": ["FDJVGXF01BZ3K6" ] }, {"p": [[170, -3177.370000, 0.281475, 0.008380, 0.123334 ], [198, -3177.960000, 0.155176, 0.000006, 0.124473 ], [169, -3178.090000, 0.136259, 0.016880, 0.127857 ], [149, -3178.120000, 0.132837, 0.014240, 0.119503 ], [127, -3178.160000, 0.127962, 0.040911, 0.120931 ], [154, -3178.500000, 0.091291, 0.026654, 0.129278 ], [196, -3178.690000, 0.075001, 0.044805, 0.116176 ] ], "n": ["FDJVGXF01AJKD3" ] }, {"p": [[174, -7929.590000, 0.271058, 0.000006, 0.329694 ], [177, -7929.730000, 0.235609, 0.002254, 0.326993 ], [173, -7930.430000, 0.116828, 0.022616, 0.330974 ], [183, -7930.430000, 0.116799, 0.000009, 0.330961 ], [182, -7930.440000, 0.116754, 0.007651, 0.330975 ], [176, -7930.820000, 0.079138, 0.001771, 0.331855 ], [178, -7931.040000, 0.063813, 0.000008, 0.336649 ] ], "n": ["FDJVGXF01BJZDD" ] }, {"p": [[175, -3927.680000, 0.190319, 0.002821, 0.179142 ], [174, -3927.820000, 0.166400, 0.006047, 0.171038 ], [176, -3927.820000, 0.166369, 0.000006, 0.171032 ], [185, -3928.140000, 0.120812, 0.000001, 0.179373 ], [184, -3928.140000, 0.120793, 0.000001, 0.179367 ], [177, -3928.160000, 0.117690, 0.017452, 0.167512 ], [178, -3928.160000, 0.117617, 0.000008, 0.167514 ] ], "n": ["FDJVGXF01EC7MM" ] }, {"p": [[175, -3678.710000, 0.215352, 0.003486, 0.147520 ], [174, -3678.860000, 0.186902, 0.000005, 0.135223 ], [176, -3678.860000, 0.186412, 0.000006, 0.141269 ], [177, -3679.250000, 0.126622, 0.000008, 0.121227 ], [178, -3679.250000, 0.125667, 0.000008, 0.138677 ], [181, -3679.710000, 0.079523, 0.037176, 0.138259 ], [182, -3679.710000, 0.079522, 0.000007, 0.138252 ] ], "n": ["FDJVGXF01CV5NL" ] }, {"p": [[182, -7174.310000, 0.311206, 0.000007, 0.004305 ], [178, -7174.310000, 0.310757, 0.004073, 0.004305 ], [183, -7175.110000, 0.138948, 0.002135, 0.003858 ], [173, -7175.130000, 0.137370, 0.022616, 0.004331 ], [172, -7176.190000, 0.047495, 0.005527, 0.003972 ], [187, -7176.420000, 0.037531, 0.005300, 0.000056 ], [176, -7177.230000, 0.016692, 0.006160, 0.005217 ] ], "n": ["FDJVGXF01C64GQ_rvcmp" ] }, {"p": [[183, -8665.400000, 0.198031, 0.000009, 0.003816 ], [173, -8665.400000, 0.198023, 0.022616, 0.003807 ], [182, -8665.400000, 0.197603, 0.007651, 0.003815 ], [186, -8665.440000, 0.188943, 0.008949, 0.003867 ], [187, -8665.440000, 0.188873, 0.000005, 0.003867 ], [184, -8668.030000, 0.014264, 0.000001, 0.007556 ], [185, -8668.030000, 0.014264, 0.000001, 0.007556 ] ], "n": ["FDJVGXF01ED316_rvcmp" ] }, {"p": [[185, -3387.720000, 0.171275, 0.000001, 0.237838 ], [184, -3387.720000, 0.171252, 0.000001, 0.237842 ], [186, -3387.720000, 0.171098, 0.000009, 0.237846 ], [175, -3387.850000, 0.150387, 0.000005, 0.257219 ], [121, -3388.050000, 0.123056, 0.000005, 0.326285 ], [174, -3388.190000, 0.106483, 0.003468, 0.243596 ], [176, -3388.190000, 0.106450, 0.000006, 0.246176 ] ], "n": ["FDJVGXF01A2O3J" ] }, {"p": [[186, -5792.700000, 0.230693, 0.003018, 0.213319 ], [185, -5792.850000, 0.198883, 0.000001, 0.219276 ], [184, -5792.850000, 0.198852, 0.000001, 0.219276 ], [187, -5793.180000, 0.143783, 0.000005, 0.212270 ], [183, -5793.180000, 0.143703, 0.017940, 0.212274 ], [175, -5794.140000, 0.054627, 0.000005, 0.244408 ], [188, -5794.760000, 0.029459, 0.000006, 0.218280 ] ], "n": ["FDJVGXF01A3V1Q" ] }, {"p": [[188, -3644.130000, 0.345454, 0.048087, 0.043702 ], [189, -3644.190000, 0.327314, 0.096145, 0.044900 ], [190, -3644.190000, 0.327232, 0.000008, 0.044906 ] ], "n": ["FDJVGXF01C4DZ8" ] }, {"p": [[188, -6165.230000, 0.275797, 0.042962, 0.284427 ], [190, -6165.330000, 0.250360, 0.000008, 0.284607 ], [189, -6165.330000, 0.250352, 0.096145, 0.284599 ], [185, -6166.690000, 0.064387, 0.000001, 0.355524 ], [184, -6166.690000, 0.064382, 0.000001, 0.355522 ], [186, -6166.690000, 0.064360, 0.000009, 0.355502 ], [187, -6167.440000, 0.030362, 0.010168, 0.341888 ] ], "n": ["FDJVGXF01CE1QS" ] }, {"p": [[188, -8682.220000, 0.457407, 0.029949, 0.096016 ], [187, -8683.330000, 0.150678, 0.003342, 0.118691 ], [183, -8683.640000, 0.109921, 0.013947, 0.114423 ], [32, -8683.960000, 0.079919, 0.003944, 0.112708 ], [186, -8684.070000, 0.071587, 0.006865, 0.120508 ], [30, -8684.150000, 0.065864, 0.000006, 0.116524 ], [31, -8684.170000, 0.064624, 0.001925, 0.116524 ] ], "n": ["FDJVGXF01CAHH6" ] }, {"p": [[188, -7244.070000, 0.822138, 0.025533, 0.112825 ], [187, -7246.600000, 0.065583, 0.008328, 0.134491 ], [172, -7246.890000, 0.049158, 0.006306, 0.138336 ], [189, -7247.280000, 0.033277, 0.091953, 0.119600 ], [190, -7247.390000, 0.029844, 0.000008, 0.123507 ] ], "n": ["FDJVGXF01EIVTC" ] }, {"p": [[188, -4715.760000, 0.579848, 0.020031, 0.102407 ], [187, -4717.290000, 0.124698, 0.011025, 0.137579 ], [172, -4717.290000, 0.124641, 0.008421, 0.137572 ], [186, -4718.330000, 0.044225, 0.008949, 0.147261 ], [183, -4718.330000, 0.044225, 0.017940, 0.147267 ], [184, -4718.400000, 0.041182, 0.000001, 0.148401 ], [185, -4718.400000, 0.041182, 0.000001, 0.148401 ] ], "n": ["FDJVGXF01DTFHM" ] }, {"p": [[188, -6069.730000, 0.360069, 0.019094, 0.109199 ], [172, -6070.350000, 0.194647, 0.003487, 0.121334 ], [187, -6070.350000, 0.193736, 0.011025, 0.123791 ], [175, -6071.140000, 0.088305, 0.000005, 0.144535 ], [189, -6071.610000, 0.054841, 0.096145, 0.111549 ], [190, -6071.620000, 0.054817, 0.000008, 0.111557 ], [174, -6071.640000, 0.053584, 0.002409, 0.138643 ] ], "n": ["FDJVGXF01AP96B_rvcmp" ] }, {"p": [[189, -8343.920000, 0.334650, 0.095112, 0.106440 ], [188, -8343.930000, 0.332693, 0.052299, 0.107571 ], [190, -8343.930000, 0.332657, 0.000008, 0.107571 ] ], "n": ["FDJVGXF01EKTAN" ] }, {"p": [[189, -8343.920000, 0.334650, 0.095112, 0.106440 ], [188, -8343.930000, 0.332693, 0.052299, 0.107571 ], [190, -8343.930000, 0.332657, 0.000008, 0.107571 ] ], "n": ["FDJVGXF01CZOX5" ] }, {"p": [[189, -5357.470000, 0.256877, 0.079975, 0.291542 ], [190, -5357.560000, 0.235041, 0.000008, 0.300127 ], [188, -5357.560000, 0.235028, 0.052299, 0.300138 ], [28, -5358.590000, 0.083451, 0.028857, 0.275674 ], [33, -5358.810000, 0.067216, 0.009908, 0.284629 ], [34, -5358.880000, 0.062616, 0.000007, 0.286027 ], [40, -5358.920000, 0.059772, 0.042326, 0.284712 ] ], "n": ["FDJVGXF01CUTHQ_rvcmp" ] }, {"p": [[189, -5028.630000, 0.496925, 0.060065, 0.125921 ], [188, -5029.660000, 0.176477, 0.049689, 0.167948 ], [190, -5029.670000, 0.175538, 0.000008, 0.167992 ], [171, -5031.010000, 0.045759, 0.034630, 0.189987 ], [191, -5031.010000, 0.045756, 0.000008, 0.189989 ], [172, -5031.420000, 0.030322, 0.000008, 0.195077 ], [187, -5031.460000, 0.029221, 0.011025, 0.201555 ] ], "n": ["FDJVGXF01A0TPT_rvcmp" ] }, {"p": [[189, -7387.730000, 0.367287, 0.055119, 0.145803 ], [190, -7387.770000, 0.351275, 0.016253, 0.160867 ], [172, -7388.830000, 0.122234, 0.000008, 0.187072 ], [188, -7389.440000, 0.066555, 0.040161, 0.169049 ], [175, -7390.050000, 0.036093, 0.003837, 0.193222 ], [171, -7390.130000, 0.033358, 0.034630, 0.174744 ], [174, -7390.490000, 0.023197, 0.000006, 0.197038 ] ], "n": ["FDJVGXF01CTVOI_rvcmp" ] }, {"p": [[189, -5095.260000, 0.464567, 0.053150, 0.070470 ], [188, -5096.550000, 0.127012, 0.029332, 0.115562 ], [185, -5096.840000, 0.095293, 0.000001, 0.148383 ], [184, -5096.840000, 0.095280, 0.000001, 0.148381 ], [186, -5096.840000, 0.095190, 0.000009, 0.148382 ], [190, -5097.160000, 0.069398, 0.000008, 0.118083 ], [172, -5097.420000, 0.053259, 0.000009, 0.128967 ] ], "n": ["FDJVGXF01CIWVJ" ] }, {"p": [[189, -6941.490000, 0.713053, 0.000006, 1.999990 ], [71, -6944.100000, 0.052483, 0.000010, 1.999990 ], [70, -6944.100000, 0.052483, 0.564406, 1.999990 ], [98, -6944.160000, 0.049426, 0.013678, 1.999990 ], [88, -6944.170000, 0.048559, 0.021340, 1.999990 ], [113, -6944.310000, 0.042452, 0.130263, 1.999990 ], [90, -6944.330000, 0.041544, 0.000010, 1.999990 ] ], "n": ["FDJVGXF01CGWE1_rvcmp" ] }, {"p": [[190, -7637.670000, 0.276344, 0.031620, 0.139789 ], [171, -7637.690000, 0.271430, 0.034630, 0.141566 ], [191, -7637.690000, 0.271306, 0.000008, 0.141571 ], [40, -7638.440000, 0.128564, 0.068284, 0.135983 ], [192, -7639.480000, 0.045483, 0.000005, 0.149896 ], [189, -7642.060000, 0.003436, 0.096145, 0.140501 ], [188, -7642.060000, 0.003436, 0.052299, 0.140503 ] ], "n": ["FDJVGXF01E02JA_rvcmp" ] }, {"p": [[190, -7229.830000, 0.508442, 0.027584, 0.111889 ], [191, -7230.700000, 0.212408, 0.003718, 0.116181 ], [171, -7230.850000, 0.182623, 0.034630, 0.117763 ], [40, -7232.110000, 0.051814, 0.065332, 0.107648 ], [27, -7232.980000, 0.021779, 0.039995, 0.122742 ], [192, -7233.320000, 0.015543, 0.000005, 0.122788 ], [38, -7234.060000, 0.007391, 0.059467, 0.117012 ] ], "n": ["FDJVGXF01BQ9MS_rvcmp" ] }, {"p": [[190, -7916.610000, 0.350228, 0.028365, 0.081550 ], [171, -7916.750000, 0.306638, 0.034630, 0.084809 ], [191, -7916.750000, 0.306403, 0.000008, 0.084815 ], [192, -7919.350000, 0.022650, 0.006552, 0.090506 ], [39, -7919.830000, 0.014081, 0.025399, 0.093953 ] ], "n": ["FDJVGXF01ETFX3" ] }, {"p": [[190, -7911.990000, 0.360850, 0.027692, 0.075584 ], [171, -7912.170000, 0.302957, 0.034634, 0.079197 ], [191, -7912.170000, 0.302698, 0.000008, 0.079192 ], [192, -7914.840000, 0.020958, 0.006464, 0.084638 ], [39, -7915.350000, 0.012537, 0.025399, 0.088178 ] ], "n": ["FDJVGXF01CB1TY" ] }, {"p": [[190, -6176.770000, 0.274326, 0.026089, 0.217405 ], [191, -6176.870000, 0.248539, 0.000008, 0.225945 ], [171, -6176.870000, 0.248480, 0.034630, 0.225941 ], [40, -6177.460000, 0.137942, 0.058152, 0.225075 ], [192, -6178.410000, 0.053167, 0.000005, 0.242613 ], [188, -6179.450000, 0.018773, 0.052300, 0.215678 ], [189, -6179.450000, 0.018773, 0.096145, 0.215672 ] ], "n": ["FDJVGXF01AQAQI" ] }, {"p": [[190, -3618.850000, 0.289104, 0.025273, 0.037790 ], [191, -3619.460000, 0.157124, 0.015648, 0.053623 ], [40, -3619.460000, 0.157120, 0.086917, 0.053634 ], [192, -3619.460000, 0.157095, 0.000005, 0.053636 ], [171, -3619.640000, 0.130641, 0.034630, 0.049503 ], [39, -3620.280000, 0.068958, 0.018698, 0.054288 ], [196, -3620.830000, 0.039958, 0.023560, 0.048142 ] ], "n": ["FDJVGXF01D8GQZ" ] }, {"p": [[190, -6431.700000, 0.573840, 0.020809, 0.126641 ], [171, -6433.370000, 0.107847, 0.034634, 0.135002 ], [191, -6433.370000, 0.107788, 0.000008, 0.135015 ], [189, -6433.410000, 0.103842, 0.083864, 0.123373 ], [188, -6433.830000, 0.068301, 0.052299, 0.132098 ], [40, -6435.080000, 0.019488, 0.082859, 0.140923 ], [192, -6435.110000, 0.018893, 0.000005, 0.143749 ] ], "n": ["FDJVGXF01BN306_rvcmp" ] }, {"p": [[190, -3888.350000, 0.355813, 0.019974, 0.043650 ], [40, -3888.840000, 0.218453, 0.071189, 0.054377 ], [171, -3888.910000, 0.203287, 0.024237, 0.053349 ], [191, -3889.760000, 0.086864, 0.004923, 0.062474 ], [192, -3889.810000, 0.083127, 0.000005, 0.067262 ], [149, -3890.890000, 0.028091, 0.054288, 0.056863 ], [39, -3891.030000, 0.024365, 0.020409, 0.075061 ] ], "n": ["FDJVGXF01BWFPL_rvcmp" ] }, {"p": [[190, -7862.460000, 0.425013, 0.019147, 0.182590 ], [189, -7863.600000, 0.135627, 0.083940, 0.178570 ], [40, -7863.820000, 0.108870, 0.061066, 0.177801 ], [191, -7863.990000, 0.091733, 0.000008, 0.192241 ], [171, -7863.990000, 0.091705, 0.034630, 0.192238 ], [188, -7864.080000, 0.084005, 0.052299, 0.187065 ], [29, -7864.370000, 0.063046, 0.020048, 0.177041 ] ], "n": ["FDJVGXF01AT043_rvcmp" ] }, {"p": [[190, -7144.950000, 0.556633, 0.018208, 0.134278 ], [189, -7146.690000, 0.097611, 0.096145, 0.137838 ], [188, -7146.690000, 0.097590, 0.052299, 0.137840 ], [171, -7146.850000, 0.082700, 0.034630, 0.143942 ], [191, -7146.850000, 0.082690, 0.000008, 0.143940 ], [39, -7147.500000, 0.043305, 0.018414, 0.143402 ], [29, -7147.590000, 0.039470, 0.021226, 0.124935 ] ], "n": ["FDJVGXF01EAE9F" ] }, {"p": [[191, -7610.030000, 0.172028, 0.000008, 1.999990 ], [190, -7610.030000, 0.172024, 0.034335, 1.999990 ], [205, -7610.100000, 0.160367, 0.038635, 1.999990 ], [22, -7610.100000, 0.160215, 0.028187, 1.999990 ], [35, -7610.460000, 0.112108, 0.000006, 1.999990 ], [34, -7610.460000, 0.112101, 0.014780, 1.999990 ], [194, -7610.460000, 0.111159, 0.006696, 1.999990 ] ], "n": ["FDJVGXF01C04K5_rvcmp" ] }, {"p": [[192, -3797.630000, 0.192360, 0.011955, 0.055541 ], [189, -3797.660000, 0.187806, 0.050634, 0.000007 ], [190, -3797.700000, 0.179901, 0.009907, 0.043473 ], [188, -3797.810000, 0.160357, 0.052299, 0.043009 ], [193, -3798.320000, 0.096596, 0.004535, 0.063553 ], [40, -3798.330000, 0.095738, 0.078115, 0.047103 ], [191, -3798.420000, 0.087242, 0.008873, 0.054578 ] ], "n": ["FDJVGXF01EIKZ9" ] }, {"p": [[192, -6840.630000, 0.302017, 0.010746, 0.156983 ], [39, -6840.810000, 0.252684, 0.000006, 0.165704 ], [191, -6841.570000, 0.118872, 0.013262, 0.161706 ], [40, -6841.650000, 0.109800, 0.086918, 0.163476 ], [193, -6841.770000, 0.096868, 0.000008, 0.170236 ], [27, -6841.780000, 0.096003, 0.031526, 0.170789 ], [38, -6843.180000, 0.023757, 0.076823, 0.176156 ] ], "n": ["FDJVGXF01A1YA4" ] }, {"p": [[193, -5254.070000, 0.348177, 0.010077, 0.068733 ], [194, -5255.030000, 0.133231, 0.001511, 0.074084 ], [38, -5255.060000, 0.128736, 0.076823, 0.074117 ], [190, -5255.230000, 0.108675, 0.024823, 0.079069 ], [195, -5255.310000, 0.100883, 0.000009, 0.077128 ], [26, -5255.390000, 0.092402, 0.092211, 0.073043 ], [196, -5255.440000, 0.087898, 0.000010, 0.075427 ] ], "n": ["FDJVGXF01B9OVH" ] }, {"p": [[193, -9056.910000, 0.209920, 0.000567, 0.247451 ], [192, -9056.920000, 0.209471, 0.022464, 0.248140 ], [39, -9056.920000, 0.209412, 0.025399, 0.248135 ], [27, -9057.390000, 0.130202, 0.040960, 0.229604 ], [38, -9057.680000, 0.097617, 0.054710, 0.225241 ], [29, -9057.970000, 0.073388, 0.028567, 0.238493 ], [40, -9058.010000, 0.069990, 0.069742, 0.248019 ] ], "n": ["FDJVGXF01A9GJQ_rvcmp" ] }, {"p": [[195, -3942.400000, 0.332638, 0.007000, 0.094449 ], [196, -3942.620000, 0.265835, 0.003967, 0.092096 ], [35, -3943.690000, 0.091040, 0.013080, 0.110699 ], [22, -3943.750000, 0.086194, 0.013580, 0.069052 ], [226, -3943.790000, 0.082582, 0.014774, 0.078114 ], [170, -3943.950000, 0.070858, 0.018724, 0.091974 ], [149, -3943.950000, 0.070852, 0.063739, 0.091968 ] ], "n": ["FDJVGXF01AL8PP_rvcmp" ] }, {"p": [[196, -2039.470000, 0.196871, 0.077870, 0.123944 ], [199, -2039.470000, 0.196799, 0.013298, 0.124374 ], [167, -2039.660000, 0.162452, 0.000008, 0.099911 ], [197, -2039.790000, 0.142507, 0.024513, 0.132986 ], [198, -2039.790000, 0.142478, 0.013117, 0.132980 ], [170, -2040.060000, 0.108479, 0.011556, 0.095374 ], [171, -2040.830000, 0.050413, 0.006155, 0.103205 ] ], "n": ["FDJVGXF01BB3AB" ] }, {"p": [[196, -8415.230000, 0.333493, 0.078189, 0.094582 ], [200, -8415.230000, 0.333403, 0.000006, 0.094584 ], [199, -8415.230000, 0.333104, 0.013298, 0.094594 ] ], "n": ["FDJVGXF01EB7TH_rvcmp" ] }, {"p": [[196, -6944.330000, 0.282072, 0.073993, 0.062249 ], [199, -6944.470000, 0.246317, 0.013298, 0.066939 ], [200, -6944.470000, 0.246166, 0.000006, 0.066937 ], [198, -6945.130000, 0.126536, 0.009840, 0.070863 ], [197, -6945.460000, 0.091423, 0.024513, 0.072550 ], [152, -6947.960000, 0.007485, 0.021245, 0.066283 ] ], "n": ["FDJVGXF01CT8Y3_rvcmp" ] }, {"p": [[196, -7025.000000, 0.308301, 0.072808, 0.054051 ], [199, -7025.240000, 0.243291, 0.013298, 0.059999 ], [200, -7025.240000, 0.243153, 0.000006, 0.059997 ], [198, -7025.980000, 0.116193, 0.009824, 0.064048 ], [197, -7026.330000, 0.081561, 0.024513, 0.065661 ], [152, -7028.720000, 0.007500, 0.021274, 0.059018 ] ], "n": ["FDJVGXF01B6GF7" ] }, {"p": [[196, -8391.840000, 0.606154, 0.067784, 0.080409 ], [199, -8393.210000, 0.154844, 0.006848, 0.092559 ], [198, -8393.830000, 0.083075, 0.012632, 0.098469 ], [197, -8393.840000, 0.082071, 0.024513, 0.098926 ], [200, -8393.950000, 0.073856, 0.000006, 0.093069 ] ], "n": ["FDJVGXF01BUKAR" ] }, {"p": [[196, -7307.800000, 0.233857, 0.068361, 0.043145 ], [154, -7308.110000, 0.172324, 0.014500, 0.039653 ], [200, -7308.170000, 0.161206, 0.008413, 0.051574 ], [204, -7308.260000, 0.147579, 0.000010, 0.051803 ], [203, -7308.260000, 0.147486, 0.009988, 0.051802 ], [199, -7308.540000, 0.111651, 0.013298, 0.052841 ], [198, -7310.000000, 0.025897, 0.007680, 0.058203 ] ], "n": ["FDJVGXF01BHL3Q" ] }, {"p": [[196, -7895.370000, 0.664468, 0.066138, 0.086251 ], [199, -7897.000000, 0.130567, 0.007405, 0.100034 ], [200, -7897.600000, 0.071496, 0.000006, 0.100664 ], [198, -7897.670000, 0.066941, 0.012786, 0.106638 ], [197, -7897.670000, 0.066529, 0.024513, 0.106987 ] ], "n": ["FDJVGXF01BWVSY" ] }, {"p": [[196, -7882.360000, 0.815986, 0.060068, 0.051241 ], [198, -7884.780000, 0.072821, 0.000006, 0.073682 ], [204, -7885.020000, 0.057350, 0.007953, 0.064359 ], [200, -7885.950000, 0.022580, 0.007928, 0.068540 ], [203, -7886.240000, 0.016894, 0.009990, 0.070694 ], [199, -7886.400000, 0.014369, 0.013295, 0.070447 ] ], "n": ["FDJVGXF01BL3V3" ] }, {"p": [[196, -7751.170000, 0.715831, 0.059488, 0.069044 ], [198, -7752.910000, 0.124819, 0.000006, 0.090247 ], [204, -7753.510000, 0.068536, 0.007550, 0.081784 ], [200, -7754.260000, 0.032512, 0.008021, 0.086542 ], [203, -7754.470000, 0.026381, 0.009988, 0.088488 ], [199, -7754.630000, 0.022380, 0.013298, 0.088419 ], [202, -7755.490000, 0.009542, 0.053792, 0.082228 ] ], "n": ["FDJVGXF01ECD0V" ] }, {"p": [[196, -7872.820000, 0.724998, 0.059456, 0.067867 ], [198, -7874.620000, 0.119770, 0.000006, 0.088939 ], [204, -7875.200000, 0.067332, 0.007582, 0.080507 ], [200, -7875.960000, 0.031521, 0.008012, 0.085165 ], [203, -7876.170000, 0.025441, 0.009988, 0.087110 ], [199, -7876.330000, 0.021586, 0.013298, 0.087023 ], [202, -7877.170000, 0.009353, 0.053663, 0.080803 ] ], "n": ["FDJVGXF01E0AWL" ] }, {"p": [[196, -7779.080000, 0.757375, 0.059418, 0.063546 ], [198, -7781.040000, 0.106602, 0.000006, 0.085149 ], [204, -7781.540000, 0.064432, 0.007682, 0.076378 ], [200, -7782.340000, 0.028991, 0.007971, 0.081003 ], [203, -7782.570000, 0.022997, 0.009988, 0.083018 ], [199, -7782.730000, 0.019602, 0.013298, 0.082885 ] ], "n": ["FDJVGXF01COG51" ] }, {"p": [[196, -6811.450000, 0.608285, 0.058865, 0.054420 ], [198, -6813.040000, 0.124340, 0.000006, 0.076350 ], [204, -6813.470000, 0.080993, 0.018941, 0.070598 ], [25, -6813.470000, 0.080644, 0.014128, 0.070563 ], [205, -6813.480000, 0.080318, 0.000009, 0.070751 ], [206, -6815.320000, 0.012709, 0.000002, 0.081972 ], [207, -6815.320000, 0.012709, 0.000002, 0.081972 ] ], "n": ["FDJVGXF01BUJKY" ] }, {"p": [[196, -7795.520000, 0.841211, 0.058846, 0.051724 ], [198, -7798.110000, 0.063373, 0.000006, 0.074766 ], [204, -7798.370000, 0.048923, 0.007951, 0.065377 ], [200, -7799.290000, 0.019428, 0.007918, 0.069658 ], [203, -7799.580000, 0.014606, 0.009990, 0.071826 ], [199, -7799.740000, 0.012460, 0.013295, 0.071577 ] ], "n": ["FDJVGXF01DWJ78" ] }, {"p": [[196, -7795.520000, 0.841211, 0.058846, 0.051724 ], [198, -7798.110000, 0.063373, 0.000006, 0.074766 ], [204, -7798.370000, 0.048923, 0.007951, 0.065377 ], [200, -7799.290000, 0.019428, 0.007918, 0.069658 ], [203, -7799.580000, 0.014606, 0.009990, 0.071826 ], [199, -7799.740000, 0.012460, 0.013295, 0.071577 ] ], "n": ["FDJVGXF01AZF0B" ] }, {"p": [[196, -7831.760000, 0.844185, 0.058842, 0.051258 ], [198, -7834.370000, 0.061823, 0.000006, 0.074216 ], [204, -7834.620000, 0.048379, 0.007969, 0.064860 ], [200, -7835.550000, 0.019092, 0.007916, 0.069097 ], [203, -7835.830000, 0.014310, 0.009990, 0.071260 ], [199, -7835.990000, 0.012211, 0.013295, 0.071014 ] ], "n": ["FDJVGXF01B64PK" ] }, {"p": [[196, -7831.760000, 0.844185, 0.058842, 0.051258 ], [198, -7834.370000, 0.061823, 0.000006, 0.074216 ], [204, -7834.620000, 0.048379, 0.007969, 0.064860 ], [200, -7835.550000, 0.019092, 0.007916, 0.069097 ], [203, -7835.830000, 0.014310, 0.009990, 0.071260 ], [199, -7835.990000, 0.012211, 0.013295, 0.071014 ] ], "n": ["FDJVGXF01E3CZ5" ] }, {"p": [[196, -8192.880000, 0.471478, 0.055618, 0.052926 ], [204, -8193.770000, 0.194430, 0.005847, 0.063104 ], [20, -8194.220000, 0.123161, 0.000005, 0.058928 ], [200, -8194.490000, 0.094654, 0.012685, 0.068490 ], [21, -8195.340000, 0.040380, 0.000008, 0.059858 ], [19, -8195.340000, 0.040300, 0.012620, 0.059860 ], [22, -8195.470000, 0.035598, 0.000007, 0.059319 ] ], "n": ["FDJVGXF01CF8WG_rvcmp" ] }, {"p": [[196, -7975.070000, 0.966533, 0.055388, 0.050621 ], [198, -7978.800000, 0.023234, 0.000006, 0.077885 ], [204, -7979.620000, 0.010233, 0.004927, 0.069573 ] ], "n": ["FDJVGXF01EPGLV_rvcmp" ] }, {"p": [[196, -6569.210000, 0.765766, 0.054489, 0.052827 ], [204, -6571.240000, 0.100188, 0.004706, 0.062801 ], [200, -6571.780000, 0.058222, 0.012685, 0.069129 ], [203, -6571.790000, 0.058188, 0.009990, 0.069130 ], [199, -6572.980000, 0.017636, 0.013295, 0.072024 ] ], "n": ["FDJVGXF01AT5GT_rvcmp" ] }, {"p": [[196, -5370.700000, 0.436635, 0.052974, 0.075023 ], [198, -5370.910000, 0.353967, 0.000006, 0.094540 ], [206, -5372.980000, 0.044615, 0.000002, 0.102192 ], [207, -5372.980000, 0.044615, 0.000002, 0.102192 ], [208, -5372.980000, 0.044610, 0.000006, 0.102188 ], [25, -5373.140000, 0.037780, 0.014512, 0.096005 ], [205, -5373.140000, 0.037779, 0.000009, 0.096008 ] ], "n": ["FDJVGXF01C3NSG" ] }, {"p": [[196, -8719.270000, 0.567337, 0.052631, 0.049382 ], [22, -8720.650000, 0.142481, 0.014308, 0.045071 ], [204, -8720.780000, 0.125484, 0.005335, 0.064227 ], [200, -8721.390000, 0.068374, 0.012685, 0.068665 ], [203, -8721.390000, 0.068250, 0.009988, 0.068660 ], [205, -8722.280000, 0.028074, 0.023598, 0.047214 ] ], "n": ["FDJVGXF01BN5PL" ] }, {"p": [[196, -7803.190000, 0.806672, 0.052332, 0.028215 ], [20, -7805.360000, 0.092376, 0.000007, 0.050390 ], [202, -7806.130000, 0.042610, 0.045509, 0.035610 ], [204, -7806.300000, 0.035936, 0.008427, 0.044564 ], [22, -7807.380000, 0.012308, 0.007768, 0.047817 ], [21, -7807.570000, 0.010098, 0.000009, 0.053651 ] ], "n": ["FDJVGXF01BVKT9" ] }, {"p": [[196, -5745.580000, 0.353549, 0.050931, 0.030915 ], [204, -5745.730000, 0.303290, 0.012080, 0.036370 ], [22, -5746.860000, 0.098115, 0.005098, 0.045460 ], [20, -5746.920000, 0.092907, 0.000007, 0.050495 ], [21, -5747.090000, 0.078359, 0.017640, 0.048886 ], [19, -5747.270000, 0.065599, 0.012620, 0.050740 ], [25, -5749.350000, 0.008181, 0.008146, 0.042739 ] ], "n": ["FDJVGXF01C2JDD_rvcmp" ] }, {"p": [[196, -8242.410000, 0.583997, 0.049683, 0.072746 ], [203, -8243.890000, 0.133158, 0.005725, 0.088676 ], [204, -8244.250000, 0.092694, 0.003826, 0.086102 ], [201, -8244.380000, 0.081088, 0.019126, 0.092176 ], [200, -8244.540000, 0.069423, 0.012685, 0.090236 ], [197, -8245.420000, 0.028613, 0.014493, 0.090770 ], [199, -8246.380000, 0.011026, 0.012750, 0.093027 ] ], "n": ["FDJVGXF01D9HJO_rvcmp" ] }, {"p": [[196, -8038.070000, 0.918864, 0.050132, 0.044456 ], [202, -8040.690000, 0.066821, 0.041298, 0.050293 ], [204, -8042.230000, 0.014316, 0.005133, 0.063560 ] ], "n": ["FDJVGXF01EBN6A" ] }, {"p": [[196, -7679.720000, 0.989610, 0.049375, 0.063674 ], [204, -7684.280000, 0.010390, 0.005127, 0.079546 ] ], "n": ["FDJVGXF01C5GUR" ] }, {"p": [[196, -7670.960000, 1.000000, 0.048685, 0.041116 ] ], "n": ["FDJVGXF01D4XPV_rvcmp" ] }, {"p": [[196, -8078.700000, 1.000000, 0.048928, 0.033863 ] ], "n": ["FDJVGXF01A4UZP_rvcmp" ] }, {"p": [[196, -7474.630000, 0.928954, 0.047800, 0.069715 ], [204, -7478.120000, 0.028116, 0.003534, 0.086173 ], [200, -7478.390000, 0.021474, 0.012685, 0.090758 ], [203, -7478.390000, 0.021455, 0.009988, 0.090760 ] ], "n": ["FDJVGXF01C4RVK_rvcmp" ] }, {"p": [[196, -7532.940000, 0.398679, 0.045657, 0.097741 ], [149, -7533.140000, 0.326713, 0.045616, 0.092047 ], [171, -7534.090000, 0.126675, 0.012998, 0.109845 ], [170, -7534.680000, 0.070209, 0.012424, 0.116945 ], [169, -7535.130000, 0.044532, 0.015914, 0.130818 ], [154, -7535.830000, 0.022199, 0.024061, 0.125489 ], [199, -7536.530000, 0.010994, 0.008070, 0.116482 ] ], "n": ["FDJVGXF01A4Y5B_rvcmp" ] }, {"p": [[196, -7994.750000, 0.979357, 0.045617, 0.072077 ], [204, -7998.610000, 0.020643, 0.003313, 0.090534 ] ], "n": ["FDJVGXF01CQLPK_rvcmp" ] }, {"p": [[196, -7947.280000, 0.985993, 0.041945, 0.096325 ], [149, -7951.530000, 0.014007, 0.038269, 0.086603 ] ], "n": ["FDJVGXF01AZERP_rvcmp" ] }, {"p": [[196, -7588.490000, 1.000000, 0.041817, 0.047501 ] ], "n": ["FDJVGXF01AIBBG_rvcmp" ] }, {"p": [[196, -7586.010000, 1.000000, 0.041673, 0.041796 ] ], "n": ["FDJVGXF01CTFU5_rvcmp" ] }, {"p": [[196, -9418.490000, 1.000000, 0.040808, 0.042382 ] ], "n": ["FDJVGXF01BJKMV" ] }, {"p": [[196, -7418.430000, 1.000000, 0.040869, 0.024153 ] ], "n": ["FDJVGXF01EC135_rvcmp" ] }, {"p": [[196, -8900.320000, 0.332974, 0.040258, 0.060417 ], [20, -8900.970000, 0.173678, 0.003651, 0.066006 ], [21, -8901.080000, 0.156852, 0.017640, 0.063728 ], [18, -8901.080000, 0.156838, 0.051699, 0.063724 ], [22, -8901.080000, 0.156831, 0.000007, 0.063725 ], [19, -8903.000000, 0.022827, 0.012620, 0.069241 ] ], "n": ["FDJVGXF01BD9BV" ] }, {"p": [[196, -6592.640000, 0.236752, 0.038604, 0.096319 ], [203, -6592.920000, 0.179034, 0.005247, 0.109319 ], [197, -6593.050000, 0.158060, 0.014336, 0.105819 ], [202, -6593.270000, 0.126664, 0.061774, 0.113307 ], [204, -6593.310000, 0.121196, 0.003749, 0.106114 ], [200, -6593.540000, 0.096820, 0.012685, 0.111285 ], [26, -6593.710000, 0.081475, 0.084336, 0.095953 ] ], "n": ["FDJVGXF01AOPC8" ] }, {"p": [[196, -7887.050000, 0.968112, 0.039320, 0.059778 ], [149, -7890.470000, 0.031888, 0.044821, 0.057088 ] ], "n": ["FDJVGXF01CA7H0_rvcmp" ] }, {"p": [[196, -8495.110000, 0.849726, 0.038712, 0.048477 ], [208, -8497.850000, 0.054820, 0.020489, 0.082722 ], [209, -8497.970000, 0.048462, 0.000896, 0.083838 ], [205, -8498.000000, 0.046993, 0.038635, 0.084418 ] ], "n": ["FDJVGXF01B7DVG" ] }, {"p": [[196, -9384.040000, 1.000000, 0.039222, 0.041231 ] ], "n": ["FDJVGXF01D13RT" ] }, {"p": [[196, -9384.040000, 1.000000, 0.039222, 0.041231 ] ], "n": ["FDJVGXF01AGSBK" ] }, {"p": [[196, -9384.040000, 1.000000, 0.039222, 0.041231 ] ], "n": ["FDJVGXF01AGYM2" ] }, {"p": [[196, -8558.730000, 0.415073, 0.037620, 0.066634 ], [170, -8559.270000, 0.241544, 0.013808, 0.087106 ], [171, -8559.760000, 0.148802, 0.006358, 0.086306 ], [149, -8560.030000, 0.113128, 0.060948, 0.086444 ], [208, -8560.710000, 0.057419, 0.011475, 0.102047 ], [206, -8562.280000, 0.012017, 0.000001, 0.112930 ], [207, -8562.280000, 0.012017, 0.000001, 0.112930 ] ], "n": ["FDJVGXF01CDB8S_rvcmp" ] }, {"p": [[196, -7630.100000, 0.897359, 0.038423, 0.060341 ], [208, -7633.320000, 0.035617, 0.021369, 0.101280 ], [205, -7633.400000, 0.033049, 0.038635, 0.102705 ], [25, -7634.350000, 0.012788, 0.004566, 0.109487 ], [23, -7634.540000, 0.010594, 0.003604, 0.114978 ], [24, -7634.540000, 0.010594, 0.001125, 0.114980 ] ], "n": ["FDJVGXF01ESOTP" ] }, {"p": [[196, -8183.990000, 1.000000, 0.034859, 0.052921 ] ], "n": ["FDJVGXF01CEK8I" ] }, {"p": [[196, -8229.790000, 0.856147, 0.034116, 0.073813 ], [20, -8231.660000, 0.132701, 0.002161, 0.079774 ], [21, -8234.130000, 0.011151, 0.008414, 0.081824 ] ], "n": ["FDJVGXF01A21S9" ] }, {"p": [[196, -7958.090000, 0.848982, 0.034277, 0.072432 ], [20, -7959.900000, 0.139401, 0.002153, 0.078290 ], [21, -7962.380000, 0.011617, 0.008416, 0.080354 ] ], "n": ["FDJVGXF01CD822" ] }, {"p": [[196, -8860.900000, 0.662861, 0.034229, 0.063006 ], [20, -8861.690000, 0.300537, 0.002143, 0.068169 ], [21, -8864.230000, 0.023541, 0.008335, 0.069430 ], [22, -8864.820000, 0.013061, 0.000007, 0.071508 ] ], "n": ["FDJVGXF01C8CC6" ] }, {"p": [[196, -8941.080000, 0.673436, 0.034219, 0.062301 ], [20, -8941.880000, 0.302901, 0.002142, 0.067543 ], [21, -8944.430000, 0.023662, 0.008337, 0.068762 ] ], "n": ["FDJVGXF01BFWFZ_rvcmp" ] }, {"p": [[196, -8520.740000, 0.867317, 0.034115, 0.058830 ], [20, -8522.700000, 0.123012, 0.002140, 0.066185 ], [21, -8525.240000, 0.009671, 0.008451, 0.067383 ] ], "n": ["FDJVGXF01BIB4C_rvcmp" ] }, {"p": [[196, -8520.740000, 0.867317, 0.034115, 0.058830 ], [20, -8522.700000, 0.123012, 0.002140, 0.066185 ], [21, -8525.240000, 0.009671, 0.008451, 0.067383 ] ], "n": ["FDJVGXF01BIIFU_rvcmp" ] }, {"p": [[196, -9121.960000, 1.000000, 0.034209, 0.050494 ] ], "n": ["FDJVGXF01EFUI5" ] }, {"p": [[196, -8541.330000, 1.000000, 0.032329, 0.087571 ] ], "n": ["FDJVGXF01B77JO_rvcmp" ] }, {"p": [[196, -8895.140000, 0.547319, 0.031643, 0.063020 ], [20, -8895.440000, 0.404905, 0.002131, 0.067897 ], [21, -8898.020000, 0.030884, 0.008230, 0.069162 ], [22, -8898.620000, 0.016891, 0.000007, 0.071233 ] ], "n": ["FDJVGXF01AYCEV_rvcmp" ] }, {"p": [[196, -8895.140000, 0.547319, 0.031643, 0.063020 ], [20, -8895.440000, 0.404905, 0.002131, 0.067897 ], [21, -8898.020000, 0.030884, 0.008230, 0.069162 ], [22, -8898.620000, 0.016891, 0.000007, 0.071233 ] ], "n": ["FDJVGXF01CD86M" ] }, {"p": [[196, -8887.370000, 0.569150, 0.031610, 0.057491 ], [20, -8887.720000, 0.400866, 0.002124, 0.063238 ], [21, -8890.310000, 0.029984, 0.008249, 0.064241 ] ], "n": ["FDJVGXF01DSHXR" ] }, {"p": [[196, -8887.370000, 0.569150, 0.031610, 0.057491 ], [20, -8887.720000, 0.400866, 0.002124, 0.063238 ], [21, -8890.310000, 0.029984, 0.008249, 0.064241 ] ], "n": ["FDJVGXF01D0K44" ] }, {"p": [[196, -9116.970000, 0.576083, 0.031595, 0.055157 ], [20, -9117.350000, 0.394636, 0.002116, 0.061160 ], [21, -9119.950000, 0.029281, 0.008254, 0.062005 ] ], "n": ["FDJVGXF01C10A6" ] }, {"p": [[196, -9116.970000, 0.576083, 0.031595, 0.055157 ], [20, -9117.350000, 0.394636, 0.002116, 0.061160 ], [21, -9119.950000, 0.029281, 0.008254, 0.062005 ] ], "n": ["FDJVGXF01B28O0" ] }, {"p": [[196, -9116.970000, 0.576083, 0.031595, 0.055157 ], [20, -9117.350000, 0.394636, 0.002116, 0.061160 ], [21, -9119.950000, 0.029281, 0.008254, 0.062005 ] ], "n": ["FDJVGXF01D97CS" ] }, {"p": [[196, -9164.220000, 1.000000, 0.031867, 0.049981 ] ], "n": ["FDJVGXF01C3VYL" ] }, {"p": [[196, -8914.460000, 1.000000, 0.032293, 0.043262 ] ], "n": ["FDJVGXF01CWWBX_rvcmp" ] }, {"p": [[196, -8863.320000, 0.934798, 0.031135, 0.058639 ], [205, -8865.980000, 0.065202, 0.016827, 0.067802 ] ], "n": ["FDJVGXF01BNGHO_rvcmp" ] }, {"p": [[196, -8964.040000, 0.918543, 0.031002, 0.056659 ], [20, -8966.460000, 0.081457, 0.002129, 0.066740 ] ], "n": ["FDJVGXF01BVZKQ" ] }, {"p": [[196, -8964.040000, 0.918543, 0.031002, 0.056659 ], [20, -8966.460000, 0.081457, 0.002129, 0.066740 ] ], "n": ["FDJVGXF01C9MCQ" ] }, {"p": [[196, -5634.990000, 0.674862, 0.031027, 0.025869 ], [20, -5636.010000, 0.243426, 0.002565, 0.048538 ], [205, -5637.950000, 0.034893, 0.024064, 0.046664 ], [21, -5638.050000, 0.031494, 0.008441, 0.048607 ], [22, -5638.770000, 0.015325, 0.000007, 0.052321 ] ], "n": ["FDJVGXF01DGJ01_rvcmp" ] }, {"p": [[196, -7666.600000, 0.925944, 0.029582, 0.069010 ], [171, -7669.420000, 0.054793, 0.019332, 0.078507 ], [149, -7670.470000, 0.019264, 0.051115, 0.074932 ] ], "n": ["FDJVGXF01D4TZH_rvcmp" ] }, {"p": [[196, -7495.850000, 0.834743, 0.030405, 0.043397 ], [194, -7498.790000, 0.044172, 0.005468, 0.063123 ], [195, -7498.820000, 0.042697, 0.000009, 0.064093 ], [35, -7498.820000, 0.042686, 0.013080, 0.064093 ], [193, -7499.000000, 0.035702, 0.009011, 0.058959 ] ], "n": ["FDJVGXF01D1TYA_rvcmp" ] }, {"p": [[196, -7496.050000, 1.000000, 0.030478, 0.025669 ] ], "n": ["FDJVGXF01A0CI8_rvcmp" ] }, {"p": [[196, -7496.050000, 1.000000, 0.030478, 0.025669 ] ], "n": ["FDJVGXF01E4QCO_rvcmp" ] }, {"p": [[196, -7029.300000, 1.000000, 0.029397, 0.028968 ] ], "n": ["FDJVGXF01EJ8C2_rvcmp" ] }, {"p": [[196, -6640.670000, 1.000000, 0.029480, 0.027799 ] ], "n": ["FDJVGXF01EF44K" ] }, {"p": [[196, -7228.590000, 1.000000, 0.029399, 0.027380 ] ], "n": ["FDJVGXF01AY8F7_rvcmp" ] }, {"p": [[196, -7228.590000, 1.000000, 0.029399, 0.027380 ] ], "n": ["FDJVGXF01ETELX" ] }, {"p": [[196, -7025.560000, 1.000000, 0.029384, 0.025805 ] ], "n": ["FDJVGXF01CC9AF_rvcmp" ] }, {"p": [[196, -7025.560000, 1.000000, 0.029384, 0.025805 ] ], "n": ["FDJVGXF01DF8QT_rvcmp" ] }, {"p": [[196, -7095.660000, 1.000000, 0.029371, 0.025227 ] ], "n": ["FDJVGXF01CZZBW" ] }, {"p": [[196, -7284.440000, 1.000000, 0.029413, 0.023976 ] ], "n": ["FDJVGXF01AIUBY" ] }, {"p": [[196, -7399.670000, 1.000000, 0.029329, 0.023466 ] ], "n": ["FDJVGXF01C5A8J" ] }, {"p": [[196, -6057.010000, 1.000000, 0.028202, 0.031115 ] ], "n": ["FDJVGXF01BKZTI" ] }, {"p": [[196, -6260.970000, 1.000000, 0.028150, 0.030049 ] ], "n": ["FDJVGXF01BF7TV_rvcmp" ] }, {"p": [[196, -8454.130000, 1.000000, 0.026773, 0.024041 ] ], "n": ["FDJVGXF01ATVL8_rvcmp" ] }, {"p": [[196, -7755.640000, 1.000000, 0.026858, 0.021985 ] ], "n": ["FDJVGXF01DO2W6" ] }, {"p": [[196, -7755.640000, 1.000000, 0.026858, 0.021985 ] ], "n": ["FDJVGXF01CJ3JL_rvcmp" ] }, {"p": [[196, -7755.640000, 1.000000, 0.026858, 0.021985 ] ], "n": ["FDJVGXF01DMK5Z" ] }, {"p": [[196, -7755.640000, 1.000000, 0.026858, 0.021985 ] ], "n": ["FDJVGXF01B6KYY" ] }, {"p": [[196, -7755.640000, 1.000000, 0.026858, 0.021985 ] ], "n": ["FDJVGXF01AJJZ3" ] }, {"p": [[196, -7755.640000, 1.000000, 0.026858, 0.021985 ] ], "n": ["FDJVGXF01B9WO5" ] }, {"p": [[196, -8122.810000, 0.780265, 0.025961, 0.093228 ], [26, -8124.480000, 0.145857, 0.084244, 0.094682 ], [195, -8125.160000, 0.073878, 0.009446, 0.108314 ] ], "n": ["FDJVGXF01AIQNC" ] }, {"p": [[196, -8861.450000, 0.698950, 0.023903, 0.095178 ], [26, -8862.780000, 0.184308, 0.086885, 0.099182 ], [195, -8863.240000, 0.116742, 0.009446, 0.109808 ] ], "n": ["FDJVGXF01A347I_rvcmp" ] }, {"p": [[196, -9252.750000, 0.886171, 0.024262, 0.071528 ], [26, -9255.480000, 0.057735, 0.095171, 0.088236 ], [195, -9255.510000, 0.056094, 0.009446, 0.090404 ] ], "n": ["FDJVGXF01BE798" ] }, {"p": [[196, -6324.510000, 0.280741, 0.022989, 0.062607 ], [195, -6324.840000, 0.200769, 0.009446, 0.067110 ], [20, -6325.100000, 0.154630, 0.000007, 0.059758 ], [204, -6325.130000, 0.150066, 0.005420, 0.066547 ], [200, -6325.740000, 0.081656, 0.012685, 0.072823 ], [21, -6325.890000, 0.070682, 0.000009, 0.060646 ], [22, -6326.030000, 0.061456, 0.000007, 0.060017 ] ], "n": ["FDJVGXF01DLPQ3" ] }, {"p": [[196, -5960.580000, 0.286472, 0.018574, 0.060570 ], [195, -5960.820000, 0.225982, 0.009446, 0.064389 ], [20, -5961.010000, 0.186000, 0.000005, 0.056908 ], [21, -5961.800000, 0.084424, 0.000008, 0.057793 ], [19, -5961.800000, 0.084325, 0.012620, 0.057795 ], [22, -5961.930000, 0.074416, 0.000007, 0.057091 ], [204, -5962.170000, 0.058382, 0.005438, 0.068752 ] ], "n": ["FDJVGXF01CAM4D" ] }, {"p": [[196, -5479.100000, 0.894452, 0.018982, 0.025053 ], [34, -5481.980000, 0.050588, 0.009865, 0.046009 ], [35, -5482.290000, 0.036941, 0.002199, 0.046826 ], [195, -5483.010000, 0.018019, 0.006631, 0.043262 ] ], "n": ["FDJVGXF01D7LWG" ] }, {"p": [[196, -5550.620000, 0.896865, 0.018982, 0.024772 ], [34, -5553.520000, 0.049419, 0.009870, 0.045557 ], [35, -5553.830000, 0.036052, 0.002209, 0.046358 ], [195, -5554.550000, 0.017664, 0.006643, 0.042786 ] ], "n": ["FDJVGXF01DERCR_rvcmp" ] }, {"p": [[196, -5902.360000, 0.286914, 0.018495, 0.061145 ], [195, -5902.590000, 0.227063, 0.009446, 0.064956 ], [20, -5902.800000, 0.184999, 0.000005, 0.057365 ], [21, -5903.590000, 0.084066, 0.000008, 0.058264 ], [19, -5903.590000, 0.083967, 0.012620, 0.058266 ], [22, -5903.710000, 0.074039, 0.000007, 0.057563 ], [204, -5903.940000, 0.058954, 0.005408, 0.069379 ] ], "n": ["FDJVGXF01ELK3H" ] }, {"p": [[196, -9453.860000, 0.494183, 0.014874, 0.106815 ], [26, -9454.500000, 0.261761, 0.088692, 0.110801 ], [195, -9454.790000, 0.196052, 0.009446, 0.119177 ], [28, -9456.420000, 0.038186, 0.026172, 0.113917 ], [34, -9457.780000, 0.009818, 0.007910, 0.125393 ] ], "n": ["FDJVGXF01DFHEL" ] }, {"p": [[196, -9482.830000, 0.496849, 0.014933, 0.105759 ], [26, -9483.470000, 0.261599, 0.088581, 0.109664 ], [195, -9483.770000, 0.193916, 0.009446, 0.118106 ], [28, -9485.400000, 0.038019, 0.026156, 0.112877 ], [34, -9486.770000, 0.009616, 0.007911, 0.124295 ] ], "n": ["FDJVGXF01ALIXY" ] }, {"p": [[196, -9482.830000, 0.496849, 0.014933, 0.105759 ], [26, -9483.470000, 0.261599, 0.088581, 0.109664 ], [195, -9483.770000, 0.193916, 0.009446, 0.118106 ], [28, -9485.400000, 0.038019, 0.026156, 0.112877 ], [34, -9486.770000, 0.009616, 0.007911, 0.124295 ] ], "n": ["FDJVGXF01D8H6T" ] }, {"p": [[196, -9387.920000, 0.485203, 0.015187, 0.102023 ], [26, -9388.590000, 0.250003, 0.088174, 0.105752 ], [195, -9388.930000, 0.177872, 0.009446, 0.114704 ], [28, -9389.810000, 0.073822, 0.020649, 0.109569 ], [34, -9391.960000, 0.008545, 0.007880, 0.120995 ], [35, -9392.590000, 0.004556, 0.002539, 0.124361 ] ], "n": ["FDJVGXF01C6L6H" ] }, {"p": [[196, -9475.680000, 0.505960, 0.014752, 0.100541 ], [26, -9476.380000, 0.252033, 0.089165, 0.104730 ], [195, -9476.670000, 0.189387, 0.009446, 0.112895 ], [28, -9477.950000, 0.052620, 0.013743, 0.112319 ] ], "n": ["FDJVGXF01EEB9Z" ] }, {"p": [[196, -9486.900000, 0.506301, 0.014761, 0.100444 ], [26, -9487.600000, 0.252026, 0.089150, 0.104621 ], [195, -9487.880000, 0.189122, 0.009446, 0.112786 ], [28, -9489.160000, 0.052551, 0.013749, 0.112217 ] ], "n": ["FDJVGXF01EO7B2" ] }, {"p": [[196, -8179.640000, 0.601504, 0.013934, 0.045441 ], [195, -8180.310000, 0.307232, 0.009446, 0.051377 ], [204, -8181.960000, 0.058989, 0.014726, 0.058169 ], [23, -8183.020000, 0.020341, 0.000007, 0.065314 ], [205, -8183.560000, 0.011934, 0.010475, 0.054850 ] ], "n": ["FDJVGXF01CMLNU" ] }, {"p": [[196, -3778.790000, 0.228977, 0.013876, 0.018384 ], [27, -3779.200000, 0.152242, 0.063247, 0.029150 ], [195, -3779.250000, 0.145071, 0.005000, 0.031408 ], [26, -3779.300000, 0.136961, 0.097406, 0.029571 ], [35, -3779.310000, 0.136914, 0.013080, 0.034189 ], [194, -3779.310000, 0.136859, 0.006696, 0.034189 ], [38, -3780.080000, 0.062976, 0.076823, 0.035312 ] ], "n": ["FDJVGXF01A1DVC" ] }, {"p": [[196, -6577.830000, 0.320911, 0.012759, 0.114137 ], [28, -6578.130000, 0.237607, 0.004549, 0.123779 ], [26, -6578.190000, 0.225188, 0.086986, 0.118745 ], [195, -6578.440000, 0.175572, 0.009446, 0.127876 ], [20, -6580.930000, 0.014520, 0.004209, 0.148269 ], [22, -6580.970000, 0.013907, 0.008652, 0.142320 ], [18, -6581.100000, 0.012295, 0.044609, 0.140873 ] ], "n": ["FDJVGXF01EDE5P" ] }, {"p": [[196, -5331.250000, 0.354057, 0.006744, 0.070885 ], [195, -5331.280000, 0.344339, 0.009446, 0.072499 ], [20, -5332.420000, 0.110047, 0.000005, 0.064279 ], [21, -5333.190000, 0.050890, 0.000008, 0.065415 ], [19, -5333.190000, 0.050831, 0.012620, 0.065418 ], [22, -5333.290000, 0.045925, 0.000007, 0.064700 ], [204, -5333.340000, 0.043912, 0.005023, 0.078949 ] ], "n": ["FDJVGXF01CS2Q4_rvcmp" ] }, {"p": [[196, -4978.890000, 0.353148, 0.007254, 0.067571 ], [195, -4978.930000, 0.341698, 0.009446, 0.069411 ], [20, -4980.050000, 0.110976, 0.000005, 0.061052 ], [21, -4980.830000, 0.050920, 0.000008, 0.062189 ], [19, -4980.830000, 0.050860, 0.012620, 0.062192 ], [22, -4980.930000, 0.046203, 0.000007, 0.061390 ], [18, -4980.930000, 0.046195, 0.051699, 0.061396 ] ], "n": ["FDJVGXF01COYEX_rvcmp" ] }, {"p": [[196, -9167.130000, 0.208024, 0.006316, 0.139217 ], [226, -9167.180000, 0.199064, 0.021167, 0.129895 ], [26, -9167.290000, 0.177014, 0.096855, 0.145039 ], [195, -9167.290000, 0.176785, 0.009446, 0.145563 ], [2, -9167.890000, 0.097077, 0.036220, 0.133682 ], [227, -9167.890000, 0.097076, 0.012980, 0.133689 ], [27, -9168.660000, 0.044961, 0.067692, 0.146667 ] ], "n": ["FDJVGXF01DLNEP" ] }, {"p": [[197, -8447.030000, 0.208646, 0.024513, 0.749380 ], [199, -8447.030000, 0.208622, 0.000006, 0.749378 ], [198, -8447.030000, 0.208600, 0.013117, 0.749409 ], [196, -8447.440000, 0.138504, 0.075613, 0.783211 ], [200, -8447.450000, 0.136761, 0.000006, 0.791678 ], [14, -8448.300000, 0.058715, 0.086246, 0.762736 ], [202, -8448.680000, 0.040153, 0.000008, 0.691462 ] ], "n": ["FDJVGXF01DQXQU_rvcmp" ] }, {"p": [[197, -6663.900000, 0.297521, 0.016536, 0.043956 ], [199, -6664.280000, 0.203574, 0.011362, 0.045596 ], [200, -6664.300000, 0.199605, 0.000006, 0.045810 ], [196, -6664.300000, 0.199592, 0.078187, 0.045811 ], [198, -6664.990000, 0.099708, 0.010289, 0.049339 ] ], "n": ["FDJVGXF01DJ34Q_rvcmp" ] }, {"p": [[197, -7035.400000, 0.257529, 0.012650, 0.048986 ], [200, -7035.850000, 0.163002, 0.008172, 0.051254 ], [204, -7035.940000, 0.149490, 0.000010, 0.051214 ], [203, -7035.940000, 0.149361, 0.009988, 0.051219 ], [199, -7036.130000, 0.124039, 0.013298, 0.052927 ], [196, -7036.130000, 0.123851, 0.078185, 0.052926 ], [198, -7037.460000, 0.032728, 0.013117, 0.056221 ] ], "n": ["FDJVGXF01D4K0O_rvcmp" ] }, {"p": [[197, -4176.670000, 0.619937, 0.006774, 0.113861 ], [204, -4178.540000, 0.095505, 0.003499, 0.116593 ], [200, -4178.710000, 0.080421, 0.012685, 0.124730 ], [203, -4178.710000, 0.080381, 0.009989, 0.124730 ], [196, -4178.870000, 0.068847, 0.032200, 0.113438 ], [18, -4179.760000, 0.028295, 0.045531, 0.091709 ], [22, -4179.820000, 0.026615, 0.001715, 0.091447 ] ], "n": ["FDJVGXF01EANTM_rvcmp" ] }, {"p": [[198, -4102.340000, 0.471711, 0.000006, 0.109432 ], [196, -4102.470000, 0.414399, 0.047843, 0.091673 ], [226, -4105.000000, 0.033151, 0.028254, 0.101862 ], [17, -4105.140000, 0.028887, 0.049256, 0.104599 ], [206, -4105.650000, 0.017285, 0.000002, 0.131758 ], [207, -4105.650000, 0.017285, 0.000002, 0.131758 ], [208, -4105.650000, 0.017284, 0.000006, 0.131755 ] ], "n": ["FDJVGXF01CTI4R_rvcmp" ] }, {"p": [[198, -6213.560000, 0.441176, 0.000006, 0.080161 ], [196, -6213.870000, 0.325307, 0.058498, 0.063041 ], [206, -6215.790000, 0.047385, 0.000002, 0.086495 ], [207, -6215.790000, 0.047385, 0.000002, 0.086495 ], [204, -6215.810000, 0.046478, 0.018959, 0.080341 ], [25, -6215.820000, 0.046137, 0.014512, 0.080488 ], [205, -6215.820000, 0.046132, 0.000009, 0.080491 ] ], "n": ["FDJVGXF01BIVZQ_rvcmp" ] }, {"p": [[198, -6213.560000, 0.441176, 0.000006, 0.080161 ], [196, -6213.870000, 0.325307, 0.058498, 0.063041 ], [206, -6215.790000, 0.047385, 0.000002, 0.086495 ], [207, -6215.790000, 0.047385, 0.000002, 0.086495 ], [204, -6215.810000, 0.046478, 0.018959, 0.080341 ], [25, -6215.820000, 0.046137, 0.014512, 0.080488 ], [205, -6215.820000, 0.046132, 0.000009, 0.080491 ] ], "n": ["FDJVGXF01BH316_rvcmp" ] }, {"p": [[198, -6213.560000, 0.441176, 0.000006, 0.080161 ], [196, -6213.870000, 0.325307, 0.058498, 0.063041 ], [206, -6215.790000, 0.047385, 0.000002, 0.086495 ], [207, -6215.790000, 0.047385, 0.000002, 0.086495 ], [204, -6215.810000, 0.046478, 0.018959, 0.080341 ], [25, -6215.820000, 0.046137, 0.014512, 0.080488 ], [205, -6215.820000, 0.046132, 0.000009, 0.080491 ] ], "n": ["FDJVGXF01BXXOZ_rvcmp" ] }, {"p": [[200, -3376.270000, 0.182422, 0.012685, 0.108685 ], [204, -3376.270000, 0.182359, 0.000010, 0.108682 ], [203, -3376.270000, 0.182337, 0.009988, 0.108683 ], [199, -3376.630000, 0.127655, 0.000885, 0.108589 ], [197, -3376.630000, 0.127628, 0.024089, 0.108425 ], [196, -3376.740000, 0.113979, 0.048390, 0.101581 ], [202, -3377.050000, 0.083621, 0.045735, 0.108844 ] ], "n": ["FDJVGXF01EDN70_rvcmp" ] }, {"p": [[200, -3376.270000, 0.182422, 0.012685, 0.108685 ], [204, -3376.270000, 0.182359, 0.000010, 0.108682 ], [203, -3376.270000, 0.182337, 0.009988, 0.108683 ], [199, -3376.630000, 0.127655, 0.000885, 0.108589 ], [197, -3376.630000, 0.127628, 0.024089, 0.108425 ], [196, -3376.740000, 0.113979, 0.048390, 0.101581 ], [202, -3377.050000, 0.083621, 0.045735, 0.108844 ] ], "n": ["FDJVGXF01BGV64_rvcmp" ] }, {"p": [[200, -3376.270000, 0.182422, 0.012685, 0.108685 ], [204, -3376.270000, 0.182359, 0.000010, 0.108682 ], [203, -3376.270000, 0.182337, 0.009988, 0.108683 ], [199, -3376.630000, 0.127655, 0.000885, 0.108589 ], [197, -3376.630000, 0.127628, 0.024089, 0.108425 ], [196, -3376.740000, 0.113979, 0.048390, 0.101581 ], [202, -3377.050000, 0.083621, 0.045735, 0.108844 ] ], "n": ["FDJVGXF01AWDYC_rvcmp" ] }, {"p": [[200, -4756.300000, 0.220055, 0.012685, 0.080933 ], [203, -4756.310000, 0.220009, 0.009990, 0.080936 ], [204, -4756.310000, 0.219909, 0.000009, 0.080931 ], [197, -4756.470000, 0.187171, 0.010870, 0.081325 ], [201, -4757.430000, 0.071324, 0.019126, 0.085717 ], [199, -4757.960000, 0.041985, 0.011251, 0.082851 ], [196, -4758.020000, 0.039546, 0.076825, 0.082888 ] ], "n": ["FDJVGXF01ASB9O" ] }, {"p": [[202, -7554.760000, 0.459974, 0.043934, 0.032369 ], [204, -7554.910000, 0.395066, 0.010874, 0.042530 ], [203, -7557.010000, 0.048507, 0.009378, 0.048355 ], [25, -7557.090000, 0.044744, 0.014061, 0.045997 ], [205, -7557.100000, 0.044389, 0.000008, 0.046152 ], [22, -7558.900000, 0.007320, 0.011373, 0.050466 ] ], "n": ["FDJVGXF01BYGE4_rvcmp" ] }, {"p": [[202, -7700.950000, 0.501220, 0.039127, 0.037162 ], [204, -7701.990000, 0.176831, 0.015522, 0.051750 ], [25, -7702.130000, 0.153429, 0.014512, 0.052263 ], [205, -7702.130000, 0.153400, 0.000006, 0.052266 ], [203, -7704.450000, 0.015120, 0.009615, 0.058042 ] ], "n": ["FDJVGXF01B80I4" ] }, {"p": [[202, -7113.570000, 0.254888, 0.038115, 0.040833 ], [204, -7113.590000, 0.250208, 0.015579, 0.051935 ], [205, -7113.720000, 0.217952, 0.000006, 0.052432 ], [25, -7113.720000, 0.217928, 0.014512, 0.052429 ], [226, -7115.780000, 0.027954, 0.015742, 0.040776 ], [203, -7116.040000, 0.021480, 0.009992, 0.059166 ], [210, -7116.850000, 0.009590, 0.004390, 0.056197 ] ], "n": ["FDJVGXF01B65ZD_rvcmp" ] }, {"p": [[202, -3768.090000, 0.254562, 0.015398, 0.108124 ], [196, -3768.590000, 0.154923, 0.019496, 0.104684 ], [26, -3768.700000, 0.139599, 0.097406, 0.109046 ], [195, -3768.700000, 0.139371, 0.009446, 0.109056 ], [200, -3768.790000, 0.126720, 0.012685, 0.115778 ], [203, -3768.790000, 0.126699, 0.009988, 0.115790 ], [20, -3769.570000, 0.058126, 0.000005, 0.085139 ] ], "n": ["FDJVGXF01BT8LZ" ] }, {"p": [[203, -7596.560000, 0.219382, 0.005248, 0.126265 ], [200, -7596.850000, 0.163303, 0.010835, 0.125245 ], [202, -7596.880000, 0.159791, 0.061774, 0.129660 ], [204, -7596.900000, 0.155954, 0.003469, 0.122885 ], [18, -7597.330000, 0.101319, 0.050321, 0.104151 ], [22, -7597.340000, 0.100128, 0.000007, 0.105557 ], [21, -7597.340000, 0.100122, 0.017640, 0.105552 ] ], "n": ["FDJVGXF01DHTNV_rvcmp" ] }, {"p": [[204, -7913.530000, 0.266466, 0.015044, 0.080083 ], [25, -7913.670000, 0.230400, 0.014512, 0.080699 ], [205, -7913.670000, 0.230392, 0.000009, 0.080710 ], [200, -7914.200000, 0.135842, 0.008280, 0.080708 ], [196, -7914.760000, 0.078031, 0.058077, 0.061191 ], [203, -7915.350000, 0.042890, 0.009990, 0.086954 ], [208, -7916.340000, 0.015979, 0.009084, 0.088751 ] ], "n": ["FDJVGXF01D8SLX_rvcmp" ] }, {"p": [[204, -2420.400000, 0.299367, 0.013545, 0.032751 ], [25, -2420.880000, 0.184783, 0.014512, 0.035628 ], [205, -2420.880000, 0.184731, 0.000009, 0.035626 ], [39, -2421.330000, 0.117938, 0.016042, 0.034380 ], [196, -2421.640000, 0.086462, 0.006845, 0.041909 ], [195, -2421.650000, 0.085590, 0.009446, 0.043873 ], [37, -2422.380000, 0.041129, 0.000006, 0.061533 ] ], "n": ["FDJVGXF01EPCRX_rvcmp" ] }, {"p": [[204, -2768.810000, 0.310291, 0.013609, 0.027211 ], [25, -2769.310000, 0.187559, 0.014512, 0.029349 ], [205, -2769.310000, 0.187509, 0.000009, 0.029347 ], [39, -2769.740000, 0.121249, 0.015967, 0.028182 ], [196, -2770.140000, 0.082028, 0.011213, 0.032872 ], [195, -2770.170000, 0.079645, 0.009446, 0.035930 ], [37, -2771.090000, 0.031719, 0.000006, 0.051765 ] ], "n": ["FDJVGXF01D48Q1" ] }, {"p": [[204, -7687.570000, 0.882632, 0.011591, 0.075174 ], [22, -7690.140000, 0.067368, 0.006951, 0.082132 ], [25, -7691.100000, 0.025790, 0.010361, 0.083133 ], [21, -7691.760000, 0.013384, 0.017640, 0.090019 ], [20, -7691.970000, 0.010825, 0.005580, 0.092744 ] ], "n": ["FDJVGXF01EX5JR_rvcmp" ] }, {"p": [[204, -7922.000000, 0.326008, 0.010795, 0.047244 ], [20, -7922.210000, 0.265854, 0.000007, 0.049364 ], [22, -7922.960000, 0.125425, 0.003943, 0.045109 ], [21, -7923.200000, 0.098180, 0.017640, 0.048278 ], [18, -7923.210000, 0.098049, 0.051699, 0.048278 ], [19, -7923.330000, 0.086484, 0.012620, 0.050099 ] ], "n": ["FDJVGXF01CQYQ6" ] }, {"p": [[204, -8023.260000, 0.362265, 0.010815, 0.046440 ], [20, -8023.470000, 0.293405, 0.000007, 0.048613 ], [22, -8024.210000, 0.140381, 0.003996, 0.044345 ], [21, -8024.460000, 0.108743, 0.017640, 0.047509 ], [19, -8024.590000, 0.095207, 0.012620, 0.049320 ] ], "n": ["FDJVGXF01DQJK1" ] }, {"p": [[204, -7443.450000, 0.508504, 0.009538, 0.051082 ], [20, -7444.200000, 0.238809, 0.000007, 0.052933 ], [22, -7445.000000, 0.107671, 0.003627, 0.048797 ], [21, -7445.200000, 0.088405, 0.017640, 0.051935 ], [200, -7446.510000, 0.023804, 0.012685, 0.064429 ], [203, -7446.510000, 0.023780, 0.009988, 0.064432 ], [196, -7447.480000, 0.009025, 0.057645, 0.057025 ] ], "n": ["FDJVGXF01DFRS3" ] }, {"p": [[204, -5245.230000, 0.358533, 0.009132, 0.089643 ], [20, -5245.990000, 0.166478, 0.000008, 0.076998 ], [200, -5246.210000, 0.134185, 0.012685, 0.100745 ], [196, -5246.290000, 0.123680, 0.050507, 0.088756 ], [21, -5246.710000, 0.081066, 0.000008, 0.078435 ], [22, -5246.810000, 0.073263, 0.001556, 0.076993 ], [199, -5246.970000, 0.062794, 0.007651, 0.101623 ] ], "n": ["FDJVGXF01AKLWC" ] }, {"p": [[204, -4621.190000, 0.387559, 0.009056, 0.088981 ], [200, -4622.150000, 0.148336, 0.012685, 0.101719 ], [203, -4622.150000, 0.148063, 0.009988, 0.101728 ], [196, -4622.260000, 0.132448, 0.050951, 0.088611 ], [199, -4622.900000, 0.070018, 0.007526, 0.102826 ], [197, -4623.110000, 0.056811, 0.024513, 0.108356 ], [198, -4623.110000, 0.056766, 0.013117, 0.108359 ] ], "n": ["FDJVGXF01DHD7T_rvcmp" ] }, {"p": [[204, -4575.000000, 0.354340, 0.009081, 0.088204 ], [196, -4575.410000, 0.235732, 0.032940, 0.086335 ], [200, -4575.970000, 0.134127, 0.012685, 0.100900 ], [203, -4575.970000, 0.133879, 0.009988, 0.100909 ], [199, -4576.730000, 0.062831, 0.007647, 0.101952 ], [197, -4576.950000, 0.050400, 0.024513, 0.107578 ], [20, -4577.520000, 0.028691, 0.000008, 0.082530 ] ], "n": ["FDJVGXF01EPCPG_rvcmp" ] }, {"p": [[204, -7598.810000, 0.420876, 0.008790, 0.050502 ], [22, -7599.210000, 0.283311, 0.009489, 0.042424 ], [196, -7599.650000, 0.181235, 0.048188, 0.046171 ], [20, -7601.090000, 0.043203, 0.000008, 0.052712 ], [200, -7601.280000, 0.035780, 0.012685, 0.061753 ], [21, -7601.790000, 0.021382, 0.017642, 0.050602 ], [19, -7602.200000, 0.014213, 0.012620, 0.053561 ] ], "n": ["FDJVGXF01B5LRT" ] }, {"p": [[204, -7648.820000, 0.420171, 0.008798, 0.050262 ], [22, -7649.210000, 0.284397, 0.009490, 0.042229 ], [196, -7649.660000, 0.181528, 0.048180, 0.045927 ], [20, -7651.100000, 0.043046, 0.000008, 0.052486 ], [200, -7651.300000, 0.035363, 0.012685, 0.061466 ], [21, -7651.800000, 0.021343, 0.017642, 0.050368 ], [19, -7652.220000, 0.014151, 0.012620, 0.053323 ] ], "n": ["FDJVGXF01BTVRT_rvcmp" ] }, {"p": [[204, -7648.820000, 0.420171, 0.008798, 0.050262 ], [22, -7649.210000, 0.284397, 0.009490, 0.042229 ], [196, -7649.660000, 0.181528, 0.048180, 0.045927 ], [20, -7651.100000, 0.043046, 0.000008, 0.052486 ], [200, -7651.300000, 0.035363, 0.012685, 0.061466 ], [21, -7651.800000, 0.021343, 0.017642, 0.050368 ], [19, -7652.220000, 0.014151, 0.012620, 0.053323 ] ], "n": ["FDJVGXF01D181H_rvcmp" ] }, {"p": [[204, -7648.820000, 0.420171, 0.008798, 0.050262 ], [22, -7649.210000, 0.284397, 0.009490, 0.042229 ], [196, -7649.660000, 0.181528, 0.048180, 0.045927 ], [20, -7651.100000, 0.043046, 0.000008, 0.052486 ], [200, -7651.300000, 0.035363, 0.012685, 0.061466 ], [21, -7651.800000, 0.021343, 0.017642, 0.050368 ], [19, -7652.220000, 0.014151, 0.012620, 0.053323 ] ], "n": ["FDJVGXF01A4VUJ_rvcmp" ] }, {"p": [[204, -3815.830000, 0.281582, 0.007602, 0.129995 ], [200, -3816.350000, 0.167935, 0.012685, 0.144251 ], [203, -3816.350000, 0.167808, 0.009988, 0.144267 ], [197, -3816.540000, 0.137654, 0.016553, 0.137442 ], [199, -3816.990000, 0.087810, 0.004201, 0.147176 ], [198, -3817.030000, 0.084694, 0.013117, 0.149898 ], [196, -3817.190000, 0.072518, 0.065003, 0.142972 ] ], "n": ["FDJVGXF01DPR33" ] }, {"p": [[204, -6808.400000, 0.631413, 0.008239, 0.064466 ], [200, -6810.350000, 0.089952, 0.012685, 0.077195 ], [203, -6810.350000, 0.089804, 0.009988, 0.077200 ], [20, -6810.580000, 0.070921, 0.000007, 0.065300 ], [196, -6810.620000, 0.068039, 0.053531, 0.065816 ], [22, -6811.600000, 0.025521, 0.002388, 0.063030 ], [21, -6811.650000, 0.024350, 0.000009, 0.066516 ] ], "n": ["FDJVGXF01CR501" ] }, {"p": [[204, -7697.720000, 0.732537, 0.008355, 0.056672 ], [200, -7699.740000, 0.097578, 0.012685, 0.068042 ], [203, -7699.740000, 0.097522, 0.009988, 0.068053 ], [202, -7700.750000, 0.035429, 0.046197, 0.059535 ], [196, -7701.150000, 0.023730, 0.061059, 0.062466 ], [20, -7701.740000, 0.013204, 0.000007, 0.064430 ] ], "n": ["FDJVGXF01BAYI3" ] }, {"p": [[204, -7930.470000, 0.747840, 0.008408, 0.055296 ], [200, -7932.540000, 0.094463, 0.012685, 0.066434 ], [203, -7932.540000, 0.094406, 0.009988, 0.066445 ], [202, -7933.800000, 0.026747, 0.048048, 0.058557 ], [196, -7933.930000, 0.023533, 0.060879, 0.060812 ], [20, -7934.520000, 0.013011, 0.000007, 0.063020 ] ], "n": ["FDJVGXF01DSZUX" ] }, {"p": [[204, -7064.590000, 0.559992, 0.007884, 0.055268 ], [20, -7066.000000, 0.137125, 0.000007, 0.056566 ], [200, -7066.450000, 0.086726, 0.012685, 0.066457 ], [203, -7066.460000, 0.086669, 0.009988, 0.066449 ], [22, -7066.840000, 0.058751, 0.003326, 0.052596 ], [21, -7067.000000, 0.050190, 0.017640, 0.055677 ], [196, -7067.890000, 0.020546, 0.062798, 0.061038 ] ], "n": ["FDJVGXF01C3KKN" ] }, {"p": [[204, -6582.580000, 0.456840, 0.006772, 0.086692 ], [200, -6583.650000, 0.156358, 0.012685, 0.097393 ], [203, -6583.650000, 0.156295, 0.009988, 0.097395 ], [196, -6583.990000, 0.111738, 0.052099, 0.085503 ], [201, -6584.810000, 0.049193, 0.015349, 0.100640 ], [202, -6584.980000, 0.041201, 0.061774, 0.102303 ], [199, -6585.360000, 0.028375, 0.012860, 0.100498 ] ], "n": ["FDJVGXF01DCRDD" ] }, {"p": [[204, -4417.870000, 0.340176, 0.006738, 0.061764 ], [203, -4418.430000, 0.195884, 0.004269, 0.073199 ], [202, -4418.630000, 0.160255, 0.057550, 0.072726 ], [201, -4418.680000, 0.152150, 0.019126, 0.075889 ], [200, -4419.210000, 0.089280, 0.012685, 0.076644 ], [196, -4420.180000, 0.033772, 0.075481, 0.080266 ], [197, -4420.350000, 0.028484, 0.016494, 0.085853 ] ], "n": ["FDJVGXF01A8GGP_rvcmp" ] }, {"p": [[204, -7632.920000, 0.241838, 0.005691, 0.062757 ], [196, -7633.060000, 0.210267, 0.055507, 0.050908 ], [170, -7633.520000, 0.132384, 0.007663, 0.073466 ], [200, -7633.600000, 0.121494, 0.012685, 0.068275 ], [203, -7633.610000, 0.121294, 0.009988, 0.068288 ], [154, -7633.740000, 0.105864, 0.030340, 0.079868 ], [149, -7634.200000, 0.066859, 0.059251, 0.063575 ] ], "n": ["FDJVGXF01CFIA4" ] }, {"p": [[204, -7632.920000, 0.241838, 0.005691, 0.062757 ], [196, -7633.060000, 0.210267, 0.055507, 0.050908 ], [170, -7633.520000, 0.132384, 0.007663, 0.073466 ], [200, -7633.600000, 0.121494, 0.012685, 0.068275 ], [203, -7633.610000, 0.121294, 0.009988, 0.068288 ], [154, -7633.740000, 0.105864, 0.030340, 0.079868 ], [149, -7634.200000, 0.066859, 0.059251, 0.063575 ] ], "n": ["FDJVGXF01EJUSJ" ] }, {"p": [[204, -3162.070000, 0.512055, 0.005464, 0.168763 ], [200, -3163.440000, 0.129969, 0.012685, 0.185644 ], [203, -3163.440000, 0.129956, 0.009988, 0.185648 ], [201, -3164.100000, 0.067557, 0.017967, 0.196688 ], [202, -3164.100000, 0.067540, 0.061774, 0.196608 ], [199, -3164.470000, 0.046705, 0.003441, 0.197949 ], [196, -3164.480000, 0.046217, 0.046489, 0.189829 ] ], "n": ["FDJVGXF01B4C28" ] }, {"p": [[204, -7420.140000, 0.347943, 0.004764, 0.064711 ], [200, -7420.660000, 0.207964, 0.012685, 0.069658 ], [203, -7420.660000, 0.207584, 0.009988, 0.069663 ], [196, -7420.730000, 0.193321, 0.054140, 0.058578 ], [199, -7422.460000, 0.034173, 0.012918, 0.071108 ], [20, -7423.790000, 0.009015, 0.000005, 0.065076 ] ], "n": ["FDJVGXF01DUVCA" ] }, {"p": [[204, -7934.660000, 0.399654, 0.004788, 0.061898 ], [200, -7935.240000, 0.225614, 0.012685, 0.067113 ], [203, -7935.240000, 0.225483, 0.009988, 0.067114 ], [202, -7936.450000, 0.066894, 0.048062, 0.058934 ], [196, -7936.570000, 0.059212, 0.060871, 0.061191 ], [199, -7937.510000, 0.023143, 0.013298, 0.069889 ] ], "n": ["FDJVGXF01EW37D_rvcmp" ] }, {"p": [[205, -4873.990000, 0.222671, 0.034333, 0.093321 ], [208, -4874.100000, 0.199548, 0.024224, 0.100445 ], [209, -4874.100000, 0.199418, 0.000007, 0.100444 ], [206, -4874.820000, 0.097091, 0.000001, 0.111845 ], [207, -4874.820000, 0.097091, 0.000001, 0.111845 ], [22, -4874.840000, 0.095455, 0.024327, 0.100654 ], [210, -4874.910000, 0.088726, 0.000009, 0.102512 ] ], "n": ["FDJVGXF01E11AV_rvcmp" ] }, {"p": [[205, -7337.700000, 0.294046, 0.029883, 0.068329 ], [22, -7338.170000, 0.184536, 0.027378, 0.071825 ], [209, -7338.170000, 0.183154, 0.006837, 0.072137 ], [210, -7338.170000, 0.182922, 0.000009, 0.072147 ], [208, -7338.440000, 0.140986, 0.020690, 0.073992 ], [206, -7341.410000, 0.007178, 0.000001, 0.085707 ], [207, -7341.410000, 0.007178, 0.000001, 0.085707 ] ], "n": ["FDJVGXF01EGX25" ] }, {"p": [[205, -7418.430000, 0.363607, 0.026826, 0.069772 ], [152, -7418.810000, 0.247741, 0.024010, 0.084055 ], [153, -7419.010000, 0.201962, 0.005738, 0.076964 ], [171, -7419.740000, 0.097820, 0.021049, 0.067908 ], [40, -7420.470000, 0.047034, 0.072251, 0.068007 ], [190, -7421.260000, 0.021271, 0.029264, 0.072469 ], [191, -7421.300000, 0.020566, 0.008132, 0.076573 ] ], "n": ["FDJVGXF01AXQ6D" ] }, {"p": [[205, -7337.790000, 0.385661, 0.026834, 0.065110 ], [152, -7338.310000, 0.229671, 0.024083, 0.079299 ], [153, -7338.440000, 0.201322, 0.005960, 0.071713 ], [151, -7339.210000, 0.092873, 0.014659, 0.081514 ], [171, -7339.840000, 0.049926, 0.019243, 0.066154 ], [40, -7340.500000, 0.025661, 0.068721, 0.065786 ], [208, -7341.050000, 0.014886, 0.020051, 0.074861 ] ], "n": ["FDJVGXF01B2SXC" ] }, {"p": [[205, -7607.900000, 0.429262, 0.026862, 0.061736 ], [152, -7608.530000, 0.229408, 0.024146, 0.075079 ], [153, -7608.600000, 0.213828, 0.006106, 0.067590 ], [151, -7609.450000, 0.091149, 0.014659, 0.077184 ], [208, -7611.220000, 0.015460, 0.020019, 0.070978 ], [209, -7611.460000, 0.012203, 0.000007, 0.072686 ], [171, -7611.800000, 0.008690, 0.020471, 0.065295 ] ], "n": ["FDJVGXF01AGPIW" ] }, {"p": [[205, -8923.350000, 0.972151, 0.023197, 0.070025 ], [22, -8927.550000, 0.014637, 0.025291, 0.083019 ], [209, -8927.650000, 0.013212, 0.006837, 0.084777 ] ], "n": ["FDJVGXF01D5ED9" ] }, {"p": [[205, -8706.690000, 1.000000, 0.023070, 0.044057 ] ], "n": ["FDJVGXF01E06Z6_rvcmp" ] }, {"p": [[205, -6062.970000, 1.000000, 0.020023, 0.051283 ] ], "n": ["FDJVGXF01DZAZN_rvcmp" ] }, {"p": [[205, -7237.020000, 1.000000, 0.019512, 0.033403 ] ], "n": ["FDJVGXF01CPE1R_rvcmp" ] }, {"p": [[205, -6955.700000, 0.567819, 0.014205, 0.078906 ], [204, -6956.420000, 0.276388, 0.013637, 0.083756 ], [22, -6957.100000, 0.139436, 0.014137, 0.086767 ], [25, -6959.250000, 0.016357, 0.014513, 0.091588 ] ], "n": ["FDJVGXF01CIP9R_rvcmp" ] }, {"p": [[205, -7419.430000, 0.609185, 0.013367, 0.077640 ], [204, -7420.550000, 0.198532, 0.013496, 0.086085 ], [25, -7421.120000, 0.111984, 0.014512, 0.090411 ], [200, -7421.890000, 0.051867, 0.005610, 0.089254 ], [199, -7422.490000, 0.028432, 0.012803, 0.090561 ] ], "n": ["FDJVGXF01AK5U0" ] }, {"p": [[205, -5567.480000, 0.735916, 0.013145, 0.000111 ], [25, -5569.190000, 0.132170, 0.014512, 0.006967 ], [204, -5569.200000, 0.131914, 0.020143, 0.006967 ] ], "n": ["FDJVGXF01AOVEB" ] }, {"p": [[205, -5567.480000, 0.735916, 0.013145, 0.000111 ], [25, -5569.190000, 0.132170, 0.014512, 0.006967 ], [204, -5569.200000, 0.131914, 0.020143, 0.006967 ] ], "n": ["FDJVGXF01EO822" ] }, {"p": [[205, -7069.180000, 0.396266, 0.006289, 0.056385 ], [204, -7069.490000, 0.290818, 0.014670, 0.055977 ], [25, -7070.010000, 0.172333, 0.008344, 0.062134 ], [24, -7070.980000, 0.065310, 0.000009, 0.069006 ], [23, -7071.000000, 0.064315, 0.003604, 0.069007 ], [226, -7073.400000, 0.005804, 0.027209, 0.069703 ], [227, -7073.520000, 0.005154, 0.000005, 0.071651 ] ], "n": ["FDJVGXF01BMGFG_rvcmp" ] }, {"p": [[205, -4309.980000, 0.320871, 0.000006, 0.048000 ], [25, -4309.980000, 0.320846, 0.014512, 0.047996 ], [204, -4309.980000, 0.320733, 0.020143, 0.047996 ], [196, -4313.020000, 0.015319, 0.062930, 0.042998 ], [200, -4313.440000, 0.010071, 0.012685, 0.057148 ], [23, -4313.940000, 0.006080, 0.003604, 0.058311 ], [24, -4313.940000, 0.006080, 0.001125, 0.058312 ] ], "n": ["FDJVGXF01CU478" ] }, {"p": [[205, -3231.020000, 0.243259, 0.000009, 0.046582 ], [25, -3231.020000, 0.243107, 0.014512, 0.046590 ], [204, -3231.020000, 0.242965, 0.020143, 0.046590 ], [190, -3232.010000, 0.090366, 0.027041, 0.040058 ], [191, -3232.310000, 0.067179, 0.015648, 0.051140 ], [192, -3232.310000, 0.067172, 0.000005, 0.051143 ], [39, -3232.690000, 0.045952, 0.019446, 0.049151 ] ], "n": ["FDJVGXF01EBB3U" ] }, {"p": [[205, -3388.470000, 0.215952, 0.000007, 0.042633 ], [25, -3388.470000, 0.215821, 0.014512, 0.042630 ], [204, -3388.470000, 0.215806, 0.020143, 0.042630 ], [190, -3388.610000, 0.187231, 0.021598, 0.025648 ], [191, -3389.820000, 0.056119, 0.007313, 0.037262 ], [171, -3389.840000, 0.054733, 0.034632, 0.035374 ], [192, -3389.850000, 0.054338, 0.000005, 0.040428 ] ], "n": ["FDJVGXF01DGL9L_rvcmp" ] }, {"p": [[205, -1836.300000, 0.312076, 0.000009, 0.000006 ], [204, -1836.300000, 0.312064, 0.020143, 0.000006 ], [25, -1836.300000, 0.311792, 0.014512, 0.000006 ], [206, -1839.160000, 0.017925, 0.000002, 0.016079 ], [207, -1839.160000, 0.017925, 0.000002, 0.016079 ], [208, -1839.160000, 0.017924, 0.000006, 0.016077 ], [209, -1839.710000, 0.010294, 0.000007, 0.009508 ] ], "n": ["FDJVGXF01E1J9N" ] }, {"p": [[208, -3253.110000, 0.193264, 0.018304, 0.059297 ], [205, -3253.410000, 0.143248, 0.038635, 0.065345 ], [209, -3253.410000, 0.143246, 0.000007, 0.065346 ], [22, -3253.470000, 0.135146, 0.028187, 0.066121 ], [23, -3253.520000, 0.128370, 0.001348, 0.067545 ], [24, -3253.520000, 0.128368, 0.000009, 0.067545 ], [25, -3253.520000, 0.128358, 0.000007, 0.067549 ] ], "n": ["FDJVGXF01CPHGI" ] }, {"p": [[208, -5070.520000, 0.247764, 0.009741, 0.125891 ], [22, -5071.150000, 0.131823, 0.024309, 0.129694 ], [206, -5071.170000, 0.129977, 0.000001, 0.131661 ], [207, -5071.170000, 0.129977, 0.000001, 0.131661 ], [209, -5071.240000, 0.121248, 0.000007, 0.133772 ], [205, -5071.240000, 0.121190, 0.038636, 0.133773 ], [210, -5071.260000, 0.118022, 0.000009, 0.133546 ] ], "n": ["FDJVGXF01EOYI2_rvcmp" ] }, {"p": [[208, -5537.520000, 0.307879, 0.009699, 0.076482 ], [22, -5538.240000, 0.148878, 0.022199, 0.076610 ], [206, -5538.490000, 0.116042, 0.000001, 0.082299 ], [207, -5538.490000, 0.116042, 0.000001, 0.082299 ], [209, -5538.600000, 0.104211, 0.000008, 0.082048 ], [205, -5538.600000, 0.104173, 0.038638, 0.082049 ], [210, -5538.610000, 0.102775, 0.000009, 0.081573 ] ], "n": ["FDJVGXF01C9WBH" ] }, {"p": [[208, -7662.010000, 0.322184, 0.006777, 0.074938 ], [206, -7662.370000, 0.224969, 0.000001, 0.079279 ], [207, -7662.370000, 0.224969, 0.000001, 0.079279 ], [205, -7663.140000, 0.104637, 0.025422, 0.072800 ], [209, -7663.660000, 0.061904, 0.000007, 0.077020 ], [22, -7664.360000, 0.030731, 0.028187, 0.076958 ], [204, -7664.370000, 0.030605, 0.016873, 0.076828 ] ], "n": ["FDJVGXF01DH0AP" ] }, {"p": [[209, -6518.480000, 0.143255, 0.000007, 1.999990 ], [208, -6518.480000, 0.143255, 0.024246, 1.999990 ], [210, -6518.490000, 0.143233, 0.000009, 1.999990 ], [22, -6518.490000, 0.143209, 0.028187, 1.999990 ], [206, -6518.490000, 0.142902, 0.000001, 1.999990 ], [207, -6518.490000, 0.142902, 0.000001, 1.999990 ], [225, -6518.500000, 0.141244, 0.036449, 1.999990 ] ], "n": ["FDJVGXF01DQ123" ] }, {"p": [[209, -8214.770000, 0.153733, 0.000007, 1.999990 ], [208, -8214.770000, 0.153733, 0.024246, 1.999990 ], [205, -8214.770000, 0.153713, 0.038635, 1.999990 ], [22, -8214.770000, 0.153629, 0.028187, 1.999990 ], [210, -8214.770000, 0.153604, 0.000009, 1.999990 ], [11, -8215.050000, 0.115794, 0.000001, 1.999990 ], [12, -8215.050000, 0.115794, 0.001169, 1.999990 ] ], "n": ["FDJVGXF01ELVFY" ] }, {"p": [[210, -4496.080000, 0.204297, 0.007982, 0.054073 ], [22, -4496.250000, 0.172586, 0.019501, 0.061094 ], [18, -4496.410000, 0.146770, 0.034265, 0.057041 ], [205, -4496.450000, 0.141133, 0.037591, 0.063419 ], [209, -4496.460000, 0.139655, 0.000327, 0.064929 ], [208, -4496.460000, 0.139526, 0.024246, 0.065016 ], [226, -4497.380000, 0.056033, 0.000008, 0.054599 ] ], "n": ["FDJVGXF01BUDHC_rvcmp" ] }, {"p": [[210, -7052.430000, 0.227704, 0.005242, 0.107803 ], [1, -7052.710000, 0.170850, 0.038659, 0.091028 ], [28, -7052.870000, 0.145984, 0.030471, 0.103485 ], [209, -7052.950000, 0.135514, 0.006837, 0.114239 ], [22, -7052.950000, 0.135437, 0.028184, 0.114236 ], [226, -7053.200000, 0.104631, 0.016951, 0.094825 ], [205, -7053.470000, 0.079880, 0.038635, 0.117809 ] ], "n": ["FDJVGXF01AKAVZ" ] }, {"p": [[210, -4408.380000, 0.183684, 0.003008, 0.076294 ], [209, -4408.430000, 0.175174, 0.006837, 0.079393 ], [17, -4408.620000, 0.143824, 0.042588, 0.065209 ], [227, -4408.710000, 0.132664, 0.000006, 0.070312 ], [226, -4408.710000, 0.132653, 0.032306, 0.070302 ], [2, -4408.740000, 0.128452, 0.029390, 0.071469 ], [205, -4408.950000, 0.103550, 0.034779, 0.078185 ] ], "n": ["FDJVGXF01D97QB" ] }, {"p": [[210, -4408.380000, 0.183684, 0.003008, 0.076294 ], [209, -4408.430000, 0.175174, 0.006837, 0.079393 ], [17, -4408.620000, 0.143824, 0.042588, 0.065209 ], [227, -4408.710000, 0.132664, 0.000006, 0.070312 ], [226, -4408.710000, 0.132653, 0.032306, 0.070302 ], [2, -4408.740000, 0.128452, 0.029390, 0.071469 ], [205, -4408.950000, 0.103550, 0.034779, 0.078185 ] ], "n": ["FDJVGXF01EK67K" ] }, {"p": [[212, -5446.450000, 0.177020, 0.000008, 1.875070 ], [148, -5446.600000, 0.152409, 0.000009, 1.999990 ], [147, -5446.600000, 0.152404, 0.065313, 1.999990 ], [219, -5446.760000, 0.129941, 0.000007, 1.963770 ], [222, -5446.770000, 0.129563, 0.000009, 1.964850 ], [220, -5446.770000, 0.129332, 0.000010, 1.967560 ], [221, -5446.770000, 0.129331, 0.000007, 1.967560 ] ], "n": ["FDJVGXF01EOJUM" ] }, {"p": [[212, -6687.480000, 0.201742, 0.000008, 1.758780 ], [213, -6687.670000, 0.166305, 0.023979, 1.810920 ], [225, -6687.670000, 0.166292, 0.000009, 1.810940 ], [224, -6687.670000, 0.166274, 0.010740, 1.810950 ], [216, -6688.140000, 0.103848, 0.038817, 1.925440 ], [223, -6688.140000, 0.103846, 0.016737, 1.925450 ], [217, -6688.260000, 0.091694, 0.000007, 1.960230 ] ], "n": ["FDJVGXF01DE7G6" ] }, {"p": [[212, -5844.360000, 0.218666, 0.000008, 1.392960 ], [213, -5844.850000, 0.134052, 0.000006, 1.481820 ], [211, -5844.850000, 0.134048, 0.024188, 1.481840 ], [224, -5844.870000, 0.132082, 0.010740, 1.481440 ], [223, -5844.900000, 0.127675, 0.016737, 1.465350 ], [219, -5844.910000, 0.126887, 0.000007, 1.467610 ], [221, -5844.910000, 0.126589, 0.003442, 1.468380 ] ], "n": ["FDJVGXF01BFVWC" ] }, {"p": [[216, -6190.480000, 0.153197, 0.038817, 1.956730 ], [223, -6190.480000, 0.153197, 0.016737, 1.956730 ], [217, -6190.570000, 0.139264, 0.000007, 1.986310 ], [218, -6190.580000, 0.138645, 0.000008, 1.990310 ], [219, -6190.580000, 0.138589, 0.000007, 1.988710 ], [220, -6190.580000, 0.138558, 0.000010, 1.988900 ], [221, -6190.580000, 0.138551, 0.000007, 1.988950 ] ], "n": ["FDJVGXF01DYSMW_rvcmp" ] }, {"p": [[225, -6003.560000, 0.528706, 0.021517, 0.139417 ], [226, -6004.220000, 0.273760, 0.014420, 0.138100 ], [210, -6005.360000, 0.087346, 0.018069, 0.159472 ], [213, -6006.430000, 0.029997, 0.012619, 0.157705 ], [17, -6006.480000, 0.028692, 0.045334, 0.142780 ], [227, -6006.500000, 0.027994, 0.000006, 0.145434 ], [26, -6006.680000, 0.023505, 0.062933, 0.136823 ] ], "n": ["FDJVGXF01B4C28_rvcmp" ] }, {"p": [[226, -8182.470000, 0.351874, 0.027567, 0.092646 ], [17, -8182.660000, 0.288658, 0.049256, 0.094209 ], [227, -8182.660000, 0.288331, 0.000006, 0.094215 ], [210, -8185.230000, 0.022172, 0.001237, 0.114524 ], [22, -8185.240000, 0.021914, 0.028187, 0.115508 ], [209, -8185.240000, 0.021912, 0.006837, 0.115505 ], [205, -8186.690000, 0.005140, 0.017645, 0.112229 ] ], "n": ["FDJVGXF01CR3K7_rvcmp" ] }, {"p": [[226, -8993.280000, 0.359096, 0.027636, 0.091496 ], [17, -8993.480000, 0.295073, 0.049256, 0.092812 ], [227, -8993.480000, 0.294736, 0.000006, 0.092818 ], [210, -8996.160000, 0.020165, 0.001442, 0.111974 ], [209, -8996.180000, 0.019840, 0.006837, 0.113008 ], [2, -8997.310000, 0.006393, 0.021524, 0.093841 ], [205, -8997.620000, 0.004697, 0.017317, 0.109916 ] ], "n": ["FDJVGXF01A5PLY_rvcmp" ] }, {"p": [[226, -9345.660000, 0.476005, 0.025996, 0.064178 ], [227, -9346.300000, 0.250939, 0.000005, 0.067922 ], [17, -9346.300000, 0.250898, 0.049256, 0.067919 ], [22, -9348.730000, 0.022158, 0.009196, 0.079539 ] ], "n": ["FDJVGXF01E07G7_rvcmp" ] }, {"p": [[226, -9209.070000, 0.268078, 0.025935, 0.057826 ], [21, -9209.620000, 0.153975, 0.016907, 0.074566 ], [18, -9209.630000, 0.152762, 0.050954, 0.074257 ], [22, -9209.640000, 0.151724, 0.000007, 0.074890 ], [17, -9209.760000, 0.134437, 0.049256, 0.061676 ], [227, -9209.760000, 0.134432, 0.000006, 0.061679 ], [2, -9213.140000, 0.004592, 0.020772, 0.059117 ] ], "n": ["FDJVGXF01DJLDB_rvcmp" ] }, {"p": [[226, -8393.860000, 0.460198, 0.024848, 0.077347 ], [17, -8394.390000, 0.269911, 0.045534, 0.076859 ], [227, -8394.430000, 0.259062, 0.000006, 0.079789 ], [2, -8397.600000, 0.010830, 0.015813, 0.081625 ] ], "n": ["FDJVGXF01A2ND0" ] }, {"p": [[226, -8393.860000, 0.460198, 0.024848, 0.077347 ], [17, -8394.390000, 0.269911, 0.045534, 0.076859 ], [227, -8394.430000, 0.259062, 0.000006, 0.079789 ], [2, -8397.600000, 0.010830, 0.015813, 0.081625 ] ], "n": ["FDJVGXF01EHY46" ] }, {"p": [[226, -8848.720000, 0.538745, 0.024569, 0.053849 ], [227, -8849.600000, 0.224338, 0.000425, 0.058826 ], [17, -8849.600000, 0.223507, 0.049256, 0.058890 ], [240, -8852.420000, 0.013410, 0.013508, 0.049632 ] ], "n": ["FDJVGXF01EIQP5_rvcmp" ] }, {"p": [[226, -9128.370000, 0.317273, 0.024035, 0.120119 ], [2, -9128.820000, 0.202166, 0.030892, 0.119749 ], [227, -9128.930000, 0.181127, 0.012980, 0.124127 ], [228, -9128.930000, 0.181012, 0.000005, 0.124128 ], [17, -9129.390000, 0.114902, 0.045240, 0.121453 ], [1, -9132.870000, 0.003520, 0.066692, 0.109553 ] ], "n": ["FDJVGXF01DC3TP_rvcmp" ] }, {"p": [[226, -9128.370000, 0.317273, 0.024035, 0.120119 ], [2, -9128.820000, 0.202166, 0.030892, 0.119749 ], [227, -9128.930000, 0.181127, 0.012980, 0.124127 ], [228, -9128.930000, 0.181012, 0.000005, 0.124128 ], [17, -9129.390000, 0.114902, 0.045240, 0.121453 ], [1, -9132.870000, 0.003520, 0.066692, 0.109553 ] ], "n": ["FDJVGXF01BUJZR_rvcmp" ] }, {"p": [[226, -8960.100000, 0.599704, 0.023700, 0.047352 ], [227, -8961.210000, 0.198269, 0.000696, 0.052955 ], [17, -8961.220000, 0.196432, 0.049256, 0.053047 ], [22, -8964.780000, 0.005594, 0.024696, 0.070768 ] ], "n": ["FDJVGXF01BQME8" ] }, {"p": [[226, -8960.100000, 0.599704, 0.023700, 0.047352 ], [227, -8961.210000, 0.198269, 0.000696, 0.052955 ], [17, -8961.220000, 0.196432, 0.049256, 0.053047 ], [22, -8964.780000, 0.005594, 0.024696, 0.070768 ] ], "n": ["FDJVGXF01BS98Y" ] }, {"p": [[226, -7666.410000, 0.374970, 0.023072, 0.104550 ], [210, -7667.520000, 0.122688, 0.000009, 0.131802 ], [22, -7667.520000, 0.122661, 0.028187, 0.131810 ], [209, -7667.520000, 0.122526, 0.006837, 0.131810 ], [17, -7667.540000, 0.120896, 0.049251, 0.109450 ], [227, -7667.540000, 0.120744, 0.000006, 0.109453 ], [21, -7669.590000, 0.015515, 0.014920, 0.141860 ] ], "n": ["FDJVGXF01ETRIS_rvcmp" ] }, {"p": [[226, -8687.470000, 0.484812, 0.022548, 0.052675 ], [227, -8688.540000, 0.165219, 0.000006, 0.056919 ], [17, -8688.540000, 0.165183, 0.049256, 0.056917 ], [204, -8689.480000, 0.064549, 0.012854, 0.066038 ], [205, -8689.510000, 0.062787, 0.012765, 0.065089 ], [209, -8690.210000, 0.031345, 0.004620, 0.070373 ], [22, -8690.390000, 0.026105, 0.026109, 0.071271 ] ], "n": ["FDJVGXF01BBDIC" ] }, {"p": [[226, -8958.610000, 0.633335, 0.022859, 0.042092 ], [227, -8959.940000, 0.167884, 0.000661, 0.048183 ], [17, -8959.950000, 0.166411, 0.049256, 0.048248 ], [22, -8962.230000, 0.016906, 0.023438, 0.063464 ], [210, -8962.320000, 0.015463, 0.002545, 0.062214 ] ], "n": ["FDJVGXF01B54J6" ] }, {"p": [[226, -8954.730000, 0.657370, 0.023269, 0.037023 ], [227, -8956.070000, 0.172190, 0.000701, 0.043138 ], [17, -8956.080000, 0.170440, 0.049256, 0.043211 ] ], "n": ["FDJVGXF01E1RU5" ] }, {"p": [[226, -8954.730000, 0.657370, 0.023269, 0.037023 ], [227, -8956.070000, 0.172190, 0.000701, 0.043138 ], [17, -8956.080000, 0.170440, 0.049256, 0.043211 ] ], "n": ["FDJVGXF01DTZMC" ] }, {"p": [[226, -8954.730000, 0.657370, 0.023269, 0.037023 ], [227, -8956.070000, 0.172190, 0.000701, 0.043138 ], [17, -8956.080000, 0.170440, 0.049256, 0.043211 ] ], "n": ["FDJVGXF01BW2IU" ] }, {"p": [[226, -8954.730000, 0.657370, 0.023269, 0.037023 ], [227, -8956.070000, 0.172190, 0.000701, 0.043138 ], [17, -8956.080000, 0.170440, 0.049256, 0.043211 ] ], "n": ["FDJVGXF01B7RY8" ] }, {"p": [[226, -9100.930000, 0.700480, 0.022558, 0.036222 ], [227, -9102.470000, 0.149818, 0.000136, 0.042674 ], [17, -9102.480000, 0.149702, 0.049256, 0.042677 ] ], "n": ["FDJVGXF01B4FSY" ] }, {"p": [[226, -8187.160000, 0.351812, 0.021858, 0.098210 ], [210, -8187.960000, 0.157467, 0.000009, 0.120048 ], [22, -8187.960000, 0.157392, 0.028187, 0.120056 ], [209, -8187.960000, 0.157264, 0.006837, 0.120055 ], [17, -8188.510000, 0.090886, 0.046789, 0.101647 ], [200, -8188.950000, 0.058479, 0.008675, 0.113883 ], [204, -8189.740000, 0.026700, 0.004299, 0.119800 ] ], "n": ["FDJVGXF01CY2XG" ] }, {"p": [[226, -5552.560000, 0.591176, 0.021814, 0.055925 ], [17, -5553.620000, 0.204520, 0.049252, 0.060839 ], [227, -5553.620000, 0.204304, 0.000006, 0.060849 ] ], "n": ["FDJVGXF01BBM1B_rvcmp" ] }, {"p": [[226, -8847.850000, 0.499970, 0.022262, 0.050335 ], [227, -8849.000000, 0.158035, 0.000006, 0.054533 ], [17, -8849.000000, 0.158001, 0.049256, 0.054539 ], [204, -8849.890000, 0.064722, 0.012861, 0.063559 ], [205, -8849.910000, 0.063647, 0.012857, 0.062608 ], [209, -8850.650000, 0.030366, 0.004619, 0.067779 ], [22, -8850.840000, 0.025259, 0.026004, 0.068609 ] ], "n": ["FDJVGXF01D6GZ5_rvcmp" ] }, {"p": [[226, -8749.410000, 0.615362, 0.022347, 0.045914 ], [227, -8750.580000, 0.189454, 0.000006, 0.050218 ], [204, -8751.720000, 0.060748, 0.012682, 0.059594 ], [205, -8751.730000, 0.059984, 0.013176, 0.058688 ], [209, -8752.530000, 0.027101, 0.004563, 0.063888 ], [210, -8752.600000, 0.025175, 0.003981, 0.062382 ], [22, -8752.730000, 0.022177, 0.025968, 0.064719 ] ], "n": ["FDJVGXF01B2CQ6_rvcmp" ] }, {"p": [[226, -8839.580000, 0.631908, 0.022040, 0.040313 ], [227, -8840.880000, 0.171633, 0.000006, 0.044618 ], [17, -8840.880000, 0.171616, 0.049256, 0.044625 ], [210, -8843.400000, 0.013788, 0.005397, 0.057445 ], [22, -8843.620000, 0.011055, 0.024938, 0.060604 ] ], "n": ["FDJVGXF01C6QUM_rvcmp" ] }, {"p": [[226, -8844.300000, 0.760393, 0.022221, 0.039564 ], [227, -8845.580000, 0.211883, 0.000006, 0.043782 ], [210, -8848.280000, 0.014169, 0.005541, 0.056501 ], [22, -8848.320000, 0.013555, 0.021511, 0.059346 ] ], "n": ["FDJVGXF01AZKUX_rvcmp" ] }, {"p": [[226, -7758.930000, 0.551594, 0.021099, 0.096460 ], [17, -7759.830000, 0.224393, 0.049256, 0.101204 ], [227, -7759.830000, 0.224012, 0.000006, 0.101211 ] ], "n": ["FDJVGXF01BLAW1" ] }, {"p": [[226, -9266.680000, 0.287583, 0.020871, 0.086761 ], [210, -9267.000000, 0.208446, 0.000009, 0.107018 ], [22, -9267.000000, 0.208372, 0.028187, 0.107025 ], [209, -9267.000000, 0.208221, 0.006837, 0.107020 ], [17, -9268.390000, 0.052027, 0.049256, 0.091910 ], [205, -9269.370000, 0.019430, 0.026742, 0.105602 ], [208, -9269.570000, 0.015920, 0.020689, 0.105504 ] ], "n": ["FDJVGXF01C7551" ] }, {"p": [[226, -7899.660000, 0.641751, 0.020507, 0.068135 ], [17, -7900.970000, 0.173593, 0.036024, 0.061377 ], [227, -7901.720000, 0.081895, 0.000006, 0.072150 ], [228, -7902.270000, 0.047264, 0.000005, 0.078311 ], [2, -7902.270000, 0.047263, 0.036220, 0.078312 ], [1, -7904.020000, 0.008235, 0.068839, 0.073669 ] ], "n": ["FDJVGXF01B3YSF_rvcmp" ] }, {"p": [[226, -8095.620000, 0.615465, 0.019591, 0.080560 ], [17, -8096.570000, 0.239706, 0.041771, 0.078471 ], [227, -8097.070000, 0.144828, 0.000006, 0.086379 ] ], "n": ["FDJVGXF01DVV5Y_rvcmp" ] }, {"p": [[226, -8647.850000, 0.390540, 0.020201, 0.047896 ], [22, -8648.790000, 0.152417, 0.023114, 0.064621 ], [209, -8648.870000, 0.141789, 0.005344, 0.064597 ], [210, -8648.940000, 0.131944, 0.001834, 0.064036 ], [227, -8649.600000, 0.068199, 0.000005, 0.055004 ], [17, -8649.600000, 0.068193, 0.049256, 0.055002 ], [205, -8649.970000, 0.046919, 0.023165, 0.063179 ] ], "n": ["FDJVGXF01BP2AX" ] }, {"p": [[226, -8838.250000, 0.371555, 0.019758, 0.047344 ], [209, -8839.030000, 0.170311, 0.004683, 0.063659 ], [22, -8839.200000, 0.142931, 0.025899, 0.064312 ], [210, -8839.210000, 0.141921, 0.001894, 0.063333 ], [205, -8839.890000, 0.072113, 0.023505, 0.062226 ], [227, -8840.110000, 0.057748, 0.000006, 0.054524 ], [204, -8840.390000, 0.043421, 0.012912, 0.063974 ] ], "n": ["FDJVGXF01AP643" ] }, {"p": [[226, -8838.250000, 0.371555, 0.019758, 0.047344 ], [209, -8839.030000, 0.170311, 0.004683, 0.063659 ], [22, -8839.200000, 0.142931, 0.025899, 0.064312 ], [210, -8839.210000, 0.141921, 0.001894, 0.063333 ], [205, -8839.890000, 0.072113, 0.023505, 0.062226 ], [227, -8840.110000, 0.057748, 0.000006, 0.054524 ], [204, -8840.390000, 0.043421, 0.012912, 0.063974 ] ], "n": ["FDJVGXF01AYG31" ] }, {"p": [[226, -8835.560000, 0.371388, 0.019762, 0.047365 ], [209, -8836.340000, 0.170363, 0.004683, 0.063674 ], [22, -8836.510000, 0.142979, 0.025899, 0.064327 ], [210, -8836.520000, 0.141962, 0.001893, 0.063348 ], [205, -8837.200000, 0.072130, 0.023499, 0.062231 ], [227, -8837.420000, 0.057741, 0.000006, 0.054529 ], [204, -8837.710000, 0.043435, 0.012908, 0.063990 ] ], "n": ["FDJVGXF01AUW88" ] }, {"p": [[226, -6107.690000, 0.644055, 0.020463, 0.035835 ], [227, -6109.240000, 0.135927, 0.000006, 0.040585 ], [17, -6109.240000, 0.135922, 0.049256, 0.040583 ], [22, -6110.460000, 0.040206, 0.012667, 0.052701 ], [21, -6111.030000, 0.022697, 0.017643, 0.055999 ], [210, -6111.100000, 0.021193, 0.009487, 0.052678 ] ], "n": ["FDJVGXF01C7HFL_rvcmp" ] }, {"p": [[226, -9425.300000, 0.368314, 0.017926, 0.115035 ], [205, -9425.610000, 0.271049, 0.027844, 0.133824 ], [22, -9426.350000, 0.129463, 0.017416, 0.138592 ], [26, -9427.000000, 0.067585, 0.080697, 0.128304 ], [17, -9427.000000, 0.067367, 0.033912, 0.118917 ], [196, -9427.240000, 0.053067, 0.017550, 0.132249 ], [210, -9427.450000, 0.043155, 0.007167, 0.132912 ] ], "n": ["FDJVGXF01A39LX_rvcmp" ] }, {"p": [[226, -8164.820000, 0.665159, 0.017643, 0.040602 ], [210, -8166.930000, 0.080563, 0.005066, 0.056548 ], [22, -8167.130000, 0.066399, 0.025108, 0.059710 ], [209, -8167.230000, 0.060068, 0.006835, 0.060595 ], [227, -8167.400000, 0.050514, 0.000006, 0.048174 ], [205, -8167.540000, 0.043795, 0.014769, 0.056322 ], [204, -8167.810000, 0.033501, 0.014539, 0.058650 ] ], "n": ["FDJVGXF01DLDAM_rvcmp" ] }, {"p": [[226, -7762.390000, 0.840647, 0.017612, 0.030959 ], [210, -7765.110000, 0.055537, 0.005691, 0.048317 ], [22, -7765.230000, 0.048944, 0.022461, 0.052178 ], [209, -7765.500000, 0.037443, 0.006837, 0.053214 ], [205, -7766.270000, 0.017428, 0.015153, 0.049083 ] ], "n": ["FDJVGXF01BWU05_rvcmp" ] }, {"p": [[226, -7762.390000, 0.840647, 0.017612, 0.030959 ], [210, -7765.110000, 0.055537, 0.005691, 0.048317 ], [22, -7765.230000, 0.048944, 0.022461, 0.052178 ], [209, -7765.500000, 0.037443, 0.006837, 0.053214 ], [205, -7766.270000, 0.017428, 0.015153, 0.049083 ] ], "n": ["FDJVGXF01BW1CN_rvcmp" ] }, {"p": [[226, -8147.700000, 0.310259, 0.016506, 0.075740 ], [210, -8147.890000, 0.257436, 0.006124, 0.090837 ], [209, -8148.640000, 0.122180, 0.006837, 0.097469 ], [22, -8148.640000, 0.122103, 0.028184, 0.097473 ], [208, -8148.850000, 0.098621, 0.018656, 0.096245 ], [205, -8149.200000, 0.069349, 0.038635, 0.099997 ], [17, -8150.440000, 0.020051, 0.045357, 0.081116 ] ], "n": ["FDJVGXF01DVLFF_rvcmp" ] }, {"p": [[226, -7741.710000, 0.788221, 0.017433, 0.031904 ], [210, -7744.260000, 0.061585, 0.005508, 0.049528 ], [22, -7744.510000, 0.048113, 0.024944, 0.053398 ], [209, -7744.630000, 0.042718, 0.006837, 0.054340 ], [205, -7744.850000, 0.034092, 0.015083, 0.049731 ], [204, -7745.150000, 0.025271, 0.014237, 0.052227 ] ], "n": ["FDJVGXF01D0TIM_rvcmp" ] }, {"p": [[226, -7617.130000, 0.855245, 0.017272, 0.026149 ], [210, -7620.080000, 0.044799, 0.006010, 0.044504 ], [22, -7620.430000, 0.031715, 0.025318, 0.049201 ], [209, -7620.530000, 0.028560, 0.006837, 0.049957 ], [205, -7620.700000, 0.024071, 0.015412, 0.045299 ], [204, -7621.140000, 0.015610, 0.015358, 0.048486 ] ], "n": ["FDJVGXF01B1Y4W_rvcmp" ] }, {"p": [[226, -7831.960000, 0.726600, 0.016232, 0.083842 ], [210, -7834.430000, 0.061925, 0.018069, 0.100678 ], [225, -7834.430000, 0.061921, 0.036449, 0.100684 ], [17, -7834.490000, 0.058342, 0.039442, 0.083774 ], [227, -7834.850000, 0.040654, 0.000006, 0.091917 ], [2, -7835.320000, 0.025282, 0.036220, 0.098600 ], [228, -7835.320000, 0.025277, 0.000005, 0.098604 ] ], "n": ["FDJVGXF01D2C4P" ] }, {"p": [[229, -6777.200000, 0.201563, 0.000006, 1.999990 ], [235, -6777.360000, 0.171282, 0.000006, 1.999990 ], [233, -6777.360000, 0.171278, 0.062297, 1.999990 ], [234, -6777.360000, 0.171277, 0.079656, 1.999990 ], [237, -6777.680000, 0.124736, 0.000006, 1.999990 ], [236, -6777.680000, 0.124727, 0.061431, 1.999990 ], [240, -6778.940000, 0.035137, 0.020199, 1.999990 ] ], "n": ["FDJVGXF01B139S" ] }, {"p": [[229, -6484.760000, 0.308300, 0.000006, 1.687020 ], [236, -6485.560000, 0.139205, 0.061433, 1.850520 ], [235, -6485.560000, 0.139202, 0.045058, 1.850560 ], [237, -6485.560000, 0.139184, 0.000010, 1.850430 ], [234, -6485.720000, 0.117731, 0.000008, 1.995650 ], [233, -6485.740000, 0.115640, 0.062297, 1.992730 ], [230, -6486.780000, 0.040737, 0.047159, 1.994230 ] ], "n": ["FDJVGXF01COS50" ] }, {"p": [[237, -2600.620000, 0.196217, 0.004984, 0.035760 ], [235, -2600.760000, 0.171435, 0.033033, 0.035334 ], [236, -2600.810000, 0.162601, 0.061101, 0.036501 ], [234, -2600.940000, 0.142742, 0.066879, 0.037274 ], [233, -2601.180000, 0.112090, 0.062297, 0.041235 ], [238, -2601.210000, 0.108625, 0.026413, 0.044321 ], [239, -2601.230000, 0.106289, 0.000006, 0.045176 ] ], "n": ["FDJVGXF01BHEJN" ] }, {"p": [[237, -2600.620000, 0.196217, 0.004984, 0.035760 ], [235, -2600.760000, 0.171435, 0.033033, 0.035334 ], [236, -2600.810000, 0.162601, 0.061101, 0.036501 ], [234, -2600.940000, 0.142742, 0.066879, 0.037274 ], [233, -2601.180000, 0.112090, 0.062297, 0.041235 ], [238, -2601.210000, 0.108625, 0.026413, 0.044321 ], [239, -2601.230000, 0.106289, 0.000006, 0.045176 ] ], "n": ["FDJVGXF01A2KPF" ] }, {"p": [[238, -6284.840000, 0.773704, 0.006143, 0.093370 ], [235, -6287.060000, 0.083706, 0.031479, 0.086311 ], [237, -6287.410000, 0.058873, 0.013082, 0.098341 ], [239, -6287.410000, 0.058844, 0.000006, 0.098348 ], [232, -6288.830000, 0.014342, 0.014309, 0.100514 ], [228, -6289.140000, 0.010532, 0.004961, 0.100060 ] ], "n": ["FDJVGXF01CS1OP_rvcmp" ] }, {"p": [[238, -5973.420000, 0.857507, 0.005674, 0.085892 ], [237, -5976.230000, 0.051583, 0.013082, 0.091867 ], [239, -5976.230000, 0.051551, 0.000006, 0.091869 ], [235, -5976.500000, 0.039359, 0.042794, 0.089827 ] ], "n": ["FDJVGXF01D798E" ] }, {"p": [[239, -6507.240000, 0.162787, 0.013015, 0.455661 ], [232, -6507.250000, 0.162744, 0.018799, 0.455637 ], [240, -6507.250000, 0.162692, 0.000006, 0.455663 ], [237, -6507.320000, 0.151271, 0.011406, 0.478425 ], [238, -6507.350000, 0.146875, 0.027842, 0.480591 ], [10, -6507.400000, 0.139747, 0.043940, 0.398095 ], [4, -6508.030000, 0.073884, 0.076256, 0.513393 ] ], "n": ["FDJVGXF01C9ZEB_rvcmp" ] }, {"p": [[248, -2948.110000, 0.512844, 0.051585, 0.039636 ], [249, -2948.950000, 0.221226, 0.012515, 0.058715 ], [250, -2948.950000, 0.221201, 0.021035, 0.058715 ], [228, -2951.820000, 0.012512, 0.021550, 0.074312 ], [226, -2951.920000, 0.011348, 0.022349, 0.069918 ], [17, -2951.940000, 0.011122, 0.035118, 0.064973 ], [227, -2952.070000, 0.009746, 0.000006, 0.074462 ] ], "n": ["FDJVGXF01CV89O_rvcmp" ] } ], "metadata": {"invocation": "guppy to_json" }, "version": 1, "fields": ["edge_num", "likelihood", "like_weight_ratio", "distal_length", "pendant_length" ] }pplacer-1.1.alpha19/tests/data/moran/de_rounded_dmsp.jplace000066400000000000000000004630541303154601500237530ustar00rootroot00000000000000{"tree": "((((((Cyanophora_paradoxa_:0.0665203[0],Mesostigma_viride_:0.0962753[1]):0.0362291[2],((chloroplast_Cyanidium_sp._Monte_Rotaro.AY391365_:0.123946[3],((chloroplast_Galdieria_sulphuraria.AY541295_:0.076265[4],((chloroplast_Galdieria_sulphuraria.AY119731_:2.68035e-06[5],chloroplast_Cyanidium_caldarium.X52758_:0.0195896[6]):0.0312019[7],chloroplast_Galdieria_sulphuraria.AY541294_:0.0188214[8]):0.0324389[9]):0.133418[10],((chloroplast_Cyanidioschyzon_merolae.AY119730_:2.68035e-06[11],chloroplast_Cyanidioschyzon_merolae_strain_DBV201.AY119729_:0.00117862[12]):0.0762594[13],chloroplast_Cyanidium_caldarium.AY541290_:0.203636[14]):0.0380657[15]):0.0194682[16]):0.0492622[17],(((chloroplast_Vaucheria_litorea.AF227740_:0.0517049[18],(plastid_Tribonema_aequale.AY528860_:0.0126259[19],chloroplast_Bumilleriopsis_filiformis.X79223_:0.00666588[20]):0.017649[21]):0.0281935[22],(((chloroplast_Skeletonema_costatum.AY119761_:0.00361095[23],Thalassiosira_pseudonana_:0.00113368[24]):0.0145191[25],(((Bigelowiella_natans_:0.097412[26],((Chlamydomonas_reinhardtii_:0.0704485[27],(chloroplast_Picochlorum_sp._RCC289.EU851960_:0.0487654[28],(Chlorella_vulgaris_:0.0467075[29],(chloroplast_Chlorella_pyrenoidosa.EU043047_:0.00161427[30],chloroplast_Auxenochlorella_protothecoides.EU043045_:0.00193294[31]):0.0152331[32]):0.0200406[33]):0.0147874[34]):0.0130863[35],((chloroplast_Chlorella_vulgaris.EU043044_:0.00120893[36],chloroplast_Chlorella_pyrenoidosa.EU043049_:0.00232797[37]):0.0768327[38],(plastid_Tetraselmis_marina.AY857618_:0.0254053[39],(chloroplast_Pseudochlorella_sp._CCAP_211_1A.EU043048_:0.0869235[40],(((((Synechococcus_sp._PCC_7002___gi170076636refNC_010475_:0.0621893[41],(((Nostock_punctiforme_gi186680550refNC_010628_:0.112883[42],((Nostoc_sp._PCC_7120_gi17227497refNC_003272_:0.00889436[43],Anabaena_variabilis_A_gi75906225refNC_007413_:0.0221131[44]):0.038336[45],(Nodularia_spumige_gi119512239refNZ_AAVW01000065_:0.0504455[46],Fremyella_diplosiphon.FDIPSBA_:0.051697[47]):0.0178891[48]):0.0237368[49]):0.0326133[50],(Lyngbya_sp_PCC_8106___gi119483230refNZ_AAVU01000001_:0.231009[51],(Microcystis_aerouginosa_gi166362741refNC_010296_:0.0929627[52],((Cyanothece_sp._ATCC_51142.CAU39610_:0.0123916[53],Cyanothece_sp._CCY_0110___gi126657681refNZ_AAXW01000012_:0.0313088[54]):0.0369935[55],(Cyanothece_sp._PCC_7425_gi218437013refNC_011729_:0.0746015[56],Cyanothece_sp._PCC_8801_gi218244892refNC_011726_:0.0616473[57]):0.0148311[58]):0.0396174[59]):0.0228094[60]):0.0166279[61]):0.0233005[62],(Synechocystis_sp_PCC_6803___gi16329170refNC_000911_:0.0535075[63],((((((Cyanothece_sp._CC_gi126660325refNZ_AAXW01000053_:0.347497[64],Synechococcus_sp._PCC_7335_gi225144522refNW_002475532_:0.317895[65]):0.108045[66],Mastigocladus_laminosus.AF170924_:0.264356[67]):0.0676548[68],((Synechococcus_sp._JA-3-3Ab__gi86604733refNC_007775_:0.0973541[69],Synechococcus_sp._JA-2-3Ba____gi86607503refNC_007776_:0.564415[70]):0.0790386[71],Gloeobacter_violaceus_gi37519569refNC_005125.1_:0.263289[72]):0.11791[73]):0.0379309[74],(Thermosynechococcus_gi22297544refNC_004113_:0.11758[75],(Cyanothece_sp._PCC_7425_gi220905643refNC_011884_:0.138332[76],Acaryochloris_marina_MBIC11017.AB303650_:0.216398[77]):0.0159655[78]):0.0287204[79]):0.0341087[80],((Prochlorothrix_hollandica.X14308_:2.68035e-06[81],Prochlorothrix_hollandica.X14523_:0.00128006[82]):0.081034[83],((Synechococcus_elongatus_PCC_7942___gi81298811refNC_007604_:0.0105928[84],Synechococcus_elongatus_PCC_6301___gi56750010refNC_006576_:0.00276979[85]):0.107743[86],((Synechococcus_sp._WH_5701__gi87301761refNZ_AANO01000004_:0.0111919[87],Synechococcus_sp._WH_5701__gi87303211refNZ_AANO01000010_:0.0726788[88]):0.0147436[89],(((((Synechococcus_sp._RCC307_gi148241099refNC_009482_:0.0408099[90],((Synechococcus_sp._WH_8102_gi33864539refNC_005070_:0.0201067[91],(Synechococcus_sp._CC9902_gi78183584refNC_007513_:0.00536202[92],Synechococcus_sp._BL107_gi211594587refNZ_DS022298_:0.00246287[93]):0.0392091[94]):0.00867041[95],Synechococcus_sp._CC9605_gi78211558refNC_007516_:0.0275067[96]):0.0214861[97]):0.0346913[98],(Synechococcus_sp.__RS9916__gi116074999refNZ_AAUA01000003_:0.0477208[99],Synechococcus_sp._gi87123618refNZ_AANP01000002_:0.0406377[100]):0.0188201[101]):0.0110855[102],((Synechococcus_sp._WH_7803___gi148238336refNC_009481_:0.00753009[103],(Synechococcus_sp.__WH_7805__gi88807077refNZ_AAOK01000001_:0.00265618[104],Synechococcus_sp._WH_7805__gi88807768refNZ_AAOK01000002_:0.0026187[105]):0.00799342[106]):0.0173394[107],(Synechococcus_sp._RS9917___gi87125174refNZ_AANP01000006_:2.68035e-06[108],Synechococcus_sp._RS9917___gi87124875refNZ_AANP01000005_:0.0026301[109]):0.00794167[110]):0.0038034[111]):0.0158306[112],Synechococcus_sp._RS9917__gi87124182refNZ_AANP01000003_:0.192923[113]):0.0118268[114],Cyanobium_sp._PCC_70_gi223490194refNW_002243451_:0.0330768[115]):0.0231555[116]):0.0518051[117]):0.0453212[118]):0.0351102[119]):0.0447589[120],Microcoleus_chthonoplastes_PCC_7420___gi224400128refNW_002435220_:0.0843742[121]):0.0306188[122]):0.0369097[123]):0.0349985[124]):0.0577156[125],Trichodesmium_erythr_gi113473942refNC_008312_:0.106684[126]):0.0409208[127],(((Prochlorococcus_marinus_subsp._pastoris_str._CCMP1986_gi33860560refNC_005072_:0.00365008[128],Prochlorococcus_marinus_str._MIT_9515___gi123965234refNC_008817_:0.00483373[129]):0.0106366[130],(Prochlorococcus_marinus_str._AS9601_gi123967536refNC_008816_:2.68035e-06[131],(Prochlorococcus_marinus_str._MIT_9301__gi126695337refNC_009091_:0.0108685[132],((Procholococcus_marinus_str._MIT_9202_gi225077649refNW_002467725_:0.00240146[133],Procholococcus_marinus_str._MIT_9215___gi157412338refNC_009840_:2.68035e-06[134]):0.00591536[135],Prochlorococcus_marinus_str._MIT_9312_gi78778385refNC_007577_:0.00379511[136]):0.0049759[137]):0.00132484[138]):0.0105617[139]):0.0465879[140],((Procholococcus_marinus_str._NATL2A___gi162958048refNC_007335.2_:0.00365548[141],Prochlorococcus_marinus_str._NATL1A___gi124024712refNC_008819_:2.68035e-06[142]):0.0615085[143],(Prochlorococcus_marinus_subsp._marinus_str._CCMP1375_gi33239452refNC_005042_:0.100663[144],Procholococcus_marinus_str._MIT_9211___gi159902540refNC_009976_:0.0611398[145]):0.060931[146]):0.0653211[147]):0.148126[148]):0.0637467[149],((chloroplast_Pavlova_gyrans.AJ575575_:0.0169655[150],(chloroplast_Pavlova_lutheri.AY119755_:0.0146662[151],chloroplast_Pavlova_gyrans.AY119754_:0.0299817[152]):0.0270032[153]):0.0303472[154],((chloroplast_Chrysochromulina_polylepis.AJ575572_:0.0128709[155],chloroplast_Imantonia_rotunda.EU851963_:0.0436031[156]):0.00589301[157],(((chloroplast_Isochrysis_galbana.AJ575574_:0.0174268[158],chloroplast_Emiliania_huxleyi.AJ575573_:0.0115577[159]):0.00738805[160],(chloroplast_Phaeocystis_antarctica.AY119756_:0.0324724[161],(chloroplast_Prymnesium_parvum.AY119758_:0.0107131[162],chloroplast_Prymnesium_parvum.AJ575576_:0.00676058[163]):0.020704[164]):0.00735947[165]):0.00200676[166],chloroplast_Pleurochrysis_carterae.AY119757_:0.0339814[167]):0.00361886[168]):0.0233927[169]):0.0187331[170]):0.0346389[171],((chloroplast_Mantoniella_squamata.EU851964_:0.00842936[172],((plastid_uncultured_Prasinophyceae.AY176630_:0.0226216[173],(((chloroplast_Ostreococcus_sp._RCC344.EU851961_:0.00605274[174],Ostreococcus_tauri_:0.010265[175]):0.00616569[176],chloroplast_Ostreococcus_sp._RCC789.EU851970_:0.01746[177]):0.00408084[178],(uncultured_Prasinophyceae.AY509537_:0.0209825[179],chloroplast_Bathycoccus_prasinos.EU851955_:0.00805147[180]):0.0371846[181]):0.00765875[182]):0.0179484[183],(chloroplast_Micromonas_pusilla.EU851965_:2.68035e-06[184],plastid_uncultured_Prasinophyceae.AY176639_:2.68035e-06[185]):0.0089575[186]):0.0110303[187]):0.0523059[188],chloroplast_Pycnococcus_provasolii.EU851957_:0.0961508[189]):0.0343432[190]):0.015656[191]):0.0224695[192]):0.0167387[193]):0.00670223[194]):0.00945502[195]):0.0781944[196],(Fragilariopsis_psbA_:0.0245188[197],Pmultiseries_psbA_:0.0131238[198]):0.0133041[199]):0.0126908[200],(Phaeodactylum_tricornutum_:0.0191354[201],plastid_Ballia_callitricha.DQ787635_:0.061781[202]):0.00999794[203]):0.0201532[204]):0.0386439[205],(chloroplast_Heterosigma_akashiwo.AY119759_:2.68035e-06[206],chloroplast_Heterosigma_carterae.HCU18090_:2.68035e-06[207]):0.0242521[208]):0.00684342[209]):0.018078[210],((chloroplast_Pachydictyon_coriaceum.AY422614_:0.0241936[211],chloroplast_Dictyota_dichotoma_var._linearis.AY422632_:0.00853816[212]):0.0239851[213],((chloroplast_Fucus_vesiculosus.DQ307679_:0.0343612[214],chloroplast_Ectocarpus_siliculosus.X56695_:0.0397557[215]):0.038827[216],((plastid_Padina_japonica.AY430360_:0.0143668[217],(plastid_Padina_arborescens.AY430357_:0.0162365[218],plastid_Padina_crassa.AY430358_:0.00695945[219]):0.00495696[220]):0.00344828[221],chloroplast_Padina_crassa.AY422643_:0.00886928[222]):0.0167452[223]):0.0107453[224]):0.0364574[225]):0.032314[226]):0.0129864[227]):0.0215549[228],(chloroplast_Flintiella_sanguinaria.AY119740_:0.047233[229],chloroplast_Porphyridium_aerugineum.AY119741_:0.0471646[230]):0.0174241[231]):0.0188085[232],(((chloroplast_Erythrotrichia_carnea.AY119739_:0.0623046[233],chloroplast_Rhodochaete_parvula.AY119743_:0.0796661[234]):0.0450641[235],chloroplast_Rhodosorus_marinus.AY119744_:0.0614381[236]):0.0130888[237],chloroplast_Bangiopsis_subsimplex.AY119736_:0.0278478[238]):0.0130213[239]):0.0469411[240],(chloroplast_Palmaria_palmata.PPU28165_:0.0983928[241],(plastid_Antithamnionella_sp._A31.DQ787640_:0.0189374[242],(plastid_Carpoblepharis_flaccida.DQ787643_:0.104554[243],chloroplast_Antithamnion_sp.X55364_:0.0274272[244]):0.00842288[245]):0.0306715[246]):0.0178171[247]):0.0709634[248],Porphyra_yezoensis_:0.0125208[249],Porphyra_purpurea_:0.0210402[250]):0[251];", "placements": [{"p": [[0, -3117.130000, 0.214473, 0.000008, 0.801891 ], [148, -3117.400000, 0.164538, 0.054804, 1.302960 ], [1, -3117.470000, 0.152677, 0.096269, 1.006950 ], [2, -3117.470000, 0.152674, 0.000009, 1.006960 ], [227, -3117.640000, 0.129693, 0.012980, 1.076140 ], [65, -3117.790000, 0.111540, 0.056959, 1.580190 ], [226, -3118.190000, 0.074404, 0.032306, 1.269280 ] ], "n": ["FDJVGXF02HY3U1_rvcmp" ] }, {"p": [[1, -5564.800000, 1.000000, 0.028081, 0.091769 ] ], "n": ["FDJVGXF02FE4ZQ_rvcmp" ] }, {"p": [[1, -4583.080000, 0.193989, 0.015939, 0.134691 ], [39, -4583.210000, 0.170963, 0.010180, 0.158900 ], [29, -4583.420000, 0.137486, 0.038169, 0.162950 ], [33, -4583.500000, 0.127677, 0.000010, 0.169180 ], [32, -4583.500000, 0.127633, 0.015226, 0.169184 ], [28, -4583.550000, 0.121153, 0.048759, 0.169104 ], [34, -4583.550000, 0.121100, 0.000007, 0.169109 ] ], "n": ["FDJVGXF02JKSVL" ] }, {"p": [[2, -9265.180000, 0.240808, 0.036220, 1.999990 ], [228, -9265.180000, 0.240776, 0.000005, 1.999990 ], [227, -9265.180000, 0.240754, 0.012980, 1.999990 ], [226, -9266.400000, 0.071450, 0.009177, 1.999990 ], [225, -9266.420000, 0.069870, 0.036449, 1.999990 ], [222, -9266.440000, 0.068171, 0.008861, 1.999990 ], [223, -9266.440000, 0.068171, 0.000008, 1.999990 ] ], "n": ["FDJVGXF02HT5SH" ] }, {"p": [[2, -7259.210000, 0.214693, 0.036220, 1.999990 ], [228, -7259.210000, 0.214652, 0.000005, 1.999990 ], [227, -7259.210000, 0.214632, 0.012980, 1.999990 ], [14, -7259.850000, 0.112963, 0.105287, 1.999990 ], [1, -7260.160000, 0.083002, 0.096269, 1.999990 ], [0, -7260.160000, 0.083001, 0.066512, 1.999990 ], [26, -7260.230000, 0.077058, 0.000006, 1.999990 ] ], "n": ["FDJVGXF02I73WJ" ] }, {"p": [[2, -7952.220000, 0.238765, 0.036220, 1.999990 ], [228, -7952.220000, 0.238719, 0.000005, 1.999990 ], [227, -7952.220000, 0.238696, 0.012980, 1.999990 ], [1, -7953.170000, 0.092233, 0.096269, 1.999990 ], [0, -7953.170000, 0.092231, 0.066512, 1.999990 ], [17, -7953.640000, 0.057799, 0.049256, 1.999990 ], [236, -7953.970000, 0.041557, 0.013580, 1.999990 ] ], "n": ["FDJVGXF02HYRJW" ] }, {"p": [[2, -7716.890000, 0.185400, 0.036220, 1.999990 ], [228, -7716.890000, 0.185343, 0.000005, 1.999990 ], [227, -7716.890000, 0.185326, 0.012980, 1.999990 ], [0, -7717.210000, 0.134744, 0.066512, 1.999990 ], [1, -7717.210000, 0.134744, 0.096269, 1.999990 ], [212, -7717.560000, 0.095123, 0.000008, 1.999990 ], [148, -7717.740000, 0.079320, 0.000009, 1.999990 ] ], "n": ["FDJVGXF02HTJMS_rvcmp" ] }, {"p": [[2, -7538.870000, 0.186782, 0.036220, 1.999990 ], [228, -7538.870000, 0.186725, 0.000005, 1.999990 ], [227, -7538.870000, 0.186707, 0.012980, 1.999990 ], [0, -7539.190000, 0.135408, 0.066512, 1.999990 ], [1, -7539.190000, 0.135407, 0.096269, 1.999990 ], [140, -7539.640000, 0.086107, 0.000006, 1.999990 ], [148, -7539.680000, 0.082865, 0.000009, 1.999990 ] ], "n": ["FDJVGXF02FLZ15" ] }, {"p": [[2, -8338.270000, 0.177564, 0.036220, 1.928570 ], [228, -8338.270000, 0.177507, 0.000005, 1.928630 ], [227, -8338.270000, 0.177492, 0.012980, 1.928620 ], [1, -8338.380000, 0.159003, 0.000006, 1.951050 ], [0, -8338.570000, 0.131264, 0.066512, 1.990660 ], [27, -8338.890000, 0.095404, 0.000009, 1.823090 ], [225, -8339.040000, 0.081766, 0.036449, 1.999990 ] ], "n": ["FDJVGXF02FYRCH" ] }, {"p": [[2, -6100.350000, 0.171663, 0.036220, 1.844040 ], [228, -6100.350000, 0.171606, 0.000005, 1.844090 ], [227, -6100.350000, 0.171590, 0.012980, 1.844090 ], [39, -6100.370000, 0.167646, 0.000006, 1.862610 ], [0, -6100.680000, 0.122459, 0.000008, 1.904720 ], [1, -6100.690000, 0.121815, 0.096269, 1.915330 ], [173, -6101.200000, 0.073222, 0.000006, 1.999990 ] ], "n": ["FDJVGXF02G57P7_rvcmp" ] }, {"p": [[2, -7810.420000, 0.215305, 0.036220, 1.655950 ], [228, -7810.420000, 0.215240, 0.000005, 1.655980 ], [227, -7810.420000, 0.215209, 0.012980, 1.655990 ], [0, -7810.890000, 0.134706, 0.066512, 1.736650 ], [1, -7810.890000, 0.134705, 0.096269, 1.736670 ], [17, -7812.040000, 0.042420, 0.049256, 1.922970 ], [226, -7812.040000, 0.042415, 0.032306, 1.923010 ] ], "n": ["FDJVGXF02IT1QW_rvcmp" ] }, {"p": [[2, -7981.470000, 0.787658, 0.018109, 0.048789 ], [22, -7982.920000, 0.184419, 0.013857, 0.062557 ], [227, -7985.430000, 0.014995, 0.004520, 0.063698 ], [226, -7985.580000, 0.012928, 0.029215, 0.063044 ] ], "n": ["FDJVGXF02GF4N8_rvcmp" ] }, {"p": [[2, -8427.140000, 0.843013, 0.018208, 0.045379 ], [22, -8429.010000, 0.129976, 0.013853, 0.058437 ], [227, -8431.200000, 0.014508, 0.004623, 0.059398 ], [226, -8431.350000, 0.012503, 0.028921, 0.058576 ] ], "n": ["FDJVGXF02FGRUW_rvcmp" ] }, {"p": [[2, -6445.550000, 0.814195, 0.014551, 0.056385 ], [22, -6447.200000, 0.156056, 0.015072, 0.076987 ], [227, -6449.890000, 0.010561, 0.004432, 0.076702 ], [18, -6449.920000, 0.010220, 0.038510, 0.089123 ], [226, -6450.060000, 0.008968, 0.030600, 0.077008 ] ], "n": ["FDJVGXF02HOSTB" ] }, {"p": [[2, -7315.100000, 0.785974, 0.014800, 0.053668 ], [22, -7316.560000, 0.183428, 0.013452, 0.069732 ], [18, -7319.240000, 0.012536, 0.041899, 0.078575 ], [227, -7319.500000, 0.009653, 0.004365, 0.070890 ], [226, -7319.640000, 0.008409, 0.029422, 0.070430 ] ], "n": ["FDJVGXF02HKV83_rvcmp" ] }, {"p": [[2, -7111.610000, 0.762892, 0.014101, 0.060062 ], [22, -7112.930000, 0.203447, 0.013952, 0.077812 ], [18, -7115.470000, 0.016037, 0.039961, 0.088032 ], [227, -7115.990000, 0.009466, 0.004388, 0.079675 ], [226, -7116.140000, 0.008158, 0.030096, 0.079691 ] ], "n": ["FDJVGXF02GF2S4_rvcmp" ] }, {"p": [[4, -1560.940000, 0.328346, 0.000009, 0.156150 ], [10, -1561.800000, 0.138353, 0.020064, 0.143011 ], [9, -1561.890000, 0.127178, 0.032431, 0.159127 ], [7, -1561.910000, 0.124723, 0.012753, 0.173881 ], [5, -1561.990000, 0.114552, 0.000001, 0.190687 ], [6, -1561.990000, 0.114552, 0.019580, 0.190687 ], [202, -1562.780000, 0.052295, 0.000008, 0.173378 ] ], "n": ["FDJVGXF02IMOR4" ] }, {"p": [[7, -5861.490000, 0.238659, 0.005765, 0.492369 ], [6, -5861.520000, 0.231081, 0.009808, 0.509158 ], [5, -5861.520000, 0.231061, 0.000001, 0.509233 ], [9, -5862.440000, 0.092037, 0.000008, 0.480130 ], [8, -5862.440000, 0.091980, 0.018812, 0.480138 ], [10, -5862.910000, 0.057591, 0.000008, 0.498955 ], [4, -5862.910000, 0.057591, 0.076256, 0.498973 ] ], "n": ["FDJVGXF02IO5UD" ] }, {"p": [[10, -4736.410000, 0.173624, 0.117143, 1.087830 ], [26, -4736.510000, 0.157391, 0.062410, 1.309950 ], [3, -4736.620000, 0.141439, 0.123938, 1.153590 ], [16, -4736.620000, 0.141431, 0.019459, 1.153590 ], [17, -4736.620000, 0.141424, 0.000006, 1.153600 ], [199, -4736.760000, 0.122498, 0.013298, 1.264610 ], [198, -4736.760000, 0.122192, 0.013117, 1.262170 ] ], "n": ["FDJVGXF02FJJ4E" ] }, {"p": [[10, -2739.510000, 0.301321, 0.059672, 0.194339 ], [244, -2739.700000, 0.250479, 0.000007, 0.289785 ], [167, -2740.220000, 0.149006, 0.000008, 0.304215 ], [64, -2740.550000, 0.106606, 0.201744, 0.235930 ], [6, -2740.910000, 0.074162, 0.001738, 0.283306 ], [9, -2741.010000, 0.067598, 0.013546, 0.252405 ], [7, -2741.290000, 0.050827, 0.031193, 0.285868 ] ], "n": ["FDJVGXF02FSPQ4_rvcmp" ] }, {"p": [[10, -2874.220000, 0.357474, 0.046026, 0.131018 ], [29, -2875.200000, 0.134654, 0.024073, 0.217957 ], [28, -2875.330000, 0.117833, 0.039567, 0.214014 ], [33, -2875.350000, 0.115112, 0.000010, 0.228547 ], [32, -2875.350000, 0.115079, 0.015226, 0.228547 ], [34, -2875.400000, 0.110466, 0.000007, 0.229077 ], [31, -2876.200000, 0.049381, 0.001925, 0.246419 ] ], "n": ["FDJVGXF02HKPJT" ] }, {"p": [[10, -2874.220000, 0.357474, 0.046026, 0.131018 ], [29, -2875.200000, 0.134654, 0.024073, 0.217957 ], [28, -2875.330000, 0.117833, 0.039567, 0.214014 ], [33, -2875.350000, 0.115112, 0.000010, 0.228547 ], [32, -2875.350000, 0.115079, 0.015226, 0.228547 ], [34, -2875.400000, 0.110466, 0.000007, 0.229077 ], [31, -2876.200000, 0.049381, 0.001925, 0.246419 ] ], "n": ["FDJVGXF02IZZZK" ] }, {"p": [[10, -2626.940000, 0.265067, 0.036090, 0.145359 ], [9, -2627.640000, 0.131969, 0.005782, 0.206560 ], [7, -2627.660000, 0.128693, 0.031193, 0.216556 ], [8, -2627.660000, 0.128692, 0.018812, 0.216562 ], [5, -2627.700000, 0.124321, 0.000001, 0.218520 ], [6, -2627.700000, 0.124251, 0.019580, 0.218538 ], [197, -2627.950000, 0.097006, 0.000006, 0.247332 ] ], "n": ["FDJVGXF02HYG0J_rvcmp" ] }, {"p": [[10, -6544.690000, 0.332762, 0.032944, 0.407233 ], [4, -6545.090000, 0.223638, 0.076256, 0.498602 ], [9, -6545.090000, 0.223522, 0.032431, 0.498612 ], [239, -6546.480000, 0.055598, 0.013015, 0.484459 ], [232, -6546.480000, 0.055582, 0.018799, 0.484440 ], [240, -6546.480000, 0.055566, 0.000006, 0.484458 ], [237, -6546.520000, 0.053332, 0.011450, 0.508824 ] ], "n": ["FDJVGXF02F2HFE_rvcmp" ] }, {"p": [[11, -6864.780000, 0.278804, 0.000001, 1.043280 ], [12, -6864.780000, 0.278804, 0.000009, 1.043270 ], [13, -6864.780000, 0.278748, 0.000009, 1.043280 ], [148, -6866.280000, 0.061855, 0.096694, 1.206030 ], [56, -6866.700000, 0.040845, 0.039334, 1.112120 ], [51, -6866.840000, 0.035437, 0.164389, 1.082770 ], [127, -6867.170000, 0.025507, 0.040911, 1.209000 ] ], "n": ["FDJVGXF02JFXRU" ] }, {"p": [[11, -3076.720000, 0.233127, 0.000001, 0.754007 ], [12, -3076.720000, 0.233127, 0.000009, 0.754007 ], [13, -3076.720000, 0.233090, 0.000009, 0.754004 ], [0, -3077.630000, 0.093581, 0.000008, 0.849447 ], [65, -3077.830000, 0.076319, 0.000009, 1.425200 ], [1, -3077.990000, 0.065378, 0.096269, 1.011570 ], [2, -3077.990000, 0.065377, 0.000009, 1.011590 ] ], "n": ["FDJVGXF02HYHTY_rvcmp" ] }, {"p": [[11, -3076.720000, 0.233127, 0.000001, 0.754007 ], [12, -3076.720000, 0.233127, 0.000009, 0.754007 ], [13, -3076.720000, 0.233090, 0.000009, 0.754004 ], [0, -3077.630000, 0.093581, 0.000008, 0.849447 ], [65, -3077.830000, 0.076319, 0.000009, 1.425200 ], [1, -3077.990000, 0.065378, 0.096269, 1.011570 ], [2, -3077.990000, 0.065377, 0.000009, 1.011590 ] ], "n": ["FDJVGXF02HTSXB_rvcmp" ] }, {"p": [[13, -5769.980000, 0.291611, 0.064845, 0.607318 ], [14, -5770.030000, 0.277925, 0.203630, 0.610159 ], [15, -5770.030000, 0.277886, 0.000009, 0.610165 ], [10, -5771.890000, 0.043041, 0.117176, 0.677724 ], [16, -5771.930000, 0.041310, 0.000010, 0.708501 ], [11, -5772.130000, 0.034113, 0.000001, 0.714205 ], [12, -5772.130000, 0.034113, 0.001169, 0.714210 ] ], "n": ["FDJVGXF02IVI8D_rvcmp" ] }, {"p": [[14, -3326.800000, 0.281519, 0.140724, 0.430414 ], [13, -3327.190000, 0.191388, 0.076254, 0.498052 ], [15, -3327.190000, 0.191342, 0.000009, 0.498052 ], [9, -3327.970000, 0.087026, 0.000008, 0.637821 ], [7, -3327.970000, 0.087015, 0.031194, 0.637827 ], [10, -3328.040000, 0.081374, 0.016508, 0.614993 ], [4, -3328.050000, 0.080335, 0.076256, 0.643355 ] ], "n": ["FDJVGXF02JXEFU_rvcmp" ] }, {"p": [[17, -7895.780000, 0.159436, 0.049256, 1.766100 ], [227, -7895.780000, 0.159417, 0.000006, 1.766110 ], [226, -7895.780000, 0.159401, 0.032306, 1.766120 ], [205, -7895.960000, 0.133044, 0.002012, 1.779580 ], [25, -7895.960000, 0.132783, 0.014512, 1.784070 ], [3, -7895.970000, 0.131500, 0.123938, 1.797630 ], [23, -7896.020000, 0.124419, 0.003604, 1.818720 ] ], "n": ["FDJVGXF02FTMSK" ] }, {"p": [[17, -7466.330000, 0.338658, 0.042709, 0.095338 ], [226, -7466.370000, 0.328472, 0.030162, 0.099519 ], [227, -7466.420000, 0.312368, 0.000006, 0.100215 ], [2, -7469.420000, 0.015512, 0.016303, 0.100631 ], [210, -7470.550000, 0.004990, 0.003185, 0.125792 ] ], "n": ["FDJVGXF02I4B0Q" ] }, {"p": [[17, -7466.330000, 0.338658, 0.042709, 0.095338 ], [226, -7466.370000, 0.328472, 0.030162, 0.099519 ], [227, -7466.420000, 0.312368, 0.000006, 0.100215 ], [2, -7469.420000, 0.015512, 0.016303, 0.100631 ], [210, -7470.550000, 0.004990, 0.003185, 0.125792 ] ], "n": ["FDJVGXF02G4XFH" ] }, {"p": [[17, -7466.330000, 0.338658, 0.042709, 0.095338 ], [226, -7466.370000, 0.328472, 0.030162, 0.099519 ], [227, -7466.420000, 0.312368, 0.000006, 0.100215 ], [2, -7469.420000, 0.015512, 0.016303, 0.100631 ], [210, -7470.550000, 0.004990, 0.003185, 0.125792 ] ], "n": ["FDJVGXF02GYT9J" ] }, {"p": [[17, -7844.150000, 0.677994, 0.029153, 0.054526 ], [226, -7845.530000, 0.170499, 0.025843, 0.067870 ], [227, -7845.990000, 0.107736, 0.000006, 0.070088 ], [16, -7846.890000, 0.043772, 0.015289, 0.051226 ] ], "n": ["FDJVGXF02H1V5W" ] }, {"p": [[18, -4819.310000, 0.227240, 0.051699, 0.370612 ], [22, -4819.310000, 0.227218, 0.000007, 0.370600 ], [21, -4819.310000, 0.227179, 0.017640, 0.370627 ], [19, -4819.980000, 0.116073, 0.000006, 0.396647 ], [20, -4820.500000, 0.069431, 0.006659, 0.417083 ], [189, -4820.540000, 0.066432, 0.096145, 0.399197 ], [188, -4820.540000, 0.066427, 0.052299, 0.399192 ] ], "n": ["FDJVGXF02HNZ3V_rvcmp" ] }, {"p": [[19, -5955.550000, 0.634081, 0.003958, 0.137929 ], [21, -5956.370000, 0.278987, 0.009223, 0.128295 ], [20, -5957.960000, 0.056639, 0.006659, 0.150048 ], [22, -5959.250000, 0.015673, 0.003400, 0.131306 ], [18, -5959.320000, 0.014620, 0.051391, 0.136503 ] ], "n": ["FDJVGXF02IDX33_rvcmp" ] }, {"p": [[19, -5835.510000, 0.283598, 0.000006, 0.345107 ], [22, -5835.890000, 0.194713, 0.010135, 0.336322 ], [21, -5836.130000, 0.153542, 0.002510, 0.355877 ], [20, -5836.140000, 0.151823, 0.006659, 0.359469 ], [18, -5836.550000, 0.100371, 0.051696, 0.361527 ], [193, -5837.100000, 0.057977, 0.016731, 0.364424 ], [194, -5837.100000, 0.057976, 0.000007, 0.364437 ] ], "n": ["FDJVGXF02HV7EN" ] }, {"p": [[19, -6081.420000, 0.328596, 0.000006, 0.316783 ], [22, -6081.880000, 0.207631, 0.009372, 0.307884 ], [21, -6082.080000, 0.170130, 0.003619, 0.324369 ], [20, -6082.110000, 0.165162, 0.006659, 0.329487 ], [18, -6082.540000, 0.107620, 0.051696, 0.329535 ], [193, -6084.790000, 0.011393, 0.016731, 0.359091 ], [35, -6084.970000, 0.009468, 0.013080, 0.364712 ] ], "n": ["FDJVGXF02FXK0E" ] }, {"p": [[19, -6081.420000, 0.328596, 0.000006, 0.316783 ], [22, -6081.880000, 0.207631, 0.009372, 0.307884 ], [21, -6082.080000, 0.170130, 0.003619, 0.324369 ], [20, -6082.110000, 0.165162, 0.006659, 0.329487 ], [18, -6082.540000, 0.107620, 0.051696, 0.329535 ], [193, -6084.790000, 0.011393, 0.016731, 0.359091 ], [35, -6084.970000, 0.009468, 0.013080, 0.364712 ] ], "n": ["FDJVGXF02FXRBW" ] }, {"p": [[20, -6041.450000, 0.212686, 0.006061, 0.053393 ], [21, -6041.460000, 0.211136, 0.000009, 0.053528 ], [19, -6041.460000, 0.210896, 0.012620, 0.053530 ], [22, -6041.630000, 0.178460, 0.002436, 0.051363 ], [18, -6041.670000, 0.171397, 0.051699, 0.052825 ], [205, -6044.080000, 0.015426, 0.023868, 0.055316 ] ], "n": ["FDJVGXF02JXNPL_rvcmp" ] }, {"p": [[20, -7802.800000, 0.228456, 0.005173, 0.048403 ], [21, -7802.850000, 0.217162, 0.000009, 0.048642 ], [19, -7802.850000, 0.216726, 0.012620, 0.048644 ], [22, -7803.100000, 0.168918, 0.000008, 0.048049 ], [18, -7803.100000, 0.168738, 0.051699, 0.048058 ] ], "n": ["FDJVGXF02HWVVX_rvcmp" ] }, {"p": [[20, -7118.550000, 0.736979, 0.002575, 0.065074 ], [21, -7120.540000, 0.100252, 0.008709, 0.065662 ], [22, -7121.110000, 0.056990, 0.001310, 0.067691 ], [18, -7121.120000, 0.056417, 0.051699, 0.068217 ], [19, -7121.250000, 0.049362, 0.012620, 0.069848 ] ], "n": ["FDJVGXF02GL3AG_rvcmp" ] }, {"p": [[20, -8610.600000, 0.418928, 0.002147, 0.070329 ], [22, -8611.150000, 0.240142, 0.011262, 0.066819 ], [205, -8611.640000, 0.147739, 0.026261, 0.069352 ], [196, -8611.660000, 0.145234, 0.032785, 0.068332 ], [21, -8612.860000, 0.043632, 0.010574, 0.070412 ], [209, -8615.170000, 0.004324, 0.006837, 0.077002 ] ], "n": ["FDJVGXF02FCTOG" ] }, {"p": [[20, -5886.570000, 0.323980, 0.000005, 0.060356 ], [204, -5887.240000, 0.165046, 0.005279, 0.073106 ], [21, -5887.650000, 0.109149, 0.000009, 0.061708 ], [19, -5887.660000, 0.108977, 0.012620, 0.061711 ], [22, -5887.760000, 0.098468, 0.000009, 0.061016 ], [18, -5887.760000, 0.098371, 0.051699, 0.061019 ], [200, -5887.780000, 0.096009, 0.012685, 0.080188 ] ], "n": ["FDJVGXF02FQOVG" ] }, {"p": [[20, -6359.030000, 0.271724, 0.000005, 0.052818 ], [196, -6359.360000, 0.196169, 0.030552, 0.055346 ], [21, -6359.830000, 0.122073, 0.000009, 0.053579 ], [19, -6359.830000, 0.121928, 0.012620, 0.053581 ], [22, -6359.960000, 0.107500, 0.000009, 0.052866 ], [18, -6359.960000, 0.107434, 0.051699, 0.052872 ], [204, -6360.340000, 0.073172, 0.005682, 0.063256 ] ], "n": ["FDJVGXF02F8HX9" ] }, {"p": [[21, -8764.250000, 0.241199, 0.017640, 0.064045 ], [22, -8764.250000, 0.241103, 0.000009, 0.064040 ], [18, -8764.250000, 0.240931, 0.051699, 0.064041 ], [196, -8764.600000, 0.170284, 0.043558, 0.062879 ], [20, -8765.750000, 0.053987, 0.005550, 0.068370 ], [19, -8765.770000, 0.052496, 0.012620, 0.068575 ] ], "n": ["FDJVGXF02HW4T9" ] }, {"p": [[21, -8438.750000, 0.283393, 0.017640, 0.062480 ], [22, -8438.750000, 0.283285, 0.000009, 0.062475 ], [18, -8438.750000, 0.283077, 0.051699, 0.062480 ], [20, -8440.260000, 0.062200, 0.005525, 0.066981 ], [19, -8440.290000, 0.060431, 0.012620, 0.067196 ], [196, -8441.080000, 0.027614, 0.044543, 0.066445 ] ], "n": ["FDJVGXF02IR6E7" ] }, {"p": [[21, -8761.550000, 0.256121, 0.017640, 0.059333 ], [22, -8761.550000, 0.256062, 0.000008, 0.059329 ], [18, -8761.550000, 0.255831, 0.051699, 0.059333 ], [196, -8761.900000, 0.180216, 0.043290, 0.057365 ], [19, -8763.150000, 0.051770, 0.012620, 0.063837 ] ], "n": ["FDJVGXF02GL7HB" ] }, {"p": [[21, -9500.630000, 0.335409, 0.017035, 0.080590 ], [18, -9500.640000, 0.332424, 0.051473, 0.080673 ], [22, -9500.640000, 0.332167, 0.000007, 0.080860 ] ], "n": ["FDJVGXF02JMMYF_rvcmp" ] }, {"p": [[21, -6868.190000, 0.546481, 0.015098, 0.175658 ], [18, -6869.050000, 0.231355, 0.047990, 0.175304 ], [22, -6869.090000, 0.222163, 0.000010, 0.176511 ] ], "n": ["FDJVGXF02FGMVP" ] }, {"p": [[21, -4573.070000, 0.681606, 0.009585, 0.111223 ], [19, -4574.640000, 0.141076, 0.007897, 0.135678 ], [20, -4574.940000, 0.105005, 0.006659, 0.141266 ], [22, -4575.980000, 0.037141, 0.004049, 0.113444 ], [18, -4576.030000, 0.035172, 0.046692, 0.119709 ] ], "n": ["FDJVGXF02HE4QW" ] }, {"p": [[21, -8945.440000, 0.762579, 0.009459, 0.112388 ], [19, -8947.610000, 0.086738, 0.011886, 0.128986 ], [20, -8947.630000, 0.085155, 0.006659, 0.129787 ], [18, -8948.570000, 0.033137, 0.049730, 0.116000 ], [22, -8948.600000, 0.032391, 0.000007, 0.117276 ] ], "n": ["FDJVGXF02I5I6G_rvcmp" ] }, {"p": [[21, -9130.550000, 0.672602, 0.007332, 0.102754 ], [19, -9132.040000, 0.151569, 0.012490, 0.115055 ], [20, -9132.040000, 0.151266, 0.006658, 0.115223 ], [22, -9134.340000, 0.015176, 0.007623, 0.102480 ], [18, -9134.820000, 0.009386, 0.051699, 0.108441 ] ], "n": ["FDJVGXF02ICZTI" ] }, {"p": [[22, -7148.800000, 0.739501, 0.016168, 0.081387 ], [209, -7150.960000, 0.084966, 0.005143, 0.091258 ], [208, -7151.100000, 0.073922, 0.015790, 0.087216 ], [210, -7151.200000, 0.066832, 0.000009, 0.092680 ], [18, -7152.300000, 0.022165, 0.028398, 0.082108 ], [205, -7152.870000, 0.012614, 0.035369, 0.092374 ] ], "n": ["FDJVGXF02H9DFJ" ] }, {"p": [[22, -3484.440000, 0.783978, 0.013036, 0.105787 ], [21, -3487.090000, 0.055667, 0.017640, 0.135841 ], [18, -3487.090000, 0.055665, 0.051699, 0.135839 ], [19, -3487.560000, 0.034949, 0.012620, 0.144740 ], [20, -3487.560000, 0.034948, 0.006659, 0.144741 ], [205, -3487.930000, 0.023987, 0.025181, 0.114760 ], [208, -3488.730000, 0.010807, 0.020091, 0.130032 ] ], "n": ["FDJVGXF02HH2NS" ] }, {"p": [[22, -5647.720000, 0.489265, 0.011545, 0.082964 ], [28, -5648.870000, 0.155655, 0.000006, 0.058515 ], [2, -5648.960000, 0.141107, 0.013181, 0.068886 ], [18, -5649.610000, 0.074071, 0.040245, 0.093766 ], [21, -5649.900000, 0.055613, 0.016497, 0.098567 ], [154, -5649.910000, 0.054865, 0.020821, 0.095248 ], [170, -5650.530000, 0.029424, 0.002051, 0.097343 ] ], "n": ["FDJVGXF02G2Y4K" ] }, {"p": [[22, -5657.600000, 0.489559, 0.011554, 0.082861 ], [28, -5658.750000, 0.155249, 0.000006, 0.058417 ], [2, -5658.840000, 0.141455, 0.013179, 0.068802 ], [18, -5659.490000, 0.074009, 0.040233, 0.093650 ], [21, -5659.770000, 0.055532, 0.016495, 0.098439 ], [154, -5659.790000, 0.054809, 0.020822, 0.095137 ], [170, -5660.410000, 0.029386, 0.002066, 0.097220 ] ], "n": ["FDJVGXF02F9HSE" ] }, {"p": [[22, -5657.600000, 0.489559, 0.011554, 0.082861 ], [28, -5658.750000, 0.155249, 0.000006, 0.058417 ], [2, -5658.840000, 0.141455, 0.013179, 0.068802 ], [18, -5659.490000, 0.074009, 0.040233, 0.093650 ], [21, -5659.770000, 0.055532, 0.016495, 0.098439 ], [154, -5659.790000, 0.054809, 0.020822, 0.095137 ], [170, -5660.410000, 0.029386, 0.002066, 0.097220 ] ], "n": ["FDJVGXF02II7J3" ] }, {"p": [[22, -5657.600000, 0.489559, 0.011554, 0.082861 ], [28, -5658.750000, 0.155249, 0.000006, 0.058417 ], [2, -5658.840000, 0.141455, 0.013179, 0.068802 ], [18, -5659.490000, 0.074009, 0.040233, 0.093650 ], [21, -5659.770000, 0.055532, 0.016495, 0.098439 ], [154, -5659.790000, 0.054809, 0.020822, 0.095137 ], [170, -5660.410000, 0.029386, 0.002066, 0.097220 ] ], "n": ["FDJVGXF02G63VE" ] }, {"p": [[22, -6113.880000, 0.707341, 0.012185, 0.080698 ], [2, -6115.420000, 0.151547, 0.014157, 0.067813 ], [18, -6116.220000, 0.067776, 0.047786, 0.094711 ], [21, -6116.240000, 0.066681, 0.016473, 0.096590 ], [226, -6118.540000, 0.006655, 0.027723, 0.088002 ] ], "n": ["FDJVGXF02FXXQP" ] }, {"p": [[22, -4769.320000, 0.792236, 0.011664, 0.078775 ], [18, -4771.270000, 0.113648, 0.040260, 0.092160 ], [21, -4771.550000, 0.085517, 0.016384, 0.097646 ], [2, -4773.850000, 0.008599, 0.017707, 0.082260 ] ], "n": ["FDJVGXF02H44BX" ] }, {"p": [[22, -6855.620000, 0.862594, 0.011860, 0.078437 ], [19, -6858.330000, 0.057582, 0.006034, 0.092879 ], [21, -6858.640000, 0.042081, 0.017640, 0.091164 ], [20, -6859.370000, 0.020381, 0.006659, 0.096796 ], [208, -6859.530000, 0.017362, 0.010929, 0.085832 ] ], "n": ["FDJVGXF02JV2HR" ] }, {"p": [[22, -5946.980000, 0.680164, 0.011519, 0.077607 ], [2, -5948.540000, 0.143296, 0.014716, 0.065161 ], [18, -5948.920000, 0.098164, 0.040075, 0.087708 ], [21, -5949.240000, 0.071379, 0.016411, 0.092374 ], [226, -5951.560000, 0.006997, 0.027529, 0.083874 ] ], "n": ["FDJVGXF02GQA01" ] }, {"p": [[22, -5397.850000, 0.837648, 0.011875, 0.064805 ], [18, -5400.010000, 0.096656, 0.039824, 0.075976 ], [21, -5400.400000, 0.065696, 0.016266, 0.081312 ] ], "n": ["FDJVGXF02GFZD0" ] }, {"p": [[22, -6643.550000, 0.583921, 0.012260, 0.056192 ], [205, -6644.430000, 0.242123, 0.026627, 0.061040 ], [21, -6645.940000, 0.053497, 0.017641, 0.063455 ], [20, -6646.010000, 0.050234, 0.005464, 0.065288 ], [19, -6646.040000, 0.048639, 0.012620, 0.065611 ], [196, -6647.530000, 0.010950, 0.048239, 0.073897 ], [209, -6647.560000, 0.010635, 0.006837, 0.066760 ] ], "n": ["FDJVGXF02FUX9G_rvcmp" ] }, {"p": [[22, -5320.680000, 0.286305, 0.010622, 0.363509 ], [19, -5321.210000, 0.169079, 0.000006, 0.403531 ], [21, -5321.320000, 0.151053, 0.017642, 0.397716 ], [18, -5321.320000, 0.151013, 0.051696, 0.397709 ], [20, -5321.720000, 0.101625, 0.006659, 0.422616 ], [194, -5322.080000, 0.070464, 0.000007, 0.413073 ], [193, -5322.080000, 0.070461, 0.016731, 0.413056 ] ], "n": ["FDJVGXF02F1O2E" ] }, {"p": [[22, -7727.700000, 0.709205, 0.010547, 0.090466 ], [18, -7728.670000, 0.269944, 0.051699, 0.102557 ], [196, -7731.230000, 0.020851, 0.035816, 0.084178 ] ], "n": ["FDJVGXF02GLM02" ] }, {"p": [[22, -4300.590000, 0.602370, 0.011475, 0.079915 ], [18, -4302.190000, 0.121455, 0.033712, 0.094761 ], [2, -4302.260000, 0.113650, 0.016774, 0.071164 ], [21, -4302.660000, 0.076347, 0.015454, 0.100229 ], [154, -4303.380000, 0.036888, 0.019745, 0.095900 ], [226, -4303.740000, 0.025738, 0.031816, 0.087929 ], [28, -4303.830000, 0.023552, 0.000006, 0.041483 ] ], "n": ["FDJVGXF02I60RH" ] }, {"p": [[22, -3498.720000, 0.654859, 0.010809, 0.057786 ], [21, -3500.170000, 0.152570, 0.009832, 0.081096 ], [18, -3500.460000, 0.114184, 0.035890, 0.073095 ], [19, -3501.530000, 0.039194, 0.012620, 0.105600 ], [20, -3501.530000, 0.039193, 0.006659, 0.105601 ] ], "n": ["FDJVGXF02I1GP4" ] }, {"p": [[22, -6495.510000, 0.448892, 0.010174, 0.286470 ], [18, -6496.310000, 0.202196, 0.051696, 0.306989 ], [21, -6496.310000, 0.202181, 0.017640, 0.306984 ], [193, -6497.910000, 0.040759, 0.016731, 0.314938 ], [194, -6497.910000, 0.040753, 0.000007, 0.314950 ], [35, -6498.130000, 0.032613, 0.013080, 0.319509 ], [195, -6498.130000, 0.032607, 0.000009, 0.319506 ] ], "n": ["FDJVGXF02F4WHG" ] }, {"p": [[22, -6447.900000, 0.487726, 0.009593, 0.083445 ], [210, -6448.710000, 0.216995, 0.011790, 0.086869 ], [225, -6449.590000, 0.090435, 0.036449, 0.093461 ], [18, -6449.930000, 0.064280, 0.048679, 0.091127 ], [21, -6449.990000, 0.060703, 0.017640, 0.093899 ], [196, -6450.310000, 0.043672, 0.040911, 0.096649 ], [20, -6450.500000, 0.036190, 0.006659, 0.098706 ] ], "n": ["FDJVGXF02FTY7D_rvcmp" ] }, {"p": [[22, -3264.030000, 0.471841, 0.009503, 0.063308 ], [18, -3264.540000, 0.283506, 0.040189, 0.081976 ], [21, -3264.870000, 0.203234, 0.017641, 0.087930 ], [208, -3267.770000, 0.011215, 0.002111, 0.088295 ], [206, -3267.790000, 0.010985, 0.000001, 0.091482 ], [207, -3267.790000, 0.010985, 0.000001, 0.091482 ], [173, -3268.080000, 0.008233, 0.015753, 0.075741 ] ], "n": ["FDJVGXF02JH59T" ] }, {"p": [[22, -6557.770000, 0.664041, 0.008803, 0.102194 ], [18, -6559.150000, 0.168022, 0.051699, 0.111302 ], [21, -6559.150000, 0.167937, 0.017640, 0.111298 ] ], "n": ["FDJVGXF02GXT72" ] }, {"p": [[22, -6557.770000, 0.664041, 0.008803, 0.102194 ], [18, -6559.150000, 0.168022, 0.051699, 0.111302 ], [21, -6559.150000, 0.167937, 0.017640, 0.111298 ] ], "n": ["FDJVGXF02GEJJS" ] }, {"p": [[22, -6557.770000, 0.664041, 0.008803, 0.102194 ], [18, -6559.150000, 0.168022, 0.051699, 0.111302 ], [21, -6559.150000, 0.167937, 0.017640, 0.111298 ] ], "n": ["FDJVGXF02HQACV" ] }, {"p": [[22, -8792.710000, 0.351791, 0.008698, 0.054756 ], [205, -8792.900000, 0.291240, 0.021720, 0.054246 ], [20, -8793.840000, 0.114068, 0.002597, 0.062597 ], [196, -8793.840000, 0.114001, 0.029581, 0.043978 ], [21, -8794.320000, 0.070731, 0.013696, 0.058001 ], [18, -8794.510000, 0.058170, 0.051699, 0.059146 ] ], "n": ["FDJVGXF02FJP4Y_rvcmp" ] }, {"p": [[22, -6445.290000, 0.527353, 0.007076, 0.046142 ], [20, -6446.100000, 0.234102, 0.000007, 0.053811 ], [21, -6446.970000, 0.098109, 0.017641, 0.052286 ], [19, -6447.240000, 0.075371, 0.012620, 0.054900 ], [196, -6447.550000, 0.054907, 0.038104, 0.057948 ], [204, -6449.240000, 0.010157, 0.005441, 0.070735 ] ], "n": ["FDJVGXF02F452C_rvcmp" ] }, {"p": [[22, -7762.610000, 0.261511, 0.006112, 0.066198 ], [18, -7762.630000, 0.256017, 0.044874, 0.066172 ], [21, -7763.010000, 0.175291, 0.017640, 0.070758 ], [19, -7763.200000, 0.145004, 0.012620, 0.073863 ], [20, -7763.200000, 0.144840, 0.006659, 0.073866 ], [204, -7765.330000, 0.017337, 0.012301, 0.067819 ] ], "n": ["FDJVGXF02IIBPI_rvcmp" ] }, {"p": [[22, -7637.040000, 0.666709, 0.006191, 0.053055 ], [21, -7638.470000, 0.159969, 0.017641, 0.058153 ], [19, -7638.640000, 0.134897, 0.012620, 0.060181 ], [196, -7639.900000, 0.038424, 0.040471, 0.062503 ] ], "n": ["FDJVGXF02JOJ52_rvcmp" ] }, {"p": [[22, -5988.020000, 0.176660, 0.004577, 0.446245 ], [225, -5988.100000, 0.164205, 0.026723, 0.441912 ], [18, -5988.170000, 0.152179, 0.051699, 0.456264 ], [21, -5988.170000, 0.152175, 0.017640, 0.456272 ], [226, -5988.230000, 0.144268, 0.000008, 0.461265 ], [19, -5988.510000, 0.108453, 0.000006, 0.473938 ], [20, -5988.570000, 0.102061, 0.006659, 0.472780 ] ], "n": ["FDJVGXF02JK252" ] }, {"p": [[22, -8627.460000, 0.321255, 0.002086, 0.080227 ], [18, -8627.510000, 0.304766, 0.051699, 0.081674 ], [21, -8627.510000, 0.304613, 0.017640, 0.081678 ], [19, -8628.990000, 0.069366, 0.000006, 0.091938 ] ], "n": ["FDJVGXF02JZTEH_rvcmp" ] }, {"p": [[22, -8561.020000, 0.328435, 0.002404, 0.074755 ], [18, -8561.090000, 0.305245, 0.051699, 0.076416 ], [21, -8561.090000, 0.305075, 0.017640, 0.076429 ], [19, -8562.700000, 0.061246, 0.000006, 0.086838 ] ], "n": ["FDJVGXF02JS345_rvcmp" ] }, {"p": [[22, -8561.020000, 0.328435, 0.002404, 0.074755 ], [18, -8561.090000, 0.305245, 0.051699, 0.076416 ], [21, -8561.090000, 0.305075, 0.017640, 0.076429 ], [19, -8562.700000, 0.061246, 0.000006, 0.086838 ] ], "n": ["FDJVGXF02HEWI1_rvcmp" ] }, {"p": [[22, -8561.020000, 0.328435, 0.002404, 0.074755 ], [18, -8561.090000, 0.305245, 0.051699, 0.076416 ], [21, -8561.090000, 0.305075, 0.017640, 0.076429 ], [19, -8562.700000, 0.061246, 0.000006, 0.086838 ] ], "n": ["FDJVGXF02FI6JK_rvcmp" ] }, {"p": [[22, -6282.140000, 0.265651, 0.000007, 0.312496 ], [18, -6282.140000, 0.265602, 0.051699, 0.312511 ], [21, -6282.140000, 0.265314, 0.017640, 0.312514 ], [149, -6283.110000, 0.100244, 0.019491, 0.297416 ], [148, -6283.730000, 0.054248, 0.119619, 0.316263 ], [127, -6284.160000, 0.034979, 0.040911, 0.317481 ], [208, -6285.080000, 0.013962, 0.004882, 0.304195 ] ], "n": ["FDJVGXF02JQJ7S" ] }, {"p": [[22, -7767.570000, 0.297045, 0.000008, 0.053836 ], [21, -7767.570000, 0.297014, 0.017640, 0.053840 ], [18, -7767.570000, 0.296677, 0.051699, 0.053836 ], [20, -7769.250000, 0.055455, 0.005506, 0.058768 ], [19, -7769.280000, 0.053809, 0.012620, 0.058958 ] ], "n": ["FDJVGXF02HCYN0" ] }, {"p": [[23, -3901.000000, 0.204318, 0.000007, 0.138743 ], [24, -3901.000000, 0.204318, 0.000009, 0.138743 ], [25, -3901.000000, 0.204212, 0.000007, 0.138733 ], [150, -3901.340000, 0.144461, 0.009001, 0.101321 ], [153, -3901.750000, 0.096351, 0.026997, 0.106561 ], [154, -3901.750000, 0.096336, 0.000007, 0.106556 ], [206, -3902.410000, 0.050005, 0.000001, 0.151504 ] ], "n": ["FDJVGXF02JDAVN" ] }, {"p": [[25, -7717.910000, 0.320906, 0.012996, 0.046082 ], [205, -7717.980000, 0.299317, 0.000009, 0.046529 ], [204, -7717.980000, 0.299314, 0.020143, 0.046523 ], [202, -7720.030000, 0.038590, 0.039140, 0.036840 ], [22, -7720.670000, 0.020361, 0.010215, 0.052594 ], [21, -7721.190000, 0.012043, 0.017640, 0.056337 ], [226, -7721.430000, 0.009470, 0.016047, 0.039565 ] ], "n": ["FDJVGXF02FMEJR" ] }, {"p": [[26, -5650.640000, 0.455852, 0.075537, 0.050416 ], [28, -5651.960000, 0.122071, 0.026559, 0.033260 ], [195, -5652.210000, 0.095355, 0.008722, 0.062156 ], [196, -5652.210000, 0.094841, 0.000010, 0.062303 ], [27, -5652.290000, 0.087557, 0.059377, 0.046468 ], [189, -5652.420000, 0.076941, 0.069519, 0.024990 ], [193, -5652.560000, 0.067383, 0.008076, 0.069170 ] ], "n": ["FDJVGXF02HBGX9" ] }, {"p": [[26, -6925.940000, 0.218431, 0.025708, 1.999990 ], [148, -6926.010000, 0.203730, 0.065801, 1.752400 ], [167, -6926.130000, 0.180280, 0.000008, 1.735720 ], [147, -6926.150000, 0.176832, 0.065313, 1.940050 ], [127, -6926.950000, 0.079260, 0.040911, 1.698140 ], [149, -6926.950000, 0.079259, 0.000008, 1.698150 ], [72, -6927.190000, 0.062208, 0.231647, 1.902260 ] ], "n": ["FDJVGXF02G7FCA" ] }, {"p": [[26, -7260.600000, 0.247643, 0.000006, 1.999990 ], [14, -7260.950000, 0.174290, 0.025079, 1.999990 ], [2, -7261.120000, 0.146807, 0.036220, 1.999990 ], [228, -7261.120000, 0.146769, 0.000005, 1.999990 ], [1, -7261.510000, 0.100021, 0.096269, 1.999990 ], [0, -7261.510000, 0.100020, 0.066512, 1.999990 ], [10, -7261.680000, 0.084451, 0.019198, 1.999990 ] ], "n": ["FDJVGXF02FHIUJ" ] }, {"p": [[26, -5411.570000, 1.000000, 0.000006, 0.092871 ] ], "n": ["FDJVGXF02GADLY_rvcmp" ] }, {"p": [[26, -6611.130000, 1.000000, 0.000006, 0.000006 ] ], "n": ["FDJVGXF02I5F8C_rvcmp" ] }, {"p": [[27, -6997.270000, 0.253447, 0.033878, 1.483110 ], [148, -6997.560000, 0.188935, 0.000009, 1.675090 ], [147, -6997.560000, 0.188906, 0.065313, 1.675130 ], [158, -6998.070000, 0.113014, 0.000009, 1.528030 ], [167, -6998.210000, 0.098695, 0.010289, 1.558800 ], [195, -6998.310000, 0.088716, 0.000009, 1.574360 ], [149, -6998.580000, 0.068287, 0.039685, 1.556220 ] ], "n": ["FDJVGXF02HRFXB_rvcmp" ] }, {"p": [[27, -8604.500000, 0.232391, 0.033632, 0.205524 ], [190, -8604.530000, 0.224145, 0.014113, 0.211015 ], [40, -8604.580000, 0.213555, 0.046417, 0.198717 ], [188, -8604.900000, 0.155565, 0.035186, 0.206690 ], [189, -8605.190000, 0.116164, 0.084528, 0.203818 ], [38, -8606.530000, 0.030430, 0.053042, 0.215546 ], [26, -8606.620000, 0.027749, 0.068494, 0.223648 ] ], "n": ["FDJVGXF02JCGD5_rvcmp" ] }, {"p": [[27, -1571.160000, 0.423882, 0.033936, 0.000009 ], [161, -1572.460000, 0.116114, 0.000008, 0.018341 ], [18, -1572.650000, 0.095536, 0.005683, 0.017612 ], [20, -1572.650000, 0.095433, 0.000007, 0.018227 ], [21, -1572.680000, 0.093169, 0.000009, 0.018237 ], [35, -1572.730000, 0.087956, 0.000006, 0.000005 ], [34, -1572.740000, 0.087911, 0.014780, 0.000010 ] ], "n": ["FDJVGXF02FIK4U" ] }, {"p": [[27, -5996.910000, 0.608052, 0.031022, 0.209381 ], [33, -5999.060000, 0.071095, 0.004928, 0.234467 ], [34, -5999.070000, 0.070276, 0.011819, 0.233997 ], [35, -5999.100000, 0.068558, 0.000006, 0.235870 ], [29, -5999.100000, 0.068192, 0.044151, 0.235636 ], [32, -5999.110000, 0.067799, 0.015226, 0.237038 ], [28, -5999.500000, 0.046028, 0.045841, 0.238133 ] ], "n": ["FDJVGXF02HLE4V_rvcmp" ] }, {"p": [[27, -7498.070000, 0.773853, 0.029961, 0.124147 ], [171, -7500.180000, 0.094002, 0.023431, 0.120473 ], [190, -7500.510000, 0.067188, 0.031155, 0.127315 ], [191, -7500.550000, 0.064956, 0.000504, 0.128798 ] ], "n": ["FDJVGXF02GY2VP" ] }, {"p": [[27, -4260.490000, 1.000000, 0.020931, 0.177290 ] ], "n": ["FDJVGXF02JD9QK" ] }, {"p": [[27, -8439.180000, 0.671244, 0.011931, 0.268882 ], [40, -8440.190000, 0.245369, 0.041956, 0.259400 ], [191, -8442.100000, 0.036078, 0.011768, 0.279196 ], [192, -8442.200000, 0.032632, 0.000005, 0.283581 ], [171, -8443.000000, 0.014677, 0.034630, 0.283123 ] ], "n": ["FDJVGXF02HSMJ1" ] }, {"p": [[27, -7207.070000, 1.000000, 0.003339, 0.288104 ] ], "n": ["FDJVGXF02GGOMJ" ] }, {"p": [[27, -8687.080000, 0.990522, 0.000007, 0.390029 ], [202, -8691.730000, 0.009478, 0.008314, 0.374407 ] ], "n": ["FDJVGXF02IYT0M" ] }, {"p": [[27, -9121.000000, 1.000000, 0.000009, 0.381143 ] ], "n": ["FDJVGXF02F41OT" ] }, {"p": [[27, -8009.940000, 0.606203, 0.000009, 0.317782 ], [40, -8011.010000, 0.207043, 0.024640, 0.302844 ], [190, -8012.210000, 0.062745, 0.025414, 0.301465 ], [39, -8012.700000, 0.038257, 0.000006, 0.297917 ], [191, -8012.720000, 0.037686, 0.005256, 0.305983 ], [171, -8012.870000, 0.032183, 0.034630, 0.310658 ], [181, -8013.580000, 0.015883, 0.000009, 0.334003 ] ], "n": ["FDJVGXF02F79AQ" ] }, {"p": [[28, -6002.150000, 0.321403, 0.048759, 0.089313 ], [34, -6002.160000, 0.321227, 0.000007, 0.089318 ], [33, -6002.160000, 0.321019, 0.020031, 0.089313 ], [35, -6004.620000, 0.027424, 0.000006, 0.097160 ], [226, -6006.810000, 0.003042, 0.017021, 0.097414 ], [31, -6006.850000, 0.002942, 0.000619, 0.116007 ], [30, -6006.850000, 0.002942, 0.000383, 0.116008 ] ], "n": ["FDJVGXF02IWIIX" ] }, {"p": [[28, -5567.750000, 0.215476, 0.036690, 0.132300 ], [33, -5568.070000, 0.156918, 0.020031, 0.142446 ], [34, -5568.070000, 0.156843, 0.000007, 0.142451 ], [29, -5568.090000, 0.153380, 0.043845, 0.141625 ], [32, -5568.110000, 0.151177, 0.015226, 0.143719 ], [40, -5568.320000, 0.121780, 0.060079, 0.119331 ], [31, -5569.330000, 0.044425, 0.001925, 0.154812 ] ], "n": ["FDJVGXF02I2UCU_rvcmp" ] }, {"p": [[28, -5402.340000, 0.190944, 0.036250, 0.142247 ], [27, -5402.370000, 0.185119, 0.048070, 0.138197 ], [34, -5402.580000, 0.150901, 0.003675, 0.152153 ], [33, -5402.660000, 0.139037, 0.020031, 0.155099 ], [40, -5402.770000, 0.124176, 0.052809, 0.127934 ], [29, -5402.900000, 0.109923, 0.037679, 0.154215 ], [32, -5402.990000, 0.099899, 0.015226, 0.159430 ] ], "n": ["FDJVGXF02JND44" ] }, {"p": [[28, -8283.440000, 0.843194, 0.020592, 0.101167 ], [226, -8286.010000, 0.065131, 0.013855, 0.097635 ], [210, -8286.590000, 0.036393, 0.010276, 0.113954 ], [34, -8287.370000, 0.016660, 0.001120, 0.121478 ], [205, -8287.620000, 0.012935, 0.037510, 0.128102 ], [208, -8287.630000, 0.012850, 0.023926, 0.129311 ], [209, -8287.630000, 0.012837, 0.000007, 0.129456 ] ], "n": ["FDJVGXF02FZ3A2_rvcmp" ] }, {"p": [[28, -8283.440000, 0.843194, 0.020592, 0.101167 ], [226, -8286.010000, 0.065131, 0.013855, 0.097635 ], [210, -8286.590000, 0.036393, 0.010276, 0.113954 ], [34, -8287.370000, 0.016660, 0.001120, 0.121478 ], [205, -8287.620000, 0.012935, 0.037510, 0.128102 ], [208, -8287.630000, 0.012850, 0.023926, 0.129311 ], [209, -8287.630000, 0.012837, 0.000007, 0.129456 ] ], "n": ["FDJVGXF02GGF3J_rvcmp" ] }, {"p": [[28, -7908.490000, 0.851074, 0.020592, 0.100231 ], [226, -7911.140000, 0.060050, 0.014200, 0.097079 ], [210, -7911.720000, 0.033618, 0.009992, 0.114361 ], [34, -7912.420000, 0.016656, 0.001113, 0.121417 ], [205, -7912.680000, 0.012922, 0.037573, 0.128437 ], [208, -7912.680000, 0.012846, 0.023949, 0.129641 ], [209, -7912.680000, 0.012834, 0.000007, 0.129789 ] ], "n": ["FDJVGXF02HKR3S_rvcmp" ] }, {"p": [[28, -8001.940000, 0.670792, 0.008204, 0.069713 ], [196, -8002.680000, 0.320324, 0.024572, 0.088784 ], [171, -8006.270000, 0.008884, 0.012956, 0.098902 ] ], "n": ["FDJVGXF02HF7N8" ] }, {"p": [[29, -7511.910000, 0.267450, 0.016925, 0.215123 ], [190, -7512.370000, 0.168526, 0.034335, 0.226125 ], [191, -7512.370000, 0.168504, 0.000008, 0.226130 ], [171, -7512.370000, 0.168476, 0.034630, 0.226126 ], [40, -7512.880000, 0.100793, 0.061983, 0.221019 ], [38, -7513.040000, 0.085722, 0.027883, 0.219588 ], [192, -7513.790000, 0.040530, 0.003921, 0.237054 ] ], "n": ["FDJVGXF02HR1AU" ] }, {"p": [[29, -5546.890000, 0.212531, 0.015123, 0.294242 ], [33, -5547.210000, 0.153198, 0.000010, 0.308997 ], [32, -5547.210000, 0.153170, 0.015226, 0.309001 ], [28, -5547.220000, 0.152332, 0.039116, 0.298598 ], [34, -5547.270000, 0.144181, 0.000007, 0.309705 ], [31, -5547.720000, 0.092294, 0.001925, 0.322318 ], [30, -5547.720000, 0.092294, 0.001608, 0.322315 ] ], "n": ["FDJVGXF02FM12Y_rvcmp" ] }, {"p": [[31, -6111.430000, 0.215266, 0.000008, 0.198255 ], [30, -6111.430000, 0.215266, 0.000006, 0.198255 ], [32, -6111.430000, 0.215191, 0.000007, 0.198252 ], [29, -6112.170000, 0.102499, 0.046698, 0.201965 ], [33, -6112.170000, 0.102485, 0.000010, 0.201973 ], [28, -6112.480000, 0.074854, 0.046673, 0.202964 ], [34, -6112.490000, 0.074439, 0.000007, 0.204785 ] ], "n": ["FDJVGXF02F1T1E" ] }, {"p": [[31, -3533.880000, 0.190347, 0.000008, 0.161841 ], [30, -3533.880000, 0.190347, 0.000006, 0.161841 ], [32, -3533.880000, 0.190278, 0.000007, 0.161840 ], [152, -3533.900000, 0.185908, 0.007319, 0.145002 ], [33, -3534.720000, 0.082520, 0.000010, 0.166522 ], [29, -3534.720000, 0.082519, 0.046702, 0.166513 ], [28, -3534.770000, 0.078080, 0.036506, 0.151192 ] ], "n": ["FDJVGXF02GZV73_rvcmp" ] }, {"p": [[31, -4990.540000, 0.191853, 0.000008, 0.158338 ], [30, -4990.540000, 0.191853, 0.000006, 0.158338 ], [32, -4990.540000, 0.191789, 0.000007, 0.158336 ], [27, -4990.870000, 0.138472, 0.050812, 0.136299 ], [34, -4991.050000, 0.114904, 0.006488, 0.151965 ], [33, -4991.300000, 0.090037, 0.017815, 0.158886 ], [189, -4991.400000, 0.081093, 0.042579, 0.120649 ] ], "n": ["FDJVGXF02HYZ7D_rvcmp" ] }, {"p": [[31, -4010.530000, 0.239133, 0.000008, 0.138819 ], [30, -4010.530000, 0.239133, 0.000006, 0.138819 ], [32, -4010.530000, 0.238998, 0.000007, 0.138820 ], [29, -4011.640000, 0.078965, 0.046702, 0.145037 ], [33, -4011.640000, 0.078962, 0.000010, 0.145033 ], [34, -4011.870000, 0.062409, 0.000007, 0.146095 ], [28, -4011.870000, 0.062400, 0.048759, 0.146104 ] ], "n": ["FDJVGXF02FTMUL" ] }, {"p": [[34, -6200.400000, 0.215165, 0.011973, 0.165627 ], [35, -6200.480000, 0.199242, 0.000010, 0.169699 ], [27, -6200.480000, 0.199210, 0.070440, 0.169695 ], [195, -6200.880000, 0.133597, 0.000005, 0.174880 ], [194, -6200.880000, 0.133487, 0.006696, 0.174881 ], [196, -6201.320000, 0.085966, 0.000008, 0.176500 ], [33, -6202.260000, 0.033333, 0.012289, 0.169455 ] ], "n": ["FDJVGXF02HZX8C_rvcmp" ] }, {"p": [[34, -4967.710000, 0.336158, 0.010008, 0.034642 ], [35, -4968.060000, 0.236923, 0.002288, 0.035301 ], [196, -4968.250000, 0.195730, 0.008752, 0.027352 ], [195, -4969.060000, 0.087365, 0.005075, 0.034321 ], [33, -4969.500000, 0.056013, 0.020031, 0.042245 ], [194, -4969.620000, 0.049879, 0.006696, 0.039136 ], [38, -4969.890000, 0.037933, 0.048377, 0.040427 ] ], "n": ["FDJVGXF02JC28Z_rvcmp" ] }, {"p": [[34, -4967.710000, 0.336158, 0.010008, 0.034642 ], [35, -4968.060000, 0.236923, 0.002288, 0.035301 ], [196, -4968.250000, 0.195730, 0.008752, 0.027352 ], [195, -4969.060000, 0.087365, 0.005075, 0.034321 ], [33, -4969.500000, 0.056013, 0.020031, 0.042245 ], [194, -4969.620000, 0.049879, 0.006696, 0.039136 ], [38, -4969.890000, 0.037933, 0.048377, 0.040427 ] ], "n": ["FDJVGXF02GOQPN" ] }, {"p": [[34, -5002.300000, 0.336076, 0.010011, 0.034465 ], [35, -5002.650000, 0.236775, 0.002287, 0.035109 ], [196, -5002.830000, 0.196510, 0.008755, 0.027205 ], [195, -5003.640000, 0.087360, 0.005080, 0.034139 ], [33, -5004.090000, 0.055751, 0.020031, 0.042037 ], [194, -5004.210000, 0.049737, 0.006696, 0.038936 ], [38, -5004.480000, 0.037791, 0.048402, 0.040207 ] ], "n": ["FDJVGXF02JIRJ4" ] }, {"p": [[34, -4870.680000, 0.278964, 0.010175, 0.026665 ], [196, -4871.000000, 0.203673, 0.008686, 0.018634 ], [35, -4871.040000, 0.194108, 0.002473, 0.026963 ], [27, -4871.150000, 0.174572, 0.070440, 0.027890 ], [195, -4872.010000, 0.073982, 0.005362, 0.025552 ], [33, -4872.680000, 0.037924, 0.020031, 0.034892 ], [194, -4872.710000, 0.036778, 0.006696, 0.030976 ] ], "n": ["FDJVGXF02GBL2M_rvcmp" ] }, {"p": [[34, -8905.190000, 0.243922, 0.008595, 0.127311 ], [27, -8905.660000, 0.153147, 0.065120, 0.126718 ], [35, -8905.750000, 0.138988, 0.000006, 0.130708 ], [195, -8905.870000, 0.123724, 0.007106, 0.133348 ], [196, -8905.880000, 0.122123, 0.003329, 0.130759 ], [26, -8905.950000, 0.114551, 0.097406, 0.134219 ], [28, -8906.050000, 0.103546, 0.042894, 0.127088 ] ], "n": ["FDJVGXF02H5LYX" ] }, {"p": [[34, -3283.190000, 0.304203, 0.006091, 0.042618 ], [28, -3283.890000, 0.151312, 0.045537, 0.040033 ], [33, -3283.990000, 0.137071, 0.020031, 0.044313 ], [35, -3284.070000, 0.126803, 0.000006, 0.048957 ], [27, -3284.070000, 0.126734, 0.070439, 0.048956 ], [195, -3284.570000, 0.076946, 0.000009, 0.054388 ], [194, -3284.570000, 0.076931, 0.006696, 0.054389 ] ], "n": ["FDJVGXF02FMWSU" ] }, {"p": [[34, -3598.420000, 0.608756, 0.005974, 0.000007 ], [33, -3599.500000, 0.207032, 0.020031, 0.000009 ], [35, -3599.910000, 0.137020, 0.000010, 0.000007 ], [32, -3602.060000, 0.016032, 0.015226, 0.004413 ], [195, -3602.240000, 0.013395, 0.000005, 0.008273 ], [194, -3602.240000, 0.013389, 0.006696, 0.008274 ], [38, -3603.360000, 0.004376, 0.076827, 0.009645 ] ], "n": ["FDJVGXF02I4R6Q_rvcmp" ] }, {"p": [[35, -3262.850000, 0.174070, 0.013080, 0.078704 ], [195, -3262.850000, 0.174055, 0.000009, 0.078694 ], [194, -3262.850000, 0.174020, 0.006696, 0.078692 ], [27, -3262.880000, 0.168677, 0.051545, 0.074268 ], [196, -3263.040000, 0.143502, 0.000008, 0.078468 ], [34, -3263.120000, 0.132899, 0.014780, 0.078731 ], [193, -3264.520000, 0.032776, 0.016731, 0.080589 ] ], "n": ["FDJVGXF02GZ37H" ] }, {"p": [[36, -3772.560000, 0.210414, 0.000009, 0.017435 ], [38, -3772.560000, 0.209748, 0.000007, 0.017434 ], [37, -3772.570000, 0.208940, 0.002319, 0.017435 ], [194, -3773.160000, 0.115617, 0.000007, 0.017522 ], [193, -3773.160000, 0.115574, 0.016731, 0.017522 ], [35, -3773.570000, 0.076248, 0.013078, 0.017531 ], [27, -3773.760000, 0.063460, 0.070440, 0.017397 ] ], "n": ["FDJVGXF02G5S7D" ] }, {"p": [[37, -2436.440000, 0.182449, 0.001061, 0.014078 ], [36, -2436.440000, 0.182444, 0.000407, 0.014086 ], [38, -2436.440000, 0.182435, 0.000008, 0.014079 ], [191, -2436.750000, 0.134671, 0.000009, 0.000006 ], [193, -2436.940000, 0.110664, 0.016731, 0.014104 ], [194, -2436.940000, 0.110641, 0.000007, 0.014104 ], [192, -2437.080000, 0.096697, 0.000005, 0.010894 ] ], "n": ["FDJVGXF02H01K4_rvcmp" ] }, {"p": [[37, -2910.280000, 0.207772, 0.001042, 0.011190 ], [36, -2910.280000, 0.207765, 0.000374, 0.011192 ], [38, -2910.280000, 0.207753, 0.000008, 0.011191 ], [194, -2910.850000, 0.117601, 0.000007, 0.011166 ], [193, -2910.850000, 0.117564, 0.016731, 0.011166 ], [35, -2911.260000, 0.077372, 0.013078, 0.010988 ], [27, -2911.450000, 0.064173, 0.070440, 0.010660 ] ], "n": ["FDJVGXF02F7PYV_rvcmp" ] }, {"p": [[38, -7746.750000, 0.487263, 0.058233, 0.106403 ], [192, -7748.360000, 0.097310, 0.021642, 0.133163 ], [193, -7748.360000, 0.096936, 0.000008, 0.134123 ], [39, -7748.360000, 0.096893, 0.025399, 0.134123 ], [171, -7748.580000, 0.078239, 0.030847, 0.118406 ], [190, -7748.670000, 0.071687, 0.034335, 0.121433 ], [191, -7748.670000, 0.071671, 0.000008, 0.121434 ] ], "n": ["FDJVGXF02JNZMF_rvcmp" ] }, {"p": [[38, -7746.750000, 0.487263, 0.058233, 0.106403 ], [192, -7748.360000, 0.097310, 0.021642, 0.133163 ], [193, -7748.360000, 0.096936, 0.000008, 0.134123 ], [39, -7748.360000, 0.096893, 0.025399, 0.134123 ], [171, -7748.580000, 0.078239, 0.030847, 0.118406 ], [190, -7748.670000, 0.071687, 0.034335, 0.121433 ], [191, -7748.670000, 0.071671, 0.000008, 0.121434 ] ], "n": ["FDJVGXF02JN5X1_rvcmp" ] }, {"p": [[38, -7350.190000, 0.218908, 0.057052, 1.294380 ], [193, -7350.480000, 0.163210, 0.016731, 1.325020 ], [194, -7350.480000, 0.163176, 0.000007, 1.324960 ], [192, -7350.760000, 0.122701, 0.022464, 1.357340 ], [39, -7350.760000, 0.122691, 0.025399, 1.357350 ], [77, -7350.900000, 0.106637, 0.097106, 1.593850 ], [2, -7350.940000, 0.102678, 0.005591, 1.431020 ] ], "n": ["FDJVGXF02FZWSE_rvcmp" ] }, {"p": [[38, -7350.190000, 0.218908, 0.057052, 1.294380 ], [193, -7350.480000, 0.163210, 0.016731, 1.325020 ], [194, -7350.480000, 0.163176, 0.000007, 1.324960 ], [192, -7350.760000, 0.122701, 0.022464, 1.357340 ], [39, -7350.760000, 0.122691, 0.025399, 1.357350 ], [77, -7350.900000, 0.106637, 0.097106, 1.593850 ], [2, -7350.940000, 0.102678, 0.005591, 1.431020 ] ], "n": ["FDJVGXF02F2FD5_rvcmp" ] }, {"p": [[38, -7609.050000, 0.603747, 0.036549, 0.084987 ], [26, -7610.440000, 0.150447, 0.081983, 0.075259 ], [27, -7610.800000, 0.105519, 0.054929, 0.083440 ], [195, -7611.590000, 0.047859, 0.009399, 0.088211 ], [34, -7611.690000, 0.043191, 0.009714, 0.092132 ], [35, -7612.110000, 0.028565, 0.003957, 0.094017 ], [194, -7612.430000, 0.020671, 0.000007, 0.096834 ] ], "n": ["FDJVGXF02GTM9N" ] }, {"p": [[38, -4971.370000, 0.273075, 0.036132, 0.045932 ], [35, -4971.890000, 0.161522, 0.004271, 0.047519 ], [196, -4972.030000, 0.140928, 0.009454, 0.033992 ], [27, -4972.090000, 0.132024, 0.070440, 0.049313 ], [194, -4972.340000, 0.102909, 0.000007, 0.048576 ], [193, -4972.340000, 0.102833, 0.016731, 0.048578 ], [195, -4972.510000, 0.086708, 0.003406, 0.044166 ] ], "n": ["FDJVGXF02FP1V7_rvcmp" ] }, {"p": [[38, -4693.080000, 0.315056, 0.030401, 0.035213 ], [196, -4693.590000, 0.188884, 0.010947, 0.021548 ], [35, -4693.910000, 0.136817, 0.004599, 0.037698 ], [27, -4694.160000, 0.106362, 0.070440, 0.039657 ], [194, -4694.370000, 0.086435, 0.000007, 0.038436 ], [193, -4694.370000, 0.086357, 0.016731, 0.038438 ], [195, -4694.450000, 0.080088, 0.003673, 0.033363 ] ], "n": ["FDJVGXF02IBL60" ] }, {"p": [[38, -6958.180000, 0.597162, 0.018283, 0.108809 ], [196, -6959.020000, 0.257204, 0.028729, 0.095868 ], [37, -6960.530000, 0.057238, 0.002319, 0.116741 ], [36, -6960.530000, 0.057016, 0.001199, 0.116742 ], [205, -6962.000000, 0.013072, 0.017372, 0.111696 ], [35, -6962.190000, 0.010858, 0.001950, 0.125166 ], [194, -6962.560000, 0.007451, 0.000007, 0.127382 ] ], "n": ["FDJVGXF02HJLY3" ] }, {"p": [[39, -8707.690000, 0.211625, 0.025399, 0.201455 ], [192, -8707.690000, 0.211602, 0.022464, 0.201460 ], [193, -8707.690000, 0.211431, 0.000008, 0.201454 ], [191, -8708.290000, 0.115865, 0.000008, 0.204244 ], [190, -8708.290000, 0.115857, 0.034335, 0.204236 ], [40, -8708.430000, 0.100675, 0.072715, 0.193895 ], [38, -8709.550000, 0.032945, 0.045660, 0.185638 ] ], "n": ["FDJVGXF02HIG4B" ] }, {"p": [[39, -7502.810000, 0.314238, 0.010616, 0.126463 ], [191, -7503.530000, 0.152581, 0.004349, 0.123573 ], [171, -7503.700000, 0.129166, 0.034630, 0.124367 ], [190, -7503.700000, 0.129065, 0.034335, 0.124369 ], [192, -7503.750000, 0.123210, 0.011581, 0.128731 ], [193, -7504.210000, 0.077530, 0.000008, 0.134824 ], [40, -7504.250000, 0.074209, 0.078856, 0.125064 ] ], "n": ["FDJVGXF02IJ4J6" ] }, {"p": [[39, -2768.000000, 0.954930, 0.005518, 0.026728 ], [40, -2771.840000, 0.020440, 0.066167, 0.037302 ], [192, -2772.240000, 0.013721, 0.022464, 0.046360 ], [204, -2772.470000, 0.010909, 0.017584, 0.052109 ] ], "n": ["FDJVGXF02INEUV" ] }, {"p": [[39, -8824.530000, 1.000000, 0.003729, 0.037689 ] ], "n": ["FDJVGXF02HQB4H" ] }, {"p": [[40, -8717.400000, 1.000000, 0.061066, 0.064478 ] ], "n": ["FDJVGXF02GI0SH" ] }, {"p": [[40, -6071.990000, 0.724419, 0.056106, 0.075059 ], [205, -6074.190000, 0.079864, 0.022906, 0.089484 ], [171, -6074.400000, 0.064824, 0.019804, 0.085194 ], [196, -6074.810000, 0.043377, 0.040536, 0.083482 ], [192, -6074.990000, 0.036197, 0.002252, 0.095943 ], [191, -6075.050000, 0.034098, 0.015648, 0.097229 ], [190, -6075.730000, 0.017220, 0.026526, 0.092286 ] ], "n": ["FDJVGXF02F73YJ_rvcmp" ] }, {"p": [[40, -6275.960000, 0.735533, 0.056166, 0.072167 ], [205, -6278.220000, 0.076600, 0.022873, 0.086627 ], [171, -6278.410000, 0.063319, 0.019808, 0.081752 ], [196, -6278.810000, 0.042517, 0.040511, 0.080388 ], [192, -6279.040000, 0.033896, 0.002300, 0.092250 ], [191, -6279.100000, 0.031767, 0.015648, 0.093511 ], [190, -6279.770000, 0.016369, 0.026347, 0.088426 ] ], "n": ["FDJVGXF02HKU98_rvcmp" ] }, {"p": [[40, -5329.310000, 0.785647, 0.050996, 0.101473 ], [189, -5331.610000, 0.079081, 0.066819, 0.116211 ], [190, -5332.230000, 0.042512, 0.021585, 0.131361 ], [191, -5332.590000, 0.029601, 0.010289, 0.136359 ], [192, -5332.650000, 0.027904, 0.000005, 0.138257 ], [171, -5332.760000, 0.025128, 0.034630, 0.136853 ], [38, -5333.670000, 0.010126, 0.042268, 0.150200 ] ], "n": ["FDJVGXF02JFU7C" ] }, {"p": [[40, -5834.380000, 0.649722, 0.049836, 0.119512 ], [38, -5836.550000, 0.074270, 0.000009, 0.177799 ], [37, -5836.550000, 0.074001, 0.002319, 0.177800 ], [36, -5836.550000, 0.073718, 0.001199, 0.177802 ], [190, -5836.910000, 0.051402, 0.022830, 0.141886 ], [39, -5837.180000, 0.039503, 0.008302, 0.152705 ], [192, -5837.230000, 0.037383, 0.007342, 0.149224 ] ], "n": ["FDJVGXF02IURA9_rvcmp" ] }, {"p": [[40, -5785.840000, 0.331542, 0.049289, 0.109788 ], [191, -5786.200000, 0.231332, 0.005069, 0.127960 ], [190, -5786.480000, 0.176246, 0.034335, 0.131202 ], [171, -5786.480000, 0.176046, 0.034630, 0.131212 ], [172, -5787.770000, 0.048471, 0.000008, 0.138435 ], [175, -5788.710000, 0.018860, 0.004370, 0.141867 ], [27, -5788.790000, 0.017503, 0.014940, 0.149184 ] ], "n": ["FDJVGXF02HLTR9" ] }, {"p": [[40, -6090.460000, 0.285142, 0.039512, 0.219815 ], [190, -6090.990000, 0.167363, 0.034335, 0.233138 ], [191, -6090.990000, 0.167317, 0.000008, 0.233138 ], [171, -6090.990000, 0.167257, 0.034630, 0.233138 ], [28, -6091.160000, 0.141760, 0.000006, 0.234861 ], [192, -6092.180000, 0.050987, 0.000005, 0.245038 ], [189, -6093.110000, 0.020175, 0.096145, 0.235363 ] ], "n": ["FDJVGXF02GK5VU_rvcmp" ] }, {"p": [[40, -6090.460000, 0.285142, 0.039512, 0.219815 ], [190, -6090.990000, 0.167363, 0.034335, 0.233138 ], [191, -6090.990000, 0.167317, 0.000008, 0.233138 ], [171, -6090.990000, 0.167257, 0.034630, 0.233138 ], [28, -6091.160000, 0.141760, 0.000006, 0.234861 ], [192, -6092.180000, 0.050987, 0.000005, 0.245038 ], [189, -6093.110000, 0.020175, 0.096145, 0.235363 ] ], "n": ["FDJVGXF02FXNNH_rvcmp" ] }, {"p": [[40, -6090.460000, 0.285142, 0.039512, 0.219815 ], [190, -6090.990000, 0.167363, 0.034335, 0.233138 ], [191, -6090.990000, 0.167317, 0.000008, 0.233138 ], [171, -6090.990000, 0.167257, 0.034630, 0.233138 ], [28, -6091.160000, 0.141760, 0.000006, 0.234861 ], [192, -6092.180000, 0.050987, 0.000005, 0.245038 ], [189, -6093.110000, 0.020175, 0.096145, 0.235363 ] ], "n": ["FDJVGXF02FJUZ3_rvcmp" ] }, {"p": [[40, -6090.460000, 0.285142, 0.039512, 0.219815 ], [190, -6090.990000, 0.167363, 0.034335, 0.233138 ], [191, -6090.990000, 0.167317, 0.000008, 0.233138 ], [171, -6090.990000, 0.167257, 0.034630, 0.233138 ], [28, -6091.160000, 0.141760, 0.000006, 0.234861 ], [192, -6092.180000, 0.050987, 0.000005, 0.245038 ], [189, -6093.110000, 0.020175, 0.096145, 0.235363 ] ], "n": ["FDJVGXF02I05DU_rvcmp" ] }, {"p": [[40, -7350.060000, 1.000000, 0.034072, 0.118787 ] ], "n": ["FDJVGXF02JECP1_rvcmp" ] }, {"p": [[40, -9680.090000, 0.332769, 0.015512, 0.306461 ], [177, -9680.720000, 0.177336, 0.000051, 0.333465 ], [29, -9680.900000, 0.148034, 0.023035, 0.303217 ], [38, -9681.160000, 0.114688, 0.047016, 0.310416 ], [33, -9681.520000, 0.079960, 0.007462, 0.314035 ], [174, -9681.530000, 0.078822, 0.002435, 0.346080 ], [176, -9681.670000, 0.068391, 0.006160, 0.339945 ] ], "n": ["FDJVGXF02FUALA" ] }, {"p": [[50, -4467.160000, 0.269919, 0.000008, 1.140440 ], [148, -4467.870000, 0.132246, 0.139119, 1.125730 ], [127, -4467.890000, 0.130056, 0.040911, 1.144600 ], [149, -4467.890000, 0.130043, 0.000008, 1.144600 ], [51, -4467.890000, 0.129643, 0.200764, 1.168910 ], [125, -4468.050000, 0.109934, 0.057709, 1.178520 ], [57, -4468.170000, 0.098159, 0.000008, 1.176020 ] ], "n": ["FDJVGXF02JWXKC_rvcmp" ] }, {"p": [[65, -5480.060000, 0.316869, 0.103998, 1.999990 ], [66, -5480.910000, 0.135035, 0.000007, 1.999990 ], [64, -5480.910000, 0.135027, 0.347492, 1.999990 ], [67, -5481.120000, 0.109049, 0.264348, 1.999990 ], [0, -5481.180000, 0.103176, 0.000008, 1.999990 ], [1, -5481.210000, 0.100422, 0.096269, 1.999990 ], [2, -5481.210000, 0.100421, 0.000009, 1.999990 ] ], "n": ["FDJVGXF02H64TH_rvcmp" ] }, {"p": [[65, -7562.270000, 0.305976, 0.094073, 1.999990 ], [5, -7563.220000, 0.119135, 0.000001, 1.999990 ], [6, -7563.220000, 0.119135, 0.019580, 1.999990 ], [7, -7563.220000, 0.119129, 0.000008, 1.999990 ], [4, -7563.280000, 0.112213, 0.076256, 1.999990 ], [9, -7563.280000, 0.112210, 0.032431, 1.999990 ], [10, -7563.280000, 0.112201, 0.000008, 1.999990 ] ], "n": ["FDJVGXF02GV266_rvcmp" ] }, {"p": [[65, -7300.620000, 0.765762, 0.054968, 1.801190 ], [22, -7302.750000, 0.091098, 0.028187, 1.770850 ], [226, -7303.260000, 0.054883, 0.000008, 1.856390 ], [66, -7303.440000, 0.045630, 0.000007, 1.999990 ], [13, -7304.520000, 0.015634, 0.000009, 1.999990 ], [227, -7304.650000, 0.013695, 0.009919, 1.964270 ], [17, -7304.680000, 0.013297, 0.049256, 1.976680 ] ], "n": ["FDJVGXF02FK6DL" ] }, {"p": [[65, -5605.520000, 0.516474, 0.030546, 1.999990 ], [64, -5607.290000, 0.087894, 0.347492, 1.999990 ], [66, -5607.290000, 0.087892, 0.000007, 1.999990 ], [142, -5607.420000, 0.077059, 0.000001, 1.999990 ], [143, -5607.420000, 0.077058, 0.000008, 1.999990 ], [141, -5607.420000, 0.077056, 0.003648, 1.999990 ], [0, -5607.430000, 0.076568, 0.000008, 1.999990 ] ], "n": ["FDJVGXF02HFB4T" ] }, {"p": [[65, -5694.100000, 0.922325, 0.000010, 1.999990 ], [13, -5698.150000, 0.016130, 0.000009, 1.999990 ], [6, -5698.270000, 0.014342, 0.019580, 1.999990 ], [7, -5698.270000, 0.014341, 0.000008, 1.999990 ], [67, -5698.470000, 0.011690, 0.264348, 1.999990 ], [9, -5698.570000, 0.010639, 0.000008, 1.999990 ], [10, -5698.580000, 0.010533, 0.000008, 1.999990 ] ], "n": ["FDJVGXF02HK3GU_rvcmp" ] }, {"p": [[85, -7444.690000, 0.434812, 0.000005, 0.328240 ], [86, -7445.070000, 0.299056, 0.023547, 0.308996 ], [84, -7445.180000, 0.266133, 0.000005, 0.330565 ] ], "n": ["FDJVGXF02F4YCW_rvcmp" ] }, {"p": [[91, -5129.930000, 0.268737, 0.018576, 0.075928 ], [94, -5129.940000, 0.267149, 0.039199, 0.075962 ], [95, -5129.940000, 0.267099, 0.000008, 0.075961 ], [96, -5131.090000, 0.084158, 0.027500, 0.079042 ], [97, -5131.090000, 0.084098, 0.000005, 0.079041 ], [92, -5132.860000, 0.014400, 0.005357, 0.087468 ], [93, -5132.860000, 0.014359, 0.002453, 0.087468 ] ], "n": ["FDJVGXF02GMIRF" ] }, {"p": [[91, -3746.990000, 0.799291, 0.013473, 0.000006 ], [103, -3750.150000, 0.033957, 0.000007, 0.009896 ], [104, -3750.150000, 0.033956, 0.000005, 0.009896 ], [106, -3750.160000, 0.033429, 0.007986, 0.009899 ], [107, -3750.160000, 0.033428, 0.000008, 0.009899 ], [102, -3750.180000, 0.032970, 0.000005, 0.009909 ], [98, -3750.180000, 0.032969, 0.034683, 0.009899 ] ], "n": ["FDJVGXF02F7DBV" ] }, {"p": [[91, -3746.990000, 0.799291, 0.013473, 0.000006 ], [103, -3750.150000, 0.033957, 0.000007, 0.009896 ], [104, -3750.150000, 0.033956, 0.000005, 0.009896 ], [106, -3750.160000, 0.033429, 0.007986, 0.009899 ], [107, -3750.160000, 0.033428, 0.000008, 0.009899 ], [102, -3750.180000, 0.032970, 0.000005, 0.009909 ], [98, -3750.180000, 0.032969, 0.034683, 0.009899 ] ], "n": ["FDJVGXF02HOLWU" ] }, {"p": [[95, -7947.020000, 0.293231, 0.005215, 0.051022 ], [96, -7947.380000, 0.204946, 0.027500, 0.051983 ], [97, -7947.380000, 0.204764, 0.000005, 0.051982 ], [91, -7947.700000, 0.148563, 0.020097, 0.053090 ], [94, -7947.700000, 0.148496, 0.039199, 0.053094 ] ], "n": ["FDJVGXF02IYHPQ_rvcmp" ] }, {"p": [[95, -7947.020000, 0.293231, 0.005215, 0.051022 ], [96, -7947.380000, 0.204946, 0.027500, 0.051983 ], [97, -7947.380000, 0.204764, 0.000005, 0.051982 ], [91, -7947.700000, 0.148563, 0.020097, 0.053090 ], [94, -7947.700000, 0.148496, 0.039199, 0.053094 ] ], "n": ["FDJVGXF02FRA7S_rvcmp" ] }, {"p": [[95, -8655.990000, 0.282593, 0.000008, 0.045604 ], [91, -8655.990000, 0.282537, 0.020097, 0.045599 ], [94, -8655.990000, 0.282424, 0.039199, 0.045604 ], [96, -8657.300000, 0.076242, 0.027500, 0.047129 ], [97, -8657.300000, 0.076204, 0.000005, 0.047133 ] ], "n": ["FDJVGXF02JW1VN_rvcmp" ] }, {"p": [[97, -8417.050000, 0.701949, 0.013322, 0.018873 ], [98, -8418.850000, 0.115723, 0.000006, 0.020220 ], [90, -8418.850000, 0.115660, 0.040800, 0.020222 ], [95, -8420.090000, 0.033348, 0.008662, 0.022053 ], [96, -8420.090000, 0.033320, 0.027500, 0.022057 ] ], "n": ["FDJVGXF02IRF33_rvcmp" ] }, {"p": [[97, -8417.050000, 0.701949, 0.013322, 0.018873 ], [98, -8418.850000, 0.115723, 0.000006, 0.020220 ], [90, -8418.850000, 0.115660, 0.040800, 0.020222 ], [95, -8420.090000, 0.033348, 0.008662, 0.022053 ], [96, -8420.090000, 0.033320, 0.027500, 0.022057 ] ], "n": ["FDJVGXF02H2CA8_rvcmp" ] }, {"p": [[98, -8243.740000, 0.939902, 0.010649, 0.050236 ], [91, -8246.780000, 0.044717, 0.000010, 0.057048 ], [97, -8247.850000, 0.015381, 0.012887, 0.054798 ] ], "n": ["FDJVGXF02JDJ3Y" ] }, {"p": [[98, -6473.070000, 0.296378, 0.010994, 0.010574 ], [99, -6473.080000, 0.293317, 0.016789, 0.010411 ], [97, -6473.960000, 0.121810, 0.021481, 0.011975 ], [90, -6473.960000, 0.121788, 0.040800, 0.011966 ], [101, -6474.730000, 0.056252, 0.018811, 0.011250 ], [102, -6474.730000, 0.056190, 0.000005, 0.011256 ], [100, -6474.770000, 0.054266, 0.040628, 0.011195 ] ], "n": ["FDJVGXF02JFCH8" ] }, {"p": [[98, -8174.820000, 0.372423, 0.009859, 0.051084 ], [91, -8175.240000, 0.243749, 0.004144, 0.053154 ], [96, -8175.650000, 0.162698, 0.022518, 0.048854 ], [95, -8175.960000, 0.118840, 0.006718, 0.050222 ], [97, -8176.110000, 0.102290, 0.000005, 0.051784 ] ], "n": ["FDJVGXF02GAGL4" ] }, {"p": [[99, -8255.900000, 1.000000, 0.016130, 0.024705 ] ], "n": ["FDJVGXF02JPZP3_rvcmp" ] }, {"p": [[101, -8561.070000, 0.404143, 0.003055, 0.103047 ], [100, -8561.380000, 0.298555, 0.040056, 0.106976 ], [99, -8561.380000, 0.297302, 0.047715, 0.107554 ] ], "n": ["FDJVGXF02F8JAM_rvcmp" ] }, {"p": [[101, -8581.620000, 0.375420, 0.002466, 0.063415 ], [99, -8581.810000, 0.312447, 0.047715, 0.065692 ], [100, -8581.810000, 0.312132, 0.040628, 0.065699 ] ], "n": ["FDJVGXF02IZ8HO_rvcmp" ] }, {"p": [[101, -7308.440000, 0.350744, 0.001727, 0.057249 ], [99, -7308.520000, 0.324792, 0.047715, 0.058865 ], [100, -7308.520000, 0.324463, 0.040628, 0.058871 ] ], "n": ["FDJVGXF02HMEKU" ] }, {"p": [[107, -5605.260000, 0.489634, 0.010331, 0.048208 ], [98, -5606.250000, 0.181153, 0.029751, 0.046539 ], [102, -5606.810000, 0.103951, 0.003018, 0.049365 ], [101, -5606.910000, 0.094418, 0.018811, 0.050367 ], [99, -5607.570000, 0.048836, 0.046062, 0.054384 ], [100, -5607.580000, 0.048297, 0.040628, 0.054565 ], [111, -5607.940000, 0.033710, 0.000007, 0.055951 ] ], "n": ["FDJVGXF02GV8P1_rvcmp" ] }, {"p": [[107, -5467.180000, 0.339528, 0.009435, 0.032819 ], [98, -5467.340000, 0.289782, 0.029024, 0.027280 ], [101, -5468.250000, 0.115754, 0.018811, 0.030809 ], [102, -5468.250000, 0.115751, 0.000005, 0.030809 ], [99, -5468.840000, 0.064380, 0.045718, 0.033474 ], [100, -5468.860000, 0.063261, 0.040628, 0.033599 ], [111, -5470.560000, 0.011543, 0.000007, 0.040102 ] ], "n": ["FDJVGXF02GLGLD_rvcmp" ] }, {"p": [[109, -2419.100000, 0.164695, 0.001310, 0.075243 ], [108, -2419.100000, 0.164691, 0.000001, 0.075246 ], [110, -2419.100000, 0.164653, 0.000008, 0.075238 ], [102, -2419.300000, 0.135787, 0.006517, 0.060552 ], [106, -2419.390000, 0.123556, 0.007986, 0.074774 ], [103, -2419.390000, 0.123556, 0.007523, 0.074784 ], [104, -2419.400000, 0.123062, 0.001437, 0.074940 ] ], "n": ["FDJVGXF02FDXJ6" ] }, {"p": [[126, -3861.970000, 0.216323, 0.092966, 0.254083 ], [125, -3862.040000, 0.201438, 0.057709, 0.266765 ], [127, -3862.040000, 0.201429, 0.000010, 0.266761 ], [29, -3862.510000, 0.126659, 0.028941, 0.283561 ], [27, -3862.670000, 0.107666, 0.010563, 0.308719 ], [32, -3862.970000, 0.079372, 0.014524, 0.290615 ], [149, -3863.140000, 0.067112, 0.004653, 0.292897 ] ], "n": ["FDJVGXF02JN8LI_rvcmp" ] }, {"p": [[126, -3861.970000, 0.216323, 0.092966, 0.254083 ], [125, -3862.040000, 0.201438, 0.057709, 0.266765 ], [127, -3862.040000, 0.201429, 0.000010, 0.266761 ], [29, -3862.510000, 0.126659, 0.028941, 0.283561 ], [27, -3862.670000, 0.107666, 0.010563, 0.308719 ], [32, -3862.970000, 0.079372, 0.014524, 0.290615 ], [149, -3863.140000, 0.067112, 0.004653, 0.292897 ] ], "n": ["FDJVGXF02HZF54_rvcmp" ] }, {"p": [[126, -3861.970000, 0.216323, 0.092966, 0.254083 ], [125, -3862.040000, 0.201438, 0.057709, 0.266765 ], [127, -3862.040000, 0.201429, 0.000010, 0.266761 ], [29, -3862.510000, 0.126659, 0.028941, 0.283561 ], [27, -3862.670000, 0.107666, 0.010563, 0.308719 ], [32, -3862.970000, 0.079372, 0.014524, 0.290615 ], [149, -3863.140000, 0.067112, 0.004653, 0.292897 ] ], "n": ["FDJVGXF02HIWQK_rvcmp" ] }, {"p": [[126, -3804.290000, 0.229009, 0.092161, 0.241375 ], [125, -3804.380000, 0.210217, 0.057709, 0.254518 ], [127, -3804.380000, 0.210190, 0.000010, 0.254521 ], [29, -3804.960000, 0.117731, 0.029334, 0.271793 ], [27, -3805.160000, 0.095777, 0.011833, 0.297476 ], [32, -3805.440000, 0.072876, 0.014203, 0.279233 ], [149, -3805.560000, 0.064199, 0.002802, 0.279914 ] ], "n": ["FDJVGXF02GW68B_rvcmp" ] }, {"p": [[126, -3804.290000, 0.229009, 0.092161, 0.241375 ], [125, -3804.380000, 0.210217, 0.057709, 0.254518 ], [127, -3804.380000, 0.210190, 0.000010, 0.254521 ], [29, -3804.960000, 0.117731, 0.029334, 0.271793 ], [27, -3805.160000, 0.095777, 0.011833, 0.297476 ], [32, -3805.440000, 0.072876, 0.014203, 0.279233 ], [149, -3805.560000, 0.064199, 0.002802, 0.279914 ] ], "n": ["FDJVGXF02FQ974_rvcmp" ] }, {"p": [[126, -3804.290000, 0.229009, 0.092161, 0.241375 ], [125, -3804.380000, 0.210217, 0.057709, 0.254518 ], [127, -3804.380000, 0.210190, 0.000010, 0.254521 ], [29, -3804.960000, 0.117731, 0.029334, 0.271793 ], [27, -3805.160000, 0.095777, 0.011833, 0.297476 ], [32, -3805.440000, 0.072876, 0.014203, 0.279233 ], [149, -3805.560000, 0.064199, 0.002802, 0.279914 ] ], "n": ["FDJVGXF02GRXS9_rvcmp" ] }, {"p": [[131, -4371.210000, 0.143902, 0.000001, 0.007463 ], [138, -4371.210000, 0.143899, 0.001320, 0.007463 ], [139, -4371.210000, 0.143807, 0.000005, 0.007463 ], [137, -4371.210000, 0.143746, 0.004966, 0.007463 ], [132, -4371.210000, 0.143682, 0.010863, 0.007463 ], [135, -4371.230000, 0.140550, 0.005910, 0.007466 ], [136, -4371.230000, 0.140414, 0.003788, 0.007466 ] ], "n": ["FDJVGXF02JNX31" ] }, {"p": [[131, -4400.960000, 0.300339, 0.000001, 0.000006 ], [139, -4400.960000, 0.300054, 0.000005, 0.000006 ], [138, -4400.960000, 0.299023, 0.001320, 0.000006 ], [130, -4402.300000, 0.078395, 0.010632, 0.000006 ], [137, -4403.730000, 0.018701, 0.004966, 0.000006 ], [136, -4406.090000, 0.001772, 0.000007, 0.007187 ], [135, -4406.120000, 0.001715, 0.005909, 0.006962 ] ], "n": ["FDJVGXF02G8JFN_rvcmp" ] }, {"p": [[131, -8922.160000, 0.145126, 0.000001, 0.000006 ], [138, -8922.160000, 0.145121, 0.001320, 0.000006 ], [139, -8922.160000, 0.144797, 0.000005, 0.000006 ], [137, -8922.160000, 0.144421, 0.004966, 0.000006 ], [132, -8922.160000, 0.144150, 0.010863, 0.000006 ], [135, -8922.200000, 0.138329, 0.005910, 0.000006 ], [136, -8922.210000, 0.138056, 0.003788, 0.000006 ] ], "n": ["FDJVGXF02FYPQO_rvcmp" ] }, {"p": [[131, -8922.160000, 0.145126, 0.000001, 0.000006 ], [138, -8922.160000, 0.145121, 0.001320, 0.000006 ], [139, -8922.160000, 0.144797, 0.000005, 0.000006 ], [137, -8922.160000, 0.144421, 0.004966, 0.000006 ], [132, -8922.160000, 0.144150, 0.010863, 0.000006 ], [135, -8922.200000, 0.138329, 0.005910, 0.000006 ], [136, -8922.210000, 0.138056, 0.003788, 0.000006 ] ], "n": ["FDJVGXF02IZ3MU_rvcmp" ] }, {"p": [[131, -8922.160000, 0.145126, 0.000001, 0.000006 ], [138, -8922.160000, 0.145121, 0.001320, 0.000006 ], [139, -8922.160000, 0.144797, 0.000005, 0.000006 ], [137, -8922.160000, 0.144421, 0.004966, 0.000006 ], [132, -8922.160000, 0.144150, 0.010863, 0.000006 ], [135, -8922.200000, 0.138329, 0.005910, 0.000006 ], [136, -8922.210000, 0.138056, 0.003788, 0.000006 ] ], "n": ["FDJVGXF02H2IL8_rvcmp" ] }, {"p": [[131, -8922.160000, 0.145126, 0.000001, 0.000006 ], [138, -8922.160000, 0.145121, 0.001320, 0.000006 ], [139, -8922.160000, 0.144797, 0.000005, 0.000006 ], [137, -8922.160000, 0.144421, 0.004966, 0.000006 ], [132, -8922.160000, 0.144150, 0.010863, 0.000006 ], [135, -8922.200000, 0.138329, 0.005910, 0.000006 ], [136, -8922.210000, 0.138056, 0.003788, 0.000006 ] ], "n": ["FDJVGXF02H2IMB_rvcmp" ] }, {"p": [[131, -8922.160000, 0.145126, 0.000001, 0.000006 ], [138, -8922.160000, 0.145121, 0.001320, 0.000006 ], [139, -8922.160000, 0.144797, 0.000005, 0.000006 ], [137, -8922.160000, 0.144421, 0.004966, 0.000006 ], [132, -8922.160000, 0.144150, 0.010863, 0.000006 ], [135, -8922.200000, 0.138329, 0.005910, 0.000006 ], [136, -8922.210000, 0.138056, 0.003788, 0.000006 ] ], "n": ["FDJVGXF02JCWU5" ] }, {"p": [[131, -8922.160000, 0.145126, 0.000001, 0.000006 ], [138, -8922.160000, 0.145121, 0.001320, 0.000006 ], [139, -8922.160000, 0.144797, 0.000005, 0.000006 ], [137, -8922.160000, 0.144421, 0.004966, 0.000006 ], [132, -8922.160000, 0.144150, 0.010863, 0.000006 ], [135, -8922.200000, 0.138329, 0.005910, 0.000006 ], [136, -8922.210000, 0.138056, 0.003788, 0.000006 ] ], "n": ["FDJVGXF02F1HYV" ] }, {"p": [[132, -7670.120000, 0.971396, 0.005579, 0.000010 ], [139, -7674.260000, 0.015439, 0.004473, 0.004140 ], [138, -7674.900000, 0.008212, 0.000712, 0.005054 ], [131, -7675.400000, 0.004952, 0.000001, 0.008195 ] ], "n": ["FDJVGXF02GH6E4_rvcmp" ] }, {"p": [[133, -8117.300000, 0.298208, 0.001193, 0.024298 ], [134, -8117.300000, 0.298181, 0.000001, 0.024300 ], [135, -8117.310000, 0.297897, 0.000006, 0.024300 ], [132, -8119.070000, 0.051235, 0.007524, 0.024893 ], [137, -8120.080000, 0.018622, 0.000010, 0.028222 ], [138, -8120.110000, 0.018048, 0.000005, 0.028485 ], [131, -8120.120000, 0.017810, 0.000001, 0.028563 ] ], "n": ["FDJVGXF02HLFOX_rvcmp" ] }, {"p": [[133, -6746.060000, 0.201028, 0.001210, 0.009765 ], [134, -6746.060000, 0.201014, 0.000001, 0.009767 ], [135, -6746.060000, 0.201011, 0.000006, 0.009767 ], [136, -6746.060000, 0.201007, 0.000007, 0.009767 ], [137, -6746.090000, 0.195940, 0.000010, 0.009769 ] ], "n": ["FDJVGXF02F50AW_rvcmp" ] }, {"p": [[133, -5342.910000, 0.695538, 0.000009, 0.011527 ], [132, -5343.980000, 0.239751, 0.005044, 0.007929 ], [139, -5346.500000, 0.019171, 0.004375, 0.012719 ], [130, -5346.960000, 0.012127, 0.007486, 0.010366 ], [138, -5347.000000, 0.011688, 0.001000, 0.015716 ], [134, -5347.070000, 0.010912, 0.000001, 0.017539 ], [131, -5347.080000, 0.010813, 0.000001, 0.017461 ] ], "n": ["FDJVGXF02JZD9F_rvcmp" ] }, {"p": [[134, -7943.200000, 0.201009, 0.000001, 0.016634 ], [133, -7943.200000, 0.201008, 0.000009, 0.016634 ], [135, -7943.200000, 0.201005, 0.000006, 0.016630 ], [136, -7943.200000, 0.201001, 0.000007, 0.016634 ], [137, -7943.220000, 0.195977, 0.000010, 0.016637 ] ], "n": ["FDJVGXF02F9YM2_rvcmp" ] }, {"p": [[134, -8092.110000, 0.201172, 0.000001, 0.012124 ], [135, -8092.110000, 0.201167, 0.000006, 0.012119 ], [136, -8092.110000, 0.201165, 0.000007, 0.012119 ], [133, -8092.110000, 0.200396, 0.002392, 0.012119 ], [137, -8092.130000, 0.196100, 0.000010, 0.012121 ] ], "n": ["FDJVGXF02I2ISR_rvcmp" ] }, {"p": [[134, -6927.760000, 0.201181, 0.000001, 0.004644 ], [135, -6927.760000, 0.201176, 0.000009, 0.004639 ], [136, -6927.760000, 0.201176, 0.000007, 0.004639 ], [133, -6927.760000, 0.200400, 0.002392, 0.004639 ], [137, -6927.780000, 0.196066, 0.000010, 0.004640 ] ], "n": ["FDJVGXF02FFQFZ_rvcmp" ] }, {"p": [[134, -7670.520000, 0.326280, 0.000001, 0.004141 ], [135, -7670.520000, 0.325946, 0.000006, 0.004141 ], [133, -7670.530000, 0.325009, 0.002392, 0.004134 ], [136, -7673.190000, 0.022765, 0.003788, 0.004698 ] ], "n": ["FDJVGXF02H5AA1" ] }, {"p": [[134, -2761.040000, 0.200840, 0.000001, 0.127490 ], [133, -2761.040000, 0.200840, 0.000009, 0.127490 ], [135, -2761.040000, 0.200837, 0.000006, 0.127490 ], [136, -2761.040000, 0.200834, 0.000007, 0.127490 ], [137, -2761.060000, 0.196649, 0.000010, 0.127579 ] ], "n": ["FDJVGXF02F4ONT_rvcmp" ] }, {"p": [[135, -8554.060000, 0.330967, 0.003244, 0.003711 ], [139, -8554.370000, 0.241626, 0.002672, 0.003308 ], [132, -8554.700000, 0.173056, 0.009006, 0.003728 ], [137, -8555.100000, 0.116220, 0.004966, 0.003822 ], [136, -8555.110000, 0.115467, 0.003788, 0.003827 ], [133, -8557.430000, 0.011332, 0.001784, 0.007407 ], [134, -8557.430000, 0.011331, 0.000001, 0.007409 ] ], "n": ["FDJVGXF02JKFMS" ] }, {"p": [[135, -6739.460000, 0.541202, 0.002241, 0.013097 ], [136, -6741.150000, 0.100298, 0.001765, 0.014350 ], [138, -6741.210000, 0.094373, 0.000720, 0.014780 ], [134, -6741.380000, 0.079514, 0.000001, 0.018140 ], [133, -6741.390000, 0.078908, 0.002392, 0.018145 ], [139, -6741.680000, 0.058656, 0.003657, 0.014823 ], [131, -6741.900000, 0.047049, 0.000001, 0.018086 ] ], "n": ["FDJVGXF02INXEC" ] }, {"p": [[136, -7492.540000, 0.435593, 0.001695, 0.013745 ], [139, -7493.020000, 0.270933, 0.004725, 0.014156 ], [135, -7493.930000, 0.108495, 0.004531, 0.016227 ], [137, -7494.410000, 0.067077, 0.000010, 0.016379 ], [132, -7494.530000, 0.059891, 0.009679, 0.017306 ], [138, -7494.720000, 0.049195, 0.000005, 0.017600 ], [131, -7496.440000, 0.008815, 0.000001, 0.021269 ] ], "n": ["FDJVGXF02H5AR0" ] }, {"p": [[136, -3527.770000, 0.381143, 0.000007, 0.151558 ], [135, -3529.040000, 0.106201, 0.005910, 0.164675 ], [137, -3529.040000, 0.106196, 0.000010, 0.164670 ], [133, -3529.090000, 0.101617, 0.001203, 0.165521 ], [131, -3529.090000, 0.101615, 0.000001, 0.165517 ], [134, -3529.090000, 0.101615, 0.000001, 0.165523 ], [138, -3529.090000, 0.101614, 0.001320, 0.165523 ] ], "n": ["FDJVGXF02GOQ6V_rvcmp" ] }, {"p": [[136, -5596.200000, 0.350716, 0.000007, 0.005595 ], [135, -5596.280000, 0.323260, 0.005910, 0.005592 ], [137, -5596.290000, 0.321116, 0.000010, 0.005591 ], [134, -5600.470000, 0.004908, 0.000001, 0.011273 ] ], "n": ["FDJVGXF02GE3K8" ] }, {"p": [[136, -5596.200000, 0.350716, 0.000007, 0.005595 ], [135, -5596.280000, 0.323260, 0.005910, 0.005592 ], [137, -5596.290000, 0.321116, 0.000010, 0.005591 ], [134, -5600.470000, 0.004908, 0.000001, 0.011273 ] ], "n": ["FDJVGXF02IE3VW" ] }, {"p": [[136, -5596.200000, 0.350716, 0.000007, 0.005595 ], [135, -5596.280000, 0.323260, 0.005910, 0.005592 ], [137, -5596.290000, 0.321116, 0.000010, 0.005591 ], [134, -5600.470000, 0.004908, 0.000001, 0.011273 ] ], "n": ["FDJVGXF02F1PNG" ] }, {"p": [[136, -5596.200000, 0.350716, 0.000007, 0.005595 ], [135, -5596.280000, 0.323260, 0.005910, 0.005592 ], [137, -5596.290000, 0.321116, 0.000010, 0.005591 ], [134, -5600.470000, 0.004908, 0.000001, 0.011273 ] ], "n": ["FDJVGXF02GC300" ] }, {"p": [[136, -7108.940000, 0.215617, 0.000007, 0.004382 ], [137, -7109.000000, 0.201138, 0.000010, 0.004384 ], [135, -7109.010000, 0.200772, 0.005910, 0.004384 ], [132, -7109.070000, 0.188985, 0.010863, 0.004386 ], [138, -7109.070000, 0.188660, 0.000005, 0.004387 ], [139, -7113.430000, 0.002415, 0.000005, 0.008801 ], [131, -7113.430000, 0.002413, 0.000001, 0.008809 ] ], "n": ["FDJVGXF02H6ETX_rvcmp" ] }, {"p": [[136, -7767.290000, 0.504201, 0.000007, 0.004094 ], [135, -7767.320000, 0.490648, 0.005909, 0.003867 ], [134, -7771.880000, 0.005151, 0.000001, 0.008219 ] ], "n": ["FDJVGXF02GOLCL" ] }, {"p": [[137, -6020.930000, 0.372440, 0.002578, 0.175789 ], [148, -6021.860000, 0.147041, 0.021756, 0.174258 ], [140, -6021.940000, 0.136566, 0.033626, 0.179127 ], [147, -6022.080000, 0.118044, 0.061400, 0.179586 ], [138, -6022.520000, 0.075840, 0.000005, 0.189862 ], [132, -6022.520000, 0.075819, 0.010863, 0.189867 ], [131, -6022.550000, 0.074250, 0.000001, 0.190179 ] ], "n": ["FDJVGXF02HDW5G" ] }, {"p": [[137, -6130.550000, 0.395932, 0.002575, 0.170351 ], [140, -6131.630000, 0.134159, 0.032648, 0.172398 ], [148, -6131.670000, 0.128346, 0.017524, 0.168068 ], [147, -6131.820000, 0.111152, 0.061465, 0.172279 ], [138, -6132.180000, 0.077375, 0.000005, 0.183917 ], [132, -6132.180000, 0.077353, 0.010863, 0.183917 ], [131, -6132.200000, 0.075683, 0.000001, 0.184224 ] ], "n": ["FDJVGXF02GB37W" ] }, {"p": [[137, -6261.790000, 0.330583, 0.002572, 0.165315 ], [148, -6262.290000, 0.201081, 0.026708, 0.159032 ], [140, -6262.560000, 0.153647, 0.033990, 0.166454 ], [147, -6262.730000, 0.129745, 0.061336, 0.167273 ], [138, -6263.460000, 0.062125, 0.000005, 0.178567 ], [132, -6263.460000, 0.062107, 0.010863, 0.178567 ], [131, -6263.490000, 0.060713, 0.000001, 0.178874 ] ], "n": ["FDJVGXF02IRBO4" ] }, {"p": [[138, -7222.620000, 0.589198, 0.000627, 0.000006 ], [132, -7223.890000, 0.166139, 0.009990, 0.000007 ], [137, -7224.050000, 0.141372, 0.004966, 0.000007 ], [139, -7225.320000, 0.039713, 0.000005, 0.004248 ], [131, -7225.320000, 0.039641, 0.000001, 0.004256 ], [135, -7226.260000, 0.015464, 0.004392, 0.004170 ], [136, -7226.860000, 0.008474, 0.003788, 0.004244 ] ], "n": ["FDJVGXF02FV3L9_rvcmp" ] }, {"p": [[139, -7633.560000, 0.550216, 0.005799, 0.010415 ], [130, -7634.170000, 0.298972, 0.010632, 0.009675 ], [135, -7635.530000, 0.076807, 0.003110, 0.012278 ], [138, -7636.360000, 0.033638, 0.000705, 0.013000 ], [131, -7637.140000, 0.015379, 0.000001, 0.016046 ], [132, -7637.160000, 0.015052, 0.008740, 0.013619 ], [137, -7637.580000, 0.009935, 0.004966, 0.013728 ] ], "n": ["FDJVGXF02HIFVX" ] }, {"p": [[139, -9156.840000, 1.000000, 0.005965, 0.004004 ] ], "n": ["FDJVGXF02INYGX" ] }, {"p": [[139, -2860.610000, 0.454324, 0.005847, 0.000006 ], [130, -2861.410000, 0.204952, 0.009957, 0.000006 ], [140, -2861.430000, 0.201808, 0.000006, 0.000006 ], [132, -2863.180000, 0.034769, 0.005444, 0.010738 ], [135, -2863.190000, 0.034722, 0.002984, 0.010781 ], [137, -2863.190000, 0.034716, 0.002478, 0.010786 ], [136, -2863.190000, 0.034710, 0.001944, 0.010792 ] ], "n": ["FDJVGXF02F4ONT" ] }, {"p": [[139, -7490.420000, 0.247330, 0.001165, 0.010955 ], [136, -7490.480000, 0.234057, 0.000007, 0.012284 ], [131, -7490.480000, 0.234017, 0.000001, 0.012285 ], [138, -7490.480000, 0.232938, 0.001320, 0.012281 ], [135, -7492.440000, 0.032907, 0.004668, 0.011420 ], [137, -7493.000000, 0.018751, 0.004966, 0.013538 ] ], "n": ["FDJVGXF02I63MJ" ] }, {"p": [[140, -7319.090000, 0.386193, 0.005330, 0.013167 ], [139, -7319.300000, 0.312129, 0.007215, 0.018337 ], [130, -7319.620000, 0.226661, 0.010091, 0.018305 ], [132, -7321.490000, 0.034796, 0.006529, 0.020275 ], [135, -7322.060000, 0.019796, 0.003219, 0.022410 ], [138, -7322.390000, 0.014118, 0.000535, 0.021327 ], [137, -7323.200000, 0.006308, 0.004966, 0.021957 ] ], "n": ["FDJVGXF02IZN0T" ] }, {"p": [[140, -7493.150000, 0.158825, 0.000006, 1.999990 ], [2, -7493.170000, 0.155326, 0.036220, 1.999990 ], [228, -7493.170000, 0.155279, 0.000005, 1.999990 ], [148, -7493.190000, 0.152842, 0.000009, 1.999990 ], [147, -7493.190000, 0.152840, 0.065313, 1.999990 ], [0, -7493.490000, 0.112444, 0.066512, 1.999990 ], [1, -7493.490000, 0.112443, 0.096269, 1.999990 ] ], "n": ["FDJVGXF02HX2JJ" ] }, {"p": [[140, -5202.620000, 0.165249, 0.000006, 1.966580 ], [139, -5202.620000, 0.165227, 0.010556, 1.966630 ], [148, -5202.660000, 0.158087, 0.000009, 1.993690 ], [147, -5202.660000, 0.158084, 0.065313, 1.993740 ], [212, -5202.810000, 0.136601, 0.000008, 1.752390 ], [137, -5202.940000, 0.119365, 0.000010, 1.999990 ], [225, -5203.150000, 0.097386, 0.036449, 1.828740 ] ], "n": ["FDJVGXF02JQX9N" ] }, {"p": [[141, -6805.560000, 0.822676, 0.002446, 0.004842 ], [143, -6807.550000, 0.111699, 0.003154, 0.005156 ], [142, -6808.080000, 0.065624, 0.000001, 0.009488 ] ], "n": ["FDJVGXF02HY0KO_rvcmp" ] }, {"p": [[141, -8114.430000, 0.333526, 0.001825, 0.003983 ], [142, -8114.430000, 0.333416, 0.000001, 0.003989 ], [143, -8114.430000, 0.333058, 0.000008, 0.003980 ] ], "n": ["FDJVGXF02GTQW8_rvcmp" ] }, {"p": [[142, -3860.720000, 0.333477, 0.000001, 0.000006 ], [141, -3860.720000, 0.333476, 0.000007, 0.000006 ], [143, -3860.720000, 0.333047, 0.000008, 0.000006 ] ], "n": ["FDJVGXF02H3FB2_rvcmp" ] }, {"p": [[142, -4529.960000, 0.333418, 0.000001, 0.007191 ], [141, -4529.960000, 0.333418, 0.000009, 0.007194 ], [143, -4529.960000, 0.333165, 0.000008, 0.007191 ] ], "n": ["FDJVGXF02GIO3F" ] }, {"p": [[143, -7455.870000, 0.801977, 0.012430, 0.000006 ], [142, -7457.960000, 0.099133, 0.000001, 0.008484 ], [141, -7457.970000, 0.098889, 0.003648, 0.008484 ] ], "n": ["FDJVGXF02GH82N_rvcmp" ] }, {"p": [[145, -7467.460000, 0.263505, 0.000007, 1.999990 ], [144, -7467.780000, 0.191735, 0.100657, 1.999990 ], [146, -7467.780000, 0.191726, 0.000007, 1.999990 ], [6, -7468.480000, 0.095604, 0.000010, 1.999990 ], [5, -7468.480000, 0.095148, 0.000001, 1.999990 ], [7, -7468.480000, 0.095134, 0.000008, 1.999990 ], [147, -7468.830000, 0.067149, 0.000008, 1.999990 ] ], "n": ["FDJVGXF02JJUZH_rvcmp" ] }, {"p": [[147, -4667.850000, 0.182087, 0.048322, 0.556995 ], [171, -4667.910000, 0.170908, 0.012211, 0.404929 ], [148, -4667.950000, 0.164002, 0.032825, 0.518166 ], [190, -4667.980000, 0.159128, 0.019049, 0.434099 ], [149, -4668.300000, 0.115833, 0.063739, 0.400832 ], [189, -4668.330000, 0.112667, 0.096145, 0.467071 ], [191, -4668.490000, 0.095374, 0.000008, 0.454074 ] ], "n": ["FDJVGXF02IOYZU_rvcmp" ] }, {"p": [[148, -7291.320000, 0.203145, 0.090065, 1.447830 ], [56, -7291.420000, 0.185259, 0.035869, 1.282520 ], [22, -7291.450000, 0.179734, 0.028187, 1.493340 ], [13, -7291.670000, 0.143648, 0.000009, 1.434270 ], [225, -7292.060000, 0.097347, 0.036449, 1.551660 ], [149, -7292.070000, 0.096643, 0.010930, 1.419510 ], [52, -7292.090000, 0.094225, 0.017039, 1.454120 ] ], "n": ["FDJVGXF02F2ZWQ" ] }, {"p": [[148, -6911.740000, 0.390936, 0.041908, 1.289100 ], [147, -6911.850000, 0.348873, 0.065313, 1.358800 ], [44, -6913.380000, 0.075662, 0.000005, 1.309500 ], [127, -6913.550000, 0.063982, 0.040911, 1.305380 ], [149, -6913.550000, 0.063982, 0.000008, 1.305370 ], [126, -6914.270000, 0.031164, 0.071899, 1.379690 ], [73, -6914.470000, 0.025401, 0.043072, 1.469550 ] ], "n": ["FDJVGXF02G04PC_rvcmp" ] }, {"p": [[148, -6911.740000, 0.390936, 0.041908, 1.289100 ], [147, -6911.850000, 0.348873, 0.065313, 1.358800 ], [44, -6913.380000, 0.075662, 0.000005, 1.309500 ], [127, -6913.550000, 0.063982, 0.040911, 1.305380 ], [149, -6913.550000, 0.063982, 0.000008, 1.305370 ], [126, -6914.270000, 0.031164, 0.071899, 1.379690 ], [73, -6914.470000, 0.025401, 0.043072, 1.469550 ] ], "n": ["FDJVGXF02FE5TM_rvcmp" ] }, {"p": [[148, -5610.020000, 0.274889, 0.000009, 1.999990 ], [126, -5610.640000, 0.148148, 0.029043, 1.999990 ], [0, -5610.800000, 0.125377, 0.000008, 1.999990 ], [1, -5610.830000, 0.122352, 0.096269, 1.999990 ], [2, -5610.830000, 0.122351, 0.000009, 1.999990 ], [227, -5610.880000, 0.116394, 0.012980, 1.999990 ], [225, -5611.130000, 0.090488, 0.036449, 1.999990 ] ], "n": ["FDJVGXF02H8Z3Y" ] }, {"p": [[148, -5455.610000, 0.278381, 0.000009, 1.621200 ], [147, -5455.610000, 0.278367, 0.065313, 1.621240 ], [227, -5456.330000, 0.136013, 0.012980, 1.464450 ], [17, -5456.620000, 0.101226, 0.049256, 1.524040 ], [64, -5456.910000, 0.075555, 0.347492, 1.890920 ], [66, -5456.910000, 0.075554, 0.000007, 1.890910 ], [126, -5457.230000, 0.054905, 0.041676, 1.542730 ] ], "n": ["FDJVGXF02HFABX" ] }, {"p": [[148, -5534.980000, 0.251229, 0.000009, 1.614820 ], [147, -5534.980000, 0.251216, 0.065313, 1.614850 ], [227, -5535.690000, 0.123326, 0.012980, 1.456040 ], [228, -5535.690000, 0.123286, 0.000005, 1.456060 ], [17, -5535.980000, 0.091582, 0.049256, 1.516290 ], [226, -5535.980000, 0.091569, 0.032306, 1.516310 ], [64, -5536.280000, 0.067792, 0.347492, 1.885870 ] ], "n": ["FDJVGXF02IFGFX" ] }, {"p": [[148, -3686.610000, 0.332719, 0.000009, 1.357670 ], [65, -3687.190000, 0.186028, 0.058208, 1.309370 ], [0, -3687.710000, 0.110507, 0.000008, 1.000740 ], [11, -3687.880000, 0.093269, 0.000001, 1.078300 ], [12, -3687.880000, 0.093269, 0.000009, 1.078310 ], [13, -3687.880000, 0.093266, 0.000009, 1.078300 ], [1, -3687.910000, 0.090942, 0.096269, 1.124350 ] ], "n": ["FDJVGXF02JWBEE" ] }, {"p": [[149, -4472.350000, 0.166697, 0.063739, 0.250963 ], [170, -4472.350000, 0.166670, 0.018724, 0.250971 ], [171, -4472.350000, 0.166650, 0.000008, 0.250971 ], [153, -4472.500000, 0.143439, 0.025504, 0.238892 ], [154, -4472.510000, 0.141722, 0.001738, 0.240463 ], [150, -4472.510000, 0.141199, 0.016958, 0.240854 ], [169, -4473.170000, 0.073623, 0.023387, 0.255436 ] ], "n": ["FDJVGXF02ICB1C_rvcmp" ] }, {"p": [[149, -6812.840000, 0.237286, 0.051948, 0.063382 ], [170, -6812.850000, 0.236753, 0.003178, 0.086056 ], [154, -6812.880000, 0.228027, 0.030339, 0.088505 ], [169, -6812.890000, 0.227910, 0.023387, 0.088511 ], [171, -6814.070000, 0.070025, 0.003489, 0.078473 ] ], "n": ["FDJVGXF02HY7HA_rvcmp" ] }, {"p": [[149, -7119.850000, 0.510147, 0.049920, 0.055898 ], [171, -7120.580000, 0.247041, 0.010993, 0.070846 ], [170, -7120.960000, 0.167946, 0.011995, 0.077570 ], [154, -7122.360000, 0.041389, 0.024038, 0.088411 ], [169, -7122.580000, 0.033477, 0.023387, 0.090284 ] ], "n": ["FDJVGXF02HC2AW" ] }, {"p": [[149, -8202.410000, 0.918858, 0.028795, 0.068851 ], [171, -8204.830000, 0.081142, 0.009926, 0.104868 ] ], "n": ["FDJVGXF02GWFX3_rvcmp" ] }, {"p": [[149, -5339.640000, 0.338021, 0.015145, 0.133362 ], [127, -5339.870000, 0.268741, 0.034213, 0.131014 ], [148, -5339.960000, 0.246385, 0.148117, 0.135116 ], [126, -5341.670000, 0.044598, 0.081599, 0.128468 ], [170, -5341.740000, 0.041547, 0.018724, 0.171529 ], [171, -5341.740000, 0.041543, 0.000008, 0.171531 ], [40, -5342.510000, 0.019165, 0.067961, 0.183131 ] ], "n": ["FDJVGXF02HQW3R" ] }, {"p": [[149, -5337.070000, 0.305192, 0.014077, 0.134793 ], [127, -5337.220000, 0.261867, 0.032864, 0.131433 ], [148, -5337.350000, 0.231219, 0.148117, 0.136486 ], [126, -5338.560000, 0.068550, 0.078681, 0.126935 ], [40, -5338.730000, 0.057831, 0.067166, 0.173492 ], [191, -5339.090000, 0.040343, 0.012123, 0.180860 ], [171, -5339.230000, 0.034997, 0.000008, 0.174198 ] ], "n": ["FDJVGXF02FF32Z" ] }, {"p": [[152, -8203.620000, 0.529923, 0.023503, 0.081181 ], [153, -8204.300000, 0.268939, 0.003748, 0.078919 ], [151, -8204.590000, 0.201138, 0.014659, 0.083206 ] ], "n": ["FDJVGXF02GEQZL" ] }, {"p": [[152, -6880.900000, 0.697936, 0.021134, 0.049368 ], [199, -6883.070000, 0.079936, 0.013298, 0.061712 ], [200, -6883.070000, 0.079890, 0.000006, 0.061710 ], [198, -6883.780000, 0.039270, 0.009856, 0.065811 ], [153, -6883.830000, 0.037546, 0.000009, 0.057395 ], [151, -6883.830000, 0.037526, 0.014659, 0.057397 ], [197, -6884.120000, 0.027896, 0.024513, 0.067466 ] ], "n": ["FDJVGXF02FNMNX" ] }, {"p": [[152, -8264.190000, 0.499897, 0.019284, 0.106021 ], [151, -8264.540000, 0.353357, 0.008379, 0.103074 ], [153, -8265.420000, 0.146746, 0.000007, 0.107664 ] ], "n": ["FDJVGXF02IVHRC_rvcmp" ] }, {"p": [[152, -8264.190000, 0.499897, 0.019284, 0.106021 ], [151, -8264.540000, 0.353357, 0.008379, 0.103074 ], [153, -8265.420000, 0.146746, 0.000007, 0.107664 ] ], "n": ["FDJVGXF02JG5WK_rvcmp" ] }, {"p": [[152, -8264.190000, 0.499897, 0.019284, 0.106021 ], [151, -8264.540000, 0.353357, 0.008379, 0.103074 ], [153, -8265.420000, 0.146746, 0.000007, 0.107664 ] ], "n": ["FDJVGXF02FV8WG_rvcmp" ] }, {"p": [[153, -8768.770000, 0.823931, 0.011754, 0.089231 ], [171, -8771.310000, 0.064975, 0.010702, 0.089827 ], [149, -8771.430000, 0.057727, 0.052609, 0.080727 ], [170, -8772.200000, 0.026741, 0.015257, 0.097378 ], [152, -8772.490000, 0.020084, 0.029974, 0.109084 ], [154, -8773.610000, 0.006542, 0.012283, 0.107344 ] ], "n": ["FDJVGXF02JVOJ8_rvcmp" ] }, {"p": [[153, -8774.600000, 0.386245, 0.011928, 0.082379 ], [171, -8774.690000, 0.355695, 0.015771, 0.075613 ], [205, -8775.570000, 0.147548, 0.022721, 0.081027 ], [196, -8776.240000, 0.074866, 0.040193, 0.072842 ], [170, -8776.990000, 0.035648, 0.016492, 0.088296 ] ], "n": ["FDJVGXF02IHBYW_rvcmp" ] }, {"p": [[154, -4436.970000, 0.333512, 0.030340, 0.006730 ], [169, -4436.970000, 0.333443, 0.023387, 0.006733 ], [170, -4436.970000, 0.333045, 0.000009, 0.006733 ] ], "n": ["FDJVGXF02J2KBH_rvcmp" ] }, {"p": [[154, -7554.860000, 0.916462, 0.010609, 0.050665 ], [153, -7557.250000, 0.083538, 0.018471, 0.058602 ] ], "n": ["FDJVGXF02HTSH5_rvcmp" ] }, {"p": [[154, -7422.500000, 0.636661, 0.009417, 0.065404 ], [153, -7423.910000, 0.155422, 0.026996, 0.074065 ], [150, -7423.910000, 0.155342, 0.016957, 0.074067 ], [152, -7425.450000, 0.033166, 0.024368, 0.073108 ], [151, -7425.990000, 0.019409, 0.014374, 0.077441 ] ], "n": ["FDJVGXF02IWEET_rvcmp" ] }, {"p": [[155, -5037.690000, 0.881489, 0.010167, 0.000006 ], [156, -5040.410000, 0.058220, 0.040565, 0.000006 ], [157, -5040.500000, 0.052911, 0.000006, 0.000006 ], [161, -5042.470000, 0.007380, 0.008241, 0.006795 ] ], "n": ["FDJVGXF02IFR90" ] }, {"p": [[155, -7052.150000, 0.940168, 0.010164, 0.000006 ], [156, -7054.900000, 0.059832, 0.041438, 0.000006 ] ], "n": ["FDJVGXF02JFCPJ" ] }, {"p": [[155, -7185.160000, 0.750731, 0.008363, 0.000006 ], [156, -7186.920000, 0.128191, 0.041382, 0.000009 ], [157, -7186.980000, 0.121079, 0.000006, 0.000005 ] ], "n": ["FDJVGXF02G0X7P" ] }, {"p": [[155, -8180.560000, 0.525654, 0.000006, 0.011972 ], [156, -8181.030000, 0.329232, 0.038025, 0.008410 ], [157, -8181.950000, 0.131004, 0.000006, 0.011622 ], [169, -8184.180000, 0.014110, 0.000006, 0.012564 ] ], "n": ["FDJVGXF02F3DP1" ] }, {"p": [[155, -8374.440000, 0.910211, 0.000006, 0.007616 ], [156, -8376.990000, 0.070867, 0.038694, 0.001169 ], [157, -8378.310000, 0.018922, 0.000723, 0.005442 ] ], "n": ["FDJVGXF02JSI4C" ] }, {"p": [[156, -3996.180000, 0.291063, 0.039673, 0.000006 ], [155, -3996.320000, 0.254554, 0.012865, 0.000006 ], [157, -3996.320000, 0.254175, 0.000006, 0.000006 ], [161, -3996.560000, 0.200209, 0.009260, 0.000006 ] ], "n": ["FDJVGXF02G0X7M" ] }, {"p": [[156, -8015.780000, 0.701736, 0.029744, 0.013525 ], [160, -8017.420000, 0.136088, 0.004116, 0.029976 ], [159, -8017.890000, 0.084978, 0.009298, 0.032098 ], [169, -8017.990000, 0.077198, 0.011359, 0.023814 ] ], "n": ["FDJVGXF02FMRFO" ] }, {"p": [[156, -8553.580000, 0.973655, 0.029147, 0.022817 ], [160, -8557.190000, 0.026345, 0.003244, 0.030173 ] ], "n": ["FDJVGXF02F47JY_rvcmp" ] }, {"p": [[156, -8184.100000, 0.966541, 0.029080, 0.019126 ], [160, -8187.910000, 0.021393, 0.003186, 0.026930 ], [158, -8188.480000, 0.012066, 0.006699, 0.021392 ] ], "n": ["FDJVGXF02H8NDW_rvcmp" ] }, {"p": [[156, -7681.740000, 0.839215, 0.028066, 0.003239 ], [155, -7684.090000, 0.080427, 0.012865, 0.007261 ], [157, -7684.090000, 0.080358, 0.000006, 0.007261 ] ], "n": ["FDJVGXF02H8J1Q_rvcmp" ] }, {"p": [[156, -8691.610000, 1.000000, 0.027374, 0.024708 ] ], "n": ["FDJVGXF02J045Y" ] }, {"p": [[156, -8796.830000, 1.000000, 0.027485, 0.024395 ] ], "n": ["FDJVGXF02F1K58" ] }, {"p": [[156, -7036.230000, 0.502100, 0.027332, 0.015450 ], [160, -7036.660000, 0.326881, 0.004331, 0.038995 ], [161, -7038.290000, 0.063655, 0.023495, 0.030176 ], [158, -7038.580000, 0.048026, 0.016014, 0.042712 ], [159, -7038.740000, 0.040735, 0.011552, 0.044645 ], [165, -7040.100000, 0.010465, 0.000007, 0.036927 ], [157, -7040.350000, 0.008138, 0.001904, 0.037339 ] ], "n": ["FDJVGXF02IOE2L_rvcmp" ] }, {"p": [[156, -6200.340000, 1.000000, 0.025663, 0.000006 ] ], "n": ["FDJVGXF02HHGGV_rvcmp" ] }, {"p": [[156, -8211.830000, 1.000000, 0.022056, 0.009825 ] ], "n": ["FDJVGXF02IE1SZ_rvcmp" ] }, {"p": [[156, -7753.460000, 0.281307, 0.021236, 0.134237 ], [167, -7754.110000, 0.146481, 0.024812, 0.132936 ], [157, -7754.120000, 0.145774, 0.002299, 0.142620 ], [155, -7754.190000, 0.135290, 0.012865, 0.143537 ], [168, -7754.290000, 0.123027, 0.003242, 0.143914 ], [169, -7754.290000, 0.122196, 0.000006, 0.143957 ], [161, -7755.270000, 0.045925, 0.018135, 0.139948 ] ], "n": ["FDJVGXF02JR510_rvcmp" ] }, {"p": [[156, -4332.230000, 0.842808, 0.017513, 0.000006 ], [169, -4333.910000, 0.157192, 0.015160, 0.000006 ] ], "n": ["FDJVGXF02FX4DB" ] }, {"p": [[156, -6229.330000, 1.000000, 0.016462, 0.026898 ] ], "n": ["FDJVGXF02GYL8N_rvcmp" ] }, {"p": [[156, -8502.650000, 1.000000, 0.015354, 0.010861 ] ], "n": ["FDJVGXF02HDCI6_rvcmp" ] }, {"p": [[156, -5499.140000, 0.347063, 0.000005, 0.022906 ], [155, -5499.410000, 0.266057, 0.012865, 0.022971 ], [157, -5499.410000, 0.265846, 0.000006, 0.022971 ], [169, -5501.230000, 0.042968, 0.004097, 0.022456 ], [168, -5501.270000, 0.041153, 0.003612, 0.024291 ], [154, -5502.040000, 0.019161, 0.028618, 0.020239 ], [170, -5502.110000, 0.017752, 0.001250, 0.019833 ] ], "n": ["FDJVGXF02H3L1Z" ] }, {"p": [[157, -4540.720000, 0.251272, 0.005887, 0.014061 ], [169, -4540.720000, 0.251225, 0.000008, 0.014058 ], [168, -4540.720000, 0.250214, 0.003611, 0.014062 ], [156, -4541.760000, 0.088891, 0.043598, 0.014842 ], [155, -4541.760000, 0.088867, 0.012865, 0.014842 ], [170, -4542.080000, 0.064549, 0.010298, 0.000007 ], [161, -4544.640000, 0.004982, 0.021940, 0.019850 ] ], "n": ["FDJVGXF02FOWJ4" ] }, {"p": [[158, -4676.930000, 0.203510, 0.000009, 0.335675 ], [167, -4677.120000, 0.168715, 0.004124, 0.338129 ], [198, -4677.320000, 0.137291, 0.007471, 0.434431 ], [197, -4677.340000, 0.134763, 0.018393, 0.434152 ], [199, -4677.370000, 0.131532, 0.000006, 0.439414 ], [156, -4677.520000, 0.112425, 0.004498, 0.323395 ], [160, -4677.530000, 0.111765, 0.001734, 0.350230 ] ], "n": ["FDJVGXF02FX0XN" ] }, {"p": [[158, -6745.560000, 0.602591, 0.000009, 0.304863 ], [162, -6747.290000, 0.106771, 0.010708, 0.303268 ], [164, -6747.290000, 0.106760, 0.000005, 0.303268 ], [163, -6747.290000, 0.106709, 0.006754, 0.303271 ], [167, -6748.560000, 0.029808, 0.023309, 0.315070 ], [161, -6748.740000, 0.024988, 0.020039, 0.310010 ], [165, -6748.850000, 0.022372, 0.000007, 0.320871 ] ], "n": ["FDJVGXF02JAXFE_rvcmp" ] }, {"p": [[159, -3952.490000, 0.424336, 0.002594, 0.041117 ], [156, -3953.600000, 0.139356, 0.035431, 0.037174 ], [161, -3953.850000, 0.108802, 0.026496, 0.035266 ], [155, -3954.020000, 0.091718, 0.012865, 0.043855 ], [157, -3954.020000, 0.091712, 0.000006, 0.043860 ], [165, -3954.250000, 0.072659, 0.000951, 0.040370 ], [164, -3954.270000, 0.071417, 0.020699, 0.041268 ] ], "n": ["FDJVGXF02F5UCJ_rvcmp" ] }, {"p": [[159, -8709.370000, 0.717864, 0.000006, 0.178962 ], [161, -8711.080000, 0.129484, 0.020945, 0.174502 ], [164, -8711.780000, 0.064711, 0.020699, 0.185858 ], [165, -8711.780000, 0.064684, 0.000007, 0.185859 ], [158, -8713.660000, 0.009861, 0.012781, 0.189420 ], [160, -8713.930000, 0.007535, 0.000007, 0.193767 ], [166, -8714.180000, 0.005861, 0.000008, 0.194949 ] ], "n": ["FDJVGXF02FK3FS_rvcmp" ] }, {"p": [[159, -7000.530000, 0.872350, 0.000006, 0.056012 ], [156, -7003.690000, 0.036935, 0.037276, 0.051455 ], [169, -7003.810000, 0.032764, 0.009791, 0.050011 ], [155, -7004.380000, 0.018448, 0.011860, 0.059073 ], [157, -7004.400000, 0.018220, 0.000006, 0.059112 ], [168, -7004.490000, 0.016569, 0.003612, 0.059410 ], [165, -7005.750000, 0.004714, 0.004037, 0.058557 ] ], "n": ["FDJVGXF02HYEKW" ] }, {"p": [[159, -2597.770000, 1.000000, 0.000006, 0.000006 ] ], "n": ["FDJVGXF02HWZI1_rvcmp" ] }, {"p": [[160, -7141.590000, 0.246777, 0.006979, 0.004323 ], [165, -7141.600000, 0.245773, 0.007352, 0.004323 ], [166, -7141.600000, 0.245355, 0.000008, 0.004324 ], [167, -7142.660000, 0.084671, 0.033973, 0.004441 ], [168, -7142.660000, 0.084650, 0.000008, 0.004447 ], [169, -7143.260000, 0.046420, 0.000006, 0.004516 ], [157, -7143.260000, 0.046354, 0.005887, 0.004516 ] ], "n": ["FDJVGXF02FKGNY" ] }, {"p": [[160, -7806.370000, 0.680841, 0.002999, 0.025881 ], [158, -7807.620000, 0.194086, 0.015224, 0.027297 ], [159, -7808.060000, 0.125073, 0.011552, 0.029507 ] ], "n": ["FDJVGXF02JWVD9_rvcmp" ] }, {"p": [[160, -7876.690000, 0.372253, 0.002004, 0.187208 ], [158, -7876.870000, 0.312337, 0.016226, 0.191141 ], [159, -7876.880000, 0.309272, 0.011123, 0.192022 ], [169, -7880.800000, 0.006138, 0.011285, 0.181256 ] ], "n": ["FDJVGXF02GRBNP" ] }, {"p": [[160, -7876.690000, 0.372253, 0.002004, 0.187208 ], [158, -7876.870000, 0.312337, 0.016226, 0.191141 ], [159, -7876.880000, 0.309272, 0.011123, 0.192022 ], [169, -7880.800000, 0.006138, 0.011285, 0.181256 ] ], "n": ["FDJVGXF02HAYK6" ] }, {"p": [[160, -8278.240000, 0.400374, 0.002349, 0.153489 ], [159, -8278.570000, 0.290519, 0.011552, 0.158584 ], [158, -8278.570000, 0.290484, 0.017418, 0.158579 ], [164, -8282.010000, 0.009314, 0.020699, 0.155000 ], [165, -8282.010000, 0.009310, 0.000007, 0.154998 ] ], "n": ["FDJVGXF02HRVXJ" ] }, {"p": [[161, -6219.930000, 0.521295, 0.027813, 0.008801 ], [164, -6220.830000, 0.212142, 0.020699, 0.012836 ], [165, -6220.830000, 0.212119, 0.000007, 0.012830 ], [168, -6222.900000, 0.026610, 0.002042, 0.016115 ], [169, -6223.550000, 0.013919, 0.000006, 0.016524 ], [157, -6223.550000, 0.013915, 0.005887, 0.016526 ] ], "n": ["FDJVGXF02F0IC5_rvcmp" ] }, {"p": [[161, -5413.260000, 0.743543, 0.025576, 0.010146 ], [165, -5415.020000, 0.128234, 0.000007, 0.017550 ], [164, -5415.020000, 0.128223, 0.020699, 0.017560 ] ], "n": ["FDJVGXF02I1NT2" ] }, {"p": [[161, -5963.600000, 0.860014, 0.026497, 0.000006 ], [165, -5966.040000, 0.075135, 0.001160, 0.004849 ], [164, -5966.190000, 0.064851, 0.020699, 0.006286 ] ], "n": ["FDJVGXF02H9W9G_rvcmp" ] }, {"p": [[161, -6424.560000, 0.209407, 0.024716, 0.208126 ], [169, -6424.680000, 0.187260, 0.014341, 0.197491 ], [164, -6425.020000, 0.132671, 0.020699, 0.212582 ], [165, -6425.020000, 0.132625, 0.000007, 0.212595 ], [170, -6425.080000, 0.124432, 0.012556, 0.185431 ], [171, -6425.140000, 0.117248, 0.007901, 0.188959 ], [190, -6425.340000, 0.096357, 0.017843, 0.185425 ] ], "n": ["FDJVGXF02GZLH0_rvcmp" ] }, {"p": [[161, -3866.160000, 0.614825, 0.025090, 0.000006 ], [159, -3866.810000, 0.323006, 0.000006, 0.008524 ], [165, -3869.140000, 0.031144, 0.000327, 0.007426 ], [164, -3869.150000, 0.031025, 0.020699, 0.007321 ] ], "n": ["FDJVGXF02H5SIY_rvcmp" ] }, {"p": [[161, -3453.730000, 0.214001, 0.023442, 0.028623 ], [156, -3453.780000, 0.204259, 0.035062, 0.031769 ], [155, -3454.280000, 0.124157, 0.012865, 0.039573 ], [157, -3454.280000, 0.124150, 0.000006, 0.039579 ], [169, -3454.360000, 0.115011, 0.000008, 0.039933 ], [168, -3454.360000, 0.114882, 0.003611, 0.039935 ], [165, -3454.460000, 0.103541, 0.001173, 0.035074 ] ], "n": ["FDJVGXF02G2ZGA" ] }, {"p": [[161, -6144.930000, 0.446643, 0.018291, 0.018020 ], [169, -6146.290000, 0.114166, 0.004877, 0.021623 ], [160, -6146.330000, 0.110043, 0.006315, 0.026606 ], [165, -6146.420000, 0.100037, 0.007352, 0.027796 ], [166, -6146.420000, 0.099932, 0.000008, 0.027802 ], [168, -6146.860000, 0.064621, 0.003612, 0.029158 ], [157, -6146.860000, 0.064558, 0.005887, 0.029158 ] ], "n": ["FDJVGXF02HLFPD" ] }, {"p": [[161, -6288.740000, 1.000000, 0.010850, 0.024929 ] ], "n": ["FDJVGXF02IVUU7" ] }, {"p": [[161, -6128.550000, 0.245886, 0.009861, 0.188364 ], [166, -6129.000000, 0.157290, 0.000008, 0.191029 ], [165, -6129.000000, 0.157219, 0.007352, 0.191025 ], [160, -6129.000000, 0.157109, 0.007380, 0.191033 ], [168, -6129.030000, 0.152103, 0.000007, 0.191292 ], [159, -6129.670000, 0.080412, 0.000006, 0.197855 ], [157, -6130.140000, 0.049980, 0.005887, 0.198179 ] ], "n": ["FDJVGXF02GYKZ6_rvcmp" ] }, {"p": [[161, -4645.640000, 0.941948, 0.008701, 0.075608 ], [169, -4649.380000, 0.022462, 0.011641, 0.086883 ], [165, -4649.560000, 0.018764, 0.000007, 0.099298 ], [156, -4649.670000, 0.016826, 0.000005, 0.075802 ] ], "n": ["FDJVGXF02I8WRF" ] }, {"p": [[161, -6926.100000, 1.000000, 0.008717, 0.014845 ] ], "n": ["FDJVGXF02FLYFT_rvcmp" ] }, {"p": [[161, -6926.100000, 1.000000, 0.008717, 0.014845 ] ], "n": ["FDJVGXF02HI1P0_rvcmp" ] }, {"p": [[161, -6926.100000, 1.000000, 0.008717, 0.014845 ] ], "n": ["FDJVGXF02JKJ3D_rvcmp" ] }, {"p": [[161, -3619.880000, 0.635596, 0.005588, 0.046791 ], [159, -3620.840000, 0.244866, 0.000006, 0.068988 ], [167, -3622.700000, 0.037884, 0.000008, 0.080104 ], [170, -3622.930000, 0.030056, 0.010035, 0.051534 ], [154, -3623.260000, 0.021678, 0.025721, 0.065383 ], [169, -3623.290000, 0.021021, 0.023387, 0.067014 ], [158, -3624.150000, 0.008899, 0.017418, 0.087760 ] ], "n": ["FDJVGXF02I3YOZ_rvcmp" ] }, {"p": [[161, -3766.490000, 0.656314, 0.005787, 0.044256 ], [159, -3767.530000, 0.230642, 0.000006, 0.065994 ], [167, -3769.440000, 0.034128, 0.000008, 0.076588 ], [170, -3769.560000, 0.030429, 0.010506, 0.047641 ], [154, -3769.940000, 0.020729, 0.025343, 0.061762 ], [169, -3769.980000, 0.019977, 0.023387, 0.063447 ], [158, -3770.920000, 0.007781, 0.017418, 0.083734 ] ], "n": ["FDJVGXF02JLTK9_rvcmp" ] }, {"p": [[161, -3766.490000, 0.656314, 0.005787, 0.044256 ], [159, -3767.530000, 0.230642, 0.000006, 0.065994 ], [167, -3769.440000, 0.034128, 0.000008, 0.076588 ], [170, -3769.560000, 0.030429, 0.010506, 0.047641 ], [154, -3769.940000, 0.020729, 0.025343, 0.061762 ], [169, -3769.980000, 0.019977, 0.023387, 0.063447 ], [158, -3770.920000, 0.007781, 0.017418, 0.083734 ] ], "n": ["FDJVGXF02I9UQ7_rvcmp" ] }, {"p": [[161, -3766.490000, 0.656314, 0.005787, 0.044256 ], [159, -3767.530000, 0.230642, 0.000006, 0.065994 ], [167, -3769.440000, 0.034128, 0.000008, 0.076588 ], [170, -3769.560000, 0.030429, 0.010506, 0.047641 ], [154, -3769.940000, 0.020729, 0.025343, 0.061762 ], [169, -3769.980000, 0.019977, 0.023387, 0.063447 ], [158, -3770.920000, 0.007781, 0.017418, 0.083734 ] ], "n": ["FDJVGXF02F036B_rvcmp" ] }, {"p": [[161, -5737.840000, 0.650471, 0.004647, 0.112127 ], [196, -5739.380000, 0.139053, 0.036335, 0.103791 ], [154, -5740.540000, 0.043797, 0.029354, 0.121802 ], [169, -5740.540000, 0.043571, 0.023387, 0.122325 ], [149, -5740.550000, 0.043370, 0.043092, 0.084161 ], [199, -5740.630000, 0.039870, 0.000006, 0.124046 ], [197, -5740.630000, 0.039867, 0.024513, 0.124038 ] ], "n": ["FDJVGXF02HTII5" ] }, {"p": [[164, -5150.580000, 0.420962, 0.016777, 0.028248 ], [165, -5151.500000, 0.167991, 0.000007, 0.032379 ], [161, -5151.500000, 0.167841, 0.032465, 0.032383 ], [169, -5151.570000, 0.156979, 0.007596, 0.026288 ], [155, -5153.160000, 0.032142, 0.007324, 0.036034 ], [168, -5153.210000, 0.030599, 0.003612, 0.039637 ], [166, -5153.470000, 0.023487, 0.001999, 0.040964 ] ], "n": ["FDJVGXF02FFCT2" ] }, {"p": [[165, -8005.550000, 0.207691, 0.004170, 0.007175 ], [156, -8005.770000, 0.166102, 0.041514, 0.009456 ], [169, -8005.860000, 0.152473, 0.002855, 0.009217 ], [155, -8005.870000, 0.150310, 0.008837, 0.012020 ], [157, -8006.100000, 0.119783, 0.000006, 0.012017 ], [168, -8006.180000, 0.110139, 0.003612, 0.012015 ], [158, -8006.350000, 0.093502, 0.007662, 0.010597 ] ], "n": ["FDJVGXF02JPOIP_rvcmp" ] }, {"p": [[167, -5767.250000, 0.269865, 0.026857, 0.055666 ], [168, -5767.920000, 0.136934, 0.000007, 0.062368 ], [166, -5767.920000, 0.136924, 0.001999, 0.062366 ], [160, -5767.990000, 0.128683, 0.006910, 0.061613 ], [165, -5768.010000, 0.125780, 0.007352, 0.062428 ], [157, -5768.100000, 0.114266, 0.005887, 0.064079 ], [155, -5768.370000, 0.087549, 0.007464, 0.062059 ] ], "n": ["FDJVGXF02IH15Z" ] }, {"p": [[168, -7448.880000, 0.479271, 0.002096, 0.000006 ], [169, -7449.600000, 0.233278, 0.000006, 0.000006 ], [157, -7449.600000, 0.233201, 0.005887, 0.000006 ], [166, -7451.270000, 0.043769, 0.001999, 0.000006 ], [156, -7452.700000, 0.010480, 0.043598, 0.000006 ] ], "n": ["FDJVGXF02I99VH_rvcmp" ] }, {"p": [[168, -7448.880000, 0.479271, 0.002096, 0.000006 ], [169, -7449.600000, 0.233278, 0.000006, 0.000006 ], [157, -7449.600000, 0.233201, 0.005887, 0.000006 ], [166, -7451.270000, 0.043769, 0.001999, 0.000006 ], [156, -7452.700000, 0.010480, 0.043598, 0.000006 ] ], "n": ["FDJVGXF02JVAVQ_rvcmp" ] }, {"p": [[168, -7448.880000, 0.479271, 0.002096, 0.000006 ], [169, -7449.600000, 0.233278, 0.000006, 0.000006 ], [157, -7449.600000, 0.233201, 0.005887, 0.000006 ], [166, -7451.270000, 0.043769, 0.001999, 0.000006 ], [156, -7452.700000, 0.010480, 0.043598, 0.000006 ] ], "n": ["FDJVGXF02F1QQL" ] }, {"p": [[169, -4691.150000, 0.280434, 0.023387, 0.013094 ], [154, -4691.150000, 0.280400, 0.030340, 0.013094 ], [170, -4691.150000, 0.280115, 0.000009, 0.013095 ], [157, -4693.020000, 0.043236, 0.000006, 0.019249 ], [156, -4693.020000, 0.043233, 0.043598, 0.019253 ], [155, -4693.020000, 0.043233, 0.012865, 0.019253 ], [168, -4693.400000, 0.029348, 0.003612, 0.019324 ] ], "n": ["FDJVGXF02IBQ2O" ] }, {"p": [[169, -4829.620000, 0.869378, 0.012846, 0.009776 ], [164, -4832.130000, 0.070968, 0.017400, 0.022686 ], [165, -4832.590000, 0.044455, 0.000007, 0.026688 ], [160, -4833.670000, 0.015199, 0.004809, 0.029031 ] ], "n": ["FDJVGXF02HVGWV" ] }, {"p": [[169, -8158.120000, 0.427070, 0.007854, 0.015535 ], [161, -8158.260000, 0.372116, 0.024220, 0.015895 ], [170, -8159.600000, 0.097440, 0.007353, 0.006866 ], [168, -8160.070000, 0.060917, 0.002572, 0.020565 ], [157, -8160.750000, 0.030880, 0.005887, 0.021449 ], [165, -8161.730000, 0.011577, 0.002038, 0.021971 ] ], "n": ["FDJVGXF02GQD9D_rvcmp" ] }, {"p": [[170, -8901.680000, 0.408155, 0.010058, 0.099148 ], [161, -8902.310000, 0.217361, 0.005360, 0.103179 ], [196, -8902.390000, 0.199481, 0.034406, 0.084643 ], [171, -8903.490000, 0.066756, 0.004831, 0.099888 ], [149, -8903.650000, 0.056657, 0.061201, 0.099840 ], [169, -8904.260000, 0.030781, 0.017424, 0.106264 ], [154, -8904.650000, 0.020809, 0.030342, 0.109432 ] ], "n": ["FDJVGXF02HKNTY_rvcmp" ] }, {"p": [[174, -8788.210000, 0.185197, 0.000006, 0.399529 ], [26, -8788.330000, 0.164750, 0.048859, 0.358105 ], [181, -8788.470000, 0.142972, 0.037176, 0.412286 ], [178, -8788.470000, 0.142964, 0.004073, 0.412285 ], [182, -8788.470000, 0.142925, 0.000007, 0.412285 ], [176, -8788.630000, 0.122106, 0.006160, 0.413440 ], [40, -8788.830000, 0.099085, 0.030383, 0.402802 ] ], "n": ["FDJVGXF02H2TBT" ] }, {"p": [[175, -4324.250000, 0.375812, 0.000005, 0.269026 ], [174, -4325.340000, 0.126879, 0.000005, 0.273036 ], [176, -4325.340000, 0.126492, 0.000006, 0.278228 ], [121, -4325.370000, 0.122809, 0.021311, 0.332987 ], [185, -4325.760000, 0.083236, 0.000001, 0.304791 ], [184, -4325.760000, 0.083235, 0.000001, 0.304783 ], [177, -4325.780000, 0.081537, 0.000007, 0.263412 ] ], "n": ["FDJVGXF02IRJEQ_rvcmp" ] }, {"p": [[177, -6292.140000, 0.676388, 0.000009, 0.810551 ], [175, -6293.900000, 0.116066, 0.000005, 0.804112 ], [188, -6294.580000, 0.059003, 0.026505, 0.881979 ], [218, -6294.760000, 0.049250, 0.000008, 0.806343 ], [148, -6295.080000, 0.035666, 0.077324, 0.533050 ], [171, -6295.180000, 0.032326, 0.034630, 0.912714 ], [40, -6295.210000, 0.031300, 0.086918, 0.919065 ] ], "n": ["FDJVGXF02GVNAG_rvcmp" ] }, {"p": [[183, -6697.560000, 0.496954, 0.009440, 0.108176 ], [187, -6698.390000, 0.215686, 0.003395, 0.119355 ], [186, -6699.170000, 0.098644, 0.007024, 0.121902 ], [173, -6699.660000, 0.060760, 0.019346, 0.119902 ], [182, -6699.710000, 0.057728, 0.007651, 0.120743 ], [188, -6699.840000, 0.050690, 0.018254, 0.113518 ], [172, -6700.790000, 0.019537, 0.008421, 0.130820 ] ], "n": ["FDJVGXF02H8YC8" ] }, {"p": [[185, -4809.320000, 0.236688, 0.000001, 0.216500 ], [184, -4809.320000, 0.236658, 0.000001, 0.216499 ], [186, -4809.320000, 0.236436, 0.000009, 0.216496 ], [172, -4810.370000, 0.082061, 0.000008, 0.203026 ], [188, -4810.460000, 0.075094, 0.000008, 0.210746 ], [187, -4810.460000, 0.075088, 0.011025, 0.210755 ], [175, -4810.720000, 0.057975, 0.000005, 0.236229 ] ], "n": ["FDJVGXF02GUQOV_rvcmp" ] }, {"p": [[186, -7918.770000, 0.315155, 0.000705, 0.213972 ], [184, -7918.780000, 0.310255, 0.000001, 0.215621 ], [185, -7918.780000, 0.310255, 0.000001, 0.215621 ], [190, -7921.020000, 0.033263, 0.016135, 0.217438 ], [179, -7922.130000, 0.010929, 0.006945, 0.212617 ], [183, -7922.170000, 0.010470, 0.017025, 0.223864 ], [188, -7922.250000, 0.009673, 0.031389, 0.212486 ] ], "n": ["FDJVGXF02GPTF2_rvcmp" ] }, {"p": [[188, -4387.080000, 0.458220, 0.027776, 0.182461 ], [148, -4387.650000, 0.259694, 0.115871, 0.151545 ], [26, -4388.250000, 0.142347, 0.024017, 0.189318 ], [190, -4388.600000, 0.100311, 0.000008, 0.208618 ], [149, -4390.330000, 0.017729, 0.020550, 0.213347 ], [173, -4390.820000, 0.010849, 0.022616, 0.207393 ], [183, -4390.820000, 0.010849, 0.000009, 0.207398 ] ], "n": ["FDJVGXF02FLSTT_rvcmp" ] }, {"p": [[188, -4387.080000, 0.458220, 0.027776, 0.182461 ], [148, -4387.650000, 0.259694, 0.115871, 0.151545 ], [26, -4388.250000, 0.142347, 0.024017, 0.189318 ], [190, -4388.600000, 0.100311, 0.000008, 0.208618 ], [149, -4390.330000, 0.017729, 0.020550, 0.213347 ], [173, -4390.820000, 0.010849, 0.022616, 0.207393 ], [183, -4390.820000, 0.010849, 0.000009, 0.207398 ] ], "n": ["FDJVGXF02GAZVW_rvcmp" ] }, {"p": [[188, -7372.460000, 0.259570, 0.026169, 0.076980 ], [183, -7372.580000, 0.229762, 0.013559, 0.081266 ], [189, -7372.650000, 0.213831, 0.080377, 0.069819 ], [186, -7373.220000, 0.120485, 0.007776, 0.087438 ], [187, -7373.310000, 0.110186, 0.000005, 0.089122 ], [172, -7374.100000, 0.050030, 0.008421, 0.091391 ], [190, -7375.230000, 0.016136, 0.000008, 0.079773 ] ], "n": ["FDJVGXF02IQ0SO" ] }, {"p": [[189, -7885.800000, 0.254554, 0.087707, 0.238223 ], [190, -7885.960000, 0.216944, 0.005966, 0.244893 ], [188, -7885.980000, 0.211932, 0.052299, 0.246601 ], [40, -7886.050000, 0.199244, 0.054173, 0.229432 ], [192, -7887.400000, 0.051690, 0.008067, 0.243862 ], [191, -7887.530000, 0.045371, 0.008980, 0.248132 ], [38, -7888.330000, 0.020264, 0.052139, 0.213129 ] ], "n": ["FDJVGXF02HJ9TM" ] }, {"p": [[189, -7919.010000, 0.816972, 0.040592, 0.100344 ], [27, -7921.080000, 0.103455, 0.037873, 0.134848 ], [190, -7921.860000, 0.047432, 0.022936, 0.128908 ], [171, -7922.250000, 0.032140, 0.034630, 0.134695 ] ], "n": ["FDJVGXF02FI7RZ" ] }, {"p": [[189, -5300.130000, 0.577815, 0.000006, 0.311887 ], [190, -5301.730000, 0.116752, 0.005694, 0.354750 ], [188, -5301.760000, 0.113746, 0.052299, 0.357801 ], [191, -5302.410000, 0.059059, 0.000008, 0.363581 ], [171, -5302.410000, 0.059042, 0.034630, 0.363598 ], [27, -5302.800000, 0.039950, 0.011701, 0.391885 ], [39, -5302.970000, 0.033636, 0.000006, 0.349238 ] ], "n": ["FDJVGXF02FM417" ] }, {"p": [[190, -7760.450000, 0.278600, 0.034335, 0.111630 ], [171, -7760.450000, 0.278566, 0.034630, 0.111632 ], [191, -7760.450000, 0.278504, 0.000008, 0.111635 ], [192, -7761.860000, 0.067703, 0.000005, 0.116052 ], [40, -7761.860000, 0.067693, 0.086918, 0.116049 ], [39, -7762.940000, 0.023045, 0.020498, 0.118787 ], [127, -7764.300000, 0.005889, 0.023560, 0.087174 ] ], "n": ["FDJVGXF02GBTVY" ] }, {"p": [[190, -5790.870000, 0.303251, 0.023145, 0.166701 ], [171, -5791.140000, 0.230902, 0.034630, 0.172600 ], [191, -5791.140000, 0.230894, 0.000008, 0.172603 ], [189, -5792.200000, 0.080307, 0.069194, 0.161475 ], [27, -5792.240000, 0.076629, 0.021372, 0.194082 ], [188, -5792.560000, 0.055908, 0.044027, 0.175566 ], [184, -5793.490000, 0.022108, 0.000001, 0.205985 ] ], "n": ["FDJVGXF02H6FKQ_rvcmp" ] }, {"p": [[190, -6659.770000, 0.280672, 0.021113, 0.140354 ], [171, -6660.050000, 0.211938, 0.034630, 0.147806 ], [191, -6660.050000, 0.211934, 0.000008, 0.147810 ], [188, -6660.380000, 0.152103, 0.039650, 0.137680 ], [40, -6661.330000, 0.059289, 0.069872, 0.144657 ], [189, -6661.390000, 0.055614, 0.096145, 0.140748 ], [192, -6662.060000, 0.028450, 0.003064, 0.157671 ] ], "n": ["FDJVGXF02IRTQS" ] }, {"p": [[190, -5560.500000, 0.512081, 0.018954, 0.058462 ], [171, -5560.940000, 0.331602, 0.020125, 0.068004 ], [189, -5563.030000, 0.040804, 0.085391, 0.053645 ], [149, -5563.090000, 0.038504, 0.055525, 0.072390 ], [40, -5563.320000, 0.030603, 0.060141, 0.076431 ], [188, -5563.550000, 0.024374, 0.047113, 0.063448 ], [153, -5563.650000, 0.022032, 0.014643, 0.080210 ] ], "n": ["FDJVGXF02HW5K5_rvcmp" ] }, {"p": [[190, -7472.430000, 0.659552, 0.015072, 0.086698 ], [188, -7474.040000, 0.132465, 0.048372, 0.087250 ], [189, -7474.080000, 0.126011, 0.096144, 0.088590 ], [171, -7475.210000, 0.041000, 0.034630, 0.097468 ], [191, -7475.210000, 0.040971, 0.000008, 0.097469 ] ], "n": ["FDJVGXF02JDX99" ] }, {"p": [[190, -7075.940000, 0.599287, 0.014925, 0.062418 ], [189, -7076.790000, 0.255070, 0.081152, 0.055512 ], [188, -7077.760000, 0.096608, 0.052299, 0.064090 ], [171, -7079.130000, 0.024523, 0.034630, 0.074326 ], [191, -7079.130000, 0.024512, 0.000008, 0.074330 ] ], "n": ["FDJVGXF02JJHC3" ] }, {"p": [[190, -8574.590000, 0.536775, 0.014399, 0.057818 ], [189, -8575.380000, 0.242974, 0.087494, 0.052558 ], [188, -8576.320000, 0.094365, 0.052299, 0.059149 ], [39, -8576.620000, 0.070201, 0.020363, 0.067589 ], [191, -8577.910000, 0.019336, 0.000008, 0.067985 ], [171, -8577.910000, 0.019330, 0.034630, 0.067983 ], [192, -8578.040000, 0.017018, 0.022464, 0.070803 ] ], "n": ["FDJVGXF02FUTY4" ] }, {"p": [[190, -6606.100000, 0.289869, 0.012497, 0.275877 ], [189, -6606.340000, 0.226932, 0.096145, 0.280584 ], [188, -6606.340000, 0.226903, 0.052299, 0.280585 ], [191, -6607.450000, 0.074618, 0.000008, 0.298160 ], [171, -6607.450000, 0.074603, 0.034630, 0.298163 ], [192, -6607.730000, 0.056498, 0.004060, 0.304881 ], [40, -6607.840000, 0.050576, 0.086918, 0.304892 ] ], "n": ["FDJVGXF02FNUCN" ] }, {"p": [[190, -3165.260000, 0.210961, 0.010440, 0.069307 ], [204, -3165.330000, 0.196564, 0.010427, 0.077556 ], [189, -3165.590000, 0.151919, 0.088661, 0.066972 ], [188, -3165.650000, 0.143727, 0.050103, 0.069187 ], [198, -3165.800000, 0.123581, 0.000006, 0.095099 ], [26, -3166.040000, 0.096520, 0.059987, 0.076397 ], [25, -3166.270000, 0.076728, 0.011501, 0.090580 ] ], "n": ["FDJVGXF02GP2GU_rvcmp" ] }, {"p": [[191, -5414.880000, 0.284176, 0.000377, 0.163598 ], [171, -5414.880000, 0.283686, 0.034630, 0.163828 ], [190, -5414.880000, 0.283642, 0.034335, 0.163823 ], [27, -5415.820000, 0.110858, 0.000009, 0.188526 ], [192, -5417.770000, 0.015732, 0.001579, 0.177679 ], [40, -5417.790000, 0.015487, 0.086918, 0.178991 ], [189, -5418.670000, 0.006421, 0.039150, 0.171791 ] ], "n": ["FDJVGXF02HMFXK" ] }, {"p": [[192, -8922.270000, 0.186198, 0.022464, 0.218093 ], [39, -8922.270000, 0.186055, 0.025399, 0.218096 ], [190, -8922.400000, 0.163430, 0.034335, 0.215159 ], [171, -8922.400000, 0.163404, 0.034630, 0.215158 ], [191, -8922.400000, 0.163401, 0.000008, 0.215168 ], [27, -8923.120000, 0.079983, 0.027262, 0.225892 ], [40, -8923.450000, 0.057529, 0.083213, 0.220729 ] ], "n": ["FDJVGXF02F1D4W_rvcmp" ] }, {"p": [[193, -7391.120000, 0.186054, 0.000937, 0.198033 ], [192, -7391.120000, 0.184992, 0.022464, 0.199135 ], [29, -7391.290000, 0.155648, 0.031159, 0.176379 ], [40, -7391.320000, 0.152330, 0.073341, 0.194923 ], [33, -7391.610000, 0.113274, 0.012211, 0.185323 ], [191, -7391.670000, 0.106925, 0.012299, 0.203018 ], [28, -7391.730000, 0.100776, 0.048759, 0.187064 ] ], "n": ["FDJVGXF02ITXCI_rvcmp" ] }, {"p": [[195, -6093.600000, 0.421795, 0.007174, 0.058061 ], [196, -6093.760000, 0.357958, 0.008910, 0.055320 ], [35, -6095.470000, 0.065146, 0.013080, 0.067836 ], [194, -6095.470000, 0.065082, 0.006696, 0.067837 ], [22, -6095.590000, 0.057386, 0.006702, 0.047955 ], [20, -6096.610000, 0.020725, 0.000007, 0.056003 ], [21, -6097.170000, 0.011908, 0.017641, 0.054212 ] ], "n": ["FDJVGXF02HZ3TW" ] }, {"p": [[196, -7235.090000, 0.446537, 0.071550, 0.070452 ], [197, -7235.570000, 0.275443, 0.015203, 0.075380 ], [199, -7236.560000, 0.102527, 0.006987, 0.078966 ], [200, -7236.680000, 0.090317, 0.000006, 0.078111 ], [198, -7236.740000, 0.085176, 0.013117, 0.082302 ] ], "n": ["FDJVGXF02F484A" ] }, {"p": [[196, -7763.080000, 0.342670, 0.064950, 0.091551 ], [199, -7763.620000, 0.200481, 0.013298, 0.100991 ], [200, -7763.620000, 0.200378, 0.000006, 0.100988 ], [158, -7764.640000, 0.072420, 0.014651, 0.097618 ], [164, -7764.750000, 0.064598, 0.013180, 0.098270 ], [159, -7764.790000, 0.062405, 0.000006, 0.100204 ], [154, -7764.880000, 0.057047, 0.015820, 0.099669 ] ], "n": ["FDJVGXF02JGWV1_rvcmp" ] }, {"p": [[196, -7763.080000, 0.342670, 0.064950, 0.091551 ], [199, -7763.620000, 0.200481, 0.013298, 0.100991 ], [200, -7763.620000, 0.200378, 0.000006, 0.100988 ], [158, -7764.640000, 0.072420, 0.014651, 0.097618 ], [164, -7764.750000, 0.064598, 0.013180, 0.098270 ], [159, -7764.790000, 0.062405, 0.000006, 0.100204 ], [154, -7764.880000, 0.057047, 0.015820, 0.099669 ] ], "n": ["FDJVGXF02HB03U_rvcmp" ] }, {"p": [[196, -8755.910000, 0.738720, 0.063985, 0.091237 ], [197, -8757.970000, 0.094179, 0.019097, 0.107466 ], [198, -8758.010000, 0.090475, 0.009866, 0.107950 ], [199, -8758.180000, 0.076626, 0.004034, 0.108207 ] ], "n": ["FDJVGXF02GWQF3" ] }, {"p": [[196, -7793.980000, 0.923067, 0.063042, 0.081199 ], [198, -7797.160000, 0.038656, 0.003789, 0.101114 ], [199, -7797.800000, 0.020262, 0.013298, 0.100778 ], [197, -7797.920000, 0.018015, 0.017018, 0.100569 ] ], "n": ["FDJVGXF02HLEEZ" ] }, {"p": [[196, -7688.790000, 0.871839, 0.058636, 0.046894 ], [198, -7691.660000, 0.049193, 0.000006, 0.070853 ], [204, -7691.840000, 0.041198, 0.007931, 0.061286 ], [200, -7692.790000, 0.016000, 0.007900, 0.065285 ], [203, -7693.100000, 0.011728, 0.009988, 0.067540 ], [199, -7693.250000, 0.010043, 0.013298, 0.067244 ] ], "n": ["FDJVGXF02HSVL8" ] }, {"p": [[196, -5744.200000, 0.826062, 0.056879, 0.114279 ], [199, -5746.860000, 0.057557, 0.013298, 0.138360 ], [200, -5746.860000, 0.057552, 0.000006, 0.138359 ], [198, -5747.340000, 0.035691, 0.003066, 0.145291 ], [197, -5747.770000, 0.023138, 0.013820, 0.144563 ] ], "n": ["FDJVGXF02H2YWV_rvcmp" ] }, {"p": [[196, -7700.920000, 1.000000, 0.057368, 0.081568 ] ], "n": ["FDJVGXF02I84EL" ] }, {"p": [[196, -7753.030000, 1.000000, 0.057354, 0.081151 ] ], "n": ["FDJVGXF02I8X2Z" ] }, {"p": [[196, -8028.220000, 0.968546, 0.055350, 0.049784 ], [198, -8032.020000, 0.021685, 0.000006, 0.076852 ], [204, -8032.810000, 0.009769, 0.004972, 0.068562 ] ], "n": ["FDJVGXF02I4V5F_rvcmp" ] }, {"p": [[196, -4233.620000, 0.441152, 0.055313, 0.033392 ], [204, -4234.290000, 0.225609, 0.004143, 0.041557 ], [200, -4234.880000, 0.125283, 0.012685, 0.048187 ], [203, -4234.880000, 0.125095, 0.009988, 0.048189 ], [199, -4235.750000, 0.052386, 0.013298, 0.051075 ], [197, -4236.980000, 0.015238, 0.024513, 0.062757 ], [198, -4236.990000, 0.015237, 0.013117, 0.062753 ] ], "n": ["FDJVGXF02JMUNU_rvcmp" ] }, {"p": [[196, -5914.230000, 0.276726, 0.053576, 0.070774 ], [204, -5914.500000, 0.209663, 0.009682, 0.078431 ], [20, -5914.540000, 0.202477, 0.000005, 0.067201 ], [205, -5915.220000, 0.102008, 0.019428, 0.062940 ], [21, -5915.600000, 0.069789, 0.000009, 0.068721 ], [19, -5915.610000, 0.069681, 0.012620, 0.068724 ], [22, -5915.610000, 0.069655, 0.004274, 0.065908 ] ], "n": ["FDJVGXF02H75N6_rvcmp" ] }, {"p": [[196, -7961.580000, 0.282986, 0.053940, 0.044954 ], [204, -7961.850000, 0.216619, 0.006170, 0.054211 ], [22, -7961.940000, 0.198175, 0.007165, 0.045084 ], [200, -7962.710000, 0.092066, 0.012685, 0.059667 ], [203, -7962.710000, 0.091879, 0.009988, 0.059681 ], [20, -7962.810000, 0.083131, 0.000005, 0.051403 ], [21, -7963.670000, 0.035144, 0.017641, 0.050053 ] ], "n": ["FDJVGXF02GTJG6_rvcmp" ] }, {"p": [[196, -5462.740000, 0.447923, 0.052941, 0.073386 ], [198, -5462.990000, 0.348375, 0.000006, 0.092817 ], [206, -5465.080000, 0.043133, 0.000001, 0.100301 ], [207, -5465.080000, 0.043133, 0.000001, 0.100301 ], [208, -5465.080000, 0.043129, 0.000006, 0.100297 ], [204, -5465.230000, 0.037246, 0.019138, 0.093986 ], [205, -5465.240000, 0.037059, 0.000009, 0.094134 ] ], "n": ["FDJVGXF02IT7U0" ] }, {"p": [[196, -7543.470000, 0.682801, 0.052770, 0.036897 ], [202, -7544.520000, 0.237966, 0.040906, 0.038409 ], [204, -7546.120000, 0.048265, 0.008112, 0.053051 ], [20, -7547.040000, 0.019216, 0.000007, 0.063159 ], [203, -7547.530000, 0.011752, 0.009992, 0.059308 ] ], "n": ["FDJVGXF02IW454" ] }, {"p": [[196, -5478.070000, 0.270880, 0.050535, 0.048190 ], [25, -5478.240000, 0.227170, 0.013270, 0.060948 ], [205, -5478.280000, 0.219259, 0.000007, 0.061625 ], [204, -5478.280000, 0.219202, 0.020144, 0.061626 ], [202, -5480.170000, 0.033097, 0.037692, 0.051426 ], [226, -5480.520000, 0.023311, 0.023104, 0.051055 ], [24, -5481.710000, 0.007082, 0.000009, 0.077917 ] ], "n": ["FDJVGXF02I9B7H_rvcmp" ] }, {"p": [[196, -7934.540000, 0.973773, 0.050315, 0.081416 ], [198, -7938.700000, 0.015198, 0.003151, 0.106421 ], [200, -7939.020000, 0.011029, 0.002747, 0.101774 ] ], "n": ["FDJVGXF02F3MP3_rvcmp" ] }, {"p": [[196, -7889.360000, 0.565839, 0.050336, 0.060226 ], [204, -7889.960000, 0.309812, 0.007864, 0.067671 ], [200, -7891.630000, 0.058692, 0.012685, 0.078665 ], [203, -7891.630000, 0.058657, 0.009988, 0.078674 ], [202, -7893.750000, 0.007001, 0.054444, 0.077269 ] ], "n": ["FDJVGXF02HOUCZ_rvcmp" ] }, {"p": [[196, -8313.020000, 0.931547, 0.046747, 0.062265 ], [204, -8315.830000, 0.056240, 0.007578, 0.073567 ], [20, -8317.350000, 0.012214, 0.000007, 0.074844 ] ], "n": ["FDJVGXF02F6EI8_rvcmp" ] }, {"p": [[196, -7737.460000, 1.000000, 0.041850, 0.068590 ] ], "n": ["FDJVGXF02G3LTF_rvcmp" ] }, {"p": [[196, -7915.300000, 1.000000, 0.041785, 0.033621 ] ], "n": ["FDJVGXF02GNBQJ" ] }, {"p": [[196, -6455.250000, 0.773997, 0.040929, 0.059852 ], [170, -6457.280000, 0.101472, 0.013957, 0.093153 ], [171, -6457.600000, 0.074256, 0.007423, 0.091332 ], [149, -6457.990000, 0.050274, 0.063741, 0.095190 ] ], "n": ["FDJVGXF02FD1KI" ] }, {"p": [[196, -6706.160000, 0.447936, 0.039504, 0.078514 ], [204, -6707.080000, 0.178594, 0.004670, 0.088343 ], [200, -6707.470000, 0.121342, 0.012685, 0.094204 ], [203, -6707.470000, 0.121139, 0.009988, 0.094209 ], [195, -6708.080000, 0.065750, 0.009446, 0.092317 ], [20, -6708.610000, 0.038690, 0.000007, 0.081718 ], [199, -6708.990000, 0.026549, 0.010371, 0.096663 ] ], "n": ["FDJVGXF02FDO26" ] }, {"p": [[196, -8809.850000, 0.654365, 0.034227, 0.062942 ], [20, -8810.640000, 0.297178, 0.002143, 0.068102 ], [21, -8813.190000, 0.023227, 0.008318, 0.069372 ], [22, -8813.780000, 0.012870, 0.000303, 0.071342 ], [19, -8813.820000, 0.012361, 0.012620, 0.072652 ] ], "n": ["FDJVGXF02HV8UI" ] }, {"p": [[196, -8829.800000, 0.537653, 0.031647, 0.064045 ], [20, -8830.100000, 0.398528, 0.002132, 0.068792 ], [21, -8832.670000, 0.030529, 0.008227, 0.070122 ], [22, -8833.270000, 0.016789, 0.000009, 0.072215 ], [19, -8833.290000, 0.016502, 0.012620, 0.073426 ] ], "n": ["FDJVGXF02H1V68_rvcmp" ] }, {"p": [[196, -8866.540000, 0.546881, 0.031580, 0.057658 ], [20, -8866.900000, 0.379951, 0.002125, 0.063395 ], [21, -8869.490000, 0.028443, 0.008249, 0.064409 ], [22, -8870.130000, 0.015098, 0.000008, 0.066482 ], [18, -8870.130000, 0.015088, 0.051699, 0.066486 ], [19, -8870.160000, 0.014538, 0.012620, 0.067712 ] ], "n": ["FDJVGXF02FK2T6" ] }, {"p": [[196, -8887.370000, 0.543554, 0.031610, 0.057491 ], [20, -8887.720000, 0.382836, 0.002118, 0.063242 ], [21, -8890.310000, 0.028636, 0.008249, 0.064241 ], [22, -8890.950000, 0.015185, 0.000008, 0.066311 ], [18, -8890.950000, 0.015175, 0.051699, 0.066314 ], [19, -8890.980000, 0.014614, 0.012620, 0.067540 ] ], "n": ["FDJVGXF02IHEZI" ] }, {"p": [[196, -8887.370000, 0.543554, 0.031610, 0.057491 ], [20, -8887.720000, 0.382836, 0.002118, 0.063242 ], [21, -8890.310000, 0.028636, 0.008249, 0.064241 ], [22, -8890.950000, 0.015185, 0.000008, 0.066311 ], [18, -8890.950000, 0.015175, 0.051699, 0.066314 ], [19, -8890.980000, 0.014614, 0.012620, 0.067540 ] ], "n": ["FDJVGXF02IOV8S" ] }, {"p": [[196, -6933.800000, 0.326027, 0.030665, 0.327534 ], [202, -6934.590000, 0.148581, 0.030180, 0.339475 ], [26, -6934.810000, 0.119046, 0.097406, 0.362252 ], [18, -6934.900000, 0.108701, 0.000006, 0.349953 ], [204, -6934.990000, 0.099246, 0.000010, 0.365485 ], [203, -6934.990000, 0.099203, 0.009988, 0.365482 ], [200, -6934.990000, 0.099197, 0.012685, 0.365488 ] ], "n": ["FDJVGXF02F2Q2N_rvcmp" ] }, {"p": [[196, -8514.960000, 1.000000, 0.029846, 0.020268 ] ], "n": ["FDJVGXF02JFT42" ] }, {"p": [[196, -6640.670000, 1.000000, 0.029480, 0.027799 ] ], "n": ["FDJVGXF02JPXGS" ] }, {"p": [[196, -7321.920000, 1.000000, 0.029396, 0.026666 ] ], "n": ["FDJVGXF02GA8P7" ] }, {"p": [[196, -7321.920000, 1.000000, 0.029396, 0.026666 ] ], "n": ["FDJVGXF02JQ95E_rvcmp" ] }, {"p": [[196, -7234.640000, 1.000000, 0.029362, 0.024484 ] ], "n": ["FDJVGXF02GFHVP_rvcmp" ] }, {"p": [[196, -8772.880000, 0.832318, 0.027572, 0.083408 ], [18, -8775.500000, 0.060836, 0.042487, 0.092237 ], [22, -8775.830000, 0.043650, 0.004342, 0.097125 ], [21, -8776.060000, 0.034459, 0.017640, 0.100748 ], [226, -8776.250000, 0.028737, 0.016901, 0.087665 ] ], "n": ["FDJVGXF02FSSZZ" ] }, {"p": [[196, -8001.590000, 0.976398, 0.027037, 0.023547 ], [205, -8005.310000, 0.023602, 0.018679, 0.040011 ] ], "n": ["FDJVGXF02JIC7T_rvcmp" ] }, {"p": [[196, -8482.890000, 1.000000, 0.026770, 0.023942 ] ], "n": ["FDJVGXF02GCGBC_rvcmp" ] }, {"p": [[196, -8338.640000, 0.979567, 0.027022, 0.022092 ], [205, -8342.510000, 0.020433, 0.018693, 0.038041 ] ], "n": ["FDJVGXF02GZ0E1_rvcmp" ] }, {"p": [[196, -5840.320000, 0.986358, 0.023177, 0.023516 ], [34, -5844.600000, 0.013642, 0.009832, 0.049461 ] ], "n": ["FDJVGXF02GFSBX_rvcmp" ] }, {"p": [[196, -9026.770000, 0.747175, 0.020137, 0.077925 ], [26, -9028.430000, 0.142979, 0.089633, 0.086683 ], [195, -9028.690000, 0.109846, 0.009446, 0.093528 ] ], "n": ["FDJVGXF02HK7IC" ] }, {"p": [[196, -6097.010000, 0.336301, 0.018745, 0.059336 ], [20, -6097.430000, 0.221249, 0.000005, 0.055913 ], [21, -6098.220000, 0.100175, 0.000009, 0.056766 ], [19, -6098.220000, 0.100057, 0.012620, 0.056768 ], [22, -6098.350000, 0.088027, 0.000009, 0.056061 ], [18, -6098.350000, 0.087988, 0.051699, 0.056063 ], [204, -6098.640000, 0.066203, 0.005515, 0.067399 ] ], "n": ["FDJVGXF02FUK1Z" ] }, {"p": [[196, -5548.500000, 0.833120, 0.019455, 0.029487 ], [38, -5550.970000, 0.070599, 0.035877, 0.054971 ], [35, -5551.470000, 0.042910, 0.004163, 0.056927 ], [194, -5551.900000, 0.027676, 0.000007, 0.057887 ], [195, -5551.980000, 0.025694, 0.004399, 0.052496 ] ], "n": ["FDJVGXF02FIP0W_rvcmp" ] }, {"p": [[196, -9070.680000, 0.548104, 0.016653, 0.087700 ], [26, -9071.190000, 0.328624, 0.082531, 0.087977 ], [195, -9072.170000, 0.123273, 0.009446, 0.101920 ] ], "n": ["FDJVGXF02H7LXG" ] }, {"p": [[196, -7903.390000, 0.555956, 0.015895, 0.091525 ], [26, -7904.160000, 0.257659, 0.087612, 0.095510 ], [195, -7904.490000, 0.186385, 0.009446, 0.104625 ] ], "n": ["FDJVGXF02I0OMG" ] }, {"p": [[196, -8980.700000, 0.506767, 0.015007, 0.104492 ], [26, -8981.340000, 0.265599, 0.088456, 0.108596 ], [195, -8981.650000, 0.195136, 0.009446, 0.117722 ], [28, -8983.440000, 0.032498, 0.011801, 0.118231 ] ], "n": ["FDJVGXF02IHO2F_rvcmp" ] }, {"p": [[196, -9128.930000, 0.516168, 0.015334, 0.101966 ], [26, -9129.890000, 0.197918, 0.093599, 0.111507 ], [195, -9129.950000, 0.187413, 0.009446, 0.115151 ], [28, -9130.750000, 0.083647, 0.020652, 0.109386 ], [34, -9132.910000, 0.009686, 0.007880, 0.121196 ], [35, -9133.540000, 0.005168, 0.002530, 0.124675 ] ], "n": ["FDJVGXF02GCAOE_rvcmp" ] }, {"p": [[196, -9227.910000, 0.548940, 0.015125, 0.095074 ], [26, -9228.640000, 0.264597, 0.088510, 0.099037 ], [195, -9228.990000, 0.186463, 0.009446, 0.108184 ] ], "n": ["FDJVGXF02H6FMM" ] }, {"p": [[196, -4419.970000, 0.333585, 0.005023, 0.074790 ], [195, -4419.980000, 0.329163, 0.009446, 0.076098 ], [18, -4421.130000, 0.103969, 0.039319, 0.057524 ], [20, -4421.490000, 0.072970, 0.000007, 0.070980 ], [204, -4421.610000, 0.064355, 0.003995, 0.085953 ], [200, -4421.910000, 0.048001, 0.012685, 0.092980 ], [203, -4421.910000, 0.047958, 0.009988, 0.092988 ] ], "n": ["FDJVGXF02J17MT" ] }, {"p": [[198, -5953.370000, 0.452245, 0.000006, 0.083857 ], [196, -5953.780000, 0.300285, 0.058633, 0.066647 ], [206, -5955.560000, 0.050746, 0.000001, 0.090518 ], [207, -5955.560000, 0.050746, 0.000001, 0.090518 ], [208, -5955.560000, 0.050743, 0.000006, 0.090514 ], [204, -5955.620000, 0.047780, 0.018999, 0.084302 ], [205, -5955.620000, 0.047455, 0.000009, 0.084460 ] ], "n": ["FDJVGXF02FN31U" ] }, {"p": [[198, -6288.700000, 0.435534, 0.000006, 0.078680 ], [196, -6288.960000, 0.335288, 0.058457, 0.061628 ], [206, -6290.940000, 0.045939, 0.000002, 0.084880 ], [207, -6290.940000, 0.045939, 0.000002, 0.084880 ], [208, -6290.940000, 0.045939, 0.000007, 0.084876 ], [204, -6290.950000, 0.045860, 0.018934, 0.078758 ], [205, -6290.950000, 0.045501, 0.000009, 0.078919 ] ], "n": ["FDJVGXF02IIFNQ_rvcmp" ] }, {"p": [[198, -1938.890000, 0.178250, 0.000006, 0.016166 ], [199, -1938.920000, 0.173173, 0.000006, 0.016181 ], [197, -1938.920000, 0.173155, 0.024513, 0.016186 ], [200, -1939.240000, 0.125946, 0.000006, 0.016350 ], [196, -1939.240000, 0.125850, 0.078185, 0.016350 ], [203, -1939.360000, 0.111833, 0.009988, 0.016430 ], [204, -1939.360000, 0.111794, 0.000010, 0.016431 ] ], "n": ["FDJVGXF02JKST7_rvcmp" ] }, {"p": [[199, -5332.050000, 0.361622, 0.008065, 0.109432 ], [196, -5332.570000, 0.214944, 0.077148, 0.110842 ], [200, -5332.570000, 0.213818, 0.000006, 0.112001 ], [197, -5333.260000, 0.107216, 0.022211, 0.119596 ], [198, -5333.310000, 0.102400, 0.013117, 0.121389 ] ], "n": ["FDJVGXF02FIS0U_rvcmp" ] }, {"p": [[200, -4677.410000, 0.287771, 0.011791, 0.007877 ], [203, -4677.420000, 0.283970, 0.009988, 0.008034 ], [204, -4677.420000, 0.283427, 0.000010, 0.008035 ], [202, -4678.970000, 0.060370, 0.061340, 0.008218 ], [201, -4678.970000, 0.060214, 0.019126, 0.008330 ], [199, -4680.570000, 0.012131, 0.013295, 0.009278 ], [196, -4680.570000, 0.012116, 0.078185, 0.009276 ] ], "n": ["FDJVGXF02GPP0F_rvcmp" ] }, {"p": [[202, -7125.700000, 0.255360, 0.038114, 0.040788 ], [204, -7125.720000, 0.250176, 0.015582, 0.051883 ], [205, -7125.850000, 0.217900, 0.000007, 0.052379 ], [25, -7125.850000, 0.217881, 0.014512, 0.052372 ], [226, -7127.910000, 0.028006, 0.015741, 0.040727 ], [203, -7128.170000, 0.021449, 0.009988, 0.059102 ], [22, -7129.020000, 0.009229, 0.023373, 0.058955 ] ], "n": ["FDJVGXF02IHFWX_rvcmp" ] }, {"p": [[203, -6626.680000, 0.302983, 0.008433, 0.034217 ], [204, -6626.720000, 0.290800, 0.001210, 0.035241 ], [200, -6626.750000, 0.283924, 0.012685, 0.035578 ], [199, -6628.190000, 0.067150, 0.013298, 0.038683 ], [201, -6628.510000, 0.048736, 0.018498, 0.034367 ], [197, -6630.540000, 0.006407, 0.019935, 0.042943 ] ], "n": ["FDJVGXF02HOBUR_rvcmp" ] }, {"p": [[203, -4827.150000, 0.252092, 0.002990, 0.074732 ], [202, -4827.280000, 0.221113, 0.061774, 0.076556 ], [201, -4827.280000, 0.221014, 0.019126, 0.076552 ], [204, -4827.880000, 0.121397, 0.003448, 0.071905 ], [200, -4828.180000, 0.089931, 0.012685, 0.078084 ], [197, -4828.520000, 0.064001, 0.005729, 0.086018 ], [196, -4829.260000, 0.030451, 0.073973, 0.080590 ] ], "n": ["FDJVGXF02IU8SX_rvcmp" ] }, {"p": [[204, -7717.260000, 0.792143, 0.014821, 0.105812 ], [24, -7719.880000, 0.057342, 0.000009, 0.116300 ], [25, -7719.890000, 0.056747, 0.001075, 0.115759 ], [23, -7719.900000, 0.056473, 0.003604, 0.116317 ], [205, -7720.310000, 0.037295, 0.007364, 0.108995 ] ], "n": ["FDJVGXF02FZVGF" ] }, {"p": [[204, -5924.510000, 0.194664, 0.013919, 1.175980 ], [23, -5924.740000, 0.154861, 0.000007, 1.228700 ], [24, -5924.740000, 0.154861, 0.000009, 1.228710 ], [25, -5924.740000, 0.154854, 0.000007, 1.228720 ], [205, -5924.780000, 0.148880, 0.000009, 1.240530 ], [227, -5925.130000, 0.104681, 0.012980, 1.266240 ], [10, -5925.310000, 0.087200, 0.133410, 1.180550 ] ], "n": ["FDJVGXF02GN1PE" ] }, {"p": [[204, -6480.150000, 0.455929, 0.012455, 0.123937 ], [22, -6480.650000, 0.274846, 0.017628, 0.116152 ], [205, -6481.290000, 0.145889, 0.019360, 0.116972 ], [208, -6482.580000, 0.039816, 0.009315, 0.122646 ], [206, -6482.820000, 0.031319, 0.000001, 0.126450 ], [207, -6482.820000, 0.031319, 0.000001, 0.126450 ], [209, -6483.230000, 0.020883, 0.000007, 0.125807 ] ], "n": ["FDJVGXF02JO714" ] }, {"p": [[204, -8054.200000, 0.362395, 0.010818, 0.046329 ], [20, -8054.410000, 0.293197, 0.000007, 0.048508 ], [22, -8055.140000, 0.140576, 0.004014, 0.044239 ], [21, -8055.400000, 0.108725, 0.017640, 0.047397 ], [19, -8055.530000, 0.095106, 0.012620, 0.049217 ] ], "n": ["FDJVGXF02GMDR6" ] }, {"p": [[204, -4785.640000, 0.282188, 0.009766, 0.069086 ], [20, -4786.020000, 0.193280, 0.000005, 0.057720 ], [196, -4786.100000, 0.178210, 0.034221, 0.066979 ], [21, -4786.790000, 0.089878, 0.000009, 0.058833 ], [19, -4786.790000, 0.089808, 0.012620, 0.058834 ], [22, -4786.810000, 0.088223, 0.003383, 0.055889 ], [200, -4786.920000, 0.078413, 0.012685, 0.080814 ] ], "n": ["FDJVGXF02GARPL_rvcmp" ] }, {"p": [[204, -7923.100000, 0.724229, 0.010238, 0.062679 ], [22, -7924.300000, 0.218076, 0.010963, 0.053646 ], [200, -7926.570000, 0.022482, 0.012685, 0.078517 ], [203, -7926.570000, 0.022451, 0.009988, 0.078520 ], [196, -7927.140000, 0.012762, 0.056194, 0.069040 ] ], "n": ["FDJVGXF02I9J86_rvcmp" ] }, {"p": [[204, -7948.440000, 0.469520, 0.009059, 0.046214 ], [205, -7949.530000, 0.156930, 0.023857, 0.045391 ], [22, -7950.130000, 0.086692, 0.023075, 0.048157 ], [200, -7950.250000, 0.076527, 0.011978, 0.051779 ], [203, -7950.280000, 0.074498, 0.009988, 0.052743 ], [208, -7950.370000, 0.067929, 0.024246, 0.051059 ], [209, -7950.370000, 0.067904, 0.000007, 0.051062 ] ], "n": ["FDJVGXF02HX53E_rvcmp" ] }, {"p": [[204, -7755.470000, 0.559303, 0.007860, 0.072168 ], [203, -7756.570000, 0.185713, 0.006227, 0.081643 ], [200, -7757.180000, 0.100835, 0.012685, 0.083133 ], [201, -7757.220000, 0.097132, 0.019126, 0.086013 ], [197, -7758.420000, 0.029379, 0.012025, 0.088107 ], [196, -7759.040000, 0.015807, 0.067864, 0.081295 ], [199, -7759.330000, 0.011831, 0.013298, 0.087235 ] ], "n": ["FDJVGXF02FMHGW" ] }, {"p": [[204, -6152.060000, 0.548636, 0.007802, 0.057802 ], [20, -6153.460000, 0.135859, 0.000007, 0.058940 ], [200, -6153.820000, 0.094270, 0.012685, 0.070591 ], [203, -6153.820000, 0.094210, 0.009988, 0.070593 ], [22, -6154.340000, 0.056290, 0.003016, 0.054921 ], [21, -6154.470000, 0.049635, 0.017640, 0.058086 ], [196, -6155.320000, 0.021100, 0.063329, 0.065114 ] ], "n": ["FDJVGXF02GDD4M" ] }, {"p": [[204, -8113.120000, 0.610007, 0.006987, 0.065609 ], [200, -8114.410000, 0.168827, 0.012685, 0.073850 ], [203, -8114.410000, 0.168661, 0.009988, 0.073844 ], [196, -8116.390000, 0.023341, 0.068707, 0.072268 ], [199, -8116.620000, 0.018375, 0.013298, 0.076766 ], [197, -8117.160000, 0.010789, 0.015763, 0.080893 ] ], "n": ["FDJVGXF02FPQ04_rvcmp" ] }, {"p": [[204, -7325.160000, 0.345211, 0.006469, 0.049170 ], [196, -7325.230000, 0.322111, 0.055618, 0.039187 ], [200, -7326.120000, 0.131748, 0.012685, 0.055437 ], [203, -7326.120000, 0.131449, 0.009988, 0.055439 ], [199, -7327.330000, 0.039401, 0.008706, 0.055726 ], [197, -7328.290000, 0.015057, 0.024290, 0.064587 ], [198, -7328.290000, 0.015023, 0.013117, 0.064838 ] ], "n": ["FDJVGXF02HAZSY_rvcmp" ] }, {"p": [[204, -7211.000000, 0.285408, 0.003200, 0.040357 ], [200, -7211.350000, 0.200787, 0.009823, 0.043702 ], [203, -7211.390000, 0.192652, 0.009988, 0.043565 ], [199, -7211.780000, 0.129920, 0.013298, 0.046131 ], [196, -7211.780000, 0.129811, 0.078188, 0.046130 ], [197, -7213.070000, 0.035854, 0.020188, 0.047458 ], [198, -7213.410000, 0.025568, 0.013117, 0.050200 ] ], "n": ["FDJVGXF02F8G87_rvcmp" ] }, {"p": [[205, -4873.990000, 0.222671, 0.034333, 0.093321 ], [208, -4874.100000, 0.199548, 0.024224, 0.100445 ], [209, -4874.100000, 0.199418, 0.000007, 0.100444 ], [206, -4874.820000, 0.097091, 0.000001, 0.111845 ], [207, -4874.820000, 0.097091, 0.000001, 0.111845 ], [22, -4874.840000, 0.095455, 0.024327, 0.100654 ], [210, -4874.910000, 0.088726, 0.000009, 0.102512 ] ], "n": ["FDJVGXF02G4OMM_rvcmp" ] }, {"p": [[205, -9019.740000, 1.000000, 0.022062, 0.030197 ] ], "n": ["FDJVGXF02IEMAK_rvcmp" ] }, {"p": [[205, -7611.670000, 0.240448, 0.011473, 0.070255 ], [25, -7611.790000, 0.213191, 0.010913, 0.073465 ], [204, -7611.890000, 0.193378, 0.016943, 0.072479 ], [208, -7612.240000, 0.135154, 0.006863, 0.077518 ], [206, -7612.590000, 0.095191, 0.000001, 0.082019 ], [207, -7612.590000, 0.095191, 0.000001, 0.082019 ], [209, -7613.840000, 0.027446, 0.000007, 0.079499 ] ], "n": ["FDJVGXF02JO6SN" ] }, {"p": [[206, -7523.930000, 0.159184, 0.000001, 1.866550 ], [207, -7523.930000, 0.159184, 0.000001, 1.866550 ], [208, -7523.930000, 0.159177, 0.000006, 1.866570 ], [209, -7524.120000, 0.130826, 0.000007, 1.893520 ], [205, -7524.120000, 0.130791, 0.038635, 1.893530 ], [210, -7524.120000, 0.130426, 0.000009, 1.893630 ], [22, -7524.120000, 0.130411, 0.028187, 1.893620 ] ], "n": ["FDJVGXF02IR6DU" ] }, {"p": [[206, -8262.110000, 0.156793, 0.000001, 1.795210 ], [207, -8262.110000, 0.156793, 0.000001, 1.795210 ], [208, -8262.110000, 0.156787, 0.000006, 1.795220 ], [209, -8262.280000, 0.132538, 0.000007, 1.806900 ], [205, -8262.280000, 0.132503, 0.038635, 1.806900 ], [210, -8262.280000, 0.132294, 0.000009, 1.806950 ], [22, -8262.280000, 0.132290, 0.028187, 1.806930 ] ], "n": ["FDJVGXF02H1AEE" ] }, {"p": [[208, -5856.200000, 0.325623, 0.017110, 0.079855 ], [210, -5856.790000, 0.181297, 0.009534, 0.083672 ], [205, -5857.210000, 0.119649, 0.031109, 0.081696 ], [209, -5857.290000, 0.110137, 0.003487, 0.087213 ], [225, -5857.410000, 0.097355, 0.036449, 0.088203 ], [226, -5857.410000, 0.097349, 0.000010, 0.088205 ], [22, -5857.760000, 0.068590, 0.025406, 0.086561 ] ], "n": ["FDJVGXF02FFCBJ" ] }, {"p": [[208, -5610.260000, 0.498922, 0.015839, 0.072657 ], [210, -5611.530000, 0.140356, 0.009928, 0.080290 ], [225, -5612.100000, 0.078799, 0.036449, 0.084755 ], [226, -5612.100000, 0.078779, 0.000008, 0.084755 ], [209, -5612.110000, 0.078069, 0.001895, 0.083133 ], [205, -5612.180000, 0.072861, 0.038635, 0.084588 ], [22, -5612.520000, 0.052214, 0.024471, 0.082434 ] ], "n": ["FDJVGXF02GQL06_rvcmp" ] }, {"p": [[208, -7108.930000, 0.575498, 0.015567, 0.063578 ], [209, -7110.110000, 0.175445, 0.003234, 0.071525 ], [210, -7110.750000, 0.093185, 0.000009, 0.075235 ], [22, -7110.750000, 0.093174, 0.028187, 0.075235 ], [205, -7111.140000, 0.062698, 0.038635, 0.072773 ] ], "n": ["FDJVGXF02FTU2D_rvcmp" ] }, {"p": [[208, -9487.900000, 0.692612, 0.011837, 0.085706 ], [22, -9489.000000, 0.230680, 0.013640, 0.090014 ], [205, -9491.330000, 0.022330, 0.036691, 0.095861 ], [209, -9491.370000, 0.021529, 0.000007, 0.097329 ], [18, -9491.640000, 0.016375, 0.047192, 0.099700 ], [206, -9492.330000, 0.008238, 0.000001, 0.104727 ], [207, -9492.330000, 0.008238, 0.000001, 0.104727 ] ], "n": ["FDJVGXF02GV4DK" ] }, {"p": [[208, -4850.630000, 0.304617, 0.011915, 0.064783 ], [210, -4850.840000, 0.246509, 0.010724, 0.070589 ], [226, -4851.370000, 0.146005, 0.000008, 0.074832 ], [225, -4851.370000, 0.145975, 0.036449, 0.074842 ], [22, -4851.900000, 0.085309, 0.023082, 0.071600 ], [209, -4852.160000, 0.065869, 0.006837, 0.077174 ], [206, -4854.610000, 0.005717, 0.000001, 0.094129 ] ], "n": ["FDJVGXF02JN35P_rvcmp" ] }, {"p": [[208, -7719.100000, 0.290524, 0.009037, 0.078841 ], [206, -7719.590000, 0.177871, 0.000001, 0.083816 ], [207, -7719.590000, 0.177871, 0.000001, 0.083816 ], [205, -7719.780000, 0.146548, 0.025989, 0.076197 ], [209, -7720.210000, 0.095342, 0.001674, 0.080442 ], [25, -7720.430000, 0.076662, 0.006514, 0.081984 ], [24, -7721.210000, 0.035182, 0.000009, 0.089140 ] ], "n": ["FDJVGXF02FE6FM" ] }, {"p": [[209, -5043.670000, 0.170866, 0.006837, 0.360517 ], [22, -5043.670000, 0.170837, 0.028185, 0.360512 ], [210, -5043.670000, 0.170778, 0.000009, 0.360522 ], [208, -5043.880000, 0.139537, 0.013382, 0.362265 ], [205, -5044.010000, 0.121508, 0.038635, 0.373292 ], [206, -5044.080000, 0.113237, 0.000001, 0.380884 ], [207, -5044.080000, 0.113237, 0.000001, 0.380884 ] ], "n": ["FDJVGXF02IPZCS" ] }, {"p": [[210, -6277.290000, 0.327278, 0.011153, 0.073292 ], [226, -6277.730000, 0.210815, 0.002805, 0.073959 ], [225, -6277.760000, 0.204394, 0.036449, 0.076326 ], [22, -6278.410000, 0.106937, 0.023199, 0.074501 ], [209, -6278.660000, 0.083563, 0.006837, 0.078594 ], [208, -6278.960000, 0.061842, 0.014785, 0.071767 ], [205, -6281.440000, 0.005171, 0.035818, 0.082190 ] ], "n": ["FDJVGXF02IVDO9_rvcmp" ] }, {"p": [[210, -3292.700000, 0.244359, 0.008897, 0.030335 ], [22, -3292.920000, 0.195699, 0.020016, 0.036181 ], [209, -3293.290000, 0.135252, 0.002826, 0.039519 ], [205, -3293.330000, 0.130743, 0.038635, 0.040468 ], [208, -3293.330000, 0.130712, 0.024246, 0.040477 ], [226, -3293.660000, 0.094026, 0.000008, 0.031633 ], [232, -3293.960000, 0.069210, 0.013988, 0.035063 ] ], "n": ["FDJVGXF02IIAX1_rvcmp" ] }, {"p": [[210, -9097.690000, 0.301069, 0.003823, 0.091486 ], [22, -9098.100000, 0.199102, 0.028187, 0.095962 ], [209, -9098.100000, 0.199067, 0.006837, 0.095963 ], [208, -9098.460000, 0.139362, 0.020699, 0.095384 ], [205, -9098.640000, 0.116469, 0.038635, 0.098168 ], [226, -9099.720000, 0.039396, 0.016348, 0.080820 ], [18, -9101.680000, 0.005535, 0.048078, 0.105049 ] ], "n": ["FDJVGXF02FOWVM_rvcmp" ] }, {"p": [[212, -6570.690000, 0.191652, 0.000008, 1.599450 ], [213, -6570.930000, 0.149994, 0.023979, 1.666710 ], [224, -6570.930000, 0.149991, 0.010740, 1.666680 ], [225, -6570.930000, 0.149987, 0.000009, 1.666700 ], [206, -6571.160000, 0.119460, 0.000001, 1.729820 ], [207, -6571.160000, 0.119460, 0.000001, 1.729820 ], [208, -6571.160000, 0.119455, 0.000006, 1.729820 ] ], "n": ["FDJVGXF02HJZAR" ] }, {"p": [[214, -8668.230000, 0.854738, 0.000008, 0.471808 ], [215, -8670.470000, 0.091543, 0.000010, 0.509642 ], [216, -8671.000000, 0.053719, 0.000009, 0.530734 ] ], "n": ["FDJVGXF02G0DM7_rvcmp" ] }, {"p": [[214, -7455.570000, 0.648919, 0.000008, 0.342334 ], [215, -7456.420000, 0.277386, 0.000010, 0.340786 ], [10, -7457.930000, 0.061178, 0.071087, 0.264395 ], [236, -7459.520000, 0.012517, 0.038667, 0.351053 ] ], "n": ["FDJVGXF02FIB3Y_rvcmp" ] }, {"p": [[219, -8098.800000, 0.145757, 0.000007, 1.952930 ], [220, -8098.800000, 0.145635, 0.000010, 1.953240 ], [223, -8098.810000, 0.145002, 0.016737, 1.951800 ], [216, -8098.810000, 0.144981, 0.038817, 1.951830 ], [217, -8098.810000, 0.144771, 0.000007, 1.958990 ], [221, -8098.820000, 0.143216, 0.000007, 1.962530 ], [22, -8098.910000, 0.130639, 0.010864, 1.891680 ] ], "n": ["FDJVGXF02I7JNP_rvcmp" ] }, {"p": [[225, -6552.070000, 0.198040, 0.036449, 0.287349 ], [210, -6552.070000, 0.198006, 0.018069, 0.287351 ], [226, -6552.070000, 0.197959, 0.000008, 0.287356 ], [21, -6552.600000, 0.117262, 0.011758, 0.301906 ], [206, -6552.790000, 0.096251, 0.000001, 0.267286 ], [207, -6552.790000, 0.096251, 0.000001, 0.267286 ], [208, -6552.790000, 0.096231, 0.000006, 0.267282 ] ], "n": ["FDJVGXF02F1KYJ" ] }, {"p": [[225, -7861.290000, 0.224647, 0.034311, 0.282015 ], [226, -7861.300000, 0.221459, 0.000008, 0.283964 ], [210, -7861.300000, 0.221319, 0.018069, 0.283974 ], [22, -7861.660000, 0.155623, 0.008005, 0.287305 ], [18, -7862.240000, 0.086873, 0.051699, 0.300100 ], [21, -7862.240000, 0.086803, 0.017640, 0.300105 ], [196, -7865.520000, 0.003276, 0.005421, 0.328594 ] ], "n": ["FDJVGXF02IBSRC_rvcmp" ] }, {"p": [[226, -9167.270000, 0.605224, 0.024043, 0.040757 ], [227, -9168.390000, 0.197792, 0.000425, 0.046122 ], [17, -9168.390000, 0.196983, 0.049256, 0.046178 ] ], "n": ["FDJVGXF02HVN6E_rvcmp" ] }, {"p": [[226, -9167.330000, 0.607474, 0.024016, 0.040499 ], [227, -9168.460000, 0.196702, 0.000440, 0.045857 ], [17, -9168.470000, 0.195825, 0.049256, 0.045914 ] ], "n": ["FDJVGXF02HWD2G_rvcmp" ] }, {"p": [[226, -8989.320000, 0.166932, 0.022732, 0.134312 ], [196, -8989.330000, 0.164801, 0.007097, 0.145407 ], [26, -8989.450000, 0.147027, 0.091982, 0.146807 ], [195, -8989.490000, 0.141112, 0.007722, 0.152005 ], [34, -8989.560000, 0.131663, 0.011565, 0.147611 ], [27, -8989.610000, 0.125216, 0.068162, 0.147837 ], [35, -8989.620000, 0.123248, 0.000006, 0.149644 ] ], "n": ["FDJVGXF02G2JAA" ] }, {"p": [[226, -7991.320000, 0.224476, 0.022024, 0.092722 ], [204, -7991.400000, 0.207545, 0.014906, 0.102860 ], [205, -7991.480000, 0.190721, 0.005627, 0.101996 ], [200, -7991.740000, 0.147911, 0.007770, 0.103180 ], [17, -7992.130000, 0.099648, 0.049256, 0.097744 ], [209, -7992.400000, 0.076516, 0.006837, 0.111128 ], [208, -7992.760000, 0.053182, 0.011125, 0.107566 ] ], "n": ["FDJVGXF02HRO57" ] }, {"p": [[226, -8998.330000, 0.587487, 0.022200, 0.048804 ], [227, -8999.510000, 0.180822, 0.000006, 0.052928 ], [204, -9000.440000, 0.071335, 0.012816, 0.061827 ], [205, -9000.460000, 0.070359, 0.012954, 0.060897 ], [209, -9001.220000, 0.032706, 0.004603, 0.065954 ], [210, -9001.300000, 0.030234, 0.003806, 0.064630 ], [22, -9001.410000, 0.027057, 0.025979, 0.066752 ] ], "n": ["FDJVGXF02F500V" ] }, {"p": [[226, -8763.710000, 0.651508, 0.022037, 0.035096 ], [227, -8765.080000, 0.165590, 0.000006, 0.039550 ], [17, -8765.080000, 0.165570, 0.049256, 0.039548 ], [210, -8767.990000, 0.009057, 0.005929, 0.052418 ], [22, -8768.080000, 0.008274, 0.021469, 0.055649 ] ], "n": ["FDJVGXF02HW32Z" ] }, {"p": [[226, -8763.710000, 0.651508, 0.022037, 0.035096 ], [227, -8765.080000, 0.165590, 0.000006, 0.039550 ], [17, -8765.080000, 0.165570, 0.049256, 0.039548 ], [210, -8767.990000, 0.009057, 0.005929, 0.052418 ], [22, -8768.080000, 0.008274, 0.021469, 0.055649 ] ], "n": ["FDJVGXF02HX8G5" ] }, {"p": [[226, -8763.710000, 0.651508, 0.022037, 0.035096 ], [227, -8765.080000, 0.165590, 0.000006, 0.039550 ], [17, -8765.080000, 0.165570, 0.049256, 0.039548 ], [210, -8767.990000, 0.009057, 0.005929, 0.052418 ], [22, -8768.080000, 0.008274, 0.021469, 0.055649 ] ], "n": ["FDJVGXF02IRIEX" ] }, {"p": [[226, -7810.580000, 0.769777, 0.020203, 0.093161 ], [17, -7812.470000, 0.116842, 0.045590, 0.096622 ], [227, -7812.500000, 0.113381, 0.000006, 0.099478 ] ], "n": ["FDJVGXF02GV2KR" ] }, {"p": [[226, -8475.520000, 0.757107, 0.020412, 0.087656 ], [17, -8477.330000, 0.123358, 0.045747, 0.089171 ], [227, -8477.360000, 0.119535, 0.000006, 0.091854 ] ], "n": ["FDJVGXF02IYV3U" ] }, {"p": [[226, -9057.100000, 0.704792, 0.019928, 0.084408 ], [17, -9059.200000, 0.086289, 0.048440, 0.089723 ], [227, -9059.200000, 0.086206, 0.001090, 0.090478 ], [2, -9059.540000, 0.061364, 0.036220, 0.094287 ], [228, -9059.540000, 0.061350, 0.000005, 0.094297 ] ], "n": ["FDJVGXF02IP0G5_rvcmp" ] }, {"p": [[226, -5211.560000, 0.584600, 0.020133, 0.033079 ], [202, -5212.310000, 0.276753, 0.033392, 0.041999 ], [204, -5214.290000, 0.038172, 0.009238, 0.058965 ], [25, -5214.650000, 0.026550, 0.014456, 0.059839 ], [205, -5214.650000, 0.026546, 0.000009, 0.059883 ], [203, -5214.650000, 0.026510, 0.008423, 0.060995 ], [210, -5214.890000, 0.020868, 0.006852, 0.054771 ] ], "n": ["FDJVGXF02GDGF1" ] }, {"p": [[226, -7908.720000, 0.615762, 0.017709, 0.042904 ], [210, -7910.630000, 0.091526, 0.004593, 0.059623 ], [22, -7910.770000, 0.079425, 0.025132, 0.062548 ], [209, -7910.860000, 0.072227, 0.006835, 0.063443 ], [205, -7911.210000, 0.050890, 0.014623, 0.059060 ], [227, -7911.220000, 0.050507, 0.000006, 0.050826 ], [204, -7911.460000, 0.039663, 0.014578, 0.061440 ] ], "n": ["FDJVGXF02IDDNS_rvcmp" ] }, {"p": [[226, -3723.790000, 0.213616, 0.012113, 0.114438 ], [210, -3723.920000, 0.187484, 0.018071, 0.121045 ], [225, -3723.920000, 0.187460, 0.036449, 0.121035 ], [22, -3724.510000, 0.103516, 0.028187, 0.124398 ], [209, -3724.520000, 0.103365, 0.006837, 0.124393 ], [17, -3724.520000, 0.103046, 0.045841, 0.108959 ], [227, -3724.530000, 0.101513, 0.000006, 0.112454 ] ], "n": ["FDJVGXF02FUQ8G" ] }, {"p": [[226, -5050.810000, 0.654156, 0.007162, 0.018239 ], [225, -5052.140000, 0.173021, 0.036449, 0.021992 ], [210, -5052.140000, 0.172823, 0.018069, 0.021995 ] ], "n": ["FDJVGXF02I3PQ2" ] }, {"p": [[229, -6936.830000, 0.170619, 0.047227, 1.679370 ], [231, -6936.830000, 0.170613, 0.000009, 1.679400 ], [230, -6936.830000, 0.170604, 0.047159, 1.679370 ], [240, -6937.130000, 0.126561, 0.009182, 1.762930 ], [239, -6937.180000, 0.120791, 0.000006, 1.797120 ], [232, -6937.180000, 0.120443, 0.005249, 1.790590 ], [228, -6937.180000, 0.120370, 0.021550, 1.788520 ] ], "n": ["FDJVGXF02GAGIC_rvcmp" ] }, {"p": [[229, -6730.440000, 0.174786, 0.047227, 1.466720 ], [231, -6730.440000, 0.174781, 0.000009, 1.466730 ], [230, -6730.440000, 0.174775, 0.047159, 1.466710 ], [239, -6730.810000, 0.120880, 0.000006, 1.561310 ], [238, -6730.810000, 0.120879, 0.027841, 1.561310 ], [232, -6730.840000, 0.117477, 0.018214, 1.580760 ], [228, -6730.850000, 0.116422, 0.021550, 1.578230 ] ], "n": ["FDJVGXF02IKPBB" ] }, {"p": [[232, -2413.120000, 0.309357, 0.009403, 0.055791 ], [228, -2413.880000, 0.145940, 0.021550, 0.076800 ], [231, -2413.880000, 0.145901, 0.017416, 0.076810 ], [239, -2414.120000, 0.114472, 0.011594, 0.052317 ], [240, -2414.140000, 0.111549, 0.000006, 0.053161 ], [17, -2414.370000, 0.088998, 0.028655, 0.066958 ], [1, -2414.430000, 0.083782, 0.000006, 0.085656 ] ], "n": ["FDJVGXF02H7I8C" ] }, {"p": [[232, -6164.290000, 0.243973, 0.000936, 0.081309 ], [228, -6164.290000, 0.243513, 0.021550, 0.081426 ], [227, -6164.960000, 0.125649, 0.012980, 0.081827 ], [236, -6165.170000, 0.101603, 0.058945, 0.086204 ], [237, -6165.220000, 0.096385, 0.000006, 0.088025 ], [239, -6165.220000, 0.096181, 0.008215, 0.085220 ], [240, -6165.260000, 0.092696, 0.004864, 0.081701 ] ], "n": ["FDJVGXF02JNDRR_rvcmp" ] }, {"p": [[235, -6815.770000, 0.150270, 0.045059, 1.713130 ], [236, -6815.770000, 0.150265, 0.061431, 1.713100 ], [237, -6815.770000, 0.150253, 0.000006, 1.713150 ], [229, -6815.820000, 0.142815, 0.047227, 1.767040 ], [231, -6815.820000, 0.142803, 0.000009, 1.767050 ], [230, -6815.820000, 0.142795, 0.047159, 1.767020 ], [233, -6815.990000, 0.120799, 0.062297, 1.850000 ] ], "n": ["FDJVGXF02FZF33_rvcmp" ] }, {"p": [[235, -9241.570000, 0.170651, 0.000006, 1.999990 ], [233, -9241.570000, 0.170646, 0.062297, 1.999990 ], [234, -9241.570000, 0.170637, 0.079656, 1.999990 ], [237, -9241.820000, 0.133791, 0.000006, 1.999990 ], [236, -9241.820000, 0.133784, 0.061431, 1.999990 ], [229, -9241.830000, 0.132680, 0.007274, 1.999990 ], [228, -9242.240000, 0.087812, 0.000005, 1.999990 ] ], "n": ["FDJVGXF02FRDNE" ] }, {"p": [[240, -7806.970000, 0.553233, 0.028569, 0.101861 ], [248, -7807.590000, 0.296729, 0.028534, 0.105895 ], [226, -7809.270000, 0.055525, 0.027424, 0.138972 ], [227, -7809.430000, 0.047257, 0.000006, 0.140544 ], [17, -7809.430000, 0.047256, 0.049256, 0.140541 ] ], "n": ["FDJVGXF02FYRR3_rvcmp" ] }, {"p": [[248, -3010.210000, 0.512993, 0.051200, 0.037859 ], [250, -3011.110000, 0.208924, 0.021035, 0.056520 ], [249, -3011.110000, 0.208923, 0.012515, 0.056520 ], [17, -3013.180000, 0.026366, 0.020241, 0.045227 ], [225, -3013.630000, 0.016906, 0.024317, 0.053746 ], [226, -3013.820000, 0.013984, 0.020923, 0.062222 ], [228, -3013.980000, 0.011904, 0.021550, 0.070677 ] ], "n": ["FDJVGXF02IPHPT" ] }, {"p": [[248, -3010.210000, 0.512993, 0.051200, 0.037859 ], [250, -3011.110000, 0.208924, 0.021035, 0.056520 ], [249, -3011.110000, 0.208923, 0.012515, 0.056520 ], [17, -3013.180000, 0.026366, 0.020241, 0.045227 ], [225, -3013.630000, 0.016906, 0.024317, 0.053746 ], [226, -3013.820000, 0.013984, 0.020923, 0.062222 ], [228, -3013.980000, 0.011904, 0.021550, 0.070677 ] ], "n": ["FDJVGXF02IPHPQ" ] }, {"p": [[248, -8779.640000, 0.535936, 0.029631, 0.123606 ], [240, -8780.340000, 0.267712, 0.028019, 0.125973 ], [226, -8781.560000, 0.078597, 0.006819, 0.149631 ], [225, -8782.050000, 0.048244, 0.036449, 0.155032 ], [210, -8782.050000, 0.048226, 0.018069, 0.155038 ], [23, -8783.220000, 0.015067, 0.000007, 0.157500 ], [247, -8784.100000, 0.006219, 0.013494, 0.150256 ] ], "n": ["FDJVGXF02GW5EL" ] } ], "metadata": {"invocation": "guppy to_json" }, "version": 1, "fields": ["edge_num", "likelihood", "like_weight_ratio", "distal_length", "pendant_length" ] }pplacer-1.1.alpha19/tests/data/moran/dmsp.jplace000066400000000000000000004630541303154601500215630ustar00rootroot00000000000000{"tree": "((((((Cyanophora_paradoxa_:0.0665203[0],Mesostigma_viride_:0.0962753[1]):0.0362291[2],((chloroplast_Cyanidium_sp._Monte_Rotaro.AY391365_:0.123946[3],((chloroplast_Galdieria_sulphuraria.AY541295_:0.076265[4],((chloroplast_Galdieria_sulphuraria.AY119731_:2.68035e-06[5],chloroplast_Cyanidium_caldarium.X52758_:0.0195896[6]):0.0312019[7],chloroplast_Galdieria_sulphuraria.AY541294_:0.0188214[8]):0.0324389[9]):0.133418[10],((chloroplast_Cyanidioschyzon_merolae.AY119730_:2.68035e-06[11],chloroplast_Cyanidioschyzon_merolae_strain_DBV201.AY119729_:0.00117862[12]):0.0762594[13],chloroplast_Cyanidium_caldarium.AY541290_:0.203636[14]):0.0380657[15]):0.0194682[16]):0.0492622[17],(((chloroplast_Vaucheria_litorea.AF227740_:0.0517049[18],(plastid_Tribonema_aequale.AY528860_:0.0126259[19],chloroplast_Bumilleriopsis_filiformis.X79223_:0.00666588[20]):0.017649[21]):0.0281935[22],(((chloroplast_Skeletonema_costatum.AY119761_:0.00361095[23],Thalassiosira_pseudonana_:0.00113368[24]):0.0145191[25],(((Bigelowiella_natans_:0.097412[26],((Chlamydomonas_reinhardtii_:0.0704485[27],(chloroplast_Picochlorum_sp._RCC289.EU851960_:0.0487654[28],(Chlorella_vulgaris_:0.0467075[29],(chloroplast_Chlorella_pyrenoidosa.EU043047_:0.00161427[30],chloroplast_Auxenochlorella_protothecoides.EU043045_:0.00193294[31]):0.0152331[32]):0.0200406[33]):0.0147874[34]):0.0130863[35],((chloroplast_Chlorella_vulgaris.EU043044_:0.00120893[36],chloroplast_Chlorella_pyrenoidosa.EU043049_:0.00232797[37]):0.0768327[38],(plastid_Tetraselmis_marina.AY857618_:0.0254053[39],(chloroplast_Pseudochlorella_sp._CCAP_211_1A.EU043048_:0.0869235[40],(((((Synechococcus_sp._PCC_7002___gi170076636refNC_010475_:0.0621893[41],(((Nostock_punctiforme_gi186680550refNC_010628_:0.112883[42],((Nostoc_sp._PCC_7120_gi17227497refNC_003272_:0.00889436[43],Anabaena_variabilis_A_gi75906225refNC_007413_:0.0221131[44]):0.038336[45],(Nodularia_spumige_gi119512239refNZ_AAVW01000065_:0.0504455[46],Fremyella_diplosiphon.FDIPSBA_:0.051697[47]):0.0178891[48]):0.0237368[49]):0.0326133[50],(Lyngbya_sp_PCC_8106___gi119483230refNZ_AAVU01000001_:0.231009[51],(Microcystis_aerouginosa_gi166362741refNC_010296_:0.0929627[52],((Cyanothece_sp._ATCC_51142.CAU39610_:0.0123916[53],Cyanothece_sp._CCY_0110___gi126657681refNZ_AAXW01000012_:0.0313088[54]):0.0369935[55],(Cyanothece_sp._PCC_7425_gi218437013refNC_011729_:0.0746015[56],Cyanothece_sp._PCC_8801_gi218244892refNC_011726_:0.0616473[57]):0.0148311[58]):0.0396174[59]):0.0228094[60]):0.0166279[61]):0.0233005[62],(Synechocystis_sp_PCC_6803___gi16329170refNC_000911_:0.0535075[63],((((((Cyanothece_sp._CC_gi126660325refNZ_AAXW01000053_:0.347497[64],Synechococcus_sp._PCC_7335_gi225144522refNW_002475532_:0.317895[65]):0.108045[66],Mastigocladus_laminosus.AF170924_:0.264356[67]):0.0676548[68],((Synechococcus_sp._JA-3-3Ab__gi86604733refNC_007775_:0.0973541[69],Synechococcus_sp._JA-2-3Ba____gi86607503refNC_007776_:0.564415[70]):0.0790386[71],Gloeobacter_violaceus_gi37519569refNC_005125.1_:0.263289[72]):0.11791[73]):0.0379309[74],(Thermosynechococcus_gi22297544refNC_004113_:0.11758[75],(Cyanothece_sp._PCC_7425_gi220905643refNC_011884_:0.138332[76],Acaryochloris_marina_MBIC11017.AB303650_:0.216398[77]):0.0159655[78]):0.0287204[79]):0.0341087[80],((Prochlorothrix_hollandica.X14308_:2.68035e-06[81],Prochlorothrix_hollandica.X14523_:0.00128006[82]):0.081034[83],((Synechococcus_elongatus_PCC_7942___gi81298811refNC_007604_:0.0105928[84],Synechococcus_elongatus_PCC_6301___gi56750010refNC_006576_:0.00276979[85]):0.107743[86],((Synechococcus_sp._WH_5701__gi87301761refNZ_AANO01000004_:0.0111919[87],Synechococcus_sp._WH_5701__gi87303211refNZ_AANO01000010_:0.0726788[88]):0.0147436[89],(((((Synechococcus_sp._RCC307_gi148241099refNC_009482_:0.0408099[90],((Synechococcus_sp._WH_8102_gi33864539refNC_005070_:0.0201067[91],(Synechococcus_sp._CC9902_gi78183584refNC_007513_:0.00536202[92],Synechococcus_sp._BL107_gi211594587refNZ_DS022298_:0.00246287[93]):0.0392091[94]):0.00867041[95],Synechococcus_sp._CC9605_gi78211558refNC_007516_:0.0275067[96]):0.0214861[97]):0.0346913[98],(Synechococcus_sp.__RS9916__gi116074999refNZ_AAUA01000003_:0.0477208[99],Synechococcus_sp._gi87123618refNZ_AANP01000002_:0.0406377[100]):0.0188201[101]):0.0110855[102],((Synechococcus_sp._WH_7803___gi148238336refNC_009481_:0.00753009[103],(Synechococcus_sp.__WH_7805__gi88807077refNZ_AAOK01000001_:0.00265618[104],Synechococcus_sp._WH_7805__gi88807768refNZ_AAOK01000002_:0.0026187[105]):0.00799342[106]):0.0173394[107],(Synechococcus_sp._RS9917___gi87125174refNZ_AANP01000006_:2.68035e-06[108],Synechococcus_sp._RS9917___gi87124875refNZ_AANP01000005_:0.0026301[109]):0.00794167[110]):0.0038034[111]):0.0158306[112],Synechococcus_sp._RS9917__gi87124182refNZ_AANP01000003_:0.192923[113]):0.0118268[114],Cyanobium_sp._PCC_70_gi223490194refNW_002243451_:0.0330768[115]):0.0231555[116]):0.0518051[117]):0.0453212[118]):0.0351102[119]):0.0447589[120],Microcoleus_chthonoplastes_PCC_7420___gi224400128refNW_002435220_:0.0843742[121]):0.0306188[122]):0.0369097[123]):0.0349985[124]):0.0577156[125],Trichodesmium_erythr_gi113473942refNC_008312_:0.106684[126]):0.0409208[127],(((Prochlorococcus_marinus_subsp._pastoris_str._CCMP1986_gi33860560refNC_005072_:0.00365008[128],Prochlorococcus_marinus_str._MIT_9515___gi123965234refNC_008817_:0.00483373[129]):0.0106366[130],(Prochlorococcus_marinus_str._AS9601_gi123967536refNC_008816_:2.68035e-06[131],(Prochlorococcus_marinus_str._MIT_9301__gi126695337refNC_009091_:0.0108685[132],((Procholococcus_marinus_str._MIT_9202_gi225077649refNW_002467725_:0.00240146[133],Procholococcus_marinus_str._MIT_9215___gi157412338refNC_009840_:2.68035e-06[134]):0.00591536[135],Prochlorococcus_marinus_str._MIT_9312_gi78778385refNC_007577_:0.00379511[136]):0.0049759[137]):0.00132484[138]):0.0105617[139]):0.0465879[140],((Procholococcus_marinus_str._NATL2A___gi162958048refNC_007335.2_:0.00365548[141],Prochlorococcus_marinus_str._NATL1A___gi124024712refNC_008819_:2.68035e-06[142]):0.0615085[143],(Prochlorococcus_marinus_subsp._marinus_str._CCMP1375_gi33239452refNC_005042_:0.100663[144],Procholococcus_marinus_str._MIT_9211___gi159902540refNC_009976_:0.0611398[145]):0.060931[146]):0.0653211[147]):0.148126[148]):0.0637467[149],((chloroplast_Pavlova_gyrans.AJ575575_:0.0169655[150],(chloroplast_Pavlova_lutheri.AY119755_:0.0146662[151],chloroplast_Pavlova_gyrans.AY119754_:0.0299817[152]):0.0270032[153]):0.0303472[154],((chloroplast_Chrysochromulina_polylepis.AJ575572_:0.0128709[155],chloroplast_Imantonia_rotunda.EU851963_:0.0436031[156]):0.00589301[157],(((chloroplast_Isochrysis_galbana.AJ575574_:0.0174268[158],chloroplast_Emiliania_huxleyi.AJ575573_:0.0115577[159]):0.00738805[160],(chloroplast_Phaeocystis_antarctica.AY119756_:0.0324724[161],(chloroplast_Prymnesium_parvum.AY119758_:0.0107131[162],chloroplast_Prymnesium_parvum.AJ575576_:0.00676058[163]):0.020704[164]):0.00735947[165]):0.00200676[166],chloroplast_Pleurochrysis_carterae.AY119757_:0.0339814[167]):0.00361886[168]):0.0233927[169]):0.0187331[170]):0.0346389[171],((chloroplast_Mantoniella_squamata.EU851964_:0.00842936[172],((plastid_uncultured_Prasinophyceae.AY176630_:0.0226216[173],(((chloroplast_Ostreococcus_sp._RCC344.EU851961_:0.00605274[174],Ostreococcus_tauri_:0.010265[175]):0.00616569[176],chloroplast_Ostreococcus_sp._RCC789.EU851970_:0.01746[177]):0.00408084[178],(uncultured_Prasinophyceae.AY509537_:0.0209825[179],chloroplast_Bathycoccus_prasinos.EU851955_:0.00805147[180]):0.0371846[181]):0.00765875[182]):0.0179484[183],(chloroplast_Micromonas_pusilla.EU851965_:2.68035e-06[184],plastid_uncultured_Prasinophyceae.AY176639_:2.68035e-06[185]):0.0089575[186]):0.0110303[187]):0.0523059[188],chloroplast_Pycnococcus_provasolii.EU851957_:0.0961508[189]):0.0343432[190]):0.015656[191]):0.0224695[192]):0.0167387[193]):0.00670223[194]):0.00945502[195]):0.0781944[196],(Fragilariopsis_psbA_:0.0245188[197],Pmultiseries_psbA_:0.0131238[198]):0.0133041[199]):0.0126908[200],(Phaeodactylum_tricornutum_:0.0191354[201],plastid_Ballia_callitricha.DQ787635_:0.061781[202]):0.00999794[203]):0.0201532[204]):0.0386439[205],(chloroplast_Heterosigma_akashiwo.AY119759_:2.68035e-06[206],chloroplast_Heterosigma_carterae.HCU18090_:2.68035e-06[207]):0.0242521[208]):0.00684342[209]):0.018078[210],((chloroplast_Pachydictyon_coriaceum.AY422614_:0.0241936[211],chloroplast_Dictyota_dichotoma_var._linearis.AY422632_:0.00853816[212]):0.0239851[213],((chloroplast_Fucus_vesiculosus.DQ307679_:0.0343612[214],chloroplast_Ectocarpus_siliculosus.X56695_:0.0397557[215]):0.038827[216],((plastid_Padina_japonica.AY430360_:0.0143668[217],(plastid_Padina_arborescens.AY430357_:0.0162365[218],plastid_Padina_crassa.AY430358_:0.00695945[219]):0.00495696[220]):0.00344828[221],chloroplast_Padina_crassa.AY422643_:0.00886928[222]):0.0167452[223]):0.0107453[224]):0.0364574[225]):0.032314[226]):0.0129864[227]):0.0215549[228],(chloroplast_Flintiella_sanguinaria.AY119740_:0.047233[229],chloroplast_Porphyridium_aerugineum.AY119741_:0.0471646[230]):0.0174241[231]):0.0188085[232],(((chloroplast_Erythrotrichia_carnea.AY119739_:0.0623046[233],chloroplast_Rhodochaete_parvula.AY119743_:0.0796661[234]):0.0450641[235],chloroplast_Rhodosorus_marinus.AY119744_:0.0614381[236]):0.0130888[237],chloroplast_Bangiopsis_subsimplex.AY119736_:0.0278478[238]):0.0130213[239]):0.0469411[240],(chloroplast_Palmaria_palmata.PPU28165_:0.0983928[241],(plastid_Antithamnionella_sp._A31.DQ787640_:0.0189374[242],(plastid_Carpoblepharis_flaccida.DQ787643_:0.104554[243],chloroplast_Antithamnion_sp.X55364_:0.0274272[244]):0.00842288[245]):0.0306715[246]):0.0178171[247]):0.0709634[248],Porphyra_yezoensis_:0.0125208[249],Porphyra_purpurea_:0.0210402[250]):0[251];", "placements": [{"p": [[0, -3117.130000, 0.214473, 0.000008, 0.801891 ], [148, -3117.400000, 0.164538, 0.054804, 1.302960 ], [1, -3117.470000, 0.152677, 0.096269, 1.006950 ], [2, -3117.470000, 0.152674, 0.000009, 1.006960 ], [227, -3117.640000, 0.129693, 0.012980, 1.076140 ], [65, -3117.790000, 0.111540, 0.056959, 1.580190 ], [226, -3118.190000, 0.074404, 0.032306, 1.269280 ] ], "n": ["FDJVGXF02HY3U1_rvcmp" ] }, {"p": [[1, -5564.800000, 1.000000, 0.028081, 0.091769 ] ], "n": ["FDJVGXF02FE4ZQ_rvcmp" ] }, {"p": [[1, -4583.080000, 0.193989, 0.015939, 0.134691 ], [39, -4583.210000, 0.170963, 0.010180, 0.158900 ], [29, -4583.420000, 0.137486, 0.038169, 0.162950 ], [33, -4583.500000, 0.127677, 0.000010, 0.169180 ], [32, -4583.500000, 0.127633, 0.015226, 0.169184 ], [28, -4583.550000, 0.121153, 0.048759, 0.169104 ], [34, -4583.550000, 0.121100, 0.000007, 0.169109 ] ], "n": ["FDJVGXF02JKSVL" ] }, {"p": [[2, -8427.140000, 0.843013, 0.018208, 0.045379 ], [22, -8429.010000, 0.129976, 0.013853, 0.058437 ], [227, -8431.200000, 0.014508, 0.004623, 0.059398 ], [226, -8431.350000, 0.012503, 0.028921, 0.058576 ] ], "n": ["FDJVGXF02FGRUW_rvcmp" ] }, {"p": [[2, -7981.470000, 0.787658, 0.018109, 0.048789 ], [22, -7982.920000, 0.184419, 0.013857, 0.062557 ], [227, -7985.430000, 0.014995, 0.004520, 0.063698 ], [226, -7985.580000, 0.012928, 0.029215, 0.063044 ] ], "n": ["FDJVGXF02GF4N8_rvcmp" ] }, {"p": [[2, -7315.100000, 0.785974, 0.014800, 0.053668 ], [22, -7316.560000, 0.183428, 0.013452, 0.069732 ], [18, -7319.240000, 0.012536, 0.041899, 0.078575 ], [227, -7319.500000, 0.009653, 0.004365, 0.070890 ], [226, -7319.640000, 0.008409, 0.029422, 0.070430 ] ], "n": ["FDJVGXF02HKV83_rvcmp" ] }, {"p": [[2, -7111.610000, 0.762892, 0.014101, 0.060062 ], [22, -7112.930000, 0.203447, 0.013952, 0.077812 ], [18, -7115.470000, 0.016037, 0.039961, 0.088032 ], [227, -7115.990000, 0.009466, 0.004388, 0.079675 ], [226, -7116.140000, 0.008158, 0.030096, 0.079691 ] ], "n": ["FDJVGXF02GF2S4_rvcmp" ] }, {"p": [[2, -6445.550000, 0.814195, 0.014551, 0.056385 ], [22, -6447.200000, 0.156056, 0.015072, 0.076987 ], [227, -6449.890000, 0.010561, 0.004432, 0.076702 ], [18, -6449.920000, 0.010220, 0.038510, 0.089123 ], [226, -6450.060000, 0.008968, 0.030600, 0.077008 ] ], "n": ["FDJVGXF02HOSTB" ] }, {"p": [[2, -7716.890000, 0.185400, 0.036220, 1.999990 ], [228, -7716.890000, 0.185343, 0.000005, 1.999990 ], [227, -7716.890000, 0.185326, 0.012980, 1.999990 ], [0, -7717.210000, 0.134744, 0.066512, 1.999990 ], [1, -7717.210000, 0.134744, 0.096269, 1.999990 ], [212, -7717.560000, 0.095123, 0.000008, 1.999990 ], [148, -7717.740000, 0.079320, 0.000009, 1.999990 ] ], "n": ["FDJVGXF02HTJMS_rvcmp" ] }, {"p": [[2, -7810.420000, 0.215305, 0.036220, 1.655950 ], [228, -7810.420000, 0.215240, 0.000005, 1.655980 ], [227, -7810.420000, 0.215209, 0.012980, 1.655990 ], [0, -7810.890000, 0.134706, 0.066512, 1.736650 ], [1, -7810.890000, 0.134705, 0.096269, 1.736670 ], [17, -7812.040000, 0.042420, 0.049256, 1.922970 ], [226, -7812.040000, 0.042415, 0.032306, 1.923010 ] ], "n": ["FDJVGXF02IT1QW_rvcmp" ] }, {"p": [[2, -7538.870000, 0.186782, 0.036220, 1.999990 ], [228, -7538.870000, 0.186725, 0.000005, 1.999990 ], [227, -7538.870000, 0.186707, 0.012980, 1.999990 ], [0, -7539.190000, 0.135408, 0.066512, 1.999990 ], [1, -7539.190000, 0.135407, 0.096269, 1.999990 ], [140, -7539.640000, 0.086107, 0.000006, 1.999990 ], [148, -7539.680000, 0.082865, 0.000009, 1.999990 ] ], "n": ["FDJVGXF02FLZ15" ] }, {"p": [[2, -9265.180000, 0.240808, 0.036220, 1.999990 ], [228, -9265.180000, 0.240776, 0.000005, 1.999990 ], [227, -9265.180000, 0.240754, 0.012980, 1.999990 ], [226, -9266.400000, 0.071450, 0.009177, 1.999990 ], [225, -9266.420000, 0.069870, 0.036449, 1.999990 ], [222, -9266.440000, 0.068171, 0.008861, 1.999990 ], [223, -9266.440000, 0.068171, 0.000008, 1.999990 ] ], "n": ["FDJVGXF02HT5SH" ] }, {"p": [[2, -8338.270000, 0.177564, 0.036220, 1.928570 ], [228, -8338.270000, 0.177507, 0.000005, 1.928630 ], [227, -8338.270000, 0.177492, 0.012980, 1.928620 ], [1, -8338.380000, 0.159003, 0.000006, 1.951050 ], [0, -8338.570000, 0.131264, 0.066512, 1.990660 ], [27, -8338.890000, 0.095404, 0.000009, 1.823090 ], [225, -8339.040000, 0.081766, 0.036449, 1.999990 ] ], "n": ["FDJVGXF02FYRCH" ] }, {"p": [[2, -7952.220000, 0.238765, 0.036220, 1.999990 ], [228, -7952.220000, 0.238719, 0.000005, 1.999990 ], [227, -7952.220000, 0.238696, 0.012980, 1.999990 ], [1, -7953.170000, 0.092233, 0.096269, 1.999990 ], [0, -7953.170000, 0.092231, 0.066512, 1.999990 ], [17, -7953.640000, 0.057799, 0.049256, 1.999990 ], [236, -7953.970000, 0.041557, 0.013580, 1.999990 ] ], "n": ["FDJVGXF02HYRJW" ] }, {"p": [[2, -7259.210000, 0.214693, 0.036220, 1.999990 ], [228, -7259.210000, 0.214652, 0.000005, 1.999990 ], [227, -7259.210000, 0.214632, 0.012980, 1.999990 ], [14, -7259.850000, 0.112963, 0.105287, 1.999990 ], [1, -7260.160000, 0.083002, 0.096269, 1.999990 ], [0, -7260.160000, 0.083001, 0.066512, 1.999990 ], [26, -7260.230000, 0.077058, 0.000006, 1.999990 ] ], "n": ["FDJVGXF02I73WJ" ] }, {"p": [[2, -6100.350000, 0.171663, 0.036220, 1.844040 ], [228, -6100.350000, 0.171606, 0.000005, 1.844090 ], [227, -6100.350000, 0.171590, 0.012980, 1.844090 ], [39, -6100.370000, 0.167646, 0.000006, 1.862610 ], [0, -6100.680000, 0.122459, 0.000008, 1.904720 ], [1, -6100.690000, 0.121815, 0.096269, 1.915330 ], [173, -6101.200000, 0.073222, 0.000006, 1.999990 ] ], "n": ["FDJVGXF02G57P7_rvcmp" ] }, {"p": [[4, -1560.940000, 0.328346, 0.000009, 0.156150 ], [10, -1561.800000, 0.138353, 0.020064, 0.143011 ], [9, -1561.890000, 0.127178, 0.032431, 0.159127 ], [7, -1561.910000, 0.124723, 0.012753, 0.173881 ], [5, -1561.990000, 0.114552, 0.000001, 0.190687 ], [6, -1561.990000, 0.114552, 0.019580, 0.190687 ], [202, -1562.780000, 0.052295, 0.000008, 0.173378 ] ], "n": ["FDJVGXF02IMOR4" ] }, {"p": [[7, -5861.490000, 0.238659, 0.005765, 0.492369 ], [6, -5861.520000, 0.231081, 0.009808, 0.509158 ], [5, -5861.520000, 0.231061, 0.000001, 0.509233 ], [9, -5862.440000, 0.092037, 0.000008, 0.480130 ], [8, -5862.440000, 0.091980, 0.018812, 0.480138 ], [10, -5862.910000, 0.057591, 0.000008, 0.498955 ], [4, -5862.910000, 0.057591, 0.076256, 0.498973 ] ], "n": ["FDJVGXF02IO5UD" ] }, {"p": [[10, -2874.220000, 0.357474, 0.046026, 0.131018 ], [29, -2875.200000, 0.134654, 0.024073, 0.217957 ], [28, -2875.330000, 0.117833, 0.039567, 0.214014 ], [33, -2875.350000, 0.115112, 0.000010, 0.228547 ], [32, -2875.350000, 0.115079, 0.015226, 0.228547 ], [34, -2875.400000, 0.110466, 0.000007, 0.229077 ], [31, -2876.200000, 0.049381, 0.001925, 0.246419 ] ], "n": ["FDJVGXF02HKPJT" ] }, {"p": [[10, -2874.220000, 0.357474, 0.046026, 0.131018 ], [29, -2875.200000, 0.134654, 0.024073, 0.217957 ], [28, -2875.330000, 0.117833, 0.039567, 0.214014 ], [33, -2875.350000, 0.115112, 0.000010, 0.228547 ], [32, -2875.350000, 0.115079, 0.015226, 0.228547 ], [34, -2875.400000, 0.110466, 0.000007, 0.229077 ], [31, -2876.200000, 0.049381, 0.001925, 0.246419 ] ], "n": ["FDJVGXF02IZZZK" ] }, {"p": [[10, -6544.690000, 0.332762, 0.032944, 0.407233 ], [4, -6545.090000, 0.223638, 0.076256, 0.498602 ], [9, -6545.090000, 0.223522, 0.032431, 0.498612 ], [239, -6546.480000, 0.055598, 0.013015, 0.484459 ], [232, -6546.480000, 0.055582, 0.018799, 0.484440 ], [240, -6546.480000, 0.055566, 0.000006, 0.484458 ], [237, -6546.520000, 0.053332, 0.011450, 0.508824 ] ], "n": ["FDJVGXF02F2HFE_rvcmp" ] }, {"p": [[10, -2739.510000, 0.301321, 0.059672, 0.194339 ], [244, -2739.700000, 0.250479, 0.000007, 0.289785 ], [167, -2740.220000, 0.149006, 0.000008, 0.304215 ], [64, -2740.550000, 0.106606, 0.201744, 0.235930 ], [6, -2740.910000, 0.074162, 0.001738, 0.283306 ], [9, -2741.010000, 0.067598, 0.013546, 0.252405 ], [7, -2741.290000, 0.050827, 0.031193, 0.285868 ] ], "n": ["FDJVGXF02FSPQ4_rvcmp" ] }, {"p": [[10, -4736.410000, 0.173624, 0.117143, 1.087830 ], [26, -4736.510000, 0.157391, 0.062410, 1.309950 ], [3, -4736.620000, 0.141439, 0.123938, 1.153590 ], [16, -4736.620000, 0.141431, 0.019459, 1.153590 ], [17, -4736.620000, 0.141424, 0.000006, 1.153600 ], [199, -4736.760000, 0.122498, 0.013298, 1.264610 ], [198, -4736.760000, 0.122192, 0.013117, 1.262170 ] ], "n": ["FDJVGXF02FJJ4E" ] }, {"p": [[10, -2626.940000, 0.265067, 0.036090, 0.145359 ], [9, -2627.640000, 0.131969, 0.005782, 0.206560 ], [7, -2627.660000, 0.128693, 0.031193, 0.216556 ], [8, -2627.660000, 0.128692, 0.018812, 0.216562 ], [5, -2627.700000, 0.124321, 0.000001, 0.218520 ], [6, -2627.700000, 0.124251, 0.019580, 0.218538 ], [197, -2627.950000, 0.097006, 0.000006, 0.247332 ] ], "n": ["FDJVGXF02HYG0J_rvcmp" ] }, {"p": [[11, -6864.780000, 0.278804, 0.000001, 1.043280 ], [12, -6864.780000, 0.278804, 0.000009, 1.043270 ], [13, -6864.780000, 0.278748, 0.000009, 1.043280 ], [148, -6866.280000, 0.061855, 0.096694, 1.206030 ], [56, -6866.700000, 0.040845, 0.039334, 1.112120 ], [51, -6866.840000, 0.035437, 0.164389, 1.082770 ], [127, -6867.170000, 0.025507, 0.040911, 1.209000 ] ], "n": ["FDJVGXF02JFXRU" ] }, {"p": [[11, -3076.720000, 0.233127, 0.000001, 0.754007 ], [12, -3076.720000, 0.233127, 0.000009, 0.754007 ], [13, -3076.720000, 0.233090, 0.000009, 0.754004 ], [0, -3077.630000, 0.093581, 0.000008, 0.849447 ], [65, -3077.830000, 0.076319, 0.000009, 1.425200 ], [1, -3077.990000, 0.065378, 0.096269, 1.011570 ], [2, -3077.990000, 0.065377, 0.000009, 1.011590 ] ], "n": ["FDJVGXF02HYHTY_rvcmp" ] }, {"p": [[11, -3076.720000, 0.233127, 0.000001, 0.754007 ], [12, -3076.720000, 0.233127, 0.000009, 0.754007 ], [13, -3076.720000, 0.233090, 0.000009, 0.754004 ], [0, -3077.630000, 0.093581, 0.000008, 0.849447 ], [65, -3077.830000, 0.076319, 0.000009, 1.425200 ], [1, -3077.990000, 0.065378, 0.096269, 1.011570 ], [2, -3077.990000, 0.065377, 0.000009, 1.011590 ] ], "n": ["FDJVGXF02HTSXB_rvcmp" ] }, {"p": [[13, -5769.980000, 0.291611, 0.064845, 0.607318 ], [14, -5770.030000, 0.277925, 0.203630, 0.610159 ], [15, -5770.030000, 0.277886, 0.000009, 0.610165 ], [10, -5771.890000, 0.043041, 0.117176, 0.677724 ], [16, -5771.930000, 0.041310, 0.000010, 0.708501 ], [11, -5772.130000, 0.034113, 0.000001, 0.714205 ], [12, -5772.130000, 0.034113, 0.001169, 0.714210 ] ], "n": ["FDJVGXF02IVI8D_rvcmp" ] }, {"p": [[14, -3326.800000, 0.281519, 0.140724, 0.430414 ], [13, -3327.190000, 0.191388, 0.076254, 0.498052 ], [15, -3327.190000, 0.191342, 0.000009, 0.498052 ], [9, -3327.970000, 0.087026, 0.000008, 0.637821 ], [7, -3327.970000, 0.087015, 0.031194, 0.637827 ], [10, -3328.040000, 0.081374, 0.016508, 0.614993 ], [4, -3328.050000, 0.080335, 0.076256, 0.643355 ] ], "n": ["FDJVGXF02JXEFU_rvcmp" ] }, {"p": [[17, -7844.150000, 0.677994, 0.029153, 0.054526 ], [226, -7845.530000, 0.170499, 0.025843, 0.067870 ], [227, -7845.990000, 0.107736, 0.000006, 0.070088 ], [16, -7846.890000, 0.043772, 0.015289, 0.051226 ] ], "n": ["FDJVGXF02H1V5W" ] }, {"p": [[17, -7466.330000, 0.338658, 0.042709, 0.095338 ], [226, -7466.370000, 0.328472, 0.030162, 0.099519 ], [227, -7466.420000, 0.312368, 0.000006, 0.100215 ], [2, -7469.420000, 0.015512, 0.016303, 0.100631 ], [210, -7470.550000, 0.004990, 0.003185, 0.125792 ] ], "n": ["FDJVGXF02I4B0Q" ] }, {"p": [[17, -7466.330000, 0.338658, 0.042709, 0.095338 ], [226, -7466.370000, 0.328472, 0.030162, 0.099519 ], [227, -7466.420000, 0.312368, 0.000006, 0.100215 ], [2, -7469.420000, 0.015512, 0.016303, 0.100631 ], [210, -7470.550000, 0.004990, 0.003185, 0.125792 ] ], "n": ["FDJVGXF02G4XFH" ] }, {"p": [[17, -7466.330000, 0.338658, 0.042709, 0.095338 ], [226, -7466.370000, 0.328472, 0.030162, 0.099519 ], [227, -7466.420000, 0.312368, 0.000006, 0.100215 ], [2, -7469.420000, 0.015512, 0.016303, 0.100631 ], [210, -7470.550000, 0.004990, 0.003185, 0.125792 ] ], "n": ["FDJVGXF02GYT9J" ] }, {"p": [[17, -7895.780000, 0.159436, 0.049256, 1.766100 ], [227, -7895.780000, 0.159417, 0.000006, 1.766110 ], [226, -7895.780000, 0.159401, 0.032306, 1.766120 ], [205, -7895.960000, 0.133044, 0.002012, 1.779580 ], [25, -7895.960000, 0.132783, 0.014512, 1.784070 ], [3, -7895.970000, 0.131500, 0.123938, 1.797630 ], [23, -7896.020000, 0.124419, 0.003604, 1.818720 ] ], "n": ["FDJVGXF02FTMSK" ] }, {"p": [[18, -4819.310000, 0.227240, 0.051699, 0.370612 ], [22, -4819.310000, 0.227218, 0.000007, 0.370600 ], [21, -4819.310000, 0.227179, 0.017640, 0.370627 ], [19, -4819.980000, 0.116073, 0.000006, 0.396647 ], [20, -4820.500000, 0.069431, 0.006659, 0.417083 ], [189, -4820.540000, 0.066432, 0.096145, 0.399197 ], [188, -4820.540000, 0.066427, 0.052299, 0.399192 ] ], "n": ["FDJVGXF02HNZ3V_rvcmp" ] }, {"p": [[19, -5955.550000, 0.634081, 0.003958, 0.137929 ], [21, -5956.370000, 0.278987, 0.009223, 0.128295 ], [20, -5957.960000, 0.056639, 0.006659, 0.150048 ], [22, -5959.250000, 0.015673, 0.003400, 0.131306 ], [18, -5959.320000, 0.014620, 0.051391, 0.136503 ] ], "n": ["FDJVGXF02IDX33_rvcmp" ] }, {"p": [[19, -6081.420000, 0.328596, 0.000006, 0.316783 ], [22, -6081.880000, 0.207631, 0.009372, 0.307884 ], [21, -6082.080000, 0.170130, 0.003619, 0.324369 ], [20, -6082.110000, 0.165162, 0.006659, 0.329487 ], [18, -6082.540000, 0.107620, 0.051696, 0.329535 ], [193, -6084.790000, 0.011393, 0.016731, 0.359091 ], [35, -6084.970000, 0.009468, 0.013080, 0.364712 ] ], "n": ["FDJVGXF02FXK0E" ] }, {"p": [[19, -6081.420000, 0.328596, 0.000006, 0.316783 ], [22, -6081.880000, 0.207631, 0.009372, 0.307884 ], [21, -6082.080000, 0.170130, 0.003619, 0.324369 ], [20, -6082.110000, 0.165162, 0.006659, 0.329487 ], [18, -6082.540000, 0.107620, 0.051696, 0.329535 ], [193, -6084.790000, 0.011393, 0.016731, 0.359091 ], [35, -6084.970000, 0.009468, 0.013080, 0.364712 ] ], "n": ["FDJVGXF02FXRBW" ] }, {"p": [[19, -5835.510000, 0.283598, 0.000006, 0.345107 ], [22, -5835.890000, 0.194713, 0.010135, 0.336322 ], [21, -5836.130000, 0.153542, 0.002510, 0.355877 ], [20, -5836.140000, 0.151823, 0.006659, 0.359469 ], [18, -5836.550000, 0.100371, 0.051696, 0.361527 ], [193, -5837.100000, 0.057977, 0.016731, 0.364424 ], [194, -5837.100000, 0.057976, 0.000007, 0.364437 ] ], "n": ["FDJVGXF02HV7EN" ] }, {"p": [[20, -8610.600000, 0.418928, 0.002147, 0.070329 ], [22, -8611.150000, 0.240142, 0.011262, 0.066819 ], [205, -8611.640000, 0.147739, 0.026261, 0.069352 ], [196, -8611.660000, 0.145234, 0.032785, 0.068332 ], [21, -8612.860000, 0.043632, 0.010574, 0.070412 ], [209, -8615.170000, 0.004324, 0.006837, 0.077002 ] ], "n": ["FDJVGXF02FCTOG" ] }, {"p": [[20, -7802.800000, 0.228456, 0.005173, 0.048403 ], [21, -7802.850000, 0.217162, 0.000009, 0.048642 ], [19, -7802.850000, 0.216726, 0.012620, 0.048644 ], [22, -7803.100000, 0.168918, 0.000008, 0.048049 ], [18, -7803.100000, 0.168738, 0.051699, 0.048058 ] ], "n": ["FDJVGXF02HWVVX_rvcmp" ] }, {"p": [[20, -7118.550000, 0.736979, 0.002575, 0.065074 ], [21, -7120.540000, 0.100252, 0.008709, 0.065662 ], [22, -7121.110000, 0.056990, 0.001310, 0.067691 ], [18, -7121.120000, 0.056417, 0.051699, 0.068217 ], [19, -7121.250000, 0.049362, 0.012620, 0.069848 ] ], "n": ["FDJVGXF02GL3AG_rvcmp" ] }, {"p": [[20, -6359.030000, 0.271724, 0.000005, 0.052818 ], [196, -6359.360000, 0.196169, 0.030552, 0.055346 ], [21, -6359.830000, 0.122073, 0.000009, 0.053579 ], [19, -6359.830000, 0.121928, 0.012620, 0.053581 ], [22, -6359.960000, 0.107500, 0.000009, 0.052866 ], [18, -6359.960000, 0.107434, 0.051699, 0.052872 ], [204, -6360.340000, 0.073172, 0.005682, 0.063256 ] ], "n": ["FDJVGXF02F8HX9" ] }, {"p": [[20, -5886.570000, 0.323980, 0.000005, 0.060356 ], [204, -5887.240000, 0.165046, 0.005279, 0.073106 ], [21, -5887.650000, 0.109149, 0.000009, 0.061708 ], [19, -5887.660000, 0.108977, 0.012620, 0.061711 ], [22, -5887.760000, 0.098468, 0.000009, 0.061016 ], [18, -5887.760000, 0.098371, 0.051699, 0.061019 ], [200, -5887.780000, 0.096009, 0.012685, 0.080188 ] ], "n": ["FDJVGXF02FQOVG" ] }, {"p": [[20, -6041.450000, 0.212686, 0.006061, 0.053393 ], [21, -6041.460000, 0.211136, 0.000009, 0.053528 ], [19, -6041.460000, 0.210896, 0.012620, 0.053530 ], [22, -6041.630000, 0.178460, 0.002436, 0.051363 ], [18, -6041.670000, 0.171397, 0.051699, 0.052825 ], [205, -6044.080000, 0.015426, 0.023868, 0.055316 ] ], "n": ["FDJVGXF02JXNPL_rvcmp" ] }, {"p": [[21, -8764.250000, 0.241199, 0.017640, 0.064045 ], [22, -8764.250000, 0.241103, 0.000009, 0.064040 ], [18, -8764.250000, 0.240931, 0.051699, 0.064041 ], [196, -8764.600000, 0.170284, 0.043558, 0.062879 ], [20, -8765.750000, 0.053987, 0.005550, 0.068370 ], [19, -8765.770000, 0.052496, 0.012620, 0.068575 ] ], "n": ["FDJVGXF02HW4T9" ] }, {"p": [[21, -8761.550000, 0.256121, 0.017640, 0.059333 ], [22, -8761.550000, 0.256062, 0.000008, 0.059329 ], [18, -8761.550000, 0.255831, 0.051699, 0.059333 ], [196, -8761.900000, 0.180216, 0.043290, 0.057365 ], [19, -8763.150000, 0.051770, 0.012620, 0.063837 ] ], "n": ["FDJVGXF02GL7HB" ] }, {"p": [[21, -9500.630000, 0.335409, 0.017035, 0.080590 ], [18, -9500.640000, 0.332424, 0.051473, 0.080673 ], [22, -9500.640000, 0.332167, 0.000007, 0.080860 ] ], "n": ["FDJVGXF02JMMYF_rvcmp" ] }, {"p": [[21, -8438.750000, 0.283393, 0.017640, 0.062480 ], [22, -8438.750000, 0.283285, 0.000009, 0.062475 ], [18, -8438.750000, 0.283077, 0.051699, 0.062480 ], [20, -8440.260000, 0.062200, 0.005525, 0.066981 ], [19, -8440.290000, 0.060431, 0.012620, 0.067196 ], [196, -8441.080000, 0.027614, 0.044543, 0.066445 ] ], "n": ["FDJVGXF02IR6E7" ] }, {"p": [[21, -9130.550000, 0.672602, 0.007332, 0.102754 ], [19, -9132.040000, 0.151569, 0.012490, 0.115055 ], [20, -9132.040000, 0.151266, 0.006658, 0.115223 ], [22, -9134.340000, 0.015176, 0.007623, 0.102480 ], [18, -9134.820000, 0.009386, 0.051699, 0.108441 ] ], "n": ["FDJVGXF02ICZTI" ] }, {"p": [[21, -8945.440000, 0.762579, 0.009459, 0.112388 ], [19, -8947.610000, 0.086738, 0.011886, 0.128986 ], [20, -8947.630000, 0.085155, 0.006659, 0.129787 ], [18, -8948.570000, 0.033137, 0.049730, 0.116000 ], [22, -8948.600000, 0.032391, 0.000007, 0.117276 ] ], "n": ["FDJVGXF02I5I6G_rvcmp" ] }, {"p": [[21, -4573.070000, 0.681606, 0.009585, 0.111223 ], [19, -4574.640000, 0.141076, 0.007897, 0.135678 ], [20, -4574.940000, 0.105005, 0.006659, 0.141266 ], [22, -4575.980000, 0.037141, 0.004049, 0.113444 ], [18, -4576.030000, 0.035172, 0.046692, 0.119709 ] ], "n": ["FDJVGXF02HE4QW" ] }, {"p": [[21, -6868.190000, 0.546481, 0.015098, 0.175658 ], [18, -6869.050000, 0.231355, 0.047990, 0.175304 ], [22, -6869.090000, 0.222163, 0.000010, 0.176511 ] ], "n": ["FDJVGXF02FGMVP" ] }, {"p": [[22, -8792.710000, 0.351791, 0.008698, 0.054756 ], [205, -8792.900000, 0.291240, 0.021720, 0.054246 ], [20, -8793.840000, 0.114068, 0.002597, 0.062597 ], [196, -8793.840000, 0.114001, 0.029581, 0.043978 ], [21, -8794.320000, 0.070731, 0.013696, 0.058001 ], [18, -8794.510000, 0.058170, 0.051699, 0.059146 ] ], "n": ["FDJVGXF02FJP4Y_rvcmp" ] }, {"p": [[22, -8627.460000, 0.321255, 0.002086, 0.080227 ], [18, -8627.510000, 0.304766, 0.051699, 0.081674 ], [21, -8627.510000, 0.304613, 0.017640, 0.081678 ], [19, -8628.990000, 0.069366, 0.000006, 0.091938 ] ], "n": ["FDJVGXF02JZTEH_rvcmp" ] }, {"p": [[22, -8561.020000, 0.328435, 0.002404, 0.074755 ], [18, -8561.090000, 0.305245, 0.051699, 0.076416 ], [21, -8561.090000, 0.305075, 0.017640, 0.076429 ], [19, -8562.700000, 0.061246, 0.000006, 0.086838 ] ], "n": ["FDJVGXF02JS345_rvcmp" ] }, {"p": [[22, -8561.020000, 0.328435, 0.002404, 0.074755 ], [18, -8561.090000, 0.305245, 0.051699, 0.076416 ], [21, -8561.090000, 0.305075, 0.017640, 0.076429 ], [19, -8562.700000, 0.061246, 0.000006, 0.086838 ] ], "n": ["FDJVGXF02HEWI1_rvcmp" ] }, {"p": [[22, -8561.020000, 0.328435, 0.002404, 0.074755 ], [18, -8561.090000, 0.305245, 0.051699, 0.076416 ], [21, -8561.090000, 0.305075, 0.017640, 0.076429 ], [19, -8562.700000, 0.061246, 0.000006, 0.086838 ] ], "n": ["FDJVGXF02FI6JK_rvcmp" ] }, {"p": [[22, -7762.610000, 0.261511, 0.006112, 0.066198 ], [18, -7762.630000, 0.256017, 0.044874, 0.066172 ], [21, -7763.010000, 0.175291, 0.017640, 0.070758 ], [19, -7763.200000, 0.145004, 0.012620, 0.073863 ], [20, -7763.200000, 0.144840, 0.006659, 0.073866 ], [204, -7765.330000, 0.017337, 0.012301, 0.067819 ] ], "n": ["FDJVGXF02IIBPI_rvcmp" ] }, {"p": [[22, -7767.570000, 0.297045, 0.000008, 0.053836 ], [21, -7767.570000, 0.297014, 0.017640, 0.053840 ], [18, -7767.570000, 0.296677, 0.051699, 0.053836 ], [20, -7769.250000, 0.055455, 0.005506, 0.058768 ], [19, -7769.280000, 0.053809, 0.012620, 0.058958 ] ], "n": ["FDJVGXF02HCYN0" ] }, {"p": [[22, -7637.040000, 0.666709, 0.006191, 0.053055 ], [21, -7638.470000, 0.159969, 0.017641, 0.058153 ], [19, -7638.640000, 0.134897, 0.012620, 0.060181 ], [196, -7639.900000, 0.038424, 0.040471, 0.062503 ] ], "n": ["FDJVGXF02JOJ52_rvcmp" ] }, {"p": [[22, -6855.620000, 0.862594, 0.011860, 0.078437 ], [19, -6858.330000, 0.057582, 0.006034, 0.092879 ], [21, -6858.640000, 0.042081, 0.017640, 0.091164 ], [20, -6859.370000, 0.020381, 0.006659, 0.096796 ], [208, -6859.530000, 0.017362, 0.010929, 0.085832 ] ], "n": ["FDJVGXF02JV2HR" ] }, {"p": [[22, -6445.290000, 0.527353, 0.007076, 0.046142 ], [20, -6446.100000, 0.234102, 0.000007, 0.053811 ], [21, -6446.970000, 0.098109, 0.017641, 0.052286 ], [19, -6447.240000, 0.075371, 0.012620, 0.054900 ], [196, -6447.550000, 0.054907, 0.038104, 0.057948 ], [204, -6449.240000, 0.010157, 0.005441, 0.070735 ] ], "n": ["FDJVGXF02F452C_rvcmp" ] }, {"p": [[22, -6643.550000, 0.583921, 0.012260, 0.056192 ], [205, -6644.430000, 0.242123, 0.026627, 0.061040 ], [21, -6645.940000, 0.053497, 0.017641, 0.063455 ], [20, -6646.010000, 0.050234, 0.005464, 0.065288 ], [19, -6646.040000, 0.048639, 0.012620, 0.065611 ], [196, -6647.530000, 0.010950, 0.048239, 0.073897 ], [209, -6647.560000, 0.010635, 0.006837, 0.066760 ] ], "n": ["FDJVGXF02FUX9G_rvcmp" ] }, {"p": [[22, -6447.900000, 0.487726, 0.009593, 0.083445 ], [210, -6448.710000, 0.216995, 0.011790, 0.086869 ], [225, -6449.590000, 0.090435, 0.036449, 0.093461 ], [18, -6449.930000, 0.064280, 0.048679, 0.091127 ], [21, -6449.990000, 0.060703, 0.017640, 0.093899 ], [196, -6450.310000, 0.043672, 0.040911, 0.096649 ], [20, -6450.500000, 0.036190, 0.006659, 0.098706 ] ], "n": ["FDJVGXF02FTY7D_rvcmp" ] }, {"p": [[22, -7727.700000, 0.709205, 0.010547, 0.090466 ], [18, -7728.670000, 0.269944, 0.051699, 0.102557 ], [196, -7731.230000, 0.020851, 0.035816, 0.084178 ] ], "n": ["FDJVGXF02GLM02" ] }, {"p": [[22, -7148.800000, 0.739501, 0.016168, 0.081387 ], [209, -7150.960000, 0.084966, 0.005143, 0.091258 ], [208, -7151.100000, 0.073922, 0.015790, 0.087216 ], [210, -7151.200000, 0.066832, 0.000009, 0.092680 ], [18, -7152.300000, 0.022165, 0.028398, 0.082108 ], [205, -7152.870000, 0.012614, 0.035369, 0.092374 ] ], "n": ["FDJVGXF02H9DFJ" ] }, {"p": [[22, -6557.770000, 0.664041, 0.008803, 0.102194 ], [18, -6559.150000, 0.168022, 0.051699, 0.111302 ], [21, -6559.150000, 0.167937, 0.017640, 0.111298 ] ], "n": ["FDJVGXF02GXT72" ] }, {"p": [[22, -6557.770000, 0.664041, 0.008803, 0.102194 ], [18, -6559.150000, 0.168022, 0.051699, 0.111302 ], [21, -6559.150000, 0.167937, 0.017640, 0.111298 ] ], "n": ["FDJVGXF02GEJJS" ] }, {"p": [[22, -6557.770000, 0.664041, 0.008803, 0.102194 ], [18, -6559.150000, 0.168022, 0.051699, 0.111302 ], [21, -6559.150000, 0.167937, 0.017640, 0.111298 ] ], "n": ["FDJVGXF02HQACV" ] }, {"p": [[22, -6113.880000, 0.707341, 0.012185, 0.080698 ], [2, -6115.420000, 0.151547, 0.014157, 0.067813 ], [18, -6116.220000, 0.067776, 0.047786, 0.094711 ], [21, -6116.240000, 0.066681, 0.016473, 0.096590 ], [226, -6118.540000, 0.006655, 0.027723, 0.088002 ] ], "n": ["FDJVGXF02FXXQP" ] }, {"p": [[22, -5946.980000, 0.680164, 0.011519, 0.077607 ], [2, -5948.540000, 0.143296, 0.014716, 0.065161 ], [18, -5948.920000, 0.098164, 0.040075, 0.087708 ], [21, -5949.240000, 0.071379, 0.016411, 0.092374 ], [226, -5951.560000, 0.006997, 0.027529, 0.083874 ] ], "n": ["FDJVGXF02GQA01" ] }, {"p": [[22, -5657.600000, 0.489559, 0.011554, 0.082861 ], [28, -5658.750000, 0.155249, 0.000006, 0.058417 ], [2, -5658.840000, 0.141455, 0.013179, 0.068802 ], [18, -5659.490000, 0.074009, 0.040233, 0.093650 ], [21, -5659.770000, 0.055532, 0.016495, 0.098439 ], [154, -5659.790000, 0.054809, 0.020822, 0.095137 ], [170, -5660.410000, 0.029386, 0.002066, 0.097220 ] ], "n": ["FDJVGXF02F9HSE" ] }, {"p": [[22, -5657.600000, 0.489559, 0.011554, 0.082861 ], [28, -5658.750000, 0.155249, 0.000006, 0.058417 ], [2, -5658.840000, 0.141455, 0.013179, 0.068802 ], [18, -5659.490000, 0.074009, 0.040233, 0.093650 ], [21, -5659.770000, 0.055532, 0.016495, 0.098439 ], [154, -5659.790000, 0.054809, 0.020822, 0.095137 ], [170, -5660.410000, 0.029386, 0.002066, 0.097220 ] ], "n": ["FDJVGXF02II7J3" ] }, {"p": [[22, -5657.600000, 0.489559, 0.011554, 0.082861 ], [28, -5658.750000, 0.155249, 0.000006, 0.058417 ], [2, -5658.840000, 0.141455, 0.013179, 0.068802 ], [18, -5659.490000, 0.074009, 0.040233, 0.093650 ], [21, -5659.770000, 0.055532, 0.016495, 0.098439 ], [154, -5659.790000, 0.054809, 0.020822, 0.095137 ], [170, -5660.410000, 0.029386, 0.002066, 0.097220 ] ], "n": ["FDJVGXF02G63VE" ] }, {"p": [[22, -5647.720000, 0.489265, 0.011545, 0.082964 ], [28, -5648.870000, 0.155655, 0.000006, 0.058515 ], [2, -5648.960000, 0.141107, 0.013181, 0.068886 ], [18, -5649.610000, 0.074071, 0.040245, 0.093766 ], [21, -5649.900000, 0.055613, 0.016497, 0.098567 ], [154, -5649.910000, 0.054865, 0.020821, 0.095248 ], [170, -5650.530000, 0.029424, 0.002051, 0.097343 ] ], "n": ["FDJVGXF02G2Y4K" ] }, {"p": [[22, -5397.850000, 0.837648, 0.011875, 0.064805 ], [18, -5400.010000, 0.096656, 0.039824, 0.075976 ], [21, -5400.400000, 0.065696, 0.016266, 0.081312 ] ], "n": ["FDJVGXF02GFZD0" ] }, {"p": [[22, -4769.320000, 0.792236, 0.011664, 0.078775 ], [18, -4771.270000, 0.113648, 0.040260, 0.092160 ], [21, -4771.550000, 0.085517, 0.016384, 0.097646 ], [2, -4773.850000, 0.008599, 0.017707, 0.082260 ] ], "n": ["FDJVGXF02H44BX" ] }, {"p": [[22, -4300.590000, 0.602370, 0.011475, 0.079915 ], [18, -4302.190000, 0.121455, 0.033712, 0.094761 ], [2, -4302.260000, 0.113650, 0.016774, 0.071164 ], [21, -4302.660000, 0.076347, 0.015454, 0.100229 ], [154, -4303.380000, 0.036888, 0.019745, 0.095900 ], [226, -4303.740000, 0.025738, 0.031816, 0.087929 ], [28, -4303.830000, 0.023552, 0.000006, 0.041483 ] ], "n": ["FDJVGXF02I60RH" ] }, {"p": [[22, -6282.140000, 0.265651, 0.000007, 0.312496 ], [18, -6282.140000, 0.265602, 0.051699, 0.312511 ], [21, -6282.140000, 0.265314, 0.017640, 0.312514 ], [149, -6283.110000, 0.100244, 0.019491, 0.297416 ], [148, -6283.730000, 0.054248, 0.119619, 0.316263 ], [127, -6284.160000, 0.034979, 0.040911, 0.317481 ], [208, -6285.080000, 0.013962, 0.004882, 0.304195 ] ], "n": ["FDJVGXF02JQJ7S" ] }, {"p": [[22, -6495.510000, 0.448892, 0.010174, 0.286470 ], [18, -6496.310000, 0.202196, 0.051696, 0.306989 ], [21, -6496.310000, 0.202181, 0.017640, 0.306984 ], [193, -6497.910000, 0.040759, 0.016731, 0.314938 ], [194, -6497.910000, 0.040753, 0.000007, 0.314950 ], [35, -6498.130000, 0.032613, 0.013080, 0.319509 ], [195, -6498.130000, 0.032607, 0.000009, 0.319506 ] ], "n": ["FDJVGXF02F4WHG" ] }, {"p": [[22, -3484.440000, 0.783978, 0.013036, 0.105787 ], [21, -3487.090000, 0.055667, 0.017640, 0.135841 ], [18, -3487.090000, 0.055665, 0.051699, 0.135839 ], [19, -3487.560000, 0.034949, 0.012620, 0.144740 ], [20, -3487.560000, 0.034948, 0.006659, 0.144741 ], [205, -3487.930000, 0.023987, 0.025181, 0.114760 ], [208, -3488.730000, 0.010807, 0.020091, 0.130032 ] ], "n": ["FDJVGXF02HH2NS" ] }, {"p": [[22, -3498.720000, 0.654859, 0.010809, 0.057786 ], [21, -3500.170000, 0.152570, 0.009832, 0.081096 ], [18, -3500.460000, 0.114184, 0.035890, 0.073095 ], [19, -3501.530000, 0.039194, 0.012620, 0.105600 ], [20, -3501.530000, 0.039193, 0.006659, 0.105601 ] ], "n": ["FDJVGXF02I1GP4" ] }, {"p": [[22, -3264.030000, 0.471841, 0.009503, 0.063308 ], [18, -3264.540000, 0.283506, 0.040189, 0.081976 ], [21, -3264.870000, 0.203234, 0.017641, 0.087930 ], [208, -3267.770000, 0.011215, 0.002111, 0.088295 ], [206, -3267.790000, 0.010985, 0.000001, 0.091482 ], [207, -3267.790000, 0.010985, 0.000001, 0.091482 ], [173, -3268.080000, 0.008233, 0.015753, 0.075741 ] ], "n": ["FDJVGXF02JH59T" ] }, {"p": [[22, -5988.020000, 0.176660, 0.004577, 0.446245 ], [225, -5988.100000, 0.164205, 0.026723, 0.441912 ], [18, -5988.170000, 0.152179, 0.051699, 0.456264 ], [21, -5988.170000, 0.152175, 0.017640, 0.456272 ], [226, -5988.230000, 0.144268, 0.000008, 0.461265 ], [19, -5988.510000, 0.108453, 0.000006, 0.473938 ], [20, -5988.570000, 0.102061, 0.006659, 0.472780 ] ], "n": ["FDJVGXF02JK252" ] }, {"p": [[22, -5320.680000, 0.286305, 0.010622, 0.363509 ], [19, -5321.210000, 0.169079, 0.000006, 0.403531 ], [21, -5321.320000, 0.151053, 0.017642, 0.397716 ], [18, -5321.320000, 0.151013, 0.051696, 0.397709 ], [20, -5321.720000, 0.101625, 0.006659, 0.422616 ], [194, -5322.080000, 0.070464, 0.000007, 0.413073 ], [193, -5322.080000, 0.070461, 0.016731, 0.413056 ] ], "n": ["FDJVGXF02F1O2E" ] }, {"p": [[23, -3901.000000, 0.204318, 0.000007, 0.138743 ], [24, -3901.000000, 0.204318, 0.000009, 0.138743 ], [25, -3901.000000, 0.204212, 0.000007, 0.138733 ], [150, -3901.340000, 0.144461, 0.009001, 0.101321 ], [153, -3901.750000, 0.096351, 0.026997, 0.106561 ], [154, -3901.750000, 0.096336, 0.000007, 0.106556 ], [206, -3902.410000, 0.050005, 0.000001, 0.151504 ] ], "n": ["FDJVGXF02JDAVN" ] }, {"p": [[25, -7717.910000, 0.320906, 0.012996, 0.046082 ], [205, -7717.980000, 0.299317, 0.000009, 0.046529 ], [204, -7717.980000, 0.299314, 0.020143, 0.046523 ], [202, -7720.030000, 0.038590, 0.039140, 0.036840 ], [22, -7720.670000, 0.020361, 0.010215, 0.052594 ], [21, -7721.190000, 0.012043, 0.017640, 0.056337 ], [226, -7721.430000, 0.009470, 0.016047, 0.039565 ] ], "n": ["FDJVGXF02FMEJR" ] }, {"p": [[26, -6611.130000, 1.000000, 0.000006, 0.000006 ] ], "n": ["FDJVGXF02I5F8C_rvcmp" ] }, {"p": [[26, -5650.640000, 0.455852, 0.075537, 0.050416 ], [28, -5651.960000, 0.122071, 0.026559, 0.033260 ], [195, -5652.210000, 0.095355, 0.008722, 0.062156 ], [196, -5652.210000, 0.094841, 0.000010, 0.062303 ], [27, -5652.290000, 0.087557, 0.059377, 0.046468 ], [189, -5652.420000, 0.076941, 0.069519, 0.024990 ], [193, -5652.560000, 0.067383, 0.008076, 0.069170 ] ], "n": ["FDJVGXF02HBGX9" ] }, {"p": [[26, -5411.570000, 1.000000, 0.000006, 0.092871 ] ], "n": ["FDJVGXF02GADLY_rvcmp" ] }, {"p": [[26, -6925.940000, 0.218431, 0.025708, 1.999990 ], [148, -6926.010000, 0.203730, 0.065801, 1.752400 ], [167, -6926.130000, 0.180280, 0.000008, 1.735720 ], [147, -6926.150000, 0.176832, 0.065313, 1.940050 ], [127, -6926.950000, 0.079260, 0.040911, 1.698140 ], [149, -6926.950000, 0.079259, 0.000008, 1.698150 ], [72, -6927.190000, 0.062208, 0.231647, 1.902260 ] ], "n": ["FDJVGXF02G7FCA" ] }, {"p": [[26, -7260.600000, 0.247643, 0.000006, 1.999990 ], [14, -7260.950000, 0.174290, 0.025079, 1.999990 ], [2, -7261.120000, 0.146807, 0.036220, 1.999990 ], [228, -7261.120000, 0.146769, 0.000005, 1.999990 ], [1, -7261.510000, 0.100021, 0.096269, 1.999990 ], [0, -7261.510000, 0.100020, 0.066512, 1.999990 ], [10, -7261.680000, 0.084451, 0.019198, 1.999990 ] ], "n": ["FDJVGXF02FHIUJ" ] }, {"p": [[27, -7498.070000, 0.773853, 0.029961, 0.124147 ], [171, -7500.180000, 0.094002, 0.023431, 0.120473 ], [190, -7500.510000, 0.067188, 0.031155, 0.127315 ], [191, -7500.550000, 0.064956, 0.000504, 0.128798 ] ], "n": ["FDJVGXF02GY2VP" ] }, {"p": [[27, -8604.500000, 0.232391, 0.033632, 0.205524 ], [190, -8604.530000, 0.224145, 0.014113, 0.211015 ], [40, -8604.580000, 0.213555, 0.046417, 0.198717 ], [188, -8604.900000, 0.155565, 0.035186, 0.206690 ], [189, -8605.190000, 0.116164, 0.084528, 0.203818 ], [38, -8606.530000, 0.030430, 0.053042, 0.215546 ], [26, -8606.620000, 0.027749, 0.068494, 0.223648 ] ], "n": ["FDJVGXF02JCGD5_rvcmp" ] }, {"p": [[27, -8009.940000, 0.606203, 0.000009, 0.317782 ], [40, -8011.010000, 0.207043, 0.024640, 0.302844 ], [190, -8012.210000, 0.062745, 0.025414, 0.301465 ], [39, -8012.700000, 0.038257, 0.000006, 0.297917 ], [191, -8012.720000, 0.037686, 0.005256, 0.305983 ], [171, -8012.870000, 0.032183, 0.034630, 0.310658 ], [181, -8013.580000, 0.015883, 0.000009, 0.334003 ] ], "n": ["FDJVGXF02F79AQ" ] }, {"p": [[27, -9121.000000, 1.000000, 0.000009, 0.381143 ] ], "n": ["FDJVGXF02F41OT" ] }, {"p": [[27, -8687.080000, 0.990522, 0.000007, 0.390029 ], [202, -8691.730000, 0.009478, 0.008314, 0.374407 ] ], "n": ["FDJVGXF02IYT0M" ] }, {"p": [[27, -8439.180000, 0.671244, 0.011931, 0.268882 ], [40, -8440.190000, 0.245369, 0.041956, 0.259400 ], [191, -8442.100000, 0.036078, 0.011768, 0.279196 ], [192, -8442.200000, 0.032632, 0.000005, 0.283581 ], [171, -8443.000000, 0.014677, 0.034630, 0.283123 ] ], "n": ["FDJVGXF02HSMJ1" ] }, {"p": [[27, -7207.070000, 1.000000, 0.003339, 0.288104 ] ], "n": ["FDJVGXF02GGOMJ" ] }, {"p": [[27, -4260.490000, 1.000000, 0.020931, 0.177290 ] ], "n": ["FDJVGXF02JD9QK" ] }, {"p": [[27, -5996.910000, 0.608052, 0.031022, 0.209381 ], [33, -5999.060000, 0.071095, 0.004928, 0.234467 ], [34, -5999.070000, 0.070276, 0.011819, 0.233997 ], [35, -5999.100000, 0.068558, 0.000006, 0.235870 ], [29, -5999.100000, 0.068192, 0.044151, 0.235636 ], [32, -5999.110000, 0.067799, 0.015226, 0.237038 ], [28, -5999.500000, 0.046028, 0.045841, 0.238133 ] ], "n": ["FDJVGXF02HLE4V_rvcmp" ] }, {"p": [[27, -6997.270000, 0.253447, 0.033878, 1.483110 ], [148, -6997.560000, 0.188935, 0.000009, 1.675090 ], [147, -6997.560000, 0.188906, 0.065313, 1.675130 ], [158, -6998.070000, 0.113014, 0.000009, 1.528030 ], [167, -6998.210000, 0.098695, 0.010289, 1.558800 ], [195, -6998.310000, 0.088716, 0.000009, 1.574360 ], [149, -6998.580000, 0.068287, 0.039685, 1.556220 ] ], "n": ["FDJVGXF02HRFXB_rvcmp" ] }, {"p": [[27, -1571.160000, 0.423882, 0.033936, 0.000009 ], [161, -1572.460000, 0.116114, 0.000008, 0.018341 ], [18, -1572.650000, 0.095536, 0.005683, 0.017612 ], [20, -1572.650000, 0.095433, 0.000007, 0.018227 ], [21, -1572.680000, 0.093169, 0.000009, 0.018237 ], [35, -1572.730000, 0.087956, 0.000006, 0.000005 ], [34, -1572.740000, 0.087911, 0.014780, 0.000010 ] ], "n": ["FDJVGXF02FIK4U" ] }, {"p": [[28, -8283.440000, 0.843194, 0.020592, 0.101167 ], [226, -8286.010000, 0.065131, 0.013855, 0.097635 ], [210, -8286.590000, 0.036393, 0.010276, 0.113954 ], [34, -8287.370000, 0.016660, 0.001120, 0.121478 ], [205, -8287.620000, 0.012935, 0.037510, 0.128102 ], [208, -8287.630000, 0.012850, 0.023926, 0.129311 ], [209, -8287.630000, 0.012837, 0.000007, 0.129456 ] ], "n": ["FDJVGXF02FZ3A2_rvcmp" ] }, {"p": [[28, -8283.440000, 0.843194, 0.020592, 0.101167 ], [226, -8286.010000, 0.065131, 0.013855, 0.097635 ], [210, -8286.590000, 0.036393, 0.010276, 0.113954 ], [34, -8287.370000, 0.016660, 0.001120, 0.121478 ], [205, -8287.620000, 0.012935, 0.037510, 0.128102 ], [208, -8287.630000, 0.012850, 0.023926, 0.129311 ], [209, -8287.630000, 0.012837, 0.000007, 0.129456 ] ], "n": ["FDJVGXF02GGF3J_rvcmp" ] }, {"p": [[28, -7908.490000, 0.851074, 0.020592, 0.100231 ], [226, -7911.140000, 0.060050, 0.014200, 0.097079 ], [210, -7911.720000, 0.033618, 0.009992, 0.114361 ], [34, -7912.420000, 0.016656, 0.001113, 0.121417 ], [205, -7912.680000, 0.012922, 0.037573, 0.128437 ], [208, -7912.680000, 0.012846, 0.023949, 0.129641 ], [209, -7912.680000, 0.012834, 0.000007, 0.129789 ] ], "n": ["FDJVGXF02HKR3S_rvcmp" ] }, {"p": [[28, -8001.940000, 0.670792, 0.008204, 0.069713 ], [196, -8002.680000, 0.320324, 0.024572, 0.088784 ], [171, -8006.270000, 0.008884, 0.012956, 0.098902 ] ], "n": ["FDJVGXF02HF7N8" ] }, {"p": [[28, -6002.150000, 0.321403, 0.048759, 0.089313 ], [34, -6002.160000, 0.321227, 0.000007, 0.089318 ], [33, -6002.160000, 0.321019, 0.020031, 0.089313 ], [35, -6004.620000, 0.027424, 0.000006, 0.097160 ], [226, -6006.810000, 0.003042, 0.017021, 0.097414 ], [31, -6006.850000, 0.002942, 0.000619, 0.116007 ], [30, -6006.850000, 0.002942, 0.000383, 0.116008 ] ], "n": ["FDJVGXF02IWIIX" ] }, {"p": [[28, -5567.750000, 0.215476, 0.036690, 0.132300 ], [33, -5568.070000, 0.156918, 0.020031, 0.142446 ], [34, -5568.070000, 0.156843, 0.000007, 0.142451 ], [29, -5568.090000, 0.153380, 0.043845, 0.141625 ], [32, -5568.110000, 0.151177, 0.015226, 0.143719 ], [40, -5568.320000, 0.121780, 0.060079, 0.119331 ], [31, -5569.330000, 0.044425, 0.001925, 0.154812 ] ], "n": ["FDJVGXF02I2UCU_rvcmp" ] }, {"p": [[28, -5402.340000, 0.190944, 0.036250, 0.142247 ], [27, -5402.370000, 0.185119, 0.048070, 0.138197 ], [34, -5402.580000, 0.150901, 0.003675, 0.152153 ], [33, -5402.660000, 0.139037, 0.020031, 0.155099 ], [40, -5402.770000, 0.124176, 0.052809, 0.127934 ], [29, -5402.900000, 0.109923, 0.037679, 0.154215 ], [32, -5402.990000, 0.099899, 0.015226, 0.159430 ] ], "n": ["FDJVGXF02JND44" ] }, {"p": [[29, -7511.910000, 0.267450, 0.016925, 0.215123 ], [190, -7512.370000, 0.168526, 0.034335, 0.226125 ], [191, -7512.370000, 0.168504, 0.000008, 0.226130 ], [171, -7512.370000, 0.168476, 0.034630, 0.226126 ], [40, -7512.880000, 0.100793, 0.061983, 0.221019 ], [38, -7513.040000, 0.085722, 0.027883, 0.219588 ], [192, -7513.790000, 0.040530, 0.003921, 0.237054 ] ], "n": ["FDJVGXF02HR1AU" ] }, {"p": [[29, -5546.890000, 0.212531, 0.015123, 0.294242 ], [33, -5547.210000, 0.153198, 0.000010, 0.308997 ], [32, -5547.210000, 0.153170, 0.015226, 0.309001 ], [28, -5547.220000, 0.152332, 0.039116, 0.298598 ], [34, -5547.270000, 0.144181, 0.000007, 0.309705 ], [31, -5547.720000, 0.092294, 0.001925, 0.322318 ], [30, -5547.720000, 0.092294, 0.001608, 0.322315 ] ], "n": ["FDJVGXF02FM12Y_rvcmp" ] }, {"p": [[31, -6111.430000, 0.215266, 0.000008, 0.198255 ], [30, -6111.430000, 0.215266, 0.000006, 0.198255 ], [32, -6111.430000, 0.215191, 0.000007, 0.198252 ], [29, -6112.170000, 0.102499, 0.046698, 0.201965 ], [33, -6112.170000, 0.102485, 0.000010, 0.201973 ], [28, -6112.480000, 0.074854, 0.046673, 0.202964 ], [34, -6112.490000, 0.074439, 0.000007, 0.204785 ] ], "n": ["FDJVGXF02F1T1E" ] }, {"p": [[31, -4990.540000, 0.191853, 0.000008, 0.158338 ], [30, -4990.540000, 0.191853, 0.000006, 0.158338 ], [32, -4990.540000, 0.191789, 0.000007, 0.158336 ], [27, -4990.870000, 0.138472, 0.050812, 0.136299 ], [34, -4991.050000, 0.114904, 0.006488, 0.151965 ], [33, -4991.300000, 0.090037, 0.017815, 0.158886 ], [189, -4991.400000, 0.081093, 0.042579, 0.120649 ] ], "n": ["FDJVGXF02HYZ7D_rvcmp" ] }, {"p": [[31, -4010.530000, 0.239133, 0.000008, 0.138819 ], [30, -4010.530000, 0.239133, 0.000006, 0.138819 ], [32, -4010.530000, 0.238998, 0.000007, 0.138820 ], [29, -4011.640000, 0.078965, 0.046702, 0.145037 ], [33, -4011.640000, 0.078962, 0.000010, 0.145033 ], [34, -4011.870000, 0.062409, 0.000007, 0.146095 ], [28, -4011.870000, 0.062400, 0.048759, 0.146104 ] ], "n": ["FDJVGXF02FTMUL" ] }, {"p": [[31, -3533.880000, 0.190347, 0.000008, 0.161841 ], [30, -3533.880000, 0.190347, 0.000006, 0.161841 ], [32, -3533.880000, 0.190278, 0.000007, 0.161840 ], [152, -3533.900000, 0.185908, 0.007319, 0.145002 ], [33, -3534.720000, 0.082520, 0.000010, 0.166522 ], [29, -3534.720000, 0.082519, 0.046702, 0.166513 ], [28, -3534.770000, 0.078080, 0.036506, 0.151192 ] ], "n": ["FDJVGXF02GZV73_rvcmp" ] }, {"p": [[34, -8905.190000, 0.243922, 0.008595, 0.127311 ], [27, -8905.660000, 0.153147, 0.065120, 0.126718 ], [35, -8905.750000, 0.138988, 0.000006, 0.130708 ], [195, -8905.870000, 0.123724, 0.007106, 0.133348 ], [196, -8905.880000, 0.122123, 0.003329, 0.130759 ], [26, -8905.950000, 0.114551, 0.097406, 0.134219 ], [28, -8906.050000, 0.103546, 0.042894, 0.127088 ] ], "n": ["FDJVGXF02H5LYX" ] }, {"p": [[34, -5002.300000, 0.336076, 0.010011, 0.034465 ], [35, -5002.650000, 0.236775, 0.002287, 0.035109 ], [196, -5002.830000, 0.196510, 0.008755, 0.027205 ], [195, -5003.640000, 0.087360, 0.005080, 0.034139 ], [33, -5004.090000, 0.055751, 0.020031, 0.042037 ], [194, -5004.210000, 0.049737, 0.006696, 0.038936 ], [38, -5004.480000, 0.037791, 0.048402, 0.040207 ] ], "n": ["FDJVGXF02JIRJ4" ] }, {"p": [[34, -4967.710000, 0.336158, 0.010008, 0.034642 ], [35, -4968.060000, 0.236923, 0.002288, 0.035301 ], [196, -4968.250000, 0.195730, 0.008752, 0.027352 ], [195, -4969.060000, 0.087365, 0.005075, 0.034321 ], [33, -4969.500000, 0.056013, 0.020031, 0.042245 ], [194, -4969.620000, 0.049879, 0.006696, 0.039136 ], [38, -4969.890000, 0.037933, 0.048377, 0.040427 ] ], "n": ["FDJVGXF02JC28Z_rvcmp" ] }, {"p": [[34, -4870.680000, 0.278964, 0.010175, 0.026665 ], [196, -4871.000000, 0.203673, 0.008686, 0.018634 ], [35, -4871.040000, 0.194108, 0.002473, 0.026963 ], [27, -4871.150000, 0.174572, 0.070440, 0.027890 ], [195, -4872.010000, 0.073982, 0.005362, 0.025552 ], [33, -4872.680000, 0.037924, 0.020031, 0.034892 ], [194, -4872.710000, 0.036778, 0.006696, 0.030976 ] ], "n": ["FDJVGXF02GBL2M_rvcmp" ] }, {"p": [[34, -4961.950000, 0.336171, 0.010008, 0.034670 ], [35, -4962.300000, 0.236946, 0.002288, 0.035324 ], [196, -4962.490000, 0.195607, 0.008751, 0.027383 ], [195, -4963.300000, 0.087365, 0.005074, 0.034351 ], [33, -4963.740000, 0.056054, 0.020031, 0.042273 ], [194, -4963.860000, 0.049902, 0.006696, 0.039169 ], [38, -4964.130000, 0.037955, 0.048373, 0.040467 ] ], "n": ["FDJVGXF02GOQPN" ] }, {"p": [[34, -6200.400000, 0.215165, 0.011973, 0.165627 ], [35, -6200.480000, 0.199242, 0.000010, 0.169699 ], [27, -6200.480000, 0.199210, 0.070440, 0.169695 ], [195, -6200.880000, 0.133597, 0.000005, 0.174880 ], [194, -6200.880000, 0.133487, 0.006696, 0.174881 ], [196, -6201.320000, 0.085966, 0.000008, 0.176500 ], [33, -6202.260000, 0.033333, 0.012289, 0.169455 ] ], "n": ["FDJVGXF02HZX8C_rvcmp" ] }, {"p": [[34, -3598.420000, 0.608756, 0.005974, 0.000007 ], [33, -3599.500000, 0.207032, 0.020031, 0.000009 ], [35, -3599.910000, 0.137020, 0.000010, 0.000007 ], [32, -3602.060000, 0.016032, 0.015226, 0.004413 ], [195, -3602.240000, 0.013395, 0.000005, 0.008273 ], [194, -3602.240000, 0.013389, 0.006696, 0.008274 ], [38, -3603.360000, 0.004376, 0.076827, 0.009645 ] ], "n": ["FDJVGXF02I4R6Q_rvcmp" ] }, {"p": [[34, -3283.190000, 0.304203, 0.006091, 0.042618 ], [28, -3283.890000, 0.151312, 0.045537, 0.040033 ], [33, -3283.990000, 0.137071, 0.020031, 0.044313 ], [35, -3284.070000, 0.126803, 0.000006, 0.048957 ], [27, -3284.070000, 0.126734, 0.070439, 0.048956 ], [195, -3284.570000, 0.076946, 0.000009, 0.054388 ], [194, -3284.570000, 0.076931, 0.006696, 0.054389 ] ], "n": ["FDJVGXF02FMWSU" ] }, {"p": [[35, -3262.850000, 0.174070, 0.013080, 0.078704 ], [195, -3262.850000, 0.174055, 0.000009, 0.078694 ], [194, -3262.850000, 0.174020, 0.006696, 0.078692 ], [27, -3262.880000, 0.168677, 0.051545, 0.074268 ], [196, -3263.040000, 0.143502, 0.000008, 0.078468 ], [34, -3263.120000, 0.132899, 0.014780, 0.078731 ], [193, -3264.520000, 0.032776, 0.016731, 0.080589 ] ], "n": ["FDJVGXF02GZ37H" ] }, {"p": [[36, -3772.560000, 0.210414, 0.000009, 0.017435 ], [38, -3772.560000, 0.209748, 0.000007, 0.017434 ], [37, -3772.570000, 0.208940, 0.002319, 0.017435 ], [194, -3773.160000, 0.115617, 0.000007, 0.017522 ], [193, -3773.160000, 0.115574, 0.016731, 0.017522 ], [35, -3773.570000, 0.076248, 0.013078, 0.017531 ], [27, -3773.760000, 0.063460, 0.070440, 0.017397 ] ], "n": ["FDJVGXF02G5S7D" ] }, {"p": [[37, -2910.280000, 0.207772, 0.001042, 0.011190 ], [36, -2910.280000, 0.207765, 0.000374, 0.011192 ], [38, -2910.280000, 0.207753, 0.000008, 0.011191 ], [194, -2910.850000, 0.117601, 0.000007, 0.011166 ], [193, -2910.850000, 0.117564, 0.016731, 0.011166 ], [35, -2911.260000, 0.077372, 0.013078, 0.010988 ], [27, -2911.450000, 0.064173, 0.070440, 0.010660 ] ], "n": ["FDJVGXF02F7PYV_rvcmp" ] }, {"p": [[37, -2436.440000, 0.182449, 0.001061, 0.014078 ], [36, -2436.440000, 0.182444, 0.000407, 0.014086 ], [38, -2436.440000, 0.182435, 0.000008, 0.014079 ], [191, -2436.750000, 0.134671, 0.000009, 0.000006 ], [193, -2436.940000, 0.110664, 0.016731, 0.014104 ], [194, -2436.940000, 0.110641, 0.000007, 0.014104 ], [192, -2437.080000, 0.096697, 0.000005, 0.010894 ] ], "n": ["FDJVGXF02H01K4_rvcmp" ] }, {"p": [[38, -7609.050000, 0.603747, 0.036549, 0.084987 ], [26, -7610.440000, 0.150447, 0.081983, 0.075259 ], [27, -7610.800000, 0.105519, 0.054929, 0.083440 ], [195, -7611.590000, 0.047859, 0.009399, 0.088211 ], [34, -7611.690000, 0.043191, 0.009714, 0.092132 ], [35, -7612.110000, 0.028565, 0.003957, 0.094017 ], [194, -7612.430000, 0.020671, 0.000007, 0.096834 ] ], "n": ["FDJVGXF02GTM9N" ] }, {"p": [[38, -7746.750000, 0.487263, 0.058233, 0.106403 ], [192, -7748.360000, 0.097310, 0.021642, 0.133163 ], [193, -7748.360000, 0.096936, 0.000008, 0.134123 ], [39, -7748.360000, 0.096893, 0.025399, 0.134123 ], [171, -7748.580000, 0.078239, 0.030847, 0.118406 ], [190, -7748.670000, 0.071687, 0.034335, 0.121433 ], [191, -7748.670000, 0.071671, 0.000008, 0.121434 ] ], "n": ["FDJVGXF02JNZMF_rvcmp" ] }, {"p": [[38, -7746.750000, 0.487263, 0.058233, 0.106403 ], [192, -7748.360000, 0.097310, 0.021642, 0.133163 ], [193, -7748.360000, 0.096936, 0.000008, 0.134123 ], [39, -7748.360000, 0.096893, 0.025399, 0.134123 ], [171, -7748.580000, 0.078239, 0.030847, 0.118406 ], [190, -7748.670000, 0.071687, 0.034335, 0.121433 ], [191, -7748.670000, 0.071671, 0.000008, 0.121434 ] ], "n": ["FDJVGXF02JN5X1_rvcmp" ] }, {"p": [[38, -6958.180000, 0.597162, 0.018283, 0.108809 ], [196, -6959.020000, 0.257204, 0.028729, 0.095868 ], [37, -6960.530000, 0.057238, 0.002319, 0.116741 ], [36, -6960.530000, 0.057016, 0.001199, 0.116742 ], [205, -6962.000000, 0.013072, 0.017372, 0.111696 ], [35, -6962.190000, 0.010858, 0.001950, 0.125166 ], [194, -6962.560000, 0.007451, 0.000007, 0.127382 ] ], "n": ["FDJVGXF02HJLY3" ] }, {"p": [[38, -4971.370000, 0.273075, 0.036132, 0.045932 ], [35, -4971.890000, 0.161522, 0.004271, 0.047519 ], [196, -4972.030000, 0.140928, 0.009454, 0.033992 ], [27, -4972.090000, 0.132024, 0.070440, 0.049313 ], [194, -4972.340000, 0.102909, 0.000007, 0.048576 ], [193, -4972.340000, 0.102833, 0.016731, 0.048578 ], [195, -4972.510000, 0.086708, 0.003406, 0.044166 ] ], "n": ["FDJVGXF02FP1V7_rvcmp" ] }, {"p": [[38, -4693.080000, 0.315056, 0.030401, 0.035213 ], [196, -4693.590000, 0.188884, 0.010947, 0.021548 ], [35, -4693.910000, 0.136817, 0.004599, 0.037698 ], [27, -4694.160000, 0.106362, 0.070440, 0.039657 ], [194, -4694.370000, 0.086435, 0.000007, 0.038436 ], [193, -4694.370000, 0.086357, 0.016731, 0.038438 ], [195, -4694.450000, 0.080088, 0.003673, 0.033363 ] ], "n": ["FDJVGXF02IBL60" ] }, {"p": [[38, -7350.190000, 0.218908, 0.057052, 1.294380 ], [193, -7350.480000, 0.163210, 0.016731, 1.325020 ], [194, -7350.480000, 0.163176, 0.000007, 1.324960 ], [192, -7350.760000, 0.122701, 0.022464, 1.357340 ], [39, -7350.760000, 0.122691, 0.025399, 1.357350 ], [77, -7350.900000, 0.106637, 0.097106, 1.593850 ], [2, -7350.940000, 0.102678, 0.005591, 1.431020 ] ], "n": ["FDJVGXF02FZWSE_rvcmp" ] }, {"p": [[38, -7350.190000, 0.218908, 0.057052, 1.294380 ], [193, -7350.480000, 0.163210, 0.016731, 1.325020 ], [194, -7350.480000, 0.163176, 0.000007, 1.324960 ], [192, -7350.760000, 0.122701, 0.022464, 1.357340 ], [39, -7350.760000, 0.122691, 0.025399, 1.357350 ], [77, -7350.900000, 0.106637, 0.097106, 1.593850 ], [2, -7350.940000, 0.102678, 0.005591, 1.431020 ] ], "n": ["FDJVGXF02F2FD5_rvcmp" ] }, {"p": [[39, -7502.810000, 0.314238, 0.010616, 0.126463 ], [191, -7503.530000, 0.152581, 0.004349, 0.123573 ], [171, -7503.700000, 0.129166, 0.034630, 0.124367 ], [190, -7503.700000, 0.129065, 0.034335, 0.124369 ], [192, -7503.750000, 0.123210, 0.011581, 0.128731 ], [193, -7504.210000, 0.077530, 0.000008, 0.134824 ], [40, -7504.250000, 0.074209, 0.078856, 0.125064 ] ], "n": ["FDJVGXF02IJ4J6" ] }, {"p": [[39, -8824.530000, 1.000000, 0.003729, 0.037689 ] ], "n": ["FDJVGXF02HQB4H" ] }, {"p": [[39, -8707.690000, 0.211625, 0.025399, 0.201455 ], [192, -8707.690000, 0.211602, 0.022464, 0.201460 ], [193, -8707.690000, 0.211431, 0.000008, 0.201454 ], [191, -8708.290000, 0.115865, 0.000008, 0.204244 ], [190, -8708.290000, 0.115857, 0.034335, 0.204236 ], [40, -8708.430000, 0.100675, 0.072715, 0.193895 ], [38, -8709.550000, 0.032945, 0.045660, 0.185638 ] ], "n": ["FDJVGXF02HIG4B" ] }, {"p": [[39, -2768.000000, 0.954930, 0.005518, 0.026728 ], [40, -2771.840000, 0.020440, 0.066167, 0.037302 ], [192, -2772.240000, 0.013721, 0.022464, 0.046360 ], [204, -2772.470000, 0.010909, 0.017584, 0.052109 ] ], "n": ["FDJVGXF02INEUV" ] }, {"p": [[40, -8717.400000, 1.000000, 0.061066, 0.064478 ] ], "n": ["FDJVGXF02GI0SH" ] }, {"p": [[40, -9680.090000, 0.332769, 0.015512, 0.306461 ], [177, -9680.720000, 0.177336, 0.000051, 0.333465 ], [29, -9680.900000, 0.148034, 0.023035, 0.303217 ], [38, -9681.160000, 0.114688, 0.047016, 0.310416 ], [33, -9681.520000, 0.079960, 0.007462, 0.314035 ], [174, -9681.530000, 0.078822, 0.002435, 0.346080 ], [176, -9681.670000, 0.068391, 0.006160, 0.339945 ] ], "n": ["FDJVGXF02FUALA" ] }, {"p": [[40, -7350.060000, 1.000000, 0.034072, 0.118787 ] ], "n": ["FDJVGXF02JECP1_rvcmp" ] }, {"p": [[40, -5785.840000, 0.331542, 0.049289, 0.109788 ], [191, -5786.200000, 0.231332, 0.005069, 0.127960 ], [190, -5786.480000, 0.176246, 0.034335, 0.131202 ], [171, -5786.480000, 0.176046, 0.034630, 0.131212 ], [172, -5787.770000, 0.048471, 0.000008, 0.138435 ], [175, -5788.710000, 0.018860, 0.004370, 0.141867 ], [27, -5788.790000, 0.017503, 0.014940, 0.149184 ] ], "n": ["FDJVGXF02HLTR9" ] }, {"p": [[40, -6275.960000, 0.735533, 0.056166, 0.072167 ], [205, -6278.220000, 0.076600, 0.022873, 0.086627 ], [171, -6278.410000, 0.063319, 0.019808, 0.081752 ], [196, -6278.810000, 0.042517, 0.040511, 0.080388 ], [192, -6279.040000, 0.033896, 0.002300, 0.092250 ], [191, -6279.100000, 0.031767, 0.015648, 0.093511 ], [190, -6279.770000, 0.016369, 0.026347, 0.088426 ] ], "n": ["FDJVGXF02HKU98_rvcmp" ] }, {"p": [[40, -6071.990000, 0.724419, 0.056106, 0.075059 ], [205, -6074.190000, 0.079864, 0.022906, 0.089484 ], [171, -6074.400000, 0.064824, 0.019804, 0.085194 ], [196, -6074.810000, 0.043377, 0.040536, 0.083482 ], [192, -6074.990000, 0.036197, 0.002252, 0.095943 ], [191, -6075.050000, 0.034098, 0.015648, 0.097229 ], [190, -6075.730000, 0.017220, 0.026526, 0.092286 ] ], "n": ["FDJVGXF02F73YJ_rvcmp" ] }, {"p": [[40, -5834.380000, 0.649722, 0.049836, 0.119512 ], [38, -5836.550000, 0.074270, 0.000009, 0.177799 ], [37, -5836.550000, 0.074001, 0.002319, 0.177800 ], [36, -5836.550000, 0.073718, 0.001199, 0.177802 ], [190, -5836.910000, 0.051402, 0.022830, 0.141886 ], [39, -5837.180000, 0.039503, 0.008302, 0.152705 ], [192, -5837.230000, 0.037383, 0.007342, 0.149224 ] ], "n": ["FDJVGXF02IURA9_rvcmp" ] }, {"p": [[40, -5329.310000, 0.785647, 0.050996, 0.101473 ], [189, -5331.610000, 0.079081, 0.066819, 0.116211 ], [190, -5332.230000, 0.042512, 0.021585, 0.131361 ], [191, -5332.590000, 0.029601, 0.010289, 0.136359 ], [192, -5332.650000, 0.027904, 0.000005, 0.138257 ], [171, -5332.760000, 0.025128, 0.034630, 0.136853 ], [38, -5333.670000, 0.010126, 0.042268, 0.150200 ] ], "n": ["FDJVGXF02JFU7C" ] }, {"p": [[40, -6090.460000, 0.285142, 0.039512, 0.219815 ], [190, -6090.990000, 0.167363, 0.034335, 0.233138 ], [191, -6090.990000, 0.167317, 0.000008, 0.233138 ], [171, -6090.990000, 0.167257, 0.034630, 0.233138 ], [28, -6091.160000, 0.141760, 0.000006, 0.234861 ], [192, -6092.180000, 0.050987, 0.000005, 0.245038 ], [189, -6093.110000, 0.020175, 0.096145, 0.235363 ] ], "n": ["FDJVGXF02GK5VU_rvcmp" ] }, {"p": [[40, -6090.460000, 0.285142, 0.039512, 0.219815 ], [190, -6090.990000, 0.167363, 0.034335, 0.233138 ], [191, -6090.990000, 0.167317, 0.000008, 0.233138 ], [171, -6090.990000, 0.167257, 0.034630, 0.233138 ], [28, -6091.160000, 0.141760, 0.000006, 0.234861 ], [192, -6092.180000, 0.050987, 0.000005, 0.245038 ], [189, -6093.110000, 0.020175, 0.096145, 0.235363 ] ], "n": ["FDJVGXF02FXNNH_rvcmp" ] }, {"p": [[40, -6090.460000, 0.285142, 0.039512, 0.219815 ], [190, -6090.990000, 0.167363, 0.034335, 0.233138 ], [191, -6090.990000, 0.167317, 0.000008, 0.233138 ], [171, -6090.990000, 0.167257, 0.034630, 0.233138 ], [28, -6091.160000, 0.141760, 0.000006, 0.234861 ], [192, -6092.180000, 0.050987, 0.000005, 0.245038 ], [189, -6093.110000, 0.020175, 0.096145, 0.235363 ] ], "n": ["FDJVGXF02FJUZ3_rvcmp" ] }, {"p": [[40, -6090.460000, 0.285142, 0.039512, 0.219815 ], [190, -6090.990000, 0.167363, 0.034335, 0.233138 ], [191, -6090.990000, 0.167317, 0.000008, 0.233138 ], [171, -6090.990000, 0.167257, 0.034630, 0.233138 ], [28, -6091.160000, 0.141760, 0.000006, 0.234861 ], [192, -6092.180000, 0.050987, 0.000005, 0.245038 ], [189, -6093.110000, 0.020175, 0.096145, 0.235363 ] ], "n": ["FDJVGXF02I05DU_rvcmp" ] }, {"p": [[50, -4467.160000, 0.269919, 0.000008, 1.140440 ], [148, -4467.870000, 0.132246, 0.139119, 1.125730 ], [127, -4467.890000, 0.130056, 0.040911, 1.144600 ], [149, -4467.890000, 0.130043, 0.000008, 1.144600 ], [51, -4467.890000, 0.129643, 0.200764, 1.168910 ], [125, -4468.050000, 0.109934, 0.057709, 1.178520 ], [57, -4468.170000, 0.098159, 0.000008, 1.176020 ] ], "n": ["FDJVGXF02JWXKC_rvcmp" ] }, {"p": [[65, -7300.620000, 0.765762, 0.054968, 1.801190 ], [22, -7302.750000, 0.091098, 0.028187, 1.770850 ], [226, -7303.260000, 0.054883, 0.000008, 1.856390 ], [66, -7303.440000, 0.045630, 0.000007, 1.999990 ], [13, -7304.520000, 0.015634, 0.000009, 1.999990 ], [227, -7304.650000, 0.013695, 0.009919, 1.964270 ], [17, -7304.680000, 0.013297, 0.049256, 1.976680 ] ], "n": ["FDJVGXF02FK6DL" ] }, {"p": [[65, -5605.520000, 0.516474, 0.030546, 1.999990 ], [64, -5607.290000, 0.087894, 0.347492, 1.999990 ], [66, -5607.290000, 0.087892, 0.000007, 1.999990 ], [142, -5607.420000, 0.077059, 0.000001, 1.999990 ], [143, -5607.420000, 0.077058, 0.000008, 1.999990 ], [141, -5607.420000, 0.077056, 0.003648, 1.999990 ], [0, -5607.430000, 0.076568, 0.000008, 1.999990 ] ], "n": ["FDJVGXF02HFB4T" ] }, {"p": [[65, -5480.060000, 0.316869, 0.103998, 1.999990 ], [66, -5480.910000, 0.135035, 0.000007, 1.999990 ], [64, -5480.910000, 0.135027, 0.347492, 1.999990 ], [67, -5481.120000, 0.109049, 0.264348, 1.999990 ], [0, -5481.180000, 0.103176, 0.000008, 1.999990 ], [1, -5481.210000, 0.100422, 0.096269, 1.999990 ], [2, -5481.210000, 0.100421, 0.000009, 1.999990 ] ], "n": ["FDJVGXF02H64TH_rvcmp" ] }, {"p": [[65, -7562.270000, 0.305976, 0.094073, 1.999990 ], [5, -7563.220000, 0.119135, 0.000001, 1.999990 ], [6, -7563.220000, 0.119135, 0.019580, 1.999990 ], [7, -7563.220000, 0.119129, 0.000008, 1.999990 ], [4, -7563.280000, 0.112213, 0.076256, 1.999990 ], [9, -7563.280000, 0.112210, 0.032431, 1.999990 ], [10, -7563.280000, 0.112201, 0.000008, 1.999990 ] ], "n": ["FDJVGXF02GV266_rvcmp" ] }, {"p": [[65, -5694.100000, 0.922325, 0.000010, 1.999990 ], [13, -5698.150000, 0.016130, 0.000009, 1.999990 ], [6, -5698.270000, 0.014342, 0.019580, 1.999990 ], [7, -5698.270000, 0.014341, 0.000008, 1.999990 ], [67, -5698.470000, 0.011690, 0.264348, 1.999990 ], [9, -5698.570000, 0.010639, 0.000008, 1.999990 ], [10, -5698.580000, 0.010533, 0.000008, 1.999990 ] ], "n": ["FDJVGXF02HK3GU_rvcmp" ] }, {"p": [[85, -7444.690000, 0.434812, 0.000005, 0.328240 ], [86, -7445.070000, 0.299056, 0.023547, 0.308996 ], [84, -7445.180000, 0.266133, 0.000005, 0.330565 ] ], "n": ["FDJVGXF02F4YCW_rvcmp" ] }, {"p": [[91, -5129.930000, 0.268737, 0.018576, 0.075928 ], [94, -5129.940000, 0.267149, 0.039199, 0.075962 ], [95, -5129.940000, 0.267099, 0.000008, 0.075961 ], [96, -5131.090000, 0.084158, 0.027500, 0.079042 ], [97, -5131.090000, 0.084098, 0.000005, 0.079041 ], [92, -5132.860000, 0.014400, 0.005357, 0.087468 ], [93, -5132.860000, 0.014359, 0.002453, 0.087468 ] ], "n": ["FDJVGXF02GMIRF" ] }, {"p": [[91, -3746.990000, 0.799291, 0.013473, 0.000006 ], [103, -3750.150000, 0.033957, 0.000007, 0.009896 ], [104, -3750.150000, 0.033956, 0.000005, 0.009896 ], [106, -3750.160000, 0.033429, 0.007986, 0.009899 ], [107, -3750.160000, 0.033428, 0.000008, 0.009899 ], [102, -3750.180000, 0.032970, 0.000005, 0.009909 ], [98, -3750.180000, 0.032969, 0.034683, 0.009899 ] ], "n": ["FDJVGXF02F7DBV" ] }, {"p": [[91, -3746.990000, 0.799291, 0.013473, 0.000006 ], [103, -3750.150000, 0.033957, 0.000007, 0.009896 ], [104, -3750.150000, 0.033956, 0.000005, 0.009896 ], [106, -3750.160000, 0.033429, 0.007986, 0.009899 ], [107, -3750.160000, 0.033428, 0.000008, 0.009899 ], [102, -3750.180000, 0.032970, 0.000005, 0.009909 ], [98, -3750.180000, 0.032969, 0.034683, 0.009899 ] ], "n": ["FDJVGXF02HOLWU" ] }, {"p": [[95, -8655.990000, 0.282593, 0.000008, 0.045604 ], [91, -8655.990000, 0.282537, 0.020097, 0.045599 ], [94, -8655.990000, 0.282424, 0.039199, 0.045604 ], [96, -8657.300000, 0.076242, 0.027500, 0.047129 ], [97, -8657.300000, 0.076204, 0.000005, 0.047133 ] ], "n": ["FDJVGXF02JW1VN_rvcmp" ] }, {"p": [[95, -7947.020000, 0.293231, 0.005215, 0.051022 ], [96, -7947.380000, 0.204946, 0.027500, 0.051983 ], [97, -7947.380000, 0.204764, 0.000005, 0.051982 ], [91, -7947.700000, 0.148563, 0.020097, 0.053090 ], [94, -7947.700000, 0.148496, 0.039199, 0.053094 ] ], "n": ["FDJVGXF02IYHPQ_rvcmp" ] }, {"p": [[95, -7947.020000, 0.293231, 0.005215, 0.051022 ], [96, -7947.380000, 0.204946, 0.027500, 0.051983 ], [97, -7947.380000, 0.204764, 0.000005, 0.051982 ], [91, -7947.700000, 0.148563, 0.020097, 0.053090 ], [94, -7947.700000, 0.148496, 0.039199, 0.053094 ] ], "n": ["FDJVGXF02FRA7S_rvcmp" ] }, {"p": [[97, -8417.050000, 0.701949, 0.013322, 0.018873 ], [98, -8418.850000, 0.115723, 0.000006, 0.020220 ], [90, -8418.850000, 0.115660, 0.040800, 0.020222 ], [95, -8420.090000, 0.033348, 0.008662, 0.022053 ], [96, -8420.090000, 0.033320, 0.027500, 0.022057 ] ], "n": ["FDJVGXF02IRF33_rvcmp" ] }, {"p": [[97, -8417.050000, 0.701949, 0.013322, 0.018873 ], [98, -8418.850000, 0.115723, 0.000006, 0.020220 ], [90, -8418.850000, 0.115660, 0.040800, 0.020222 ], [95, -8420.090000, 0.033348, 0.008662, 0.022053 ], [96, -8420.090000, 0.033320, 0.027500, 0.022057 ] ], "n": ["FDJVGXF02H2CA8_rvcmp" ] }, {"p": [[98, -8243.740000, 0.939902, 0.010649, 0.050236 ], [91, -8246.780000, 0.044717, 0.000010, 0.057048 ], [97, -8247.850000, 0.015381, 0.012887, 0.054798 ] ], "n": ["FDJVGXF02JDJ3Y" ] }, {"p": [[98, -8174.820000, 0.372423, 0.009859, 0.051084 ], [91, -8175.240000, 0.243749, 0.004144, 0.053154 ], [96, -8175.650000, 0.162698, 0.022518, 0.048854 ], [95, -8175.960000, 0.118840, 0.006718, 0.050222 ], [97, -8176.110000, 0.102290, 0.000005, 0.051784 ] ], "n": ["FDJVGXF02GAGL4" ] }, {"p": [[98, -6473.070000, 0.296378, 0.010994, 0.010574 ], [99, -6473.080000, 0.293317, 0.016789, 0.010411 ], [97, -6473.960000, 0.121810, 0.021481, 0.011975 ], [90, -6473.960000, 0.121788, 0.040800, 0.011966 ], [101, -6474.730000, 0.056252, 0.018811, 0.011250 ], [102, -6474.730000, 0.056190, 0.000005, 0.011256 ], [100, -6474.770000, 0.054266, 0.040628, 0.011195 ] ], "n": ["FDJVGXF02JFCH8" ] }, {"p": [[99, -8255.900000, 1.000000, 0.016130, 0.024705 ] ], "n": ["FDJVGXF02JPZP3_rvcmp" ] }, {"p": [[101, -7308.440000, 0.350744, 0.001727, 0.057249 ], [99, -7308.520000, 0.324792, 0.047715, 0.058865 ], [100, -7308.520000, 0.324463, 0.040628, 0.058871 ] ], "n": ["FDJVGXF02HMEKU" ] }, {"p": [[101, -8581.620000, 0.375420, 0.002466, 0.063415 ], [99, -8581.810000, 0.312447, 0.047715, 0.065692 ], [100, -8581.810000, 0.312132, 0.040628, 0.065699 ] ], "n": ["FDJVGXF02IZ8HO_rvcmp" ] }, {"p": [[101, -8561.070000, 0.404143, 0.003055, 0.103047 ], [100, -8561.380000, 0.298555, 0.040056, 0.106976 ], [99, -8561.380000, 0.297302, 0.047715, 0.107554 ] ], "n": ["FDJVGXF02F8JAM_rvcmp" ] }, {"p": [[107, -5605.260000, 0.489634, 0.010331, 0.048208 ], [98, -5606.250000, 0.181153, 0.029751, 0.046539 ], [102, -5606.810000, 0.103951, 0.003018, 0.049365 ], [101, -5606.910000, 0.094418, 0.018811, 0.050367 ], [99, -5607.570000, 0.048836, 0.046062, 0.054384 ], [100, -5607.580000, 0.048297, 0.040628, 0.054565 ], [111, -5607.940000, 0.033710, 0.000007, 0.055951 ] ], "n": ["FDJVGXF02GV8P1_rvcmp" ] }, {"p": [[107, -5467.180000, 0.339528, 0.009435, 0.032819 ], [98, -5467.340000, 0.289782, 0.029024, 0.027280 ], [101, -5468.250000, 0.115754, 0.018811, 0.030809 ], [102, -5468.250000, 0.115751, 0.000005, 0.030809 ], [99, -5468.840000, 0.064380, 0.045718, 0.033474 ], [100, -5468.860000, 0.063261, 0.040628, 0.033599 ], [111, -5470.560000, 0.011543, 0.000007, 0.040102 ] ], "n": ["FDJVGXF02GLGLD_rvcmp" ] }, {"p": [[109, -2419.100000, 0.164695, 0.001310, 0.075243 ], [108, -2419.100000, 0.164691, 0.000001, 0.075246 ], [110, -2419.100000, 0.164653, 0.000008, 0.075238 ], [102, -2419.300000, 0.135787, 0.006517, 0.060552 ], [106, -2419.390000, 0.123556, 0.007986, 0.074774 ], [103, -2419.390000, 0.123556, 0.007523, 0.074784 ], [104, -2419.400000, 0.123062, 0.001437, 0.074940 ] ], "n": ["FDJVGXF02FDXJ6" ] }, {"p": [[126, -3861.970000, 0.216323, 0.092966, 0.254083 ], [125, -3862.040000, 0.201438, 0.057709, 0.266765 ], [127, -3862.040000, 0.201429, 0.000010, 0.266761 ], [29, -3862.510000, 0.126659, 0.028941, 0.283561 ], [27, -3862.670000, 0.107666, 0.010563, 0.308719 ], [32, -3862.970000, 0.079372, 0.014524, 0.290615 ], [149, -3863.140000, 0.067112, 0.004653, 0.292897 ] ], "n": ["FDJVGXF02JN8LI_rvcmp" ] }, {"p": [[126, -3861.970000, 0.216323, 0.092966, 0.254083 ], [125, -3862.040000, 0.201438, 0.057709, 0.266765 ], [127, -3862.040000, 0.201429, 0.000010, 0.266761 ], [29, -3862.510000, 0.126659, 0.028941, 0.283561 ], [27, -3862.670000, 0.107666, 0.010563, 0.308719 ], [32, -3862.970000, 0.079372, 0.014524, 0.290615 ], [149, -3863.140000, 0.067112, 0.004653, 0.292897 ] ], "n": ["FDJVGXF02HZF54_rvcmp" ] }, {"p": [[126, -3861.970000, 0.216323, 0.092966, 0.254083 ], [125, -3862.040000, 0.201438, 0.057709, 0.266765 ], [127, -3862.040000, 0.201429, 0.000010, 0.266761 ], [29, -3862.510000, 0.126659, 0.028941, 0.283561 ], [27, -3862.670000, 0.107666, 0.010563, 0.308719 ], [32, -3862.970000, 0.079372, 0.014524, 0.290615 ], [149, -3863.140000, 0.067112, 0.004653, 0.292897 ] ], "n": ["FDJVGXF02HIWQK_rvcmp" ] }, {"p": [[126, -3804.290000, 0.229009, 0.092161, 0.241375 ], [125, -3804.380000, 0.210217, 0.057709, 0.254518 ], [127, -3804.380000, 0.210190, 0.000010, 0.254521 ], [29, -3804.960000, 0.117731, 0.029334, 0.271793 ], [27, -3805.160000, 0.095777, 0.011833, 0.297476 ], [32, -3805.440000, 0.072876, 0.014203, 0.279233 ], [149, -3805.560000, 0.064199, 0.002802, 0.279914 ] ], "n": ["FDJVGXF02GW68B_rvcmp" ] }, {"p": [[126, -3804.290000, 0.229009, 0.092161, 0.241375 ], [125, -3804.380000, 0.210217, 0.057709, 0.254518 ], [127, -3804.380000, 0.210190, 0.000010, 0.254521 ], [29, -3804.960000, 0.117731, 0.029334, 0.271793 ], [27, -3805.160000, 0.095777, 0.011833, 0.297476 ], [32, -3805.440000, 0.072876, 0.014203, 0.279233 ], [149, -3805.560000, 0.064199, 0.002802, 0.279914 ] ], "n": ["FDJVGXF02FQ974_rvcmp" ] }, {"p": [[126, -3804.290000, 0.229009, 0.092161, 0.241375 ], [125, -3804.380000, 0.210217, 0.057709, 0.254518 ], [127, -3804.380000, 0.210190, 0.000010, 0.254521 ], [29, -3804.960000, 0.117731, 0.029334, 0.271793 ], [27, -3805.160000, 0.095777, 0.011833, 0.297476 ], [32, -3805.440000, 0.072876, 0.014203, 0.279233 ], [149, -3805.560000, 0.064199, 0.002802, 0.279914 ] ], "n": ["FDJVGXF02GRXS9_rvcmp" ] }, {"p": [[131, -8922.160000, 0.145126, 0.000001, 0.000006 ], [138, -8922.160000, 0.145121, 0.001320, 0.000006 ], [139, -8922.160000, 0.144797, 0.000005, 0.000006 ], [137, -8922.160000, 0.144421, 0.004966, 0.000006 ], [132, -8922.160000, 0.144150, 0.010863, 0.000006 ], [135, -8922.200000, 0.138329, 0.005910, 0.000006 ], [136, -8922.210000, 0.138056, 0.003788, 0.000006 ] ], "n": ["FDJVGXF02FYPQO_rvcmp" ] }, {"p": [[131, -5966.320000, 0.143927, 0.000001, 0.000006 ], [138, -5966.320000, 0.143924, 0.001320, 0.000006 ], [139, -5966.320000, 0.143797, 0.000005, 0.000006 ], [137, -5966.320000, 0.143763, 0.004966, 0.000006 ], [132, -5966.320000, 0.143699, 0.010863, 0.000006 ], [135, -5966.340000, 0.140514, 0.005910, 0.000006 ], [136, -5966.340000, 0.140375, 0.003788, 0.000006 ] ], "n": ["FDJVGXF02IZ3MU_rvcmp" ] }, {"p": [[131, -5352.240000, 0.143926, 0.000001, 0.000006 ], [138, -5352.240000, 0.143923, 0.001320, 0.000006 ], [139, -5352.240000, 0.143801, 0.000005, 0.000006 ], [137, -5352.240000, 0.143763, 0.004966, 0.000006 ], [132, -5352.240000, 0.143698, 0.010863, 0.000006 ], [135, -5352.260000, 0.140513, 0.005910, 0.000006 ], [136, -5352.260000, 0.140375, 0.003788, 0.000006 ] ], "n": ["FDJVGXF02H2IL8_rvcmp" ] }, {"p": [[131, -5352.240000, 0.143926, 0.000001, 0.000006 ], [138, -5352.240000, 0.143923, 0.001320, 0.000006 ], [139, -5352.240000, 0.143801, 0.000005, 0.000006 ], [137, -5352.240000, 0.143763, 0.004966, 0.000006 ], [132, -5352.240000, 0.143698, 0.010863, 0.000006 ], [135, -5352.260000, 0.140513, 0.005910, 0.000006 ], [136, -5352.260000, 0.140375, 0.003788, 0.000006 ] ], "n": ["FDJVGXF02H2IMB_rvcmp" ] }, {"p": [[131, -5052.660000, 0.143922, 0.000001, 0.000006 ], [138, -5052.660000, 0.143920, 0.001320, 0.000006 ], [139, -5052.660000, 0.143822, 0.000005, 0.000006 ], [137, -5052.660000, 0.143759, 0.004966, 0.000006 ], [132, -5052.660000, 0.143695, 0.010863, 0.000006 ], [135, -5052.690000, 0.140510, 0.005910, 0.000006 ], [136, -5052.690000, 0.140372, 0.003788, 0.000006 ] ], "n": ["FDJVGXF02JCWU5" ] }, {"p": [[131, -4400.960000, 0.300339, 0.000001, 0.000006 ], [139, -4400.960000, 0.300054, 0.000005, 0.000006 ], [138, -4400.960000, 0.299023, 0.001320, 0.000006 ], [130, -4402.300000, 0.078395, 0.010632, 0.000006 ], [137, -4403.730000, 0.018701, 0.004966, 0.000006 ], [136, -4406.090000, 0.001772, 0.000007, 0.007187 ], [135, -4406.120000, 0.001715, 0.005909, 0.006962 ] ], "n": ["FDJVGXF02G8JFN_rvcmp" ] }, {"p": [[131, -4371.210000, 0.143902, 0.000001, 0.007463 ], [138, -4371.210000, 0.143899, 0.001320, 0.007463 ], [139, -4371.210000, 0.143807, 0.000005, 0.007463 ], [137, -4371.210000, 0.143746, 0.004966, 0.007463 ], [132, -4371.210000, 0.143682, 0.010863, 0.007463 ], [135, -4371.230000, 0.140550, 0.005910, 0.007466 ], [136, -4371.230000, 0.140414, 0.003788, 0.007466 ] ], "n": ["FDJVGXF02JNX31" ] }, {"p": [[131, -3469.970000, 0.143921, 0.000001, 0.000006 ], [138, -3469.970000, 0.143918, 0.001320, 0.000006 ], [139, -3469.970000, 0.143822, 0.000005, 0.000006 ], [137, -3469.970000, 0.143760, 0.004966, 0.000006 ], [132, -3469.970000, 0.143695, 0.010863, 0.000006 ], [135, -3469.990000, 0.140511, 0.005910, 0.000006 ], [136, -3469.990000, 0.140372, 0.003788, 0.000006 ] ], "n": ["FDJVGXF02F1HYV" ] }, {"p": [[132, -7670.120000, 0.971396, 0.005579, 0.000010 ], [139, -7674.260000, 0.015439, 0.004473, 0.004140 ], [138, -7674.900000, 0.008212, 0.000712, 0.005054 ], [131, -7675.400000, 0.004952, 0.000001, 0.008195 ] ], "n": ["FDJVGXF02GH6E4_rvcmp" ] }, {"p": [[133, -8117.300000, 0.298208, 0.001193, 0.024298 ], [134, -8117.300000, 0.298181, 0.000001, 0.024300 ], [135, -8117.310000, 0.297897, 0.000006, 0.024300 ], [132, -8119.070000, 0.051235, 0.007524, 0.024893 ], [137, -8120.080000, 0.018622, 0.000010, 0.028222 ], [138, -8120.110000, 0.018048, 0.000005, 0.028485 ], [131, -8120.120000, 0.017810, 0.000001, 0.028563 ] ], "n": ["FDJVGXF02HLFOX_rvcmp" ] }, {"p": [[133, -5342.910000, 0.695538, 0.000009, 0.011527 ], [132, -5343.980000, 0.239751, 0.005044, 0.007929 ], [139, -5346.500000, 0.019171, 0.004375, 0.012719 ], [130, -5346.960000, 0.012127, 0.007486, 0.010366 ], [138, -5347.000000, 0.011688, 0.001000, 0.015716 ], [134, -5347.070000, 0.010912, 0.000001, 0.017539 ], [131, -5347.080000, 0.010813, 0.000001, 0.017461 ] ], "n": ["FDJVGXF02JZD9F_rvcmp" ] }, {"p": [[133, -6746.060000, 0.201028, 0.001210, 0.009765 ], [134, -6746.060000, 0.201014, 0.000001, 0.009767 ], [135, -6746.060000, 0.201011, 0.000006, 0.009767 ], [136, -6746.060000, 0.201007, 0.000007, 0.009767 ], [137, -6746.090000, 0.195940, 0.000010, 0.009769 ] ], "n": ["FDJVGXF02F50AW_rvcmp" ] }, {"p": [[134, -8092.110000, 0.201172, 0.000001, 0.012124 ], [135, -8092.110000, 0.201167, 0.000006, 0.012119 ], [136, -8092.110000, 0.201165, 0.000007, 0.012119 ], [133, -8092.110000, 0.200396, 0.002392, 0.012119 ], [137, -8092.130000, 0.196100, 0.000010, 0.012121 ] ], "n": ["FDJVGXF02I2ISR_rvcmp" ] }, {"p": [[134, -7670.520000, 0.326280, 0.000001, 0.004141 ], [135, -7670.520000, 0.325946, 0.000006, 0.004141 ], [133, -7670.530000, 0.325009, 0.002392, 0.004134 ], [136, -7673.190000, 0.022765, 0.003788, 0.004698 ] ], "n": ["FDJVGXF02H5AA1" ] }, {"p": [[134, -7943.200000, 0.201009, 0.000001, 0.016634 ], [133, -7943.200000, 0.201008, 0.000009, 0.016634 ], [135, -7943.200000, 0.201005, 0.000006, 0.016630 ], [136, -7943.200000, 0.201001, 0.000007, 0.016634 ], [137, -7943.220000, 0.195977, 0.000010, 0.016637 ] ], "n": ["FDJVGXF02F9YM2_rvcmp" ] }, {"p": [[134, -6927.760000, 0.201181, 0.000001, 0.004644 ], [135, -6927.760000, 0.201176, 0.000009, 0.004639 ], [136, -6927.760000, 0.201176, 0.000007, 0.004639 ], [133, -6927.760000, 0.200400, 0.002392, 0.004639 ], [137, -6927.780000, 0.196066, 0.000010, 0.004640 ] ], "n": ["FDJVGXF02FFQFZ_rvcmp" ] }, {"p": [[134, -2761.040000, 0.200840, 0.000001, 0.127490 ], [133, -2761.040000, 0.200840, 0.000009, 0.127490 ], [135, -2761.040000, 0.200837, 0.000006, 0.127490 ], [136, -2761.040000, 0.200834, 0.000007, 0.127490 ], [137, -2761.060000, 0.196649, 0.000010, 0.127579 ] ], "n": ["FDJVGXF02F4ONT_rvcmp" ] }, {"p": [[135, -8554.060000, 0.330967, 0.003244, 0.003711 ], [139, -8554.370000, 0.241626, 0.002672, 0.003308 ], [132, -8554.700000, 0.173056, 0.009006, 0.003728 ], [137, -8555.100000, 0.116220, 0.004966, 0.003822 ], [136, -8555.110000, 0.115467, 0.003788, 0.003827 ], [133, -8557.430000, 0.011332, 0.001784, 0.007407 ], [134, -8557.430000, 0.011331, 0.000001, 0.007409 ] ], "n": ["FDJVGXF02JKFMS" ] }, {"p": [[135, -6739.460000, 0.541202, 0.002241, 0.013097 ], [136, -6741.150000, 0.100298, 0.001765, 0.014350 ], [138, -6741.210000, 0.094373, 0.000720, 0.014780 ], [134, -6741.380000, 0.079514, 0.000001, 0.018140 ], [133, -6741.390000, 0.078908, 0.002392, 0.018145 ], [139, -6741.680000, 0.058656, 0.003657, 0.014823 ], [131, -6741.900000, 0.047049, 0.000001, 0.018086 ] ], "n": ["FDJVGXF02INXEC" ] }, {"p": [[136, -7108.940000, 0.215617, 0.000007, 0.004382 ], [137, -7109.000000, 0.201138, 0.000010, 0.004384 ], [135, -7109.010000, 0.200772, 0.005910, 0.004384 ], [132, -7109.070000, 0.188985, 0.010863, 0.004386 ], [138, -7109.070000, 0.188660, 0.000005, 0.004387 ], [139, -7113.430000, 0.002415, 0.000005, 0.008801 ], [131, -7113.430000, 0.002413, 0.000001, 0.008809 ] ], "n": ["FDJVGXF02H6ETX_rvcmp" ] }, {"p": [[136, -7492.540000, 0.435593, 0.001695, 0.013745 ], [139, -7493.020000, 0.270933, 0.004725, 0.014156 ], [135, -7493.930000, 0.108495, 0.004531, 0.016227 ], [137, -7494.410000, 0.067077, 0.000010, 0.016379 ], [132, -7494.530000, 0.059891, 0.009679, 0.017306 ], [138, -7494.720000, 0.049195, 0.000005, 0.017600 ], [131, -7496.440000, 0.008815, 0.000001, 0.021269 ] ], "n": ["FDJVGXF02H5AR0" ] }, {"p": [[136, -7767.290000, 0.504201, 0.000007, 0.004094 ], [135, -7767.320000, 0.490648, 0.005909, 0.003867 ], [134, -7771.880000, 0.005151, 0.000001, 0.008219 ] ], "n": ["FDJVGXF02GOLCL" ] }, {"p": [[136, -5596.200000, 0.350716, 0.000007, 0.005595 ], [135, -5596.280000, 0.323260, 0.005910, 0.005592 ], [137, -5596.290000, 0.321116, 0.000010, 0.005591 ], [134, -5600.470000, 0.004908, 0.000001, 0.011273 ] ], "n": ["FDJVGXF02GE3K8" ] }, {"p": [[136, -5596.200000, 0.350716, 0.000007, 0.005595 ], [135, -5596.280000, 0.323260, 0.005910, 0.005592 ], [137, -5596.290000, 0.321116, 0.000010, 0.005591 ], [134, -5600.470000, 0.004908, 0.000001, 0.011273 ] ], "n": ["FDJVGXF02IE3VW" ] }, {"p": [[136, -5596.200000, 0.350716, 0.000007, 0.005595 ], [135, -5596.280000, 0.323260, 0.005910, 0.005592 ], [137, -5596.290000, 0.321116, 0.000010, 0.005591 ], [134, -5600.470000, 0.004908, 0.000001, 0.011273 ] ], "n": ["FDJVGXF02F1PNG" ] }, {"p": [[136, -5596.200000, 0.350716, 0.000007, 0.005595 ], [135, -5596.280000, 0.323260, 0.005910, 0.005592 ], [137, -5596.290000, 0.321116, 0.000010, 0.005591 ], [134, -5600.470000, 0.004908, 0.000001, 0.011273 ] ], "n": ["FDJVGXF02GC300" ] }, {"p": [[136, -3527.770000, 0.381143, 0.000007, 0.151558 ], [135, -3529.040000, 0.106201, 0.005910, 0.164675 ], [137, -3529.040000, 0.106196, 0.000010, 0.164670 ], [133, -3529.090000, 0.101617, 0.001203, 0.165521 ], [131, -3529.090000, 0.101615, 0.000001, 0.165517 ], [134, -3529.090000, 0.101615, 0.000001, 0.165523 ], [138, -3529.090000, 0.101614, 0.001320, 0.165523 ] ], "n": ["FDJVGXF02GOQ6V_rvcmp" ] }, {"p": [[137, -6130.550000, 0.395932, 0.002575, 0.170351 ], [140, -6131.630000, 0.134159, 0.032648, 0.172398 ], [148, -6131.670000, 0.128346, 0.017524, 0.168068 ], [147, -6131.820000, 0.111152, 0.061465, 0.172279 ], [138, -6132.180000, 0.077375, 0.000005, 0.183917 ], [132, -6132.180000, 0.077353, 0.010863, 0.183917 ], [131, -6132.200000, 0.075683, 0.000001, 0.184224 ] ], "n": ["FDJVGXF02GB37W" ] }, {"p": [[137, -6261.790000, 0.330583, 0.002572, 0.165315 ], [148, -6262.290000, 0.201081, 0.026708, 0.159032 ], [140, -6262.560000, 0.153647, 0.033990, 0.166454 ], [147, -6262.730000, 0.129745, 0.061336, 0.167273 ], [138, -6263.460000, 0.062125, 0.000005, 0.178567 ], [132, -6263.460000, 0.062107, 0.010863, 0.178567 ], [131, -6263.490000, 0.060713, 0.000001, 0.178874 ] ], "n": ["FDJVGXF02IRBO4" ] }, {"p": [[137, -6020.930000, 0.372440, 0.002578, 0.175789 ], [148, -6021.860000, 0.147041, 0.021756, 0.174258 ], [140, -6021.940000, 0.136566, 0.033626, 0.179127 ], [147, -6022.080000, 0.118044, 0.061400, 0.179586 ], [138, -6022.520000, 0.075840, 0.000005, 0.189862 ], [132, -6022.520000, 0.075819, 0.010863, 0.189867 ], [131, -6022.550000, 0.074250, 0.000001, 0.190179 ] ], "n": ["FDJVGXF02HDW5G" ] }, {"p": [[138, -7222.620000, 0.589198, 0.000627, 0.000006 ], [132, -7223.890000, 0.166139, 0.009990, 0.000007 ], [137, -7224.050000, 0.141372, 0.004966, 0.000007 ], [139, -7225.320000, 0.039713, 0.000005, 0.004248 ], [131, -7225.320000, 0.039641, 0.000001, 0.004256 ], [135, -7226.260000, 0.015464, 0.004392, 0.004170 ], [136, -7226.860000, 0.008474, 0.003788, 0.004244 ] ], "n": ["FDJVGXF02FV3L9_rvcmp" ] }, {"p": [[139, -9156.840000, 1.000000, 0.005965, 0.004004 ] ], "n": ["FDJVGXF02INYGX" ] }, {"p": [[139, -7633.560000, 0.550216, 0.005799, 0.010415 ], [130, -7634.170000, 0.298972, 0.010632, 0.009675 ], [135, -7635.530000, 0.076807, 0.003110, 0.012278 ], [138, -7636.360000, 0.033638, 0.000705, 0.013000 ], [131, -7637.140000, 0.015379, 0.000001, 0.016046 ], [132, -7637.160000, 0.015052, 0.008740, 0.013619 ], [137, -7637.580000, 0.009935, 0.004966, 0.013728 ] ], "n": ["FDJVGXF02HIFVX" ] }, {"p": [[139, -7490.420000, 0.247330, 0.001165, 0.010955 ], [136, -7490.480000, 0.234057, 0.000007, 0.012284 ], [131, -7490.480000, 0.234017, 0.000001, 0.012285 ], [138, -7490.480000, 0.232938, 0.001320, 0.012281 ], [135, -7492.440000, 0.032907, 0.004668, 0.011420 ], [137, -7493.000000, 0.018751, 0.004966, 0.013538 ] ], "n": ["FDJVGXF02I63MJ" ] }, {"p": [[139, -2860.610000, 0.454324, 0.005847, 0.000006 ], [130, -2861.410000, 0.204952, 0.009957, 0.000006 ], [140, -2861.430000, 0.201808, 0.000006, 0.000006 ], [132, -2863.180000, 0.034769, 0.005444, 0.010738 ], [135, -2863.190000, 0.034722, 0.002984, 0.010781 ], [137, -2863.190000, 0.034716, 0.002478, 0.010786 ], [136, -2863.190000, 0.034710, 0.001944, 0.010792 ] ], "n": ["FDJVGXF02F4ONT" ] }, {"p": [[140, -7319.090000, 0.386193, 0.005330, 0.013167 ], [139, -7319.300000, 0.312129, 0.007215, 0.018337 ], [130, -7319.620000, 0.226661, 0.010091, 0.018305 ], [132, -7321.490000, 0.034796, 0.006529, 0.020275 ], [135, -7322.060000, 0.019796, 0.003219, 0.022410 ], [138, -7322.390000, 0.014118, 0.000535, 0.021327 ], [137, -7323.200000, 0.006308, 0.004966, 0.021957 ] ], "n": ["FDJVGXF02IZN0T" ] }, {"p": [[140, -7493.150000, 0.158825, 0.000006, 1.999990 ], [2, -7493.170000, 0.155326, 0.036220, 1.999990 ], [228, -7493.170000, 0.155279, 0.000005, 1.999990 ], [148, -7493.190000, 0.152842, 0.000009, 1.999990 ], [147, -7493.190000, 0.152840, 0.065313, 1.999990 ], [0, -7493.490000, 0.112444, 0.066512, 1.999990 ], [1, -7493.490000, 0.112443, 0.096269, 1.999990 ] ], "n": ["FDJVGXF02HX2JJ" ] }, {"p": [[140, -5202.620000, 0.165249, 0.000006, 1.966580 ], [139, -5202.620000, 0.165227, 0.010556, 1.966630 ], [148, -5202.660000, 0.158087, 0.000009, 1.993690 ], [147, -5202.660000, 0.158084, 0.065313, 1.993740 ], [212, -5202.810000, 0.136601, 0.000008, 1.752390 ], [137, -5202.940000, 0.119365, 0.000010, 1.999990 ], [225, -5203.150000, 0.097386, 0.036449, 1.828740 ] ], "n": ["FDJVGXF02JQX9N" ] }, {"p": [[141, -8114.430000, 0.333526, 0.001825, 0.003983 ], [142, -8114.430000, 0.333416, 0.000001, 0.003989 ], [143, -8114.430000, 0.333058, 0.000008, 0.003980 ] ], "n": ["FDJVGXF02GTQW8_rvcmp" ] }, {"p": [[141, -6805.560000, 0.822676, 0.002446, 0.004842 ], [143, -6807.550000, 0.111699, 0.003154, 0.005156 ], [142, -6808.080000, 0.065624, 0.000001, 0.009488 ] ], "n": ["FDJVGXF02HY0KO_rvcmp" ] }, {"p": [[142, -4529.960000, 0.333418, 0.000001, 0.007191 ], [141, -4529.960000, 0.333418, 0.000009, 0.007194 ], [143, -4529.960000, 0.333165, 0.000008, 0.007191 ] ], "n": ["FDJVGXF02GIO3F" ] }, {"p": [[142, -3860.720000, 0.333477, 0.000001, 0.000006 ], [141, -3860.720000, 0.333476, 0.000007, 0.000006 ], [143, -3860.720000, 0.333047, 0.000008, 0.000006 ] ], "n": ["FDJVGXF02H3FB2_rvcmp" ] }, {"p": [[143, -7455.870000, 0.801977, 0.012430, 0.000006 ], [142, -7457.960000, 0.099133, 0.000001, 0.008484 ], [141, -7457.970000, 0.098889, 0.003648, 0.008484 ] ], "n": ["FDJVGXF02GH82N_rvcmp" ] }, {"p": [[145, -7467.460000, 0.263505, 0.000007, 1.999990 ], [144, -7467.780000, 0.191735, 0.100657, 1.999990 ], [146, -7467.780000, 0.191726, 0.000007, 1.999990 ], [6, -7468.480000, 0.095604, 0.000010, 1.999990 ], [5, -7468.480000, 0.095148, 0.000001, 1.999990 ], [7, -7468.480000, 0.095134, 0.000008, 1.999990 ], [147, -7468.830000, 0.067149, 0.000008, 1.999990 ] ], "n": ["FDJVGXF02JJUZH_rvcmp" ] }, {"p": [[147, -4667.850000, 0.182087, 0.048322, 0.556995 ], [171, -4667.910000, 0.170908, 0.012211, 0.404929 ], [148, -4667.950000, 0.164002, 0.032825, 0.518166 ], [190, -4667.980000, 0.159128, 0.019049, 0.434099 ], [149, -4668.300000, 0.115833, 0.063739, 0.400832 ], [189, -4668.330000, 0.112667, 0.096145, 0.467071 ], [191, -4668.490000, 0.095374, 0.000008, 0.454074 ] ], "n": ["FDJVGXF02IOYZU_rvcmp" ] }, {"p": [[148, -5610.020000, 0.274889, 0.000009, 1.999990 ], [126, -5610.640000, 0.148148, 0.029043, 1.999990 ], [0, -5610.800000, 0.125377, 0.000008, 1.999990 ], [1, -5610.830000, 0.122352, 0.096269, 1.999990 ], [2, -5610.830000, 0.122351, 0.000009, 1.999990 ], [227, -5610.880000, 0.116394, 0.012980, 1.999990 ], [225, -5611.130000, 0.090488, 0.036449, 1.999990 ] ], "n": ["FDJVGXF02H8Z3Y" ] }, {"p": [[148, -7291.320000, 0.203145, 0.090065, 1.447830 ], [56, -7291.420000, 0.185259, 0.035869, 1.282520 ], [22, -7291.450000, 0.179734, 0.028187, 1.493340 ], [13, -7291.670000, 0.143648, 0.000009, 1.434270 ], [225, -7292.060000, 0.097347, 0.036449, 1.551660 ], [149, -7292.070000, 0.096643, 0.010930, 1.419510 ], [52, -7292.090000, 0.094225, 0.017039, 1.454120 ] ], "n": ["FDJVGXF02F2ZWQ" ] }, {"p": [[148, -6911.740000, 0.390936, 0.041908, 1.289100 ], [147, -6911.850000, 0.348873, 0.065313, 1.358800 ], [44, -6913.380000, 0.075662, 0.000005, 1.309500 ], [127, -6913.550000, 0.063982, 0.040911, 1.305380 ], [149, -6913.550000, 0.063982, 0.000008, 1.305370 ], [126, -6914.270000, 0.031164, 0.071899, 1.379690 ], [73, -6914.470000, 0.025401, 0.043072, 1.469550 ] ], "n": ["FDJVGXF02G04PC_rvcmp" ] }, {"p": [[148, -6911.740000, 0.390936, 0.041908, 1.289100 ], [147, -6911.850000, 0.348873, 0.065313, 1.358800 ], [44, -6913.380000, 0.075662, 0.000005, 1.309500 ], [127, -6913.550000, 0.063982, 0.040911, 1.305380 ], [149, -6913.550000, 0.063982, 0.000008, 1.305370 ], [126, -6914.270000, 0.031164, 0.071899, 1.379690 ], [73, -6914.470000, 0.025401, 0.043072, 1.469550 ] ], "n": ["FDJVGXF02FE5TM_rvcmp" ] }, {"p": [[148, -5534.980000, 0.251229, 0.000009, 1.614820 ], [147, -5534.980000, 0.251216, 0.065313, 1.614850 ], [227, -5535.690000, 0.123326, 0.012980, 1.456040 ], [228, -5535.690000, 0.123286, 0.000005, 1.456060 ], [17, -5535.980000, 0.091582, 0.049256, 1.516290 ], [226, -5535.980000, 0.091569, 0.032306, 1.516310 ], [64, -5536.280000, 0.067792, 0.347492, 1.885870 ] ], "n": ["FDJVGXF02IFGFX" ] }, {"p": [[148, -5455.610000, 0.278381, 0.000009, 1.621200 ], [147, -5455.610000, 0.278367, 0.065313, 1.621240 ], [227, -5456.330000, 0.136013, 0.012980, 1.464450 ], [17, -5456.620000, 0.101226, 0.049256, 1.524040 ], [64, -5456.910000, 0.075555, 0.347492, 1.890920 ], [66, -5456.910000, 0.075554, 0.000007, 1.890910 ], [126, -5457.230000, 0.054905, 0.041676, 1.542730 ] ], "n": ["FDJVGXF02HFABX" ] }, {"p": [[148, -3686.610000, 0.332719, 0.000009, 1.357670 ], [65, -3687.190000, 0.186028, 0.058208, 1.309370 ], [0, -3687.710000, 0.110507, 0.000008, 1.000740 ], [11, -3687.880000, 0.093269, 0.000001, 1.078300 ], [12, -3687.880000, 0.093269, 0.000009, 1.078310 ], [13, -3687.880000, 0.093266, 0.000009, 1.078300 ], [1, -3687.910000, 0.090942, 0.096269, 1.124350 ] ], "n": ["FDJVGXF02JWBEE" ] }, {"p": [[149, -8202.410000, 0.918858, 0.028795, 0.068851 ], [171, -8204.830000, 0.081142, 0.009926, 0.104868 ] ], "n": ["FDJVGXF02GWFX3_rvcmp" ] }, {"p": [[149, -7119.850000, 0.510147, 0.049920, 0.055898 ], [171, -7120.580000, 0.247041, 0.010993, 0.070846 ], [170, -7120.960000, 0.167946, 0.011995, 0.077570 ], [154, -7122.360000, 0.041389, 0.024038, 0.088411 ], [169, -7122.580000, 0.033477, 0.023387, 0.090284 ] ], "n": ["FDJVGXF02HC2AW" ] }, {"p": [[149, -6812.840000, 0.237286, 0.051948, 0.063382 ], [170, -6812.850000, 0.236753, 0.003178, 0.086056 ], [154, -6812.880000, 0.228027, 0.030339, 0.088505 ], [169, -6812.890000, 0.227910, 0.023387, 0.088511 ], [171, -6814.070000, 0.070025, 0.003489, 0.078473 ] ], "n": ["FDJVGXF02HY7HA_rvcmp" ] }, {"p": [[149, -5339.640000, 0.338021, 0.015145, 0.133362 ], [127, -5339.870000, 0.268741, 0.034213, 0.131014 ], [148, -5339.960000, 0.246385, 0.148117, 0.135116 ], [126, -5341.670000, 0.044598, 0.081599, 0.128468 ], [170, -5341.740000, 0.041547, 0.018724, 0.171529 ], [171, -5341.740000, 0.041543, 0.000008, 0.171531 ], [40, -5342.510000, 0.019165, 0.067961, 0.183131 ] ], "n": ["FDJVGXF02HQW3R" ] }, {"p": [[149, -5337.070000, 0.305192, 0.014077, 0.134793 ], [127, -5337.220000, 0.261867, 0.032864, 0.131433 ], [148, -5337.350000, 0.231219, 0.148117, 0.136486 ], [126, -5338.560000, 0.068550, 0.078681, 0.126935 ], [40, -5338.730000, 0.057831, 0.067166, 0.173492 ], [191, -5339.090000, 0.040343, 0.012123, 0.180860 ], [171, -5339.230000, 0.034997, 0.000008, 0.174198 ] ], "n": ["FDJVGXF02FF32Z" ] }, {"p": [[149, -4472.350000, 0.166697, 0.063739, 0.250963 ], [170, -4472.350000, 0.166670, 0.018724, 0.250971 ], [171, -4472.350000, 0.166650, 0.000008, 0.250971 ], [153, -4472.500000, 0.143439, 0.025504, 0.238892 ], [154, -4472.510000, 0.141722, 0.001738, 0.240463 ], [150, -4472.510000, 0.141199, 0.016958, 0.240854 ], [169, -4473.170000, 0.073623, 0.023387, 0.255436 ] ], "n": ["FDJVGXF02ICB1C_rvcmp" ] }, {"p": [[152, -8203.620000, 0.529923, 0.023503, 0.081181 ], [153, -8204.300000, 0.268939, 0.003748, 0.078919 ], [151, -8204.590000, 0.201138, 0.014659, 0.083206 ] ], "n": ["FDJVGXF02GEQZL" ] }, {"p": [[152, -8264.190000, 0.499897, 0.019284, 0.106021 ], [151, -8264.540000, 0.353357, 0.008379, 0.103074 ], [153, -8265.420000, 0.146746, 0.000007, 0.107664 ] ], "n": ["FDJVGXF02IVHRC_rvcmp" ] }, {"p": [[152, -8264.190000, 0.499897, 0.019284, 0.106021 ], [151, -8264.540000, 0.353357, 0.008379, 0.103074 ], [153, -8265.420000, 0.146746, 0.000007, 0.107664 ] ], "n": ["FDJVGXF02JG5WK_rvcmp" ] }, {"p": [[152, -8264.190000, 0.499897, 0.019284, 0.106021 ], [151, -8264.540000, 0.353357, 0.008379, 0.103074 ], [153, -8265.420000, 0.146746, 0.000007, 0.107664 ] ], "n": ["FDJVGXF02FV8WG_rvcmp" ] }, {"p": [[152, -6880.900000, 0.697936, 0.021134, 0.049368 ], [199, -6883.070000, 0.079936, 0.013298, 0.061712 ], [200, -6883.070000, 0.079890, 0.000006, 0.061710 ], [198, -6883.780000, 0.039270, 0.009856, 0.065811 ], [153, -6883.830000, 0.037546, 0.000009, 0.057395 ], [151, -6883.830000, 0.037526, 0.014659, 0.057397 ], [197, -6884.120000, 0.027896, 0.024513, 0.067466 ] ], "n": ["FDJVGXF02FNMNX" ] }, {"p": [[153, -8774.600000, 0.386245, 0.011928, 0.082379 ], [171, -8774.690000, 0.355695, 0.015771, 0.075613 ], [205, -8775.570000, 0.147548, 0.022721, 0.081027 ], [196, -8776.240000, 0.074866, 0.040193, 0.072842 ], [170, -8776.990000, 0.035648, 0.016492, 0.088296 ] ], "n": ["FDJVGXF02IHBYW_rvcmp" ] }, {"p": [[153, -8768.770000, 0.823931, 0.011754, 0.089231 ], [171, -8771.310000, 0.064975, 0.010702, 0.089827 ], [149, -8771.430000, 0.057727, 0.052609, 0.080727 ], [170, -8772.200000, 0.026741, 0.015257, 0.097378 ], [152, -8772.490000, 0.020084, 0.029974, 0.109084 ], [154, -8773.610000, 0.006542, 0.012283, 0.107344 ] ], "n": ["FDJVGXF02JVOJ8_rvcmp" ] }, {"p": [[154, -7422.500000, 0.636661, 0.009417, 0.065404 ], [153, -7423.910000, 0.155422, 0.026996, 0.074065 ], [150, -7423.910000, 0.155342, 0.016957, 0.074067 ], [152, -7425.450000, 0.033166, 0.024368, 0.073108 ], [151, -7425.990000, 0.019409, 0.014374, 0.077441 ] ], "n": ["FDJVGXF02IWEET_rvcmp" ] }, {"p": [[154, -7554.860000, 0.916462, 0.010609, 0.050665 ], [153, -7557.250000, 0.083538, 0.018471, 0.058602 ] ], "n": ["FDJVGXF02HTSH5_rvcmp" ] }, {"p": [[154, -4436.970000, 0.333512, 0.030340, 0.006730 ], [169, -4436.970000, 0.333443, 0.023387, 0.006733 ], [170, -4436.970000, 0.333045, 0.000009, 0.006733 ] ], "n": ["FDJVGXF02J2KBH_rvcmp" ] }, {"p": [[155, -8374.440000, 0.910211, 0.000006, 0.007616 ], [156, -8376.990000, 0.070867, 0.038694, 0.001169 ], [157, -8378.310000, 0.018922, 0.000723, 0.005442 ] ], "n": ["FDJVGXF02JSI4C" ] }, {"p": [[155, -8180.560000, 0.525654, 0.000006, 0.011972 ], [156, -8181.030000, 0.329232, 0.038025, 0.008410 ], [157, -8181.950000, 0.131004, 0.000006, 0.011622 ], [169, -8184.180000, 0.014110, 0.000006, 0.012564 ] ], "n": ["FDJVGXF02F3DP1" ] }, {"p": [[155, -7052.150000, 0.940168, 0.010164, 0.000006 ], [156, -7054.900000, 0.059832, 0.041438, 0.000006 ] ], "n": ["FDJVGXF02JFCPJ" ] }, {"p": [[155, -7185.160000, 0.750731, 0.008363, 0.000006 ], [156, -7186.920000, 0.128191, 0.041382, 0.000009 ], [157, -7186.980000, 0.121079, 0.000006, 0.000005 ] ], "n": ["FDJVGXF02G0X7P" ] }, {"p": [[155, -5037.690000, 0.881489, 0.010167, 0.000006 ], [156, -5040.410000, 0.058220, 0.040565, 0.000006 ], [157, -5040.500000, 0.052911, 0.000006, 0.000006 ], [161, -5042.470000, 0.007380, 0.008241, 0.006795 ] ], "n": ["FDJVGXF02IFR90" ] }, {"p": [[156, -7681.740000, 0.839215, 0.028066, 0.003239 ], [155, -7684.090000, 0.080427, 0.012865, 0.007261 ], [157, -7684.090000, 0.080358, 0.000006, 0.007261 ] ], "n": ["FDJVGXF02H8J1Q_rvcmp" ] }, {"p": [[156, -8796.830000, 1.000000, 0.027485, 0.024395 ] ], "n": ["FDJVGXF02F1K58" ] }, {"p": [[156, -8691.610000, 1.000000, 0.027374, 0.024708 ] ], "n": ["FDJVGXF02J045Y" ] }, {"p": [[156, -7753.460000, 0.281307, 0.021236, 0.134237 ], [167, -7754.110000, 0.146481, 0.024812, 0.132936 ], [157, -7754.120000, 0.145774, 0.002299, 0.142620 ], [155, -7754.190000, 0.135290, 0.012865, 0.143537 ], [168, -7754.290000, 0.123027, 0.003242, 0.143914 ], [169, -7754.290000, 0.122196, 0.000006, 0.143957 ], [161, -7755.270000, 0.045925, 0.018135, 0.139948 ] ], "n": ["FDJVGXF02JR510_rvcmp" ] }, {"p": [[156, -8553.580000, 0.973655, 0.029147, 0.022817 ], [160, -8557.190000, 0.026345, 0.003244, 0.030173 ] ], "n": ["FDJVGXF02F47JY_rvcmp" ] }, {"p": [[156, -8015.780000, 0.701736, 0.029744, 0.013525 ], [160, -8017.420000, 0.136088, 0.004116, 0.029976 ], [159, -8017.890000, 0.084978, 0.009298, 0.032098 ], [169, -8017.990000, 0.077198, 0.011359, 0.023814 ] ], "n": ["FDJVGXF02FMRFO" ] }, {"p": [[156, -8211.830000, 1.000000, 0.022056, 0.009825 ] ], "n": ["FDJVGXF02IE1SZ_rvcmp" ] }, {"p": [[156, -8502.650000, 1.000000, 0.015354, 0.010861 ] ], "n": ["FDJVGXF02HDCI6_rvcmp" ] }, {"p": [[156, -6200.340000, 1.000000, 0.025663, 0.000006 ] ], "n": ["FDJVGXF02HHGGV_rvcmp" ] }, {"p": [[156, -8184.100000, 0.966541, 0.029080, 0.019126 ], [160, -8187.910000, 0.021393, 0.003186, 0.026930 ], [158, -8188.480000, 0.012066, 0.006699, 0.021392 ] ], "n": ["FDJVGXF02H8NDW_rvcmp" ] }, {"p": [[156, -7036.230000, 0.502100, 0.027332, 0.015450 ], [160, -7036.660000, 0.326881, 0.004331, 0.038995 ], [161, -7038.290000, 0.063655, 0.023495, 0.030176 ], [158, -7038.580000, 0.048026, 0.016014, 0.042712 ], [159, -7038.740000, 0.040735, 0.011552, 0.044645 ], [165, -7040.100000, 0.010465, 0.000007, 0.036927 ], [157, -7040.350000, 0.008138, 0.001904, 0.037339 ] ], "n": ["FDJVGXF02IOE2L_rvcmp" ] }, {"p": [[156, -5499.140000, 0.347063, 0.000005, 0.022906 ], [155, -5499.410000, 0.266057, 0.012865, 0.022971 ], [157, -5499.410000, 0.265846, 0.000006, 0.022971 ], [169, -5501.230000, 0.042968, 0.004097, 0.022456 ], [168, -5501.270000, 0.041153, 0.003612, 0.024291 ], [154, -5502.040000, 0.019161, 0.028618, 0.020239 ], [170, -5502.110000, 0.017752, 0.001250, 0.019833 ] ], "n": ["FDJVGXF02H3L1Z" ] }, {"p": [[156, -4332.230000, 0.842808, 0.017513, 0.000006 ], [169, -4333.910000, 0.157192, 0.015160, 0.000006 ] ], "n": ["FDJVGXF02FX4DB" ] }, {"p": [[156, -6229.330000, 1.000000, 0.016462, 0.026898 ] ], "n": ["FDJVGXF02GYL8N_rvcmp" ] }, {"p": [[156, -3996.180000, 0.291063, 0.039673, 0.000006 ], [155, -3996.320000, 0.254554, 0.012865, 0.000006 ], [157, -3996.320000, 0.254175, 0.000006, 0.000006 ], [161, -3996.560000, 0.200209, 0.009260, 0.000006 ] ], "n": ["FDJVGXF02G0X7M" ] }, {"p": [[157, -4540.720000, 0.251272, 0.005887, 0.014061 ], [169, -4540.720000, 0.251225, 0.000008, 0.014058 ], [168, -4540.720000, 0.250214, 0.003611, 0.014062 ], [156, -4541.760000, 0.088891, 0.043598, 0.014842 ], [155, -4541.760000, 0.088867, 0.012865, 0.014842 ], [170, -4542.080000, 0.064549, 0.010298, 0.000007 ], [161, -4544.640000, 0.004982, 0.021940, 0.019850 ] ], "n": ["FDJVGXF02FOWJ4" ] }, {"p": [[158, -6745.560000, 0.602591, 0.000009, 0.304863 ], [162, -6747.290000, 0.106771, 0.010708, 0.303268 ], [164, -6747.290000, 0.106760, 0.000005, 0.303268 ], [163, -6747.290000, 0.106709, 0.006754, 0.303271 ], [167, -6748.560000, 0.029808, 0.023309, 0.315070 ], [161, -6748.740000, 0.024988, 0.020039, 0.310010 ], [165, -6748.850000, 0.022372, 0.000007, 0.320871 ] ], "n": ["FDJVGXF02JAXFE_rvcmp" ] }, {"p": [[158, -4676.930000, 0.203510, 0.000009, 0.335675 ], [167, -4677.120000, 0.168715, 0.004124, 0.338129 ], [198, -4677.320000, 0.137291, 0.007471, 0.434431 ], [197, -4677.340000, 0.134763, 0.018393, 0.434152 ], [199, -4677.370000, 0.131532, 0.000006, 0.439414 ], [156, -4677.520000, 0.112425, 0.004498, 0.323395 ], [160, -4677.530000, 0.111765, 0.001734, 0.350230 ] ], "n": ["FDJVGXF02FX0XN" ] }, {"p": [[159, -8709.370000, 0.717864, 0.000006, 0.178962 ], [161, -8711.080000, 0.129484, 0.020945, 0.174502 ], [164, -8711.780000, 0.064711, 0.020699, 0.185858 ], [165, -8711.780000, 0.064684, 0.000007, 0.185859 ], [158, -8713.660000, 0.009861, 0.012781, 0.189420 ], [160, -8713.930000, 0.007535, 0.000007, 0.193767 ], [166, -8714.180000, 0.005861, 0.000008, 0.194949 ] ], "n": ["FDJVGXF02FK3FS_rvcmp" ] }, {"p": [[159, -7000.530000, 0.872350, 0.000006, 0.056012 ], [156, -7003.690000, 0.036935, 0.037276, 0.051455 ], [169, -7003.810000, 0.032764, 0.009791, 0.050011 ], [155, -7004.380000, 0.018448, 0.011860, 0.059073 ], [157, -7004.400000, 0.018220, 0.000006, 0.059112 ], [168, -7004.490000, 0.016569, 0.003612, 0.059410 ], [165, -7005.750000, 0.004714, 0.004037, 0.058557 ] ], "n": ["FDJVGXF02HYEKW" ] }, {"p": [[159, -3952.490000, 0.424336, 0.002594, 0.041117 ], [156, -3953.600000, 0.139356, 0.035431, 0.037174 ], [161, -3953.850000, 0.108802, 0.026496, 0.035266 ], [155, -3954.020000, 0.091718, 0.012865, 0.043855 ], [157, -3954.020000, 0.091712, 0.000006, 0.043860 ], [165, -3954.250000, 0.072659, 0.000951, 0.040370 ], [164, -3954.270000, 0.071417, 0.020699, 0.041268 ] ], "n": ["FDJVGXF02F5UCJ_rvcmp" ] }, {"p": [[159, -2597.770000, 1.000000, 0.000006, 0.000006 ] ], "n": ["FDJVGXF02HWZI1_rvcmp" ] }, {"p": [[160, -7141.590000, 0.246777, 0.006979, 0.004323 ], [165, -7141.600000, 0.245773, 0.007352, 0.004323 ], [166, -7141.600000, 0.245355, 0.000008, 0.004324 ], [167, -7142.660000, 0.084671, 0.033973, 0.004441 ], [168, -7142.660000, 0.084650, 0.000008, 0.004447 ], [169, -7143.260000, 0.046420, 0.000006, 0.004516 ], [157, -7143.260000, 0.046354, 0.005887, 0.004516 ] ], "n": ["FDJVGXF02FKGNY" ] }, {"p": [[160, -7806.370000, 0.680841, 0.002999, 0.025881 ], [158, -7807.620000, 0.194086, 0.015224, 0.027297 ], [159, -7808.060000, 0.125073, 0.011552, 0.029507 ] ], "n": ["FDJVGXF02JWVD9_rvcmp" ] }, {"p": [[160, -8278.240000, 0.400374, 0.002349, 0.153489 ], [159, -8278.570000, 0.290519, 0.011552, 0.158584 ], [158, -8278.570000, 0.290484, 0.017418, 0.158579 ], [164, -8282.010000, 0.009314, 0.020699, 0.155000 ], [165, -8282.010000, 0.009310, 0.000007, 0.154998 ] ], "n": ["FDJVGXF02HRVXJ" ] }, {"p": [[160, -7876.690000, 0.372253, 0.002004, 0.187208 ], [158, -7876.870000, 0.312337, 0.016226, 0.191141 ], [159, -7876.880000, 0.309272, 0.011123, 0.192022 ], [169, -7880.800000, 0.006138, 0.011285, 0.181256 ] ], "n": ["FDJVGXF02GRBNP" ] }, {"p": [[160, -7876.690000, 0.372253, 0.002004, 0.187208 ], [158, -7876.870000, 0.312337, 0.016226, 0.191141 ], [159, -7876.880000, 0.309272, 0.011123, 0.192022 ], [169, -7880.800000, 0.006138, 0.011285, 0.181256 ] ], "n": ["FDJVGXF02HAYK6" ] }, {"p": [[161, -6219.930000, 0.521295, 0.027813, 0.008801 ], [164, -6220.830000, 0.212142, 0.020699, 0.012836 ], [165, -6220.830000, 0.212119, 0.000007, 0.012830 ], [168, -6222.900000, 0.026610, 0.002042, 0.016115 ], [169, -6223.550000, 0.013919, 0.000006, 0.016524 ], [157, -6223.550000, 0.013915, 0.005887, 0.016526 ] ], "n": ["FDJVGXF02F0IC5_rvcmp" ] }, {"p": [[161, -6926.100000, 1.000000, 0.008717, 0.014845 ] ], "n": ["FDJVGXF02FLYFT_rvcmp" ] }, {"p": [[161, -6926.100000, 1.000000, 0.008717, 0.014845 ] ], "n": ["FDJVGXF02HI1P0_rvcmp" ] }, {"p": [[161, -6926.100000, 1.000000, 0.008717, 0.014845 ] ], "n": ["FDJVGXF02JKJ3D_rvcmp" ] }, {"p": [[161, -6288.740000, 1.000000, 0.010850, 0.024929 ] ], "n": ["FDJVGXF02IVUU7" ] }, {"p": [[161, -5737.840000, 0.650471, 0.004647, 0.112127 ], [196, -5739.380000, 0.139053, 0.036335, 0.103791 ], [154, -5740.540000, 0.043797, 0.029354, 0.121802 ], [169, -5740.540000, 0.043571, 0.023387, 0.122325 ], [149, -5740.550000, 0.043370, 0.043092, 0.084161 ], [199, -5740.630000, 0.039870, 0.000006, 0.124046 ], [197, -5740.630000, 0.039867, 0.024513, 0.124038 ] ], "n": ["FDJVGXF02HTII5" ] }, {"p": [[161, -5963.600000, 0.860014, 0.026497, 0.000006 ], [165, -5966.040000, 0.075135, 0.001160, 0.004849 ], [164, -5966.190000, 0.064851, 0.020699, 0.006286 ] ], "n": ["FDJVGXF02H9W9G_rvcmp" ] }, {"p": [[161, -6144.930000, 0.446643, 0.018291, 0.018020 ], [169, -6146.290000, 0.114166, 0.004877, 0.021623 ], [160, -6146.330000, 0.110043, 0.006315, 0.026606 ], [165, -6146.420000, 0.100037, 0.007352, 0.027796 ], [166, -6146.420000, 0.099932, 0.000008, 0.027802 ], [168, -6146.860000, 0.064621, 0.003612, 0.029158 ], [157, -6146.860000, 0.064558, 0.005887, 0.029158 ] ], "n": ["FDJVGXF02HLFPD" ] }, {"p": [[161, -5413.260000, 0.743543, 0.025576, 0.010146 ], [165, -5415.020000, 0.128234, 0.000007, 0.017550 ], [164, -5415.020000, 0.128223, 0.020699, 0.017560 ] ], "n": ["FDJVGXF02I1NT2" ] }, {"p": [[161, -4645.640000, 0.941948, 0.008701, 0.075608 ], [169, -4649.380000, 0.022462, 0.011641, 0.086883 ], [165, -4649.560000, 0.018764, 0.000007, 0.099298 ], [156, -4649.670000, 0.016826, 0.000005, 0.075802 ] ], "n": ["FDJVGXF02I8WRF" ] }, {"p": [[161, -3453.730000, 0.214001, 0.023442, 0.028623 ], [156, -3453.780000, 0.204259, 0.035062, 0.031769 ], [155, -3454.280000, 0.124157, 0.012865, 0.039573 ], [157, -3454.280000, 0.124150, 0.000006, 0.039579 ], [169, -3454.360000, 0.115011, 0.000008, 0.039933 ], [168, -3454.360000, 0.114882, 0.003611, 0.039935 ], [165, -3454.460000, 0.103541, 0.001173, 0.035074 ] ], "n": ["FDJVGXF02G2ZGA" ] }, {"p": [[161, -3866.160000, 0.614825, 0.025090, 0.000006 ], [159, -3866.810000, 0.323006, 0.000006, 0.008524 ], [165, -3869.140000, 0.031144, 0.000327, 0.007426 ], [164, -3869.150000, 0.031025, 0.020699, 0.007321 ] ], "n": ["FDJVGXF02H5SIY_rvcmp" ] }, {"p": [[161, -6128.550000, 0.245886, 0.009861, 0.188364 ], [166, -6129.000000, 0.157290, 0.000008, 0.191029 ], [165, -6129.000000, 0.157219, 0.007352, 0.191025 ], [160, -6129.000000, 0.157109, 0.007380, 0.191033 ], [168, -6129.030000, 0.152103, 0.000007, 0.191292 ], [159, -6129.670000, 0.080412, 0.000006, 0.197855 ], [157, -6130.140000, 0.049980, 0.005887, 0.198179 ] ], "n": ["FDJVGXF02GYKZ6_rvcmp" ] }, {"p": [[161, -3766.490000, 0.656314, 0.005787, 0.044256 ], [159, -3767.530000, 0.230642, 0.000006, 0.065994 ], [167, -3769.440000, 0.034128, 0.000008, 0.076588 ], [170, -3769.560000, 0.030429, 0.010506, 0.047641 ], [154, -3769.940000, 0.020729, 0.025343, 0.061762 ], [169, -3769.980000, 0.019977, 0.023387, 0.063447 ], [158, -3770.920000, 0.007781, 0.017418, 0.083734 ] ], "n": ["FDJVGXF02JLTK9_rvcmp" ] }, {"p": [[161, -3766.490000, 0.656314, 0.005787, 0.044256 ], [159, -3767.530000, 0.230642, 0.000006, 0.065994 ], [167, -3769.440000, 0.034128, 0.000008, 0.076588 ], [170, -3769.560000, 0.030429, 0.010506, 0.047641 ], [154, -3769.940000, 0.020729, 0.025343, 0.061762 ], [169, -3769.980000, 0.019977, 0.023387, 0.063447 ], [158, -3770.920000, 0.007781, 0.017418, 0.083734 ] ], "n": ["FDJVGXF02I9UQ7_rvcmp" ] }, {"p": [[161, -3766.490000, 0.656314, 0.005787, 0.044256 ], [159, -3767.530000, 0.230642, 0.000006, 0.065994 ], [167, -3769.440000, 0.034128, 0.000008, 0.076588 ], [170, -3769.560000, 0.030429, 0.010506, 0.047641 ], [154, -3769.940000, 0.020729, 0.025343, 0.061762 ], [169, -3769.980000, 0.019977, 0.023387, 0.063447 ], [158, -3770.920000, 0.007781, 0.017418, 0.083734 ] ], "n": ["FDJVGXF02F036B_rvcmp" ] }, {"p": [[161, -6424.560000, 0.209407, 0.024716, 0.208126 ], [169, -6424.680000, 0.187260, 0.014341, 0.197491 ], [164, -6425.020000, 0.132671, 0.020699, 0.212582 ], [165, -6425.020000, 0.132625, 0.000007, 0.212595 ], [170, -6425.080000, 0.124432, 0.012556, 0.185431 ], [171, -6425.140000, 0.117248, 0.007901, 0.188959 ], [190, -6425.340000, 0.096357, 0.017843, 0.185425 ] ], "n": ["FDJVGXF02GZLH0_rvcmp" ] }, {"p": [[161, -3619.880000, 0.635596, 0.005588, 0.046791 ], [159, -3620.840000, 0.244866, 0.000006, 0.068988 ], [167, -3622.700000, 0.037884, 0.000008, 0.080104 ], [170, -3622.930000, 0.030056, 0.010035, 0.051534 ], [154, -3623.260000, 0.021678, 0.025721, 0.065383 ], [169, -3623.290000, 0.021021, 0.023387, 0.067014 ], [158, -3624.150000, 0.008899, 0.017418, 0.087760 ] ], "n": ["FDJVGXF02I3YOZ_rvcmp" ] }, {"p": [[164, -5150.580000, 0.420962, 0.016777, 0.028248 ], [165, -5151.500000, 0.167991, 0.000007, 0.032379 ], [161, -5151.500000, 0.167841, 0.032465, 0.032383 ], [169, -5151.570000, 0.156979, 0.007596, 0.026288 ], [155, -5153.160000, 0.032142, 0.007324, 0.036034 ], [168, -5153.210000, 0.030599, 0.003612, 0.039637 ], [166, -5153.470000, 0.023487, 0.001999, 0.040964 ] ], "n": ["FDJVGXF02FFCT2" ] }, {"p": [[165, -8005.550000, 0.207691, 0.004170, 0.007175 ], [156, -8005.770000, 0.166102, 0.041514, 0.009456 ], [169, -8005.860000, 0.152473, 0.002855, 0.009217 ], [155, -8005.870000, 0.150310, 0.008837, 0.012020 ], [157, -8006.100000, 0.119783, 0.000006, 0.012017 ], [168, -8006.180000, 0.110139, 0.003612, 0.012015 ], [158, -8006.350000, 0.093502, 0.007662, 0.010597 ] ], "n": ["FDJVGXF02JPOIP_rvcmp" ] }, {"p": [[167, -5767.250000, 0.269865, 0.026857, 0.055666 ], [168, -5767.920000, 0.136934, 0.000007, 0.062368 ], [166, -5767.920000, 0.136924, 0.001999, 0.062366 ], [160, -5767.990000, 0.128683, 0.006910, 0.061613 ], [165, -5768.010000, 0.125780, 0.007352, 0.062428 ], [157, -5768.100000, 0.114266, 0.005887, 0.064079 ], [155, -5768.370000, 0.087549, 0.007464, 0.062059 ] ], "n": ["FDJVGXF02IH15Z" ] }, {"p": [[168, -7448.880000, 0.479271, 0.002096, 0.000006 ], [169, -7449.600000, 0.233278, 0.000006, 0.000006 ], [157, -7449.600000, 0.233201, 0.005887, 0.000006 ], [166, -7451.270000, 0.043769, 0.001999, 0.000006 ], [156, -7452.700000, 0.010480, 0.043598, 0.000006 ] ], "n": ["FDJVGXF02I99VH_rvcmp" ] }, {"p": [[168, -7163.610000, 0.479191, 0.002097, 0.000006 ], [169, -7164.330000, 0.233290, 0.000006, 0.000006 ], [157, -7164.330000, 0.233216, 0.005887, 0.000006 ], [166, -7166.010000, 0.043747, 0.001999, 0.000006 ], [156, -7167.430000, 0.010557, 0.043598, 0.000006 ] ], "n": ["FDJVGXF02JVAVQ_rvcmp" ] }, {"p": [[168, -4997.300000, 0.479345, 0.002101, 0.000006 ], [169, -4998.020000, 0.233211, 0.000006, 0.000006 ], [157, -4998.020000, 0.233126, 0.005887, 0.000006 ], [166, -4999.690000, 0.043770, 0.001999, 0.000006 ], [156, -5001.110000, 0.010547, 0.043598, 0.000006 ] ], "n": ["FDJVGXF02F1QQL" ] }, {"p": [[169, -8158.120000, 0.427070, 0.007854, 0.015535 ], [161, -8158.260000, 0.372116, 0.024220, 0.015895 ], [170, -8159.600000, 0.097440, 0.007353, 0.006866 ], [168, -8160.070000, 0.060917, 0.002572, 0.020565 ], [157, -8160.750000, 0.030880, 0.005887, 0.021449 ], [165, -8161.730000, 0.011577, 0.002038, 0.021971 ] ], "n": ["FDJVGXF02GQD9D_rvcmp" ] }, {"p": [[169, -4691.150000, 0.280434, 0.023387, 0.013094 ], [154, -4691.150000, 0.280400, 0.030340, 0.013094 ], [170, -4691.150000, 0.280115, 0.000009, 0.013095 ], [157, -4693.020000, 0.043236, 0.000006, 0.019249 ], [156, -4693.020000, 0.043233, 0.043598, 0.019253 ], [155, -4693.020000, 0.043233, 0.012865, 0.019253 ], [168, -4693.400000, 0.029348, 0.003612, 0.019324 ] ], "n": ["FDJVGXF02IBQ2O" ] }, {"p": [[169, -4829.620000, 0.869378, 0.012846, 0.009776 ], [164, -4832.130000, 0.070968, 0.017400, 0.022686 ], [165, -4832.590000, 0.044455, 0.000007, 0.026688 ], [160, -4833.670000, 0.015199, 0.004809, 0.029031 ] ], "n": ["FDJVGXF02HVGWV" ] }, {"p": [[170, -8901.680000, 0.408155, 0.010058, 0.099148 ], [161, -8902.310000, 0.217361, 0.005360, 0.103179 ], [196, -8902.390000, 0.199481, 0.034406, 0.084643 ], [171, -8903.490000, 0.066756, 0.004831, 0.099888 ], [149, -8903.650000, 0.056657, 0.061201, 0.099840 ], [169, -8904.260000, 0.030781, 0.017424, 0.106264 ], [154, -8904.650000, 0.020809, 0.030342, 0.109432 ] ], "n": ["FDJVGXF02HKNTY_rvcmp" ] }, {"p": [[174, -8788.210000, 0.185197, 0.000006, 0.399529 ], [26, -8788.330000, 0.164750, 0.048859, 0.358105 ], [181, -8788.470000, 0.142972, 0.037176, 0.412286 ], [178, -8788.470000, 0.142964, 0.004073, 0.412285 ], [182, -8788.470000, 0.142925, 0.000007, 0.412285 ], [176, -8788.630000, 0.122106, 0.006160, 0.413440 ], [40, -8788.830000, 0.099085, 0.030383, 0.402802 ] ], "n": ["FDJVGXF02H2TBT" ] }, {"p": [[175, -4324.250000, 0.375812, 0.000005, 0.269026 ], [174, -4325.340000, 0.126879, 0.000005, 0.273036 ], [176, -4325.340000, 0.126492, 0.000006, 0.278228 ], [121, -4325.370000, 0.122809, 0.021311, 0.332987 ], [185, -4325.760000, 0.083236, 0.000001, 0.304791 ], [184, -4325.760000, 0.083235, 0.000001, 0.304783 ], [177, -4325.780000, 0.081537, 0.000007, 0.263412 ] ], "n": ["FDJVGXF02IRJEQ_rvcmp" ] }, {"p": [[177, -6292.140000, 0.676388, 0.000009, 0.810551 ], [175, -6293.900000, 0.116066, 0.000005, 0.804112 ], [188, -6294.580000, 0.059003, 0.026505, 0.881979 ], [218, -6294.760000, 0.049250, 0.000008, 0.806343 ], [148, -6295.080000, 0.035666, 0.077324, 0.533050 ], [171, -6295.180000, 0.032326, 0.034630, 0.912714 ], [40, -6295.210000, 0.031300, 0.086918, 0.919065 ] ], "n": ["FDJVGXF02GVNAG_rvcmp" ] }, {"p": [[183, -6697.560000, 0.496954, 0.009440, 0.108176 ], [187, -6698.390000, 0.215686, 0.003395, 0.119355 ], [186, -6699.170000, 0.098644, 0.007024, 0.121902 ], [173, -6699.660000, 0.060760, 0.019346, 0.119902 ], [182, -6699.710000, 0.057728, 0.007651, 0.120743 ], [188, -6699.840000, 0.050690, 0.018254, 0.113518 ], [172, -6700.790000, 0.019537, 0.008421, 0.130820 ] ], "n": ["FDJVGXF02H8YC8" ] }, {"p": [[185, -4809.320000, 0.236688, 0.000001, 0.216500 ], [184, -4809.320000, 0.236658, 0.000001, 0.216499 ], [186, -4809.320000, 0.236436, 0.000009, 0.216496 ], [172, -4810.370000, 0.082061, 0.000008, 0.203026 ], [188, -4810.460000, 0.075094, 0.000008, 0.210746 ], [187, -4810.460000, 0.075088, 0.011025, 0.210755 ], [175, -4810.720000, 0.057975, 0.000005, 0.236229 ] ], "n": ["FDJVGXF02GUQOV_rvcmp" ] }, {"p": [[186, -7918.770000, 0.315155, 0.000705, 0.213972 ], [184, -7918.780000, 0.310255, 0.000001, 0.215621 ], [185, -7918.780000, 0.310255, 0.000001, 0.215621 ], [190, -7921.020000, 0.033263, 0.016135, 0.217438 ], [179, -7922.130000, 0.010929, 0.006945, 0.212617 ], [183, -7922.170000, 0.010470, 0.017025, 0.223864 ], [188, -7922.250000, 0.009673, 0.031389, 0.212486 ] ], "n": ["FDJVGXF02GPTF2_rvcmp" ] }, {"p": [[188, -7372.460000, 0.259570, 0.026169, 0.076980 ], [183, -7372.580000, 0.229762, 0.013559, 0.081266 ], [189, -7372.650000, 0.213831, 0.080377, 0.069819 ], [186, -7373.220000, 0.120485, 0.007776, 0.087438 ], [187, -7373.310000, 0.110186, 0.000005, 0.089122 ], [172, -7374.100000, 0.050030, 0.008421, 0.091391 ], [190, -7375.230000, 0.016136, 0.000008, 0.079773 ] ], "n": ["FDJVGXF02IQ0SO" ] }, {"p": [[188, -4387.080000, 0.458220, 0.027776, 0.182461 ], [148, -4387.650000, 0.259694, 0.115871, 0.151545 ], [26, -4388.250000, 0.142347, 0.024017, 0.189318 ], [190, -4388.600000, 0.100311, 0.000008, 0.208618 ], [149, -4390.330000, 0.017729, 0.020550, 0.213347 ], [173, -4390.820000, 0.010849, 0.022616, 0.207393 ], [183, -4390.820000, 0.010849, 0.000009, 0.207398 ] ], "n": ["FDJVGXF02FLSTT_rvcmp" ] }, {"p": [[188, -4387.080000, 0.458220, 0.027776, 0.182461 ], [148, -4387.650000, 0.259694, 0.115871, 0.151545 ], [26, -4388.250000, 0.142347, 0.024017, 0.189318 ], [190, -4388.600000, 0.100311, 0.000008, 0.208618 ], [149, -4390.330000, 0.017729, 0.020550, 0.213347 ], [173, -4390.820000, 0.010849, 0.022616, 0.207393 ], [183, -4390.820000, 0.010849, 0.000009, 0.207398 ] ], "n": ["FDJVGXF02GAZVW_rvcmp" ] }, {"p": [[189, -7919.010000, 0.816972, 0.040592, 0.100344 ], [27, -7921.080000, 0.103455, 0.037873, 0.134848 ], [190, -7921.860000, 0.047432, 0.022936, 0.128908 ], [171, -7922.250000, 0.032140, 0.034630, 0.134695 ] ], "n": ["FDJVGXF02FI7RZ" ] }, {"p": [[189, -7885.800000, 0.254554, 0.087707, 0.238223 ], [190, -7885.960000, 0.216944, 0.005966, 0.244893 ], [188, -7885.980000, 0.211932, 0.052299, 0.246601 ], [40, -7886.050000, 0.199244, 0.054173, 0.229432 ], [192, -7887.400000, 0.051690, 0.008067, 0.243862 ], [191, -7887.530000, 0.045371, 0.008980, 0.248132 ], [38, -7888.330000, 0.020264, 0.052139, 0.213129 ] ], "n": ["FDJVGXF02HJ9TM" ] }, {"p": [[189, -5300.130000, 0.577815, 0.000006, 0.311887 ], [190, -5301.730000, 0.116752, 0.005694, 0.354750 ], [188, -5301.760000, 0.113746, 0.052299, 0.357801 ], [191, -5302.410000, 0.059059, 0.000008, 0.363581 ], [171, -5302.410000, 0.059042, 0.034630, 0.363598 ], [27, -5302.800000, 0.039950, 0.011701, 0.391885 ], [39, -5302.970000, 0.033636, 0.000006, 0.349238 ] ], "n": ["FDJVGXF02FM417" ] }, {"p": [[190, -8574.590000, 0.536775, 0.014399, 0.057818 ], [189, -8575.380000, 0.242974, 0.087494, 0.052558 ], [188, -8576.320000, 0.094365, 0.052299, 0.059149 ], [39, -8576.620000, 0.070201, 0.020363, 0.067589 ], [191, -8577.910000, 0.019336, 0.000008, 0.067985 ], [171, -8577.910000, 0.019330, 0.034630, 0.067983 ], [192, -8578.040000, 0.017018, 0.022464, 0.070803 ] ], "n": ["FDJVGXF02FUTY4" ] }, {"p": [[190, -7075.940000, 0.599287, 0.014925, 0.062418 ], [189, -7076.790000, 0.255070, 0.081152, 0.055512 ], [188, -7077.760000, 0.096608, 0.052299, 0.064090 ], [171, -7079.130000, 0.024523, 0.034630, 0.074326 ], [191, -7079.130000, 0.024512, 0.000008, 0.074330 ] ], "n": ["FDJVGXF02JJHC3" ] }, {"p": [[190, -7760.450000, 0.278600, 0.034335, 0.111630 ], [171, -7760.450000, 0.278566, 0.034630, 0.111632 ], [191, -7760.450000, 0.278504, 0.000008, 0.111635 ], [192, -7761.860000, 0.067703, 0.000005, 0.116052 ], [40, -7761.860000, 0.067693, 0.086918, 0.116049 ], [39, -7762.940000, 0.023045, 0.020498, 0.118787 ], [127, -7764.300000, 0.005889, 0.023560, 0.087174 ] ], "n": ["FDJVGXF02GBTVY" ] }, {"p": [[190, -7472.430000, 0.659552, 0.015072, 0.086698 ], [188, -7474.040000, 0.132465, 0.048372, 0.087250 ], [189, -7474.080000, 0.126011, 0.096144, 0.088590 ], [171, -7475.210000, 0.041000, 0.034630, 0.097468 ], [191, -7475.210000, 0.040971, 0.000008, 0.097469 ] ], "n": ["FDJVGXF02JDX99" ] }, {"p": [[190, -6659.770000, 0.280672, 0.021113, 0.140354 ], [171, -6660.050000, 0.211938, 0.034630, 0.147806 ], [191, -6660.050000, 0.211934, 0.000008, 0.147810 ], [188, -6660.380000, 0.152103, 0.039650, 0.137680 ], [40, -6661.330000, 0.059289, 0.069872, 0.144657 ], [189, -6661.390000, 0.055614, 0.096145, 0.140748 ], [192, -6662.060000, 0.028450, 0.003064, 0.157671 ] ], "n": ["FDJVGXF02IRTQS" ] }, {"p": [[190, -5790.870000, 0.303251, 0.023145, 0.166701 ], [171, -5791.140000, 0.230902, 0.034630, 0.172600 ], [191, -5791.140000, 0.230894, 0.000008, 0.172603 ], [189, -5792.200000, 0.080307, 0.069194, 0.161475 ], [27, -5792.240000, 0.076629, 0.021372, 0.194082 ], [188, -5792.560000, 0.055908, 0.044027, 0.175566 ], [184, -5793.490000, 0.022108, 0.000001, 0.205985 ] ], "n": ["FDJVGXF02H6FKQ_rvcmp" ] }, {"p": [[190, -5560.500000, 0.512081, 0.018954, 0.058462 ], [171, -5560.940000, 0.331602, 0.020125, 0.068004 ], [189, -5563.030000, 0.040804, 0.085391, 0.053645 ], [149, -5563.090000, 0.038504, 0.055525, 0.072390 ], [40, -5563.320000, 0.030603, 0.060141, 0.076431 ], [188, -5563.550000, 0.024374, 0.047113, 0.063448 ], [153, -5563.650000, 0.022032, 0.014643, 0.080210 ] ], "n": ["FDJVGXF02HW5K5_rvcmp" ] }, {"p": [[190, -6606.100000, 0.289869, 0.012497, 0.275877 ], [189, -6606.340000, 0.226932, 0.096145, 0.280584 ], [188, -6606.340000, 0.226903, 0.052299, 0.280585 ], [191, -6607.450000, 0.074618, 0.000008, 0.298160 ], [171, -6607.450000, 0.074603, 0.034630, 0.298163 ], [192, -6607.730000, 0.056498, 0.004060, 0.304881 ], [40, -6607.840000, 0.050576, 0.086918, 0.304892 ] ], "n": ["FDJVGXF02FNUCN" ] }, {"p": [[190, -3165.260000, 0.210961, 0.010440, 0.069307 ], [204, -3165.330000, 0.196564, 0.010427, 0.077556 ], [189, -3165.590000, 0.151919, 0.088661, 0.066972 ], [188, -3165.650000, 0.143727, 0.050103, 0.069187 ], [198, -3165.800000, 0.123581, 0.000006, 0.095099 ], [26, -3166.040000, 0.096520, 0.059987, 0.076397 ], [25, -3166.270000, 0.076728, 0.011501, 0.090580 ] ], "n": ["FDJVGXF02GP2GU_rvcmp" ] }, {"p": [[191, -5414.880000, 0.284176, 0.000377, 0.163598 ], [171, -5414.880000, 0.283686, 0.034630, 0.163828 ], [190, -5414.880000, 0.283642, 0.034335, 0.163823 ], [27, -5415.820000, 0.110858, 0.000009, 0.188526 ], [192, -5417.770000, 0.015732, 0.001579, 0.177679 ], [40, -5417.790000, 0.015487, 0.086918, 0.178991 ], [189, -5418.670000, 0.006421, 0.039150, 0.171791 ] ], "n": ["FDJVGXF02HMFXK" ] }, {"p": [[192, -8922.270000, 0.186198, 0.022464, 0.218093 ], [39, -8922.270000, 0.186055, 0.025399, 0.218096 ], [190, -8922.400000, 0.163430, 0.034335, 0.215159 ], [171, -8922.400000, 0.163404, 0.034630, 0.215158 ], [191, -8922.400000, 0.163401, 0.000008, 0.215168 ], [27, -8923.120000, 0.079983, 0.027262, 0.225892 ], [40, -8923.450000, 0.057529, 0.083213, 0.220729 ] ], "n": ["FDJVGXF02F1D4W_rvcmp" ] }, {"p": [[193, -7391.120000, 0.186054, 0.000937, 0.198033 ], [192, -7391.120000, 0.184992, 0.022464, 0.199135 ], [29, -7391.290000, 0.155648, 0.031159, 0.176379 ], [40, -7391.320000, 0.152330, 0.073341, 0.194923 ], [33, -7391.610000, 0.113274, 0.012211, 0.185323 ], [191, -7391.670000, 0.106925, 0.012299, 0.203018 ], [28, -7391.730000, 0.100776, 0.048759, 0.187064 ] ], "n": ["FDJVGXF02ITXCI_rvcmp" ] }, {"p": [[195, -6093.600000, 0.421795, 0.007174, 0.058061 ], [196, -6093.760000, 0.357958, 0.008910, 0.055320 ], [35, -6095.470000, 0.065146, 0.013080, 0.067836 ], [194, -6095.470000, 0.065082, 0.006696, 0.067837 ], [22, -6095.590000, 0.057386, 0.006702, 0.047955 ], [20, -6096.610000, 0.020725, 0.000007, 0.056003 ], [21, -6097.170000, 0.011908, 0.017641, 0.054212 ] ], "n": ["FDJVGXF02HZ3TW" ] }, {"p": [[196, -8809.850000, 0.654365, 0.034227, 0.062942 ], [20, -8810.640000, 0.297178, 0.002143, 0.068102 ], [21, -8813.190000, 0.023227, 0.008318, 0.069372 ], [22, -8813.780000, 0.012870, 0.000303, 0.071342 ], [19, -8813.820000, 0.012361, 0.012620, 0.072652 ] ], "n": ["FDJVGXF02HV8UI" ] }, {"p": [[196, -7961.580000, 0.282986, 0.053940, 0.044954 ], [204, -7961.850000, 0.216619, 0.006170, 0.054211 ], [22, -7961.940000, 0.198175, 0.007165, 0.045084 ], [200, -7962.710000, 0.092066, 0.012685, 0.059667 ], [203, -7962.710000, 0.091879, 0.009988, 0.059681 ], [20, -7962.810000, 0.083131, 0.000005, 0.051403 ], [21, -7963.670000, 0.035144, 0.017641, 0.050053 ] ], "n": ["FDJVGXF02GTJG6_rvcmp" ] }, {"p": [[196, -8482.890000, 1.000000, 0.026770, 0.023942 ] ], "n": ["FDJVGXF02GCGBC_rvcmp" ] }, {"p": [[196, -9227.910000, 0.548940, 0.015125, 0.095074 ], [26, -9228.640000, 0.264597, 0.088510, 0.099037 ], [195, -9228.990000, 0.186463, 0.009446, 0.108184 ] ], "n": ["FDJVGXF02H6FMM" ] }, {"p": [[196, -9128.930000, 0.516168, 0.015334, 0.101966 ], [26, -9129.890000, 0.197918, 0.093599, 0.111507 ], [195, -9129.950000, 0.187413, 0.009446, 0.115151 ], [28, -9130.750000, 0.083647, 0.020652, 0.109386 ], [34, -9132.910000, 0.009686, 0.007880, 0.121196 ], [35, -9133.540000, 0.005168, 0.002530, 0.124675 ] ], "n": ["FDJVGXF02GCAOE_rvcmp" ] }, {"p": [[196, -9070.680000, 0.548104, 0.016653, 0.087700 ], [26, -9071.190000, 0.328624, 0.082531, 0.087977 ], [195, -9072.170000, 0.123273, 0.009446, 0.101920 ] ], "n": ["FDJVGXF02H7LXG" ] }, {"p": [[196, -8887.370000, 0.543554, 0.031610, 0.057491 ], [20, -8887.720000, 0.382836, 0.002118, 0.063242 ], [21, -8890.310000, 0.028636, 0.008249, 0.064241 ], [22, -8890.950000, 0.015185, 0.000008, 0.066311 ], [18, -8890.950000, 0.015175, 0.051699, 0.066314 ], [19, -8890.980000, 0.014614, 0.012620, 0.067540 ] ], "n": ["FDJVGXF02IHEZI" ] }, {"p": [[196, -8887.370000, 0.543554, 0.031610, 0.057491 ], [20, -8887.720000, 0.382836, 0.002118, 0.063242 ], [21, -8890.310000, 0.028636, 0.008249, 0.064241 ], [22, -8890.950000, 0.015185, 0.000008, 0.066311 ], [18, -8890.950000, 0.015175, 0.051699, 0.066314 ], [19, -8890.980000, 0.014614, 0.012620, 0.067540 ] ], "n": ["FDJVGXF02IOV8S" ] }, {"p": [[196, -8514.960000, 1.000000, 0.029846, 0.020268 ] ], "n": ["FDJVGXF02JFT42" ] }, {"p": [[196, -8338.640000, 0.979567, 0.027022, 0.022092 ], [205, -8342.510000, 0.020433, 0.018693, 0.038041 ] ], "n": ["FDJVGXF02GZ0E1_rvcmp" ] }, {"p": [[196, -8829.800000, 0.537653, 0.031647, 0.064045 ], [20, -8830.100000, 0.398528, 0.002132, 0.068792 ], [21, -8832.670000, 0.030529, 0.008227, 0.070122 ], [22, -8833.270000, 0.016789, 0.000009, 0.072215 ], [19, -8833.290000, 0.016502, 0.012620, 0.073426 ] ], "n": ["FDJVGXF02H1V68_rvcmp" ] }, {"p": [[196, -9026.770000, 0.747175, 0.020137, 0.077925 ], [26, -9028.430000, 0.142979, 0.089633, 0.086683 ], [195, -9028.690000, 0.109846, 0.009446, 0.093528 ] ], "n": ["FDJVGXF02HK7IC" ] }, {"p": [[196, -8772.880000, 0.832318, 0.027572, 0.083408 ], [18, -8775.500000, 0.060836, 0.042487, 0.092237 ], [22, -8775.830000, 0.043650, 0.004342, 0.097125 ], [21, -8776.060000, 0.034459, 0.017640, 0.100748 ], [226, -8776.250000, 0.028737, 0.016901, 0.087665 ] ], "n": ["FDJVGXF02FSSZZ" ] }, {"p": [[196, -8313.020000, 0.931547, 0.046747, 0.062265 ], [204, -8315.830000, 0.056240, 0.007578, 0.073567 ], [20, -8317.350000, 0.012214, 0.000007, 0.074844 ] ], "n": ["FDJVGXF02F6EI8_rvcmp" ] }, {"p": [[196, -8866.540000, 0.546881, 0.031580, 0.057658 ], [20, -8866.900000, 0.379951, 0.002125, 0.063395 ], [21, -8869.490000, 0.028443, 0.008249, 0.064409 ], [22, -8870.130000, 0.015098, 0.000008, 0.066482 ], [18, -8870.130000, 0.015088, 0.051699, 0.066486 ], [19, -8870.160000, 0.014538, 0.012620, 0.067712 ] ], "n": ["FDJVGXF02FK2T6" ] }, {"p": [[196, -7543.470000, 0.682801, 0.052770, 0.036897 ], [202, -7544.520000, 0.237966, 0.040906, 0.038409 ], [204, -7546.120000, 0.048265, 0.008112, 0.053051 ], [20, -7547.040000, 0.019216, 0.000007, 0.063159 ], [203, -7547.530000, 0.011752, 0.009992, 0.059308 ] ], "n": ["FDJVGXF02IW454" ] }, {"p": [[196, -8980.700000, 0.506767, 0.015007, 0.104492 ], [26, -8981.340000, 0.265599, 0.088456, 0.108596 ], [195, -8981.650000, 0.195136, 0.009446, 0.117722 ], [28, -8983.440000, 0.032498, 0.011801, 0.118231 ] ], "n": ["FDJVGXF02IHO2F_rvcmp" ] }, {"p": [[196, -7915.300000, 1.000000, 0.041785, 0.033621 ] ], "n": ["FDJVGXF02GNBQJ" ] }, {"p": [[196, -8755.910000, 0.738720, 0.063985, 0.091237 ], [197, -8757.970000, 0.094179, 0.019097, 0.107466 ], [198, -8758.010000, 0.090475, 0.009866, 0.107950 ], [199, -8758.180000, 0.076626, 0.004034, 0.108207 ] ], "n": ["FDJVGXF02GWQF3" ] }, {"p": [[196, -7753.030000, 1.000000, 0.057354, 0.081151 ] ], "n": ["FDJVGXF02I8X2Z" ] }, {"p": [[196, -7688.790000, 0.871839, 0.058636, 0.046894 ], [198, -7691.660000, 0.049193, 0.000006, 0.070853 ], [204, -7691.840000, 0.041198, 0.007931, 0.061286 ], [200, -7692.790000, 0.016000, 0.007900, 0.065285 ], [203, -7693.100000, 0.011728, 0.009988, 0.067540 ], [199, -7693.250000, 0.010043, 0.013298, 0.067244 ] ], "n": ["FDJVGXF02HSVL8" ] }, {"p": [[196, -8028.220000, 0.968546, 0.055350, 0.049784 ], [198, -8032.020000, 0.021685, 0.000006, 0.076852 ], [204, -8032.810000, 0.009769, 0.004972, 0.068562 ] ], "n": ["FDJVGXF02I4V5F_rvcmp" ] }, {"p": [[196, -7889.360000, 0.565839, 0.050336, 0.060226 ], [204, -7889.960000, 0.309812, 0.007864, 0.067671 ], [200, -7891.630000, 0.058692, 0.012685, 0.078665 ], [203, -7891.630000, 0.058657, 0.009988, 0.078674 ], [202, -7893.750000, 0.007001, 0.054444, 0.077269 ] ], "n": ["FDJVGXF02HOUCZ_rvcmp" ] }, {"p": [[196, -7700.920000, 1.000000, 0.057368, 0.081568 ] ], "n": ["FDJVGXF02I84EL" ] }, {"p": [[196, -7793.980000, 0.923067, 0.063042, 0.081199 ], [198, -7797.160000, 0.038656, 0.003789, 0.101114 ], [199, -7797.800000, 0.020262, 0.013298, 0.100778 ], [197, -7797.920000, 0.018015, 0.017018, 0.100569 ] ], "n": ["FDJVGXF02HLEEZ" ] }, {"p": [[196, -8001.590000, 0.976398, 0.027037, 0.023547 ], [205, -8005.310000, 0.023602, 0.018679, 0.040011 ] ], "n": ["FDJVGXF02JIC7T_rvcmp" ] }, {"p": [[196, -7934.540000, 0.973773, 0.050315, 0.081416 ], [198, -7938.700000, 0.015198, 0.003151, 0.106421 ], [200, -7939.020000, 0.011029, 0.002747, 0.101774 ] ], "n": ["FDJVGXF02F3MP3_rvcmp" ] }, {"p": [[196, -7737.460000, 1.000000, 0.041850, 0.068590 ] ], "n": ["FDJVGXF02G3LTF_rvcmp" ] }, {"p": [[196, -7763.080000, 0.342670, 0.064950, 0.091551 ], [199, -7763.620000, 0.200481, 0.013298, 0.100991 ], [200, -7763.620000, 0.200378, 0.000006, 0.100988 ], [158, -7764.640000, 0.072420, 0.014651, 0.097618 ], [164, -7764.750000, 0.064598, 0.013180, 0.098270 ], [159, -7764.790000, 0.062405, 0.000006, 0.100204 ], [154, -7764.880000, 0.057047, 0.015820, 0.099669 ] ], "n": ["FDJVGXF02JGWV1_rvcmp" ] }, {"p": [[196, -7763.080000, 0.342670, 0.064950, 0.091551 ], [199, -7763.620000, 0.200481, 0.013298, 0.100991 ], [200, -7763.620000, 0.200378, 0.000006, 0.100988 ], [158, -7764.640000, 0.072420, 0.014651, 0.097618 ], [164, -7764.750000, 0.064598, 0.013180, 0.098270 ], [159, -7764.790000, 0.062405, 0.000006, 0.100204 ], [154, -7764.880000, 0.057047, 0.015820, 0.099669 ] ], "n": ["FDJVGXF02HB03U_rvcmp" ] }, {"p": [[196, -7903.390000, 0.555956, 0.015895, 0.091525 ], [26, -7904.160000, 0.257659, 0.087612, 0.095510 ], [195, -7904.490000, 0.186385, 0.009446, 0.104625 ] ], "n": ["FDJVGXF02I0OMG" ] }, {"p": [[196, -7235.090000, 0.446537, 0.071550, 0.070452 ], [197, -7235.570000, 0.275443, 0.015203, 0.075380 ], [199, -7236.560000, 0.102527, 0.006987, 0.078966 ], [200, -7236.680000, 0.090317, 0.000006, 0.078111 ], [198, -7236.740000, 0.085176, 0.013117, 0.082302 ] ], "n": ["FDJVGXF02F484A" ] }, {"p": [[196, -7321.920000, 1.000000, 0.029396, 0.026666 ] ], "n": ["FDJVGXF02GA8P7" ] }, {"p": [[196, -7321.920000, 1.000000, 0.029396, 0.026666 ] ], "n": ["FDJVGXF02JQ95E_rvcmp" ] }, {"p": [[196, -7234.640000, 1.000000, 0.029362, 0.024484 ] ], "n": ["FDJVGXF02GFHVP_rvcmp" ] }, {"p": [[196, -6706.160000, 0.447936, 0.039504, 0.078514 ], [204, -6707.080000, 0.178594, 0.004670, 0.088343 ], [200, -6707.470000, 0.121342, 0.012685, 0.094204 ], [203, -6707.470000, 0.121139, 0.009988, 0.094209 ], [195, -6708.080000, 0.065750, 0.009446, 0.092317 ], [20, -6708.610000, 0.038690, 0.000007, 0.081718 ], [199, -6708.990000, 0.026549, 0.010371, 0.096663 ] ], "n": ["FDJVGXF02FDO26" ] }, {"p": [[196, -6097.010000, 0.336301, 0.018745, 0.059336 ], [20, -6097.430000, 0.221249, 0.000005, 0.055913 ], [21, -6098.220000, 0.100175, 0.000009, 0.056766 ], [19, -6098.220000, 0.100057, 0.012620, 0.056768 ], [22, -6098.350000, 0.088027, 0.000009, 0.056061 ], [18, -6098.350000, 0.087988, 0.051699, 0.056063 ], [204, -6098.640000, 0.066203, 0.005515, 0.067399 ] ], "n": ["FDJVGXF02FUK1Z" ] }, {"p": [[196, -5914.230000, 0.276726, 0.053576, 0.070774 ], [204, -5914.500000, 0.209663, 0.009682, 0.078431 ], [20, -5914.540000, 0.202477, 0.000005, 0.067201 ], [205, -5915.220000, 0.102008, 0.019428, 0.062940 ], [21, -5915.600000, 0.069789, 0.000009, 0.068721 ], [19, -5915.610000, 0.069681, 0.012620, 0.068724 ], [22, -5915.610000, 0.069655, 0.004274, 0.065908 ] ], "n": ["FDJVGXF02H75N6_rvcmp" ] }, {"p": [[196, -5478.070000, 0.270880, 0.050535, 0.048190 ], [25, -5478.240000, 0.227170, 0.013270, 0.060948 ], [205, -5478.280000, 0.219259, 0.000007, 0.061625 ], [204, -5478.280000, 0.219202, 0.020144, 0.061626 ], [202, -5480.170000, 0.033097, 0.037692, 0.051426 ], [226, -5480.520000, 0.023311, 0.023104, 0.051055 ], [24, -5481.710000, 0.007082, 0.000009, 0.077917 ] ], "n": ["FDJVGXF02I9B7H_rvcmp" ] }, {"p": [[196, -5462.740000, 0.447923, 0.052941, 0.073386 ], [198, -5462.990000, 0.348375, 0.000006, 0.092817 ], [206, -5465.080000, 0.043133, 0.000001, 0.100301 ], [207, -5465.080000, 0.043133, 0.000001, 0.100301 ], [208, -5465.080000, 0.043129, 0.000006, 0.100297 ], [204, -5465.230000, 0.037246, 0.019138, 0.093986 ], [205, -5465.240000, 0.037059, 0.000009, 0.094134 ] ], "n": ["FDJVGXF02IT7U0" ] }, {"p": [[196, -6640.670000, 1.000000, 0.029480, 0.027799 ] ], "n": ["FDJVGXF02JPXGS" ] }, {"p": [[196, -5744.200000, 0.826062, 0.056879, 0.114279 ], [199, -5746.860000, 0.057557, 0.013298, 0.138360 ], [200, -5746.860000, 0.057552, 0.000006, 0.138359 ], [198, -5747.340000, 0.035691, 0.003066, 0.145291 ], [197, -5747.770000, 0.023138, 0.013820, 0.144563 ] ], "n": ["FDJVGXF02H2YWV_rvcmp" ] }, {"p": [[196, -6455.250000, 0.773997, 0.040929, 0.059852 ], [170, -6457.280000, 0.101472, 0.013957, 0.093153 ], [171, -6457.600000, 0.074256, 0.007423, 0.091332 ], [149, -6457.990000, 0.050274, 0.063741, 0.095190 ] ], "n": ["FDJVGXF02FD1KI" ] }, {"p": [[196, -5840.320000, 0.986358, 0.023177, 0.023516 ], [34, -5844.600000, 0.013642, 0.009832, 0.049461 ] ], "n": ["FDJVGXF02GFSBX_rvcmp" ] }, {"p": [[196, -6933.800000, 0.326027, 0.030665, 0.327534 ], [202, -6934.590000, 0.148581, 0.030180, 0.339475 ], [26, -6934.810000, 0.119046, 0.097406, 0.362252 ], [18, -6934.900000, 0.108701, 0.000006, 0.349953 ], [204, -6934.990000, 0.099246, 0.000010, 0.365485 ], [203, -6934.990000, 0.099203, 0.009988, 0.365482 ], [200, -6934.990000, 0.099197, 0.012685, 0.365488 ] ], "n": ["FDJVGXF02F2Q2N_rvcmp" ] }, {"p": [[196, -4233.620000, 0.441152, 0.055313, 0.033392 ], [204, -4234.290000, 0.225609, 0.004143, 0.041557 ], [200, -4234.880000, 0.125283, 0.012685, 0.048187 ], [203, -4234.880000, 0.125095, 0.009988, 0.048189 ], [199, -4235.750000, 0.052386, 0.013298, 0.051075 ], [197, -4236.980000, 0.015238, 0.024513, 0.062757 ], [198, -4236.990000, 0.015237, 0.013117, 0.062753 ] ], "n": ["FDJVGXF02JMUNU_rvcmp" ] }, {"p": [[196, -5548.500000, 0.833120, 0.019455, 0.029487 ], [38, -5550.970000, 0.070599, 0.035877, 0.054971 ], [35, -5551.470000, 0.042910, 0.004163, 0.056927 ], [194, -5551.900000, 0.027676, 0.000007, 0.057887 ], [195, -5551.980000, 0.025694, 0.004399, 0.052496 ] ], "n": ["FDJVGXF02FIP0W_rvcmp" ] }, {"p": [[196, -4419.970000, 0.333585, 0.005023, 0.074790 ], [195, -4419.980000, 0.329163, 0.009446, 0.076098 ], [18, -4421.130000, 0.103969, 0.039319, 0.057524 ], [20, -4421.490000, 0.072970, 0.000007, 0.070980 ], [204, -4421.610000, 0.064355, 0.003995, 0.085953 ], [200, -4421.910000, 0.048001, 0.012685, 0.092980 ], [203, -4421.910000, 0.047958, 0.009988, 0.092988 ] ], "n": ["FDJVGXF02J17MT" ] }, {"p": [[198, -6288.700000, 0.435534, 0.000006, 0.078680 ], [196, -6288.960000, 0.335288, 0.058457, 0.061628 ], [206, -6290.940000, 0.045939, 0.000002, 0.084880 ], [207, -6290.940000, 0.045939, 0.000002, 0.084880 ], [208, -6290.940000, 0.045939, 0.000007, 0.084876 ], [204, -6290.950000, 0.045860, 0.018934, 0.078758 ], [205, -6290.950000, 0.045501, 0.000009, 0.078919 ] ], "n": ["FDJVGXF02IIFNQ_rvcmp" ] }, {"p": [[198, -5953.370000, 0.452245, 0.000006, 0.083857 ], [196, -5953.780000, 0.300285, 0.058633, 0.066647 ], [206, -5955.560000, 0.050746, 0.000001, 0.090518 ], [207, -5955.560000, 0.050746, 0.000001, 0.090518 ], [208, -5955.560000, 0.050743, 0.000006, 0.090514 ], [204, -5955.620000, 0.047780, 0.018999, 0.084302 ], [205, -5955.620000, 0.047455, 0.000009, 0.084460 ] ], "n": ["FDJVGXF02FN31U" ] }, {"p": [[198, -1938.890000, 0.178250, 0.000006, 0.016166 ], [199, -1938.920000, 0.173173, 0.000006, 0.016181 ], [197, -1938.920000, 0.173155, 0.024513, 0.016186 ], [200, -1939.240000, 0.125946, 0.000006, 0.016350 ], [196, -1939.240000, 0.125850, 0.078185, 0.016350 ], [203, -1939.360000, 0.111833, 0.009988, 0.016430 ], [204, -1939.360000, 0.111794, 0.000010, 0.016431 ] ], "n": ["FDJVGXF02JKST7_rvcmp" ] }, {"p": [[199, -5332.050000, 0.361622, 0.008065, 0.109432 ], [196, -5332.570000, 0.214944, 0.077148, 0.110842 ], [200, -5332.570000, 0.213818, 0.000006, 0.112001 ], [197, -5333.260000, 0.107216, 0.022211, 0.119596 ], [198, -5333.310000, 0.102400, 0.013117, 0.121389 ] ], "n": ["FDJVGXF02FIS0U_rvcmp" ] }, {"p": [[200, -4677.410000, 0.287771, 0.011791, 0.007877 ], [203, -4677.420000, 0.283970, 0.009988, 0.008034 ], [204, -4677.420000, 0.283427, 0.000010, 0.008035 ], [202, -4678.970000, 0.060370, 0.061340, 0.008218 ], [201, -4678.970000, 0.060214, 0.019126, 0.008330 ], [199, -4680.570000, 0.012131, 0.013295, 0.009278 ], [196, -4680.570000, 0.012116, 0.078185, 0.009276 ] ], "n": ["FDJVGXF02GPP0F_rvcmp" ] }, {"p": [[202, -7125.700000, 0.255360, 0.038114, 0.040788 ], [204, -7125.720000, 0.250176, 0.015582, 0.051883 ], [205, -7125.850000, 0.217900, 0.000007, 0.052379 ], [25, -7125.850000, 0.217881, 0.014512, 0.052372 ], [226, -7127.910000, 0.028006, 0.015741, 0.040727 ], [203, -7128.170000, 0.021449, 0.009988, 0.059102 ], [22, -7129.020000, 0.009229, 0.023373, 0.058955 ] ], "n": ["FDJVGXF02IHFWX_rvcmp" ] }, {"p": [[203, -6626.680000, 0.302983, 0.008433, 0.034217 ], [204, -6626.720000, 0.290800, 0.001210, 0.035241 ], [200, -6626.750000, 0.283924, 0.012685, 0.035578 ], [199, -6628.190000, 0.067150, 0.013298, 0.038683 ], [201, -6628.510000, 0.048736, 0.018498, 0.034367 ], [197, -6630.540000, 0.006407, 0.019935, 0.042943 ] ], "n": ["FDJVGXF02HOBUR_rvcmp" ] }, {"p": [[203, -4827.150000, 0.252092, 0.002990, 0.074732 ], [202, -4827.280000, 0.221113, 0.061774, 0.076556 ], [201, -4827.280000, 0.221014, 0.019126, 0.076552 ], [204, -4827.880000, 0.121397, 0.003448, 0.071905 ], [200, -4828.180000, 0.089931, 0.012685, 0.078084 ], [197, -4828.520000, 0.064001, 0.005729, 0.086018 ], [196, -4829.260000, 0.030451, 0.073973, 0.080590 ] ], "n": ["FDJVGXF02IU8SX_rvcmp" ] }, {"p": [[204, -8054.200000, 0.362395, 0.010818, 0.046329 ], [20, -8054.410000, 0.293197, 0.000007, 0.048508 ], [22, -8055.140000, 0.140576, 0.004014, 0.044239 ], [21, -8055.400000, 0.108725, 0.017640, 0.047397 ], [19, -8055.530000, 0.095106, 0.012620, 0.049217 ] ], "n": ["FDJVGXF02GMDR6" ] }, {"p": [[204, -8113.120000, 0.610007, 0.006987, 0.065609 ], [200, -8114.410000, 0.168827, 0.012685, 0.073850 ], [203, -8114.410000, 0.168661, 0.009988, 0.073844 ], [196, -8116.390000, 0.023341, 0.068707, 0.072268 ], [199, -8116.620000, 0.018375, 0.013298, 0.076766 ], [197, -8117.160000, 0.010789, 0.015763, 0.080893 ] ], "n": ["FDJVGXF02FPQ04_rvcmp" ] }, {"p": [[204, -7923.100000, 0.724229, 0.010238, 0.062679 ], [22, -7924.300000, 0.218076, 0.010963, 0.053646 ], [200, -7926.570000, 0.022482, 0.012685, 0.078517 ], [203, -7926.570000, 0.022451, 0.009988, 0.078520 ], [196, -7927.140000, 0.012762, 0.056194, 0.069040 ] ], "n": ["FDJVGXF02I9J86_rvcmp" ] }, {"p": [[204, -7948.440000, 0.469520, 0.009059, 0.046214 ], [205, -7949.530000, 0.156930, 0.023857, 0.045391 ], [22, -7950.130000, 0.086692, 0.023075, 0.048157 ], [200, -7950.250000, 0.076527, 0.011978, 0.051779 ], [203, -7950.280000, 0.074498, 0.009988, 0.052743 ], [208, -7950.370000, 0.067929, 0.024246, 0.051059 ], [209, -7950.370000, 0.067904, 0.000007, 0.051062 ] ], "n": ["FDJVGXF02HX53E_rvcmp" ] }, {"p": [[204, -7755.470000, 0.559303, 0.007860, 0.072168 ], [203, -7756.570000, 0.185713, 0.006227, 0.081643 ], [200, -7757.180000, 0.100835, 0.012685, 0.083133 ], [201, -7757.220000, 0.097132, 0.019126, 0.086013 ], [197, -7758.420000, 0.029379, 0.012025, 0.088107 ], [196, -7759.040000, 0.015807, 0.067864, 0.081295 ], [199, -7759.330000, 0.011831, 0.013298, 0.087235 ] ], "n": ["FDJVGXF02FMHGW" ] }, {"p": [[204, -7717.260000, 0.792143, 0.014821, 0.105812 ], [24, -7719.880000, 0.057342, 0.000009, 0.116300 ], [25, -7719.890000, 0.056747, 0.001075, 0.115759 ], [23, -7719.900000, 0.056473, 0.003604, 0.116317 ], [205, -7720.310000, 0.037295, 0.007364, 0.108995 ] ], "n": ["FDJVGXF02FZVGF" ] }, {"p": [[204, -7211.000000, 0.285408, 0.003200, 0.040357 ], [200, -7211.350000, 0.200787, 0.009823, 0.043702 ], [203, -7211.390000, 0.192652, 0.009988, 0.043565 ], [199, -7211.780000, 0.129920, 0.013298, 0.046131 ], [196, -7211.780000, 0.129811, 0.078188, 0.046130 ], [197, -7213.070000, 0.035854, 0.020188, 0.047458 ], [198, -7213.410000, 0.025568, 0.013117, 0.050200 ] ], "n": ["FDJVGXF02F8G87_rvcmp" ] }, {"p": [[204, -7325.160000, 0.345211, 0.006469, 0.049170 ], [196, -7325.230000, 0.322111, 0.055618, 0.039187 ], [200, -7326.120000, 0.131748, 0.012685, 0.055437 ], [203, -7326.120000, 0.131449, 0.009988, 0.055439 ], [199, -7327.330000, 0.039401, 0.008706, 0.055726 ], [197, -7328.290000, 0.015057, 0.024290, 0.064587 ], [198, -7328.290000, 0.015023, 0.013117, 0.064838 ] ], "n": ["FDJVGXF02HAZSY_rvcmp" ] }, {"p": [[204, -6152.060000, 0.548636, 0.007802, 0.057802 ], [20, -6153.460000, 0.135859, 0.000007, 0.058940 ], [200, -6153.820000, 0.094270, 0.012685, 0.070591 ], [203, -6153.820000, 0.094210, 0.009988, 0.070593 ], [22, -6154.340000, 0.056290, 0.003016, 0.054921 ], [21, -6154.470000, 0.049635, 0.017640, 0.058086 ], [196, -6155.320000, 0.021100, 0.063329, 0.065114 ] ], "n": ["FDJVGXF02GDD4M" ] }, {"p": [[204, -6480.150000, 0.455929, 0.012455, 0.123937 ], [22, -6480.650000, 0.274846, 0.017628, 0.116152 ], [205, -6481.290000, 0.145889, 0.019360, 0.116972 ], [208, -6482.580000, 0.039816, 0.009315, 0.122646 ], [206, -6482.820000, 0.031319, 0.000001, 0.126450 ], [207, -6482.820000, 0.031319, 0.000001, 0.126450 ], [209, -6483.230000, 0.020883, 0.000007, 0.125807 ] ], "n": ["FDJVGXF02JO714" ] }, {"p": [[204, -4785.640000, 0.282188, 0.009766, 0.069086 ], [20, -4786.020000, 0.193280, 0.000005, 0.057720 ], [196, -4786.100000, 0.178210, 0.034221, 0.066979 ], [21, -4786.790000, 0.089878, 0.000009, 0.058833 ], [19, -4786.790000, 0.089808, 0.012620, 0.058834 ], [22, -4786.810000, 0.088223, 0.003383, 0.055889 ], [200, -4786.920000, 0.078413, 0.012685, 0.080814 ] ], "n": ["FDJVGXF02GARPL_rvcmp" ] }, {"p": [[204, -5924.510000, 0.194664, 0.013919, 1.175980 ], [23, -5924.740000, 0.154861, 0.000007, 1.228700 ], [24, -5924.740000, 0.154861, 0.000009, 1.228710 ], [25, -5924.740000, 0.154854, 0.000007, 1.228720 ], [205, -5924.780000, 0.148880, 0.000009, 1.240530 ], [227, -5925.130000, 0.104681, 0.012980, 1.266240 ], [10, -5925.310000, 0.087200, 0.133410, 1.180550 ] ], "n": ["FDJVGXF02GN1PE" ] }, {"p": [[205, -9019.740000, 1.000000, 0.022062, 0.030197 ] ], "n": ["FDJVGXF02IEMAK_rvcmp" ] }, {"p": [[205, -7611.670000, 0.240448, 0.011473, 0.070255 ], [25, -7611.790000, 0.213191, 0.010913, 0.073465 ], [204, -7611.890000, 0.193378, 0.016943, 0.072479 ], [208, -7612.240000, 0.135154, 0.006863, 0.077518 ], [206, -7612.590000, 0.095191, 0.000001, 0.082019 ], [207, -7612.590000, 0.095191, 0.000001, 0.082019 ], [209, -7613.840000, 0.027446, 0.000007, 0.079499 ] ], "n": ["FDJVGXF02JO6SN" ] }, {"p": [[205, -4873.990000, 0.222671, 0.034333, 0.093321 ], [208, -4874.100000, 0.199548, 0.024224, 0.100445 ], [209, -4874.100000, 0.199418, 0.000007, 0.100444 ], [206, -4874.820000, 0.097091, 0.000001, 0.111845 ], [207, -4874.820000, 0.097091, 0.000001, 0.111845 ], [22, -4874.840000, 0.095455, 0.024327, 0.100654 ], [210, -4874.910000, 0.088726, 0.000009, 0.102512 ] ], "n": ["FDJVGXF02G4OMM_rvcmp" ] }, {"p": [[206, -7523.930000, 0.159184, 0.000001, 1.866550 ], [207, -7523.930000, 0.159184, 0.000001, 1.866550 ], [208, -7523.930000, 0.159177, 0.000006, 1.866570 ], [209, -7524.120000, 0.130826, 0.000007, 1.893520 ], [205, -7524.120000, 0.130791, 0.038635, 1.893530 ], [210, -7524.120000, 0.130426, 0.000009, 1.893630 ], [22, -7524.120000, 0.130411, 0.028187, 1.893620 ] ], "n": ["FDJVGXF02IR6DU" ] }, {"p": [[206, -8262.110000, 0.156793, 0.000001, 1.795210 ], [207, -8262.110000, 0.156793, 0.000001, 1.795210 ], [208, -8262.110000, 0.156787, 0.000006, 1.795220 ], [209, -8262.280000, 0.132538, 0.000007, 1.806900 ], [205, -8262.280000, 0.132503, 0.038635, 1.806900 ], [210, -8262.280000, 0.132294, 0.000009, 1.806950 ], [22, -8262.280000, 0.132290, 0.028187, 1.806930 ] ], "n": ["FDJVGXF02H1AEE" ] }, {"p": [[208, -9487.900000, 0.692612, 0.011837, 0.085706 ], [22, -9489.000000, 0.230680, 0.013640, 0.090014 ], [205, -9491.330000, 0.022330, 0.036691, 0.095861 ], [209, -9491.370000, 0.021529, 0.000007, 0.097329 ], [18, -9491.640000, 0.016375, 0.047192, 0.099700 ], [206, -9492.330000, 0.008238, 0.000001, 0.104727 ], [207, -9492.330000, 0.008238, 0.000001, 0.104727 ] ], "n": ["FDJVGXF02GV4DK" ] }, {"p": [[208, -7719.100000, 0.290524, 0.009037, 0.078841 ], [206, -7719.590000, 0.177871, 0.000001, 0.083816 ], [207, -7719.590000, 0.177871, 0.000001, 0.083816 ], [205, -7719.780000, 0.146548, 0.025989, 0.076197 ], [209, -7720.210000, 0.095342, 0.001674, 0.080442 ], [25, -7720.430000, 0.076662, 0.006514, 0.081984 ], [24, -7721.210000, 0.035182, 0.000009, 0.089140 ] ], "n": ["FDJVGXF02FE6FM" ] }, {"p": [[208, -7108.930000, 0.575498, 0.015567, 0.063578 ], [209, -7110.110000, 0.175445, 0.003234, 0.071525 ], [210, -7110.750000, 0.093185, 0.000009, 0.075235 ], [22, -7110.750000, 0.093174, 0.028187, 0.075235 ], [205, -7111.140000, 0.062698, 0.038635, 0.072773 ] ], "n": ["FDJVGXF02FTU2D_rvcmp" ] }, {"p": [[208, -5856.200000, 0.325623, 0.017110, 0.079855 ], [210, -5856.790000, 0.181297, 0.009534, 0.083672 ], [205, -5857.210000, 0.119649, 0.031109, 0.081696 ], [209, -5857.290000, 0.110137, 0.003487, 0.087213 ], [225, -5857.410000, 0.097355, 0.036449, 0.088203 ], [226, -5857.410000, 0.097349, 0.000010, 0.088205 ], [22, -5857.760000, 0.068590, 0.025406, 0.086561 ] ], "n": ["FDJVGXF02FFCBJ" ] }, {"p": [[208, -5610.260000, 0.498922, 0.015839, 0.072657 ], [210, -5611.530000, 0.140356, 0.009928, 0.080290 ], [225, -5612.100000, 0.078799, 0.036449, 0.084755 ], [226, -5612.100000, 0.078779, 0.000008, 0.084755 ], [209, -5612.110000, 0.078069, 0.001895, 0.083133 ], [205, -5612.180000, 0.072861, 0.038635, 0.084588 ], [22, -5612.520000, 0.052214, 0.024471, 0.082434 ] ], "n": ["FDJVGXF02GQL06_rvcmp" ] }, {"p": [[208, -4850.630000, 0.304617, 0.011915, 0.064783 ], [210, -4850.840000, 0.246509, 0.010724, 0.070589 ], [226, -4851.370000, 0.146005, 0.000008, 0.074832 ], [225, -4851.370000, 0.145975, 0.036449, 0.074842 ], [22, -4851.900000, 0.085309, 0.023082, 0.071600 ], [209, -4852.160000, 0.065869, 0.006837, 0.077174 ], [206, -4854.610000, 0.005717, 0.000001, 0.094129 ] ], "n": ["FDJVGXF02JN35P_rvcmp" ] }, {"p": [[209, -5043.670000, 0.170866, 0.006837, 0.360517 ], [22, -5043.670000, 0.170837, 0.028185, 0.360512 ], [210, -5043.670000, 0.170778, 0.000009, 0.360522 ], [208, -5043.880000, 0.139537, 0.013382, 0.362265 ], [205, -5044.010000, 0.121508, 0.038635, 0.373292 ], [206, -5044.080000, 0.113237, 0.000001, 0.380884 ], [207, -5044.080000, 0.113237, 0.000001, 0.380884 ] ], "n": ["FDJVGXF02IPZCS" ] }, {"p": [[210, -9097.690000, 0.301069, 0.003823, 0.091486 ], [22, -9098.100000, 0.199102, 0.028187, 0.095962 ], [209, -9098.100000, 0.199067, 0.006837, 0.095963 ], [208, -9098.460000, 0.139362, 0.020699, 0.095384 ], [205, -9098.640000, 0.116469, 0.038635, 0.098168 ], [226, -9099.720000, 0.039396, 0.016348, 0.080820 ], [18, -9101.680000, 0.005535, 0.048078, 0.105049 ] ], "n": ["FDJVGXF02FOWVM_rvcmp" ] }, {"p": [[210, -6277.290000, 0.327278, 0.011153, 0.073292 ], [226, -6277.730000, 0.210815, 0.002805, 0.073959 ], [225, -6277.760000, 0.204394, 0.036449, 0.076326 ], [22, -6278.410000, 0.106937, 0.023199, 0.074501 ], [209, -6278.660000, 0.083563, 0.006837, 0.078594 ], [208, -6278.960000, 0.061842, 0.014785, 0.071767 ], [205, -6281.440000, 0.005171, 0.035818, 0.082190 ] ], "n": ["FDJVGXF02IVDO9_rvcmp" ] }, {"p": [[210, -3292.700000, 0.244359, 0.008897, 0.030335 ], [22, -3292.920000, 0.195699, 0.020016, 0.036181 ], [209, -3293.290000, 0.135252, 0.002826, 0.039519 ], [205, -3293.330000, 0.130743, 0.038635, 0.040468 ], [208, -3293.330000, 0.130712, 0.024246, 0.040477 ], [226, -3293.660000, 0.094026, 0.000008, 0.031633 ], [232, -3293.960000, 0.069210, 0.013988, 0.035063 ] ], "n": ["FDJVGXF02IIAX1_rvcmp" ] }, {"p": [[212, -6570.690000, 0.191652, 0.000008, 1.599450 ], [213, -6570.930000, 0.149994, 0.023979, 1.666710 ], [224, -6570.930000, 0.149991, 0.010740, 1.666680 ], [225, -6570.930000, 0.149987, 0.000009, 1.666700 ], [206, -6571.160000, 0.119460, 0.000001, 1.729820 ], [207, -6571.160000, 0.119460, 0.000001, 1.729820 ], [208, -6571.160000, 0.119455, 0.000006, 1.729820 ] ], "n": ["FDJVGXF02HJZAR" ] }, {"p": [[214, -7455.570000, 0.648919, 0.000008, 0.342334 ], [215, -7456.420000, 0.277386, 0.000010, 0.340786 ], [10, -7457.930000, 0.061178, 0.071087, 0.264395 ], [236, -7459.520000, 0.012517, 0.038667, 0.351053 ] ], "n": ["FDJVGXF02FIB3Y_rvcmp" ] }, {"p": [[214, -8668.230000, 0.854738, 0.000008, 0.471808 ], [215, -8670.470000, 0.091543, 0.000010, 0.509642 ], [216, -8671.000000, 0.053719, 0.000009, 0.530734 ] ], "n": ["FDJVGXF02G0DM7_rvcmp" ] }, {"p": [[219, -8098.800000, 0.145757, 0.000007, 1.952930 ], [220, -8098.800000, 0.145635, 0.000010, 1.953240 ], [223, -8098.810000, 0.145002, 0.016737, 1.951800 ], [216, -8098.810000, 0.144981, 0.038817, 1.951830 ], [217, -8098.810000, 0.144771, 0.000007, 1.958990 ], [221, -8098.820000, 0.143216, 0.000007, 1.962530 ], [22, -8098.910000, 0.130639, 0.010864, 1.891680 ] ], "n": ["FDJVGXF02I7JNP_rvcmp" ] }, {"p": [[225, -7861.290000, 0.224647, 0.034311, 0.282015 ], [226, -7861.300000, 0.221459, 0.000008, 0.283964 ], [210, -7861.300000, 0.221319, 0.018069, 0.283974 ], [22, -7861.660000, 0.155623, 0.008005, 0.287305 ], [18, -7862.240000, 0.086873, 0.051699, 0.300100 ], [21, -7862.240000, 0.086803, 0.017640, 0.300105 ], [196, -7865.520000, 0.003276, 0.005421, 0.328594 ] ], "n": ["FDJVGXF02IBSRC_rvcmp" ] }, {"p": [[225, -6552.070000, 0.198040, 0.036449, 0.287349 ], [210, -6552.070000, 0.198006, 0.018069, 0.287351 ], [226, -6552.070000, 0.197959, 0.000008, 0.287356 ], [21, -6552.600000, 0.117262, 0.011758, 0.301906 ], [206, -6552.790000, 0.096251, 0.000001, 0.267286 ], [207, -6552.790000, 0.096251, 0.000001, 0.267286 ], [208, -6552.790000, 0.096231, 0.000006, 0.267282 ] ], "n": ["FDJVGXF02F1KYJ" ] }, {"p": [[226, -8998.330000, 0.587487, 0.022200, 0.048804 ], [227, -8999.510000, 0.180822, 0.000006, 0.052928 ], [204, -9000.440000, 0.071335, 0.012816, 0.061827 ], [205, -9000.460000, 0.070359, 0.012954, 0.060897 ], [209, -9001.220000, 0.032706, 0.004603, 0.065954 ], [210, -9001.300000, 0.030234, 0.003806, 0.064630 ], [22, -9001.410000, 0.027057, 0.025979, 0.066752 ] ], "n": ["FDJVGXF02F500V" ] }, {"p": [[226, -8763.710000, 0.651508, 0.022037, 0.035096 ], [227, -8765.080000, 0.165590, 0.000006, 0.039550 ], [17, -8765.080000, 0.165570, 0.049256, 0.039548 ], [210, -8767.990000, 0.009057, 0.005929, 0.052418 ], [22, -8768.080000, 0.008274, 0.021469, 0.055649 ] ], "n": ["FDJVGXF02HW32Z" ] }, {"p": [[226, -8763.710000, 0.651508, 0.022037, 0.035096 ], [227, -8765.080000, 0.165590, 0.000006, 0.039550 ], [17, -8765.080000, 0.165570, 0.049256, 0.039548 ], [210, -8767.990000, 0.009057, 0.005929, 0.052418 ], [22, -8768.080000, 0.008274, 0.021469, 0.055649 ] ], "n": ["FDJVGXF02HX8G5" ] }, {"p": [[226, -8763.710000, 0.651508, 0.022037, 0.035096 ], [227, -8765.080000, 0.165590, 0.000006, 0.039550 ], [17, -8765.080000, 0.165570, 0.049256, 0.039548 ], [210, -8767.990000, 0.009057, 0.005929, 0.052418 ], [22, -8768.080000, 0.008274, 0.021469, 0.055649 ] ], "n": ["FDJVGXF02IRIEX" ] }, {"p": [[226, -9167.270000, 0.605224, 0.024043, 0.040757 ], [227, -9168.390000, 0.197792, 0.000425, 0.046122 ], [17, -9168.390000, 0.196983, 0.049256, 0.046178 ] ], "n": ["FDJVGXF02HVN6E_rvcmp" ] }, {"p": [[226, -9167.330000, 0.607474, 0.024016, 0.040499 ], [227, -9168.460000, 0.196702, 0.000440, 0.045857 ], [17, -9168.470000, 0.195825, 0.049256, 0.045914 ] ], "n": ["FDJVGXF02HWD2G_rvcmp" ] }, {"p": [[226, -9057.100000, 0.704792, 0.019928, 0.084408 ], [17, -9059.200000, 0.086289, 0.048440, 0.089723 ], [227, -9059.200000, 0.086206, 0.001090, 0.090478 ], [2, -9059.540000, 0.061364, 0.036220, 0.094287 ], [228, -9059.540000, 0.061350, 0.000005, 0.094297 ] ], "n": ["FDJVGXF02IP0G5_rvcmp" ] }, {"p": [[226, -7908.720000, 0.615762, 0.017709, 0.042904 ], [210, -7910.630000, 0.091526, 0.004593, 0.059623 ], [22, -7910.770000, 0.079425, 0.025132, 0.062548 ], [209, -7910.860000, 0.072227, 0.006835, 0.063443 ], [205, -7911.210000, 0.050890, 0.014623, 0.059060 ], [227, -7911.220000, 0.050507, 0.000006, 0.050826 ], [204, -7911.460000, 0.039663, 0.014578, 0.061440 ] ], "n": ["FDJVGXF02IDDNS_rvcmp" ] }, {"p": [[226, -7991.320000, 0.224476, 0.022024, 0.092722 ], [204, -7991.400000, 0.207545, 0.014906, 0.102860 ], [205, -7991.480000, 0.190721, 0.005627, 0.101996 ], [200, -7991.740000, 0.147911, 0.007770, 0.103180 ], [17, -7992.130000, 0.099648, 0.049256, 0.097744 ], [209, -7992.400000, 0.076516, 0.006837, 0.111128 ], [208, -7992.760000, 0.053182, 0.011125, 0.107566 ] ], "n": ["FDJVGXF02HRO57" ] }, {"p": [[226, -8989.320000, 0.166932, 0.022732, 0.134312 ], [196, -8989.330000, 0.164801, 0.007097, 0.145407 ], [26, -8989.450000, 0.147027, 0.091982, 0.146807 ], [195, -8989.490000, 0.141112, 0.007722, 0.152005 ], [34, -8989.560000, 0.131663, 0.011565, 0.147611 ], [27, -8989.610000, 0.125216, 0.068162, 0.147837 ], [35, -8989.620000, 0.123248, 0.000006, 0.149644 ] ], "n": ["FDJVGXF02G2JAA" ] }, {"p": [[226, -8475.520000, 0.757107, 0.020412, 0.087656 ], [17, -8477.330000, 0.123358, 0.045747, 0.089171 ], [227, -8477.360000, 0.119535, 0.000006, 0.091854 ] ], "n": ["FDJVGXF02IYV3U" ] }, {"p": [[226, -7810.580000, 0.769777, 0.020203, 0.093161 ], [17, -7812.470000, 0.116842, 0.045590, 0.096622 ], [227, -7812.500000, 0.113381, 0.000006, 0.099478 ] ], "n": ["FDJVGXF02GV2KR" ] }, {"p": [[226, -5211.560000, 0.584600, 0.020133, 0.033079 ], [202, -5212.310000, 0.276753, 0.033392, 0.041999 ], [204, -5214.290000, 0.038172, 0.009238, 0.058965 ], [25, -5214.650000, 0.026550, 0.014456, 0.059839 ], [205, -5214.650000, 0.026546, 0.000009, 0.059883 ], [203, -5214.650000, 0.026510, 0.008423, 0.060995 ], [210, -5214.890000, 0.020868, 0.006852, 0.054771 ] ], "n": ["FDJVGXF02GDGF1" ] }, {"p": [[226, -5050.810000, 0.654156, 0.007162, 0.018239 ], [225, -5052.140000, 0.173021, 0.036449, 0.021992 ], [210, -5052.140000, 0.172823, 0.018069, 0.021995 ] ], "n": ["FDJVGXF02I3PQ2" ] }, {"p": [[226, -3723.790000, 0.213616, 0.012113, 0.114438 ], [210, -3723.920000, 0.187484, 0.018071, 0.121045 ], [225, -3723.920000, 0.187460, 0.036449, 0.121035 ], [22, -3724.510000, 0.103516, 0.028187, 0.124398 ], [209, -3724.520000, 0.103365, 0.006837, 0.124393 ], [17, -3724.520000, 0.103046, 0.045841, 0.108959 ], [227, -3724.530000, 0.101513, 0.000006, 0.112454 ] ], "n": ["FDJVGXF02FUQ8G" ] }, {"p": [[229, -6936.830000, 0.170619, 0.047227, 1.679370 ], [231, -6936.830000, 0.170613, 0.000009, 1.679400 ], [230, -6936.830000, 0.170604, 0.047159, 1.679370 ], [240, -6937.130000, 0.126561, 0.009182, 1.762930 ], [239, -6937.180000, 0.120791, 0.000006, 1.797120 ], [232, -6937.180000, 0.120443, 0.005249, 1.790590 ], [228, -6937.180000, 0.120370, 0.021550, 1.788520 ] ], "n": ["FDJVGXF02GAGIC_rvcmp" ] }, {"p": [[229, -6730.440000, 0.174786, 0.047227, 1.466720 ], [231, -6730.440000, 0.174781, 0.000009, 1.466730 ], [230, -6730.440000, 0.174775, 0.047159, 1.466710 ], [239, -6730.810000, 0.120880, 0.000006, 1.561310 ], [238, -6730.810000, 0.120879, 0.027841, 1.561310 ], [232, -6730.840000, 0.117477, 0.018214, 1.580760 ], [228, -6730.850000, 0.116422, 0.021550, 1.578230 ] ], "n": ["FDJVGXF02IKPBB" ] }, {"p": [[232, -6164.290000, 0.243973, 0.000936, 0.081309 ], [228, -6164.290000, 0.243513, 0.021550, 0.081426 ], [227, -6164.960000, 0.125649, 0.012980, 0.081827 ], [236, -6165.170000, 0.101603, 0.058945, 0.086204 ], [237, -6165.220000, 0.096385, 0.000006, 0.088025 ], [239, -6165.220000, 0.096181, 0.008215, 0.085220 ], [240, -6165.260000, 0.092696, 0.004864, 0.081701 ] ], "n": ["FDJVGXF02JNDRR_rvcmp" ] }, {"p": [[232, -2413.120000, 0.309357, 0.009403, 0.055791 ], [228, -2413.880000, 0.145940, 0.021550, 0.076800 ], [231, -2413.880000, 0.145901, 0.017416, 0.076810 ], [239, -2414.120000, 0.114472, 0.011594, 0.052317 ], [240, -2414.140000, 0.111549, 0.000006, 0.053161 ], [17, -2414.370000, 0.088998, 0.028655, 0.066958 ], [1, -2414.430000, 0.083782, 0.000006, 0.085656 ] ], "n": ["FDJVGXF02H7I8C" ] }, {"p": [[235, -9241.570000, 0.170651, 0.000006, 1.999990 ], [233, -9241.570000, 0.170646, 0.062297, 1.999990 ], [234, -9241.570000, 0.170637, 0.079656, 1.999990 ], [237, -9241.820000, 0.133791, 0.000006, 1.999990 ], [236, -9241.820000, 0.133784, 0.061431, 1.999990 ], [229, -9241.830000, 0.132680, 0.007274, 1.999990 ], [228, -9242.240000, 0.087812, 0.000005, 1.999990 ] ], "n": ["FDJVGXF02FRDNE" ] }, {"p": [[235, -6815.770000, 0.150270, 0.045059, 1.713130 ], [236, -6815.770000, 0.150265, 0.061431, 1.713100 ], [237, -6815.770000, 0.150253, 0.000006, 1.713150 ], [229, -6815.820000, 0.142815, 0.047227, 1.767040 ], [231, -6815.820000, 0.142803, 0.000009, 1.767050 ], [230, -6815.820000, 0.142795, 0.047159, 1.767020 ], [233, -6815.990000, 0.120799, 0.062297, 1.850000 ] ], "n": ["FDJVGXF02FZF33_rvcmp" ] }, {"p": [[240, -7806.970000, 0.553233, 0.028569, 0.101861 ], [248, -7807.590000, 0.296729, 0.028534, 0.105895 ], [226, -7809.270000, 0.055525, 0.027424, 0.138972 ], [227, -7809.430000, 0.047257, 0.000006, 0.140544 ], [17, -7809.430000, 0.047256, 0.049256, 0.140541 ] ], "n": ["FDJVGXF02FYRR3_rvcmp" ] }, {"p": [[248, -8779.640000, 0.535936, 0.029631, 0.123606 ], [240, -8780.340000, 0.267712, 0.028019, 0.125973 ], [226, -8781.560000, 0.078597, 0.006819, 0.149631 ], [225, -8782.050000, 0.048244, 0.036449, 0.155032 ], [210, -8782.050000, 0.048226, 0.018069, 0.155038 ], [23, -8783.220000, 0.015067, 0.000007, 0.157500 ], [247, -8784.100000, 0.006219, 0.013494, 0.150256 ] ], "n": ["FDJVGXF02GW5EL" ] }, {"p": [[248, -3010.210000, 0.512993, 0.051200, 0.037859 ], [250, -3011.110000, 0.208924, 0.021035, 0.056520 ], [249, -3011.110000, 0.208923, 0.012515, 0.056520 ], [17, -3013.180000, 0.026366, 0.020241, 0.045227 ], [225, -3013.630000, 0.016906, 0.024317, 0.053746 ], [226, -3013.820000, 0.013984, 0.020923, 0.062222 ], [228, -3013.980000, 0.011904, 0.021550, 0.070677 ] ], "n": ["FDJVGXF02IPHPT" ] }, {"p": [[248, -3010.210000, 0.512993, 0.051200, 0.037859 ], [250, -3011.110000, 0.208924, 0.021035, 0.056520 ], [249, -3011.110000, 0.208923, 0.012515, 0.056520 ], [17, -3013.180000, 0.026366, 0.020241, 0.045227 ], [225, -3013.630000, 0.016906, 0.024317, 0.053746 ], [226, -3013.820000, 0.013984, 0.020923, 0.062222 ], [228, -3013.980000, 0.011904, 0.021550, 0.070677 ] ], "n": ["FDJVGXF02IPHPQ" ] } ], "metadata": {"invocation": "guppy to_json" }, "version": 1, "fields": ["edge_num", "likelihood", "like_weight_ratio", "distal_length", "pendant_length" ] }pplacer-1.1.alpha19/tests/data/moran/rounded_control.jplace000066400000000000000000007431241303154601500240170ustar00rootroot00000000000000{"tree": "((((((Cyanophora_paradoxa_:0.0665203[0],Mesostigma_viride_:0.0962753[1]):0.0362291[2],((chloroplast_Cyanidium_sp._Monte_Rotaro.AY391365_:0.123946[3],((chloroplast_Galdieria_sulphuraria.AY541295_:0.076265[4],((chloroplast_Galdieria_sulphuraria.AY119731_:2.68035e-06[5],chloroplast_Cyanidium_caldarium.X52758_:0.0195896[6]):0.0312019[7],chloroplast_Galdieria_sulphuraria.AY541294_:0.0188214[8]):0.0324389[9]):0.133418[10],((chloroplast_Cyanidioschyzon_merolae.AY119730_:2.68035e-06[11],chloroplast_Cyanidioschyzon_merolae_strain_DBV201.AY119729_:0.00117862[12]):0.0762594[13],chloroplast_Cyanidium_caldarium.AY541290_:0.203636[14]):0.0380657[15]):0.0194682[16]):0.0492622[17],(((chloroplast_Vaucheria_litorea.AF227740_:0.0517049[18],(plastid_Tribonema_aequale.AY528860_:0.0126259[19],chloroplast_Bumilleriopsis_filiformis.X79223_:0.00666588[20]):0.017649[21]):0.0281935[22],(((chloroplast_Skeletonema_costatum.AY119761_:0.00361095[23],Thalassiosira_pseudonana_:0.00113368[24]):0.0145191[25],(((Bigelowiella_natans_:0.097412[26],((Chlamydomonas_reinhardtii_:0.0704485[27],(chloroplast_Picochlorum_sp._RCC289.EU851960_:0.0487654[28],(Chlorella_vulgaris_:0.0467075[29],(chloroplast_Chlorella_pyrenoidosa.EU043047_:0.00161427[30],chloroplast_Auxenochlorella_protothecoides.EU043045_:0.00193294[31]):0.0152331[32]):0.0200406[33]):0.0147874[34]):0.0130863[35],((chloroplast_Chlorella_vulgaris.EU043044_:0.00120893[36],chloroplast_Chlorella_pyrenoidosa.EU043049_:0.00232797[37]):0.0768327[38],(plastid_Tetraselmis_marina.AY857618_:0.0254053[39],(chloroplast_Pseudochlorella_sp._CCAP_211_1A.EU043048_:0.0869235[40],(((((Synechococcus_sp._PCC_7002___gi170076636refNC_010475_:0.0621893[41],(((Nostock_punctiforme_gi186680550refNC_010628_:0.112883[42],((Nostoc_sp._PCC_7120_gi17227497refNC_003272_:0.00889436[43],Anabaena_variabilis_A_gi75906225refNC_007413_:0.0221131[44]):0.038336[45],(Nodularia_spumige_gi119512239refNZ_AAVW01000065_:0.0504455[46],Fremyella_diplosiphon.FDIPSBA_:0.051697[47]):0.0178891[48]):0.0237368[49]):0.0326133[50],(Lyngbya_sp_PCC_8106___gi119483230refNZ_AAVU01000001_:0.231009[51],(Microcystis_aerouginosa_gi166362741refNC_010296_:0.0929627[52],((Cyanothece_sp._ATCC_51142.CAU39610_:0.0123916[53],Cyanothece_sp._CCY_0110___gi126657681refNZ_AAXW01000012_:0.0313088[54]):0.0369935[55],(Cyanothece_sp._PCC_7425_gi218437013refNC_011729_:0.0746015[56],Cyanothece_sp._PCC_8801_gi218244892refNC_011726_:0.0616473[57]):0.0148311[58]):0.0396174[59]):0.0228094[60]):0.0166279[61]):0.0233005[62],(Synechocystis_sp_PCC_6803___gi16329170refNC_000911_:0.0535075[63],((((((Cyanothece_sp._CC_gi126660325refNZ_AAXW01000053_:0.347497[64],Synechococcus_sp._PCC_7335_gi225144522refNW_002475532_:0.317895[65]):0.108045[66],Mastigocladus_laminosus.AF170924_:0.264356[67]):0.0676548[68],((Synechococcus_sp._JA-3-3Ab__gi86604733refNC_007775_:0.0973541[69],Synechococcus_sp._JA-2-3Ba____gi86607503refNC_007776_:0.564415[70]):0.0790386[71],Gloeobacter_violaceus_gi37519569refNC_005125.1_:0.263289[72]):0.11791[73]):0.0379309[74],(Thermosynechococcus_gi22297544refNC_004113_:0.11758[75],(Cyanothece_sp._PCC_7425_gi220905643refNC_011884_:0.138332[76],Acaryochloris_marina_MBIC11017.AB303650_:0.216398[77]):0.0159655[78]):0.0287204[79]):0.0341087[80],((Prochlorothrix_hollandica.X14308_:2.68035e-06[81],Prochlorothrix_hollandica.X14523_:0.00128006[82]):0.081034[83],((Synechococcus_elongatus_PCC_7942___gi81298811refNC_007604_:0.0105928[84],Synechococcus_elongatus_PCC_6301___gi56750010refNC_006576_:0.00276979[85]):0.107743[86],((Synechococcus_sp._WH_5701__gi87301761refNZ_AANO01000004_:0.0111919[87],Synechococcus_sp._WH_5701__gi87303211refNZ_AANO01000010_:0.0726788[88]):0.0147436[89],(((((Synechococcus_sp._RCC307_gi148241099refNC_009482_:0.0408099[90],((Synechococcus_sp._WH_8102_gi33864539refNC_005070_:0.0201067[91],(Synechococcus_sp._CC9902_gi78183584refNC_007513_:0.00536202[92],Synechococcus_sp._BL107_gi211594587refNZ_DS022298_:0.00246287[93]):0.0392091[94]):0.00867041[95],Synechococcus_sp._CC9605_gi78211558refNC_007516_:0.0275067[96]):0.0214861[97]):0.0346913[98],(Synechococcus_sp.__RS9916__gi116074999refNZ_AAUA01000003_:0.0477208[99],Synechococcus_sp._gi87123618refNZ_AANP01000002_:0.0406377[100]):0.0188201[101]):0.0110855[102],((Synechococcus_sp._WH_7803___gi148238336refNC_009481_:0.00753009[103],(Synechococcus_sp.__WH_7805__gi88807077refNZ_AAOK01000001_:0.00265618[104],Synechococcus_sp._WH_7805__gi88807768refNZ_AAOK01000002_:0.0026187[105]):0.00799342[106]):0.0173394[107],(Synechococcus_sp._RS9917___gi87125174refNZ_AANP01000006_:2.68035e-06[108],Synechococcus_sp._RS9917___gi87124875refNZ_AANP01000005_:0.0026301[109]):0.00794167[110]):0.0038034[111]):0.0158306[112],Synechococcus_sp._RS9917__gi87124182refNZ_AANP01000003_:0.192923[113]):0.0118268[114],Cyanobium_sp._PCC_70_gi223490194refNW_002243451_:0.0330768[115]):0.0231555[116]):0.0518051[117]):0.0453212[118]):0.0351102[119]):0.0447589[120],Microcoleus_chthonoplastes_PCC_7420___gi224400128refNW_002435220_:0.0843742[121]):0.0306188[122]):0.0369097[123]):0.0349985[124]):0.0577156[125],Trichodesmium_erythr_gi113473942refNC_008312_:0.106684[126]):0.0409208[127],(((Prochlorococcus_marinus_subsp._pastoris_str._CCMP1986_gi33860560refNC_005072_:0.00365008[128],Prochlorococcus_marinus_str._MIT_9515___gi123965234refNC_008817_:0.00483373[129]):0.0106366[130],(Prochlorococcus_marinus_str._AS9601_gi123967536refNC_008816_:2.68035e-06[131],(Prochlorococcus_marinus_str._MIT_9301__gi126695337refNC_009091_:0.0108685[132],((Procholococcus_marinus_str._MIT_9202_gi225077649refNW_002467725_:0.00240146[133],Procholococcus_marinus_str._MIT_9215___gi157412338refNC_009840_:2.68035e-06[134]):0.00591536[135],Prochlorococcus_marinus_str._MIT_9312_gi78778385refNC_007577_:0.00379511[136]):0.0049759[137]):0.00132484[138]):0.0105617[139]):0.0465879[140],((Procholococcus_marinus_str._NATL2A___gi162958048refNC_007335.2_:0.00365548[141],Prochlorococcus_marinus_str._NATL1A___gi124024712refNC_008819_:2.68035e-06[142]):0.0615085[143],(Prochlorococcus_marinus_subsp._marinus_str._CCMP1375_gi33239452refNC_005042_:0.100663[144],Procholococcus_marinus_str._MIT_9211___gi159902540refNC_009976_:0.0611398[145]):0.060931[146]):0.0653211[147]):0.148126[148]):0.0637467[149],((chloroplast_Pavlova_gyrans.AJ575575_:0.0169655[150],(chloroplast_Pavlova_lutheri.AY119755_:0.0146662[151],chloroplast_Pavlova_gyrans.AY119754_:0.0299817[152]):0.0270032[153]):0.0303472[154],((chloroplast_Chrysochromulina_polylepis.AJ575572_:0.0128709[155],chloroplast_Imantonia_rotunda.EU851963_:0.0436031[156]):0.00589301[157],(((chloroplast_Isochrysis_galbana.AJ575574_:0.0174268[158],chloroplast_Emiliania_huxleyi.AJ575573_:0.0115577[159]):0.00738805[160],(chloroplast_Phaeocystis_antarctica.AY119756_:0.0324724[161],(chloroplast_Prymnesium_parvum.AY119758_:0.0107131[162],chloroplast_Prymnesium_parvum.AJ575576_:0.00676058[163]):0.020704[164]):0.00735947[165]):0.00200676[166],chloroplast_Pleurochrysis_carterae.AY119757_:0.0339814[167]):0.00361886[168]):0.0233927[169]):0.0187331[170]):0.0346389[171],((chloroplast_Mantoniella_squamata.EU851964_:0.00842936[172],((plastid_uncultured_Prasinophyceae.AY176630_:0.0226216[173],(((chloroplast_Ostreococcus_sp._RCC344.EU851961_:0.00605274[174],Ostreococcus_tauri_:0.010265[175]):0.00616569[176],chloroplast_Ostreococcus_sp._RCC789.EU851970_:0.01746[177]):0.00408084[178],(uncultured_Prasinophyceae.AY509537_:0.0209825[179],chloroplast_Bathycoccus_prasinos.EU851955_:0.00805147[180]):0.0371846[181]):0.00765875[182]):0.0179484[183],(chloroplast_Micromonas_pusilla.EU851965_:2.68035e-06[184],plastid_uncultured_Prasinophyceae.AY176639_:2.68035e-06[185]):0.0089575[186]):0.0110303[187]):0.0523059[188],chloroplast_Pycnococcus_provasolii.EU851957_:0.0961508[189]):0.0343432[190]):0.015656[191]):0.0224695[192]):0.0167387[193]):0.00670223[194]):0.00945502[195]):0.0781944[196],(Fragilariopsis_psbA_:0.0245188[197],Pmultiseries_psbA_:0.0131238[198]):0.0133041[199]):0.0126908[200],(Phaeodactylum_tricornutum_:0.0191354[201],plastid_Ballia_callitricha.DQ787635_:0.061781[202]):0.00999794[203]):0.0201532[204]):0.0386439[205],(chloroplast_Heterosigma_akashiwo.AY119759_:2.68035e-06[206],chloroplast_Heterosigma_carterae.HCU18090_:2.68035e-06[207]):0.0242521[208]):0.00684342[209]):0.018078[210],((chloroplast_Pachydictyon_coriaceum.AY422614_:0.0241936[211],chloroplast_Dictyota_dichotoma_var._linearis.AY422632_:0.00853816[212]):0.0239851[213],((chloroplast_Fucus_vesiculosus.DQ307679_:0.0343612[214],chloroplast_Ectocarpus_siliculosus.X56695_:0.0397557[215]):0.038827[216],((plastid_Padina_japonica.AY430360_:0.0143668[217],(plastid_Padina_arborescens.AY430357_:0.0162365[218],plastid_Padina_crassa.AY430358_:0.00695945[219]):0.00495696[220]):0.00344828[221],chloroplast_Padina_crassa.AY422643_:0.00886928[222]):0.0167452[223]):0.0107453[224]):0.0364574[225]):0.032314[226]):0.0129864[227]):0.0215549[228],(chloroplast_Flintiella_sanguinaria.AY119740_:0.047233[229],chloroplast_Porphyridium_aerugineum.AY119741_:0.0471646[230]):0.0174241[231]):0.0188085[232],(((chloroplast_Erythrotrichia_carnea.AY119739_:0.0623046[233],chloroplast_Rhodochaete_parvula.AY119743_:0.0796661[234]):0.0450641[235],chloroplast_Rhodosorus_marinus.AY119744_:0.0614381[236]):0.0130888[237],chloroplast_Bangiopsis_subsimplex.AY119736_:0.0278478[238]):0.0130213[239]):0.0469411[240],(chloroplast_Palmaria_palmata.PPU28165_:0.0983928[241],(plastid_Antithamnionella_sp._A31.DQ787640_:0.0189374[242],(plastid_Carpoblepharis_flaccida.DQ787643_:0.104554[243],chloroplast_Antithamnion_sp.X55364_:0.0274272[244]):0.00842288[245]):0.0306715[246]):0.0178171[247]):0.0709634[248],Porphyra_yezoensis_:0.0125208[249],Porphyra_purpurea_:0.0210402[250]):0[251];", "placements": [{"p": [[0, -5700.010000, 0.155277, 0.000008, 1.999990 ], [2, -5700.030000, 0.153087, 0.036220, 1.999990 ], [227, -5700.030000, 0.153070, 0.012980, 1.999990 ], [228, -5700.030000, 0.153035, 0.000005, 1.999990 ], [1, -5700.040000, 0.151204, 0.096269, 1.999990 ], [17, -5700.290000, 0.117165, 0.049256, 1.999990 ], [226, -5700.290000, 0.117162, 0.032306, 1.999990 ] ], "n": ["FDJVGXF01AR46S" ] }, {"p": [[0, -2734.470000, 0.219662, 0.000008, 0.770961 ], [148, -2734.840000, 0.152975, 0.076333, 0.977053 ], [1, -2734.880000, 0.145896, 0.096269, 0.887218 ], [2, -2734.880000, 0.145895, 0.000009, 0.887199 ], [227, -2735.010000, 0.128294, 0.012980, 0.899452 ], [212, -2735.130000, 0.114269, 0.000008, 0.894439 ], [65, -2735.330000, 0.093009, 0.202930, 0.993485 ] ], "n": ["FDJVGXF01AQ80C_rvcmp" ] }, {"p": [[0, -3360.110000, 0.189998, 0.000008, 0.749450 ], [2, -3360.290000, 0.158188, 0.036220, 0.682944 ], [227, -3360.290000, 0.158145, 0.012980, 0.682953 ], [228, -3360.290000, 0.158099, 0.000005, 0.682915 ], [1, -3360.410000, 0.140083, 0.096269, 0.801723 ], [148, -3360.470000, 0.132139, 0.081697, 0.906141 ], [204, -3361.210000, 0.063349, 0.015026, 0.817513 ] ], "n": ["FDJVGXF01B0W77" ] }, {"p": [[1, -7534.320000, 0.904492, 0.057572, 0.093211 ], [2, -7537.800000, 0.027864, 0.016056, 0.108359 ], [226, -7538.140000, 0.019822, 0.025233, 0.110628 ], [17, -7538.300000, 0.017002, 0.033682, 0.099106 ], [227, -7538.390000, 0.015414, 0.012980, 0.114407 ], [228, -7538.400000, 0.015406, 0.000005, 0.114406 ] ], "n": ["FDJVGXF01D5TIW" ] }, {"p": [[1, -7350.310000, 0.843161, 0.058259, 0.089891 ], [226, -7353.340000, 0.040725, 0.024504, 0.104966 ], [2, -7353.520000, 0.034154, 0.022140, 0.105068 ], [17, -7353.590000, 0.031751, 0.033903, 0.093812 ], [227, -7353.830000, 0.025112, 0.012980, 0.109633 ], [228, -7353.830000, 0.025098, 0.000005, 0.109634 ] ], "n": ["FDJVGXF01AJUIH_rvcmp" ] }, {"p": [[1, -6830.070000, 0.365840, 0.050655, 0.106232 ], [226, -6830.090000, 0.359994, 0.016241, 0.105660 ], [225, -6831.690000, 0.072735, 0.036449, 0.121914 ], [17, -6831.750000, 0.068473, 0.036260, 0.101017 ], [227, -6832.170000, 0.045204, 0.007426, 0.115530 ], [2, -6832.200000, 0.043891, 0.036220, 0.117886 ], [228, -6832.200000, 0.043864, 0.000005, 0.117894 ] ], "n": ["FDJVGXF01BSCCI_rvcmp" ] }, {"p": [[1, -6077.210000, 0.371419, 0.050826, 0.103586 ], [226, -6077.430000, 0.298856, 0.014817, 0.106659 ], [210, -6078.620000, 0.091368, 0.016280, 0.118972 ], [225, -6078.640000, 0.089183, 0.036449, 0.119487 ], [17, -6078.670000, 0.086937, 0.027057, 0.100541 ], [227, -6079.560000, 0.035545, 0.000006, 0.115086 ], [16, -6079.850000, 0.026692, 0.016304, 0.100662 ] ], "n": ["FDJVGXF01CDOA5" ] }, {"p": [[1, -5329.660000, 0.361179, 0.046886, 0.083300 ], [226, -5330.130000, 0.225502, 0.012603, 0.093797 ], [225, -5330.420000, 0.168098, 0.034696, 0.097185 ], [210, -5330.440000, 0.164555, 0.018069, 0.099227 ], [17, -5332.120000, 0.030919, 0.044550, 0.094571 ], [227, -5332.150000, 0.029884, 0.000006, 0.097389 ], [2, -5332.560000, 0.019863, 0.036220, 0.100990 ] ], "n": ["FDJVGXF01BR9HO_rvcmp" ] }, {"p": [[1, -4710.170000, 0.882102, 0.045404, 0.085828 ], [216, -4713.330000, 0.037402, 0.010593, 0.096030 ], [214, -4713.340000, 0.037035, 0.021465, 0.101702 ], [215, -4713.580000, 0.028968, 0.034528, 0.100202 ], [2, -4714.280000, 0.014493, 0.000947, 0.107480 ] ], "n": ["FDJVGXF01A1J33" ] }, {"p": [[1, -4340.990000, 1.000000, 0.044433, 0.051054 ] ], "n": ["FDJVGXF01A46Y1" ] }, {"p": [[1, -5526.750000, 0.974852, 0.040055, 0.096719 ], [226, -5530.400000, 0.025148, 0.014279, 0.123324 ] ], "n": ["FDJVGXF01EQECW_rvcmp" ] }, {"p": [[1, -5568.110000, 0.987551, 0.039659, 0.078913 ], [226, -5572.490000, 0.012449, 0.007116, 0.107364 ] ], "n": ["FDJVGXF01A87XB_rvcmp" ] }, {"p": [[1, -5491.850000, 0.968936, 0.039023, 0.107218 ], [226, -5495.290000, 0.031064, 0.013863, 0.133929 ] ], "n": ["FDJVGXF01DUOWM" ] }, {"p": [[1, -4084.020000, 1.000000, 0.033503, 0.054114 ] ], "n": ["FDJVGXF01APO9N_rvcmp" ] }, {"p": [[1, -5825.460000, 1.000000, 0.028971, 0.084501 ] ], "n": ["FDJVGXF01BRKCL_rvcmp" ] }, {"p": [[1, -5564.800000, 1.000000, 0.028081, 0.091764 ] ], "n": ["FDJVGXF01CKP9W_rvcmp" ] }, {"p": [[1, -6144.060000, 1.000000, 0.028348, 0.087970 ] ], "n": ["FDJVGXF01A615B_rvcmp" ] }, {"p": [[1, -3901.840000, 1.000000, 0.025886, 0.075342 ] ], "n": ["FDJVGXF01D03AR", "FDJVGXF01A149X" ] }, {"p": [[1, -5020.540000, 0.329356, 0.006667, 0.137555 ], [39, -5020.640000, 0.297083, 0.009349, 0.153063 ], [192, -5021.750000, 0.097856, 0.022464, 0.167931 ], [193, -5021.750000, 0.097852, 0.000008, 0.167932 ], [29, -5022.200000, 0.062055, 0.038654, 0.168418 ], [33, -5022.270000, 0.058241, 0.000010, 0.173834 ], [28, -5022.280000, 0.057557, 0.048759, 0.173072 ] ], "n": ["FDJVGXF01DGD2W_rvcmp" ] }, {"p": [[2, -7754.310000, 0.217329, 0.036220, 1.999990 ], [228, -7754.310000, 0.217287, 0.000005, 1.999990 ], [227, -7754.310000, 0.217267, 0.012980, 1.999990 ], [236, -7754.930000, 0.116804, 0.000007, 1.999990 ], [1, -7755.270000, 0.083651, 0.096269, 1.999990 ], [0, -7755.270000, 0.083650, 0.066512, 1.999990 ], [26, -7755.530000, 0.064013, 0.010607, 1.999990 ] ], "n": ["FDJVGXF01CWKBY" ] }, {"p": [[2, -7082.530000, 0.228511, 0.036220, 1.999990 ], [228, -7082.530000, 0.228468, 0.000005, 1.999990 ], [227, -7082.530000, 0.228447, 0.012980, 1.999990 ], [1, -7083.490000, 0.087832, 0.096269, 1.999990 ], [0, -7083.490000, 0.087831, 0.066512, 1.999990 ], [26, -7083.720000, 0.069759, 0.009954, 1.999990 ], [236, -7083.730000, 0.069152, 0.000007, 1.999990 ] ], "n": ["FDJVGXF01DTUVZ_rvcmp" ] }, {"p": [[2, -6825.070000, 0.191248, 0.036220, 1.999990 ], [228, -6825.070000, 0.191189, 0.000005, 1.999990 ], [227, -6825.070000, 0.191171, 0.012980, 1.999990 ], [1, -6825.150000, 0.176820, 0.000006, 1.999990 ], [0, -6825.370000, 0.140749, 0.066512, 1.999990 ], [226, -6826.310000, 0.055257, 0.010592, 1.999990 ], [225, -6826.340000, 0.053566, 0.036449, 1.999990 ] ], "n": ["FDJVGXF01AQSZU_rvcmp" ] }, {"p": [[2, -7559.780000, 0.198092, 0.036220, 1.999990 ], [228, -7559.780000, 0.198032, 0.000005, 1.999990 ], [227, -7559.780000, 0.198013, 0.012980, 1.999990 ], [0, -7560.090000, 0.144928, 0.066512, 1.999990 ], [1, -7560.090000, 0.144927, 0.096269, 1.999990 ], [226, -7560.990000, 0.058583, 0.008703, 1.999990 ], [225, -7561.010000, 0.057425, 0.036449, 1.999990 ] ], "n": ["FDJVGXF01DRZRX_rvcmp" ] }, {"p": [[2, -7584.580000, 0.178121, 0.036220, 1.999990 ], [228, -7584.590000, 0.178066, 0.000005, 1.999990 ], [227, -7584.590000, 0.178050, 0.012980, 1.999990 ], [0, -7584.900000, 0.130179, 0.066512, 1.999990 ], [1, -7584.900000, 0.130179, 0.096269, 1.999990 ], [212, -7585.070000, 0.109323, 0.000008, 1.999990 ], [140, -7585.200000, 0.096083, 0.000006, 1.999990 ] ], "n": ["FDJVGXF01AU61H" ] }, {"p": [[2, -7125.950000, 0.201960, 0.036220, 1.999990 ], [228, -7125.950000, 0.201898, 0.000005, 1.999990 ], [227, -7125.950000, 0.201879, 0.012980, 1.999990 ], [0, -7126.240000, 0.150119, 0.000008, 1.999990 ], [1, -7126.270000, 0.146505, 0.096269, 1.999990 ], [226, -7127.370000, 0.048820, 0.032306, 1.999990 ], [17, -7127.370000, 0.048820, 0.049256, 1.999990 ] ], "n": ["FDJVGXF01CIEJT" ] }, {"p": [[2, -6893.490000, 0.190998, 0.036220, 1.987900 ], [228, -6893.490000, 0.190940, 0.000005, 1.987960 ], [227, -6893.490000, 0.190922, 0.012980, 1.987960 ], [0, -6893.790000, 0.140970, 0.000008, 1.999990 ], [1, -6893.810000, 0.138175, 0.096269, 1.999990 ], [39, -6894.250000, 0.089534, 0.000006, 1.999990 ], [236, -6894.670000, 0.058462, 0.000007, 1.999990 ] ], "n": ["FDJVGXF01D3WTC_rvcmp" ] }, {"p": [[2, -2319.500000, 0.428546, 0.018691, 0.021661 ], [227, -2320.730000, 0.125308, 0.012980, 0.036105 ], [228, -2320.730000, 0.125279, 0.000005, 0.036112 ], [226, -2321.040000, 0.091860, 0.032306, 0.036947 ], [17, -2321.040000, 0.091849, 0.049256, 0.036947 ], [225, -2321.070000, 0.089561, 0.027302, 0.028114 ], [210, -2321.700000, 0.047597, 0.018069, 0.038507 ] ], "n": ["FDJVGXF01CFZ5I_rvcmp" ] }, {"p": [[2, -8322.960000, 0.784951, 0.017529, 0.049601 ], [22, -8324.370000, 0.191576, 0.014528, 0.063248 ], [227, -8327.080000, 0.012682, 0.004689, 0.065348 ], [226, -8327.240000, 0.010790, 0.029250, 0.064825 ] ], "n": ["FDJVGXF01BSXC6_rvcmp" ] }, {"p": [[2, -8253.370000, 0.795980, 0.018019, 0.046663 ], [22, -8254.910000, 0.170990, 0.013896, 0.059852 ], [227, -8257.440000, 0.013679, 0.004586, 0.061103 ], [226, -8257.580000, 0.011822, 0.028973, 0.060323 ], [18, -8258.030000, 0.007529, 0.042784, 0.067881 ] ], "n": ["FDJVGXF01AKP12_rvcmp", "FDJVGXF01BLH1N_rvcmp" ] }, {"p": [[2, -8255.220000, 0.786494, 0.017444, 0.050169 ], [22, -8256.640000, 0.190088, 0.014515, 0.064033 ], [227, -8259.350000, 0.012660, 0.004687, 0.066102 ], [226, -8259.510000, 0.010758, 0.029312, 0.065605 ] ], "n": ["FDJVGXF01B9YL9_rvcmp" ] }, {"p": [[2, -7317.910000, 0.792759, 0.014799, 0.053653 ], [22, -7319.370000, 0.184882, 0.013452, 0.069710 ], [18, -7322.050000, 0.012630, 0.041906, 0.078552 ], [227, -7322.310000, 0.009729, 0.004366, 0.070870 ] ], "n": ["FDJVGXF01CZ9O4_rvcmp" ] }, {"p": [[2, -7712.790000, 0.883852, 0.014640, 0.049668 ], [22, -7714.820000, 0.116148, 0.013694, 0.064873 ] ], "n": ["FDJVGXF01BUW8J" ] }, {"p": [[2, -7582.780000, 0.852815, 0.014049, 0.054796 ], [22, -7584.530000, 0.147185, 0.014067, 0.071155 ] ], "n": ["FDJVGXF01DIV21_rvcmp" ] }, {"p": [[4, -5865.650000, 0.379359, 0.000009, 1.195070 ], [6, -5866.630000, 0.142877, 0.000010, 1.502030 ], [9, -5866.930000, 0.105563, 0.032431, 1.515360 ], [10, -5866.930000, 0.105556, 0.000008, 1.515370 ], [8, -5867.010000, 0.097852, 0.018812, 1.564030 ], [7, -5867.010000, 0.097850, 0.031194, 1.564020 ], [5, -5867.330000, 0.070942, 0.000001, 1.632330 ] ], "n": ["FDJVGXF01A51R9_rvcmp" ] }, {"p": [[5, -8635.630000, 0.169083, 0.000001, 1.762920 ], [6, -8635.630000, 0.169083, 0.000010, 1.762910 ], [7, -8635.630000, 0.169064, 0.000008, 1.762940 ], [4, -8635.910000, 0.127654, 0.076256, 1.768260 ], [9, -8635.910000, 0.127649, 0.032431, 1.768270 ], [10, -8635.910000, 0.127642, 0.000008, 1.768260 ], [8, -8636.060000, 0.109825, 0.000009, 1.839190 ] ], "n": ["FDJVGXF01CDR6W" ] }, {"p": [[17, -6592.980000, 0.344063, 0.041282, 0.104860 ], [226, -6593.070000, 0.316607, 0.031123, 0.110801 ], [227, -6593.080000, 0.311338, 0.000006, 0.111220 ], [2, -6596.300000, 0.012517, 0.017926, 0.113731 ], [210, -6597.170000, 0.005246, 0.002151, 0.143325 ], [22, -6597.190000, 0.005117, 0.028187, 0.145327 ], [209, -6597.190000, 0.005111, 0.006837, 0.145327 ] ], "n": ["FDJVGXF01B500Z" ] }, {"p": [[17, -8474.300000, 0.614349, 0.034732, 0.085322 ], [226, -8475.450000, 0.193496, 0.031646, 0.098796 ], [227, -8475.460000, 0.192155, 0.000006, 0.098944 ] ], "n": ["FDJVGXF01EFJFC" ] }, {"p": [[17, -6215.670000, 0.550917, 0.031377, 0.079741 ], [226, -6216.640000, 0.210639, 0.027077, 0.092727 ], [227, -6216.910000, 0.160179, 0.000006, 0.095417 ], [16, -6218.310000, 0.039349, 0.017811, 0.079631 ], [3, -6218.320000, 0.038916, 0.123938, 0.080816 ] ], "n": ["FDJVGXF01EJVTA_rvcmp" ] }, {"p": [[18, -6749.270000, 0.350601, 0.048560, 0.063242 ], [22, -6749.330000, 0.328473, 0.002367, 0.064802 ], [21, -6749.350000, 0.320926, 0.016831, 0.065869 ] ], "n": ["FDJVGXF01DA10A" ] }, {"p": [[18, -8985.560000, 0.362090, 0.045212, 0.134997 ], [22, -8985.650000, 0.329178, 0.003070, 0.135397 ], [21, -8985.720000, 0.308732, 0.017640, 0.138657 ] ], "n": ["FDJVGXF01AXBUQ" ] }, {"p": [[18, -6958.920000, 0.891405, 0.000006, 0.272210 ], [202, -6961.390000, 0.074915, 0.023119, 0.286868 ], [196, -6962.730000, 0.019566, 0.032002, 0.286802 ], [10, -6963.060000, 0.014114, 0.064427, 0.239780 ] ], "n": ["FDJVGXF01C6BVV_rvcmp" ] }, {"p": [[19, -5907.270000, 0.285611, 0.000006, 0.336734 ], [22, -5907.630000, 0.198338, 0.010261, 0.327181 ], [21, -5907.890000, 0.152619, 0.002886, 0.346591 ], [20, -5907.910000, 0.150211, 0.006659, 0.350749 ], [18, -5908.330000, 0.099093, 0.051699, 0.352205 ], [38, -5908.880000, 0.057068, 0.076823, 0.354397 ], [193, -5908.880000, 0.057060, 0.016731, 0.354408 ] ], "n": ["FDJVGXF01EJ0WT_rvcmp" ] }, {"p": [[19, -5982.550000, 0.325158, 0.000006, 0.327313 ], [22, -5983.020000, 0.202501, 0.009215, 0.319262 ], [21, -5983.190000, 0.170974, 0.003177, 0.336098 ], [20, -5983.210000, 0.167443, 0.006659, 0.340610 ], [18, -5983.640000, 0.109223, 0.051699, 0.341409 ], [38, -5985.810000, 0.012384, 0.074343, 0.369984 ], [193, -5985.820000, 0.012317, 0.016731, 0.373520 ] ], "n": ["FDJVGXF01BVJSL_rvcmp" ] }, {"p": [[19, -7122.190000, 0.629362, 0.000006, 0.297979 ], [20, -7123.410000, 0.185332, 0.006659, 0.316409 ], [21, -7123.410000, 0.185306, 0.000009, 0.316394 ] ], "n": ["FDJVGXF01DSGZT" ] }, {"p": [[20, -6657.860000, 0.214367, 0.005452, 0.065365 ], [21, -6657.890000, 0.207852, 0.000009, 0.065687 ], [19, -6657.890000, 0.207542, 0.012620, 0.065689 ], [22, -6658.110000, 0.167861, 0.001648, 0.064386 ], [18, -6658.120000, 0.165099, 0.051699, 0.065232 ], [205, -6659.980000, 0.025678, 0.022564, 0.066624 ], [204, -6660.780000, 0.011600, 0.009560, 0.086873 ] ], "n": ["FDJVGXF01DDLP3_rvcmp" ] }, {"p": [[20, -6483.400000, 0.254133, 0.005394, 0.061007 ], [21, -6483.430000, 0.245510, 0.000008, 0.061328 ], [19, -6483.430000, 0.245135, 0.012620, 0.061330 ], [22, -6483.630000, 0.201786, 0.002135, 0.059671 ], [205, -6485.530000, 0.030153, 0.022599, 0.061902 ], [196, -6486.450000, 0.011992, 0.054783, 0.075214 ], [204, -6486.510000, 0.011290, 0.009716, 0.082480 ] ], "n": ["FDJVGXF01D2F9J_rvcmp" ] }, {"p": [[20, -7991.920000, 0.226374, 0.005272, 0.056413 ], [21, -7991.960000, 0.216847, 0.000008, 0.056668 ], [19, -7991.960000, 0.216424, 0.012620, 0.056674 ], [22, -7992.230000, 0.166383, 0.000007, 0.056187 ], [18, -7992.230000, 0.166220, 0.051699, 0.056191 ], [196, -7995.290000, 0.007751, 0.047586, 0.063102 ] ], "n": ["FDJVGXF01CJHZG_rvcmp" ] }, {"p": [[20, -7504.760000, 0.228280, 0.005264, 0.056019 ], [21, -7504.810000, 0.218607, 0.000008, 0.056296 ], [19, -7504.810000, 0.218180, 0.012620, 0.056298 ], [22, -7505.070000, 0.167549, 0.000007, 0.055786 ], [18, -7505.070000, 0.167384, 0.051699, 0.055790 ] ], "n": ["FDJVGXF01A6W2D" ] }, {"p": [[20, -8061.750000, 0.226940, 0.005258, 0.055615 ], [21, -8061.800000, 0.217229, 0.000008, 0.055869 ], [19, -8061.800000, 0.216804, 0.012620, 0.055871 ], [22, -8062.060000, 0.166853, 0.000007, 0.055379 ], [18, -8062.060000, 0.166687, 0.051699, 0.055388 ], [196, -8065.480000, 0.005487, 0.050156, 0.062604 ] ], "n": ["FDJVGXF01DNP11", "FDJVGXF01AXT7W" ] }, {"p": [[20, -7346.080000, 0.228361, 0.005219, 0.052363 ], [21, -7346.130000, 0.217917, 0.000008, 0.052635 ], [19, -7346.130000, 0.217485, 0.012620, 0.052637 ], [22, -7346.390000, 0.168207, 0.000007, 0.052065 ], [18, -7346.390000, 0.168031, 0.051699, 0.052070 ] ], "n": ["FDJVGXF01EAHUW_rvcmp" ] }, {"p": [[20, -8713.380000, 0.228455, 0.005202, 0.050899 ], [21, -8713.430000, 0.217694, 0.000008, 0.051116 ], [19, -8713.430000, 0.217260, 0.012620, 0.051122 ], [22, -8713.680000, 0.168386, 0.000007, 0.050615 ], [18, -8713.680000, 0.168206, 0.051699, 0.050619 ] ], "n": ["FDJVGXF01A1O4M" ] }, {"p": [[20, -9168.740000, 0.444129, 0.002140, 0.065787 ], [22, -9169.080000, 0.316010, 0.011397, 0.060297 ], [205, -9170.020000, 0.122547, 0.025926, 0.062733 ], [196, -9170.790000, 0.056788, 0.031633, 0.063014 ], [21, -9171.080000, 0.042665, 0.010039, 0.065795 ], [19, -9171.950000, 0.017862, 0.012620, 0.070053 ] ], "n": ["FDJVGXF01DXDA3_rvcmp" ] }, {"p": [[20, -9173.420000, 0.649986, 0.002139, 0.065747 ], [22, -9174.660000, 0.187954, 0.008443, 0.063354 ], [196, -9175.820000, 0.058955, 0.031217, 0.064574 ], [21, -9175.840000, 0.057829, 0.009450, 0.066118 ], [19, -9176.630000, 0.026113, 0.012620, 0.070026 ], [205, -9176.940000, 0.019163, 0.026033, 0.067544 ] ], "n": ["FDJVGXF01B5Z58" ] }, {"p": [[20, -8648.250000, 0.671613, 0.002128, 0.065710 ], [22, -8649.930000, 0.126077, 0.005626, 0.063497 ], [196, -8650.410000, 0.077535, 0.032683, 0.064763 ], [21, -8650.660000, 0.060533, 0.009672, 0.066099 ], [18, -8651.140000, 0.037608, 0.051699, 0.067756 ], [19, -8651.480000, 0.026634, 0.012620, 0.070291 ] ], "n": ["FDJVGXF01C9YBP_rvcmp" ] }, {"p": [[20, -8829.380000, 0.694192, 0.002126, 0.064447 ], [22, -8831.050000, 0.130136, 0.005657, 0.062202 ], [21, -8831.790000, 0.062028, 0.009625, 0.064754 ], [196, -8832.040000, 0.048587, 0.030455, 0.063577 ], [18, -8832.280000, 0.038050, 0.051699, 0.066369 ], [19, -8832.630000, 0.027007, 0.012620, 0.068879 ] ], "n": ["FDJVGXF01CBX1F_rvcmp" ] }, {"p": [[20, -8889.620000, 0.694774, 0.002125, 0.063644 ], [22, -8891.290000, 0.130933, 0.005669, 0.061361 ], [21, -8892.040000, 0.061982, 0.009631, 0.063891 ], [196, -8892.300000, 0.047744, 0.030477, 0.062592 ], [18, -8892.530000, 0.037866, 0.051699, 0.065488 ], [19, -8892.880000, 0.026702, 0.012620, 0.067987 ] ], "n": ["FDJVGXF01BYCO7", "FDJVGXF01AELJM" ] }, {"p": [[20, -9179.430000, 0.646073, 0.002134, 0.061422 ], [22, -9180.630000, 0.194400, 0.008485, 0.058725 ], [196, -9181.810000, 0.059417, 0.031252, 0.059233 ], [21, -9181.850000, 0.057227, 0.009490, 0.061524 ], [19, -9182.710000, 0.024347, 0.012620, 0.065491 ], [205, -9182.980000, 0.018536, 0.025964, 0.062752 ] ], "n": ["FDJVGXF01A7QII_rvcmp", "FDJVGXF01BQVWT_rvcmp", "FDJVGXF01BHQ5C_rvcmp" ] }, {"p": [[20, -8809.930000, 0.693433, 0.002121, 0.059804 ], [22, -8811.570000, 0.135037, 0.005735, 0.057229 ], [21, -8812.350000, 0.061692, 0.009669, 0.059798 ], [196, -8812.610000, 0.047789, 0.030531, 0.057821 ], [18, -8812.870000, 0.036889, 0.051699, 0.061405 ], [19, -8813.250000, 0.025161, 0.012620, 0.063986 ] ], "n": ["FDJVGXF01A1U38" ] }, {"p": [[20, -6813.430000, 0.371533, 0.000007, 0.061604 ], [204, -6814.480000, 0.129920, 0.005294, 0.072664 ], [21, -6814.530000, 0.122985, 0.000009, 0.062794 ], [196, -6814.580000, 0.117936, 0.044809, 0.065739 ], [22, -6814.660000, 0.108196, 0.000009, 0.062215 ], [200, -6815.030000, 0.074779, 0.012685, 0.078680 ], [203, -6815.030000, 0.074651, 0.009988, 0.078676 ] ], "n": ["FDJVGXF01CS3NG" ] }, {"p": [[20, -4633.000000, 0.284052, 0.000005, 0.059136 ], [21, -4633.780000, 0.129725, 0.000008, 0.060334 ], [19, -4633.780000, 0.129572, 0.012620, 0.060341 ], [22, -4633.880000, 0.117856, 0.000007, 0.059459 ], [18, -4633.880000, 0.117832, 0.051699, 0.059461 ], [196, -4633.920000, 0.113303, 0.009594, 0.074759 ], [195, -4633.970000, 0.107660, 0.009446, 0.077152 ] ], "n": ["FDJVGXF01EP157_rvcmp" ] }, {"p": [[20, -4711.160000, 0.265598, 0.000005, 0.058329 ], [204, -4711.840000, 0.134673, 0.005222, 0.073914 ], [196, -4711.890000, 0.127930, 0.024267, 0.071129 ], [21, -4711.950000, 0.121090, 0.000008, 0.059498 ], [19, -4711.950000, 0.120944, 0.012620, 0.059500 ], [22, -4712.000000, 0.114908, 0.000007, 0.058582 ], [18, -4712.000000, 0.114857, 0.051699, 0.058588 ] ], "n": ["FDJVGXF01B5ZPX" ] }, {"p": [[20, -6206.060000, 0.338424, 0.000005, 0.056786 ], [204, -6206.850000, 0.153702, 0.005474, 0.068323 ], [21, -6207.180000, 0.110240, 0.000008, 0.058002 ], [19, -6207.180000, 0.110016, 0.012620, 0.058005 ], [22, -6207.260000, 0.101875, 0.000007, 0.057284 ], [18, -6207.260000, 0.101763, 0.051699, 0.057284 ], [200, -6207.450000, 0.083978, 0.012685, 0.075100 ] ], "n": ["FDJVGXF01COB4U" ] }, {"p": [[20, -6235.790000, 0.485949, 0.000005, 0.056344 ], [21, -6236.910000, 0.158009, 0.000008, 0.057541 ], [19, -6236.920000, 0.157690, 0.012620, 0.057549 ], [22, -6237.030000, 0.140088, 0.000007, 0.056847 ], [204, -6238.810000, 0.023633, 0.005180, 0.074652 ], [196, -6238.950000, 0.020584, 0.046374, 0.067115 ], [200, -6239.330000, 0.014047, 0.012685, 0.081216 ] ], "n": ["FDJVGXF01EJR5M" ] }, {"p": [[20, -5082.600000, 0.301061, 0.000005, 0.052830 ], [21, -5083.400000, 0.135331, 0.000008, 0.053791 ], [19, -5083.400000, 0.135167, 0.012620, 0.053789 ], [22, -5083.480000, 0.124414, 0.000007, 0.052891 ], [18, -5083.480000, 0.124378, 0.051699, 0.052901 ], [196, -5083.770000, 0.093233, 0.011326, 0.065491 ], [195, -5083.850000, 0.086416, 0.009446, 0.068185 ] ], "n": ["FDJVGXF01AWJHN" ] }, {"p": [[20, -7788.040000, 0.768616, 0.000007, 0.050459 ], [21, -7790.250000, 0.084015, 0.000009, 0.053723 ], [19, -7790.250000, 0.083951, 0.012620, 0.053724 ], [22, -7790.830000, 0.046894, 0.002360, 0.052617 ], [196, -7792.400000, 0.009808, 0.053012, 0.040083 ], [204, -7792.780000, 0.006717, 0.011669, 0.049572 ] ], "n": ["FDJVGXF01A0HKE" ] }, {"p": [[20, -8108.800000, 0.380342, 0.000005, 0.049950 ], [21, -8109.950000, 0.120935, 0.000009, 0.050725 ], [19, -8109.950000, 0.120685, 0.012620, 0.050723 ], [22, -8110.050000, 0.109196, 0.000007, 0.050101 ], [18, -8110.050000, 0.109082, 0.051699, 0.050105 ], [196, -8110.050000, 0.109071, 0.057308, 0.048154 ], [204, -8110.820000, 0.050689, 0.006091, 0.058115 ] ], "n": ["FDJVGXF01B687C" ] }, {"p": [[20, -6345.380000, 0.498605, 0.000005, 0.049213 ], [21, -6346.530000, 0.158197, 0.000008, 0.050218 ], [19, -6346.530000, 0.157869, 0.012620, 0.050225 ], [22, -6346.640000, 0.142479, 0.000007, 0.049437 ], [204, -6348.760000, 0.017109, 0.005529, 0.066029 ], [196, -6348.780000, 0.016629, 0.046111, 0.058333 ], [200, -6349.390000, 0.009110, 0.012685, 0.072601 ] ], "n": ["FDJVGXF01DH3DF_rvcmp" ] }, {"p": [[20, -5487.710000, 0.347264, 0.000005, 0.049417 ], [21, -5488.520000, 0.154710, 0.000008, 0.050249 ], [19, -5488.520000, 0.154522, 0.012620, 0.050246 ], [22, -5488.630000, 0.138315, 0.000007, 0.049376 ], [18, -5488.630000, 0.138237, 0.051699, 0.049381 ], [196, -5489.570000, 0.054077, 0.021806, 0.059651 ], [204, -5491.000000, 0.012874, 0.005393, 0.068791 ] ], "n": ["FDJVGXF01D1UNE_rvcmp" ] }, {"p": [[20, -7502.900000, 0.410102, 0.000007, 0.048206 ], [21, -7504.020000, 0.132875, 0.000009, 0.048978 ], [19, -7504.030000, 0.132658, 0.012620, 0.048975 ], [22, -7504.140000, 0.117963, 0.000008, 0.048301 ], [18, -7504.140000, 0.117854, 0.051699, 0.048305 ], [204, -7504.430000, 0.088548, 0.010777, 0.050597 ] ], "n": ["FDJVGXF01DF939_rvcmp" ] }, {"p": [[20, -7763.720000, 0.412044, 0.000007, 0.046922 ], [21, -7764.850000, 0.132906, 0.000009, 0.047653 ], [19, -7764.850000, 0.132688, 0.012620, 0.047649 ], [22, -7764.980000, 0.116811, 0.000008, 0.046980 ], [18, -7764.980000, 0.116688, 0.051699, 0.046984 ], [204, -7765.250000, 0.088863, 0.010812, 0.049090 ] ], "n": ["FDJVGXF01C8XFL_rvcmp" ] }, {"p": [[20, -7862.870000, 0.414092, 0.000007, 0.046058 ], [21, -7864.010000, 0.133165, 0.000009, 0.046762 ], [19, -7864.010000, 0.132946, 0.012620, 0.046758 ], [22, -7864.140000, 0.116718, 0.000008, 0.046086 ], [18, -7864.140000, 0.116592, 0.051699, 0.046095 ], [204, -7864.440000, 0.086487, 0.010854, 0.048084 ] ], "n": ["FDJVGXF01EQ0TT_rvcmp" ] }, {"p": [[20, -7841.330000, 0.431985, 0.000007, 0.045802 ], [21, -7842.460000, 0.138766, 0.000009, 0.046498 ], [19, -7842.460000, 0.138539, 0.012620, 0.046500 ], [22, -7842.610000, 0.119361, 0.000008, 0.045836 ], [18, -7842.610000, 0.119218, 0.051699, 0.045840 ], [204, -7843.440000, 0.052130, 0.010770, 0.048283 ] ], "n": ["FDJVGXF01BKUCP_rvcmp" ] }, {"p": [[21, -8360.510000, 0.276947, 0.017640, 0.068484 ], [22, -8360.510000, 0.276896, 0.000007, 0.068480 ], [18, -8360.510000, 0.276642, 0.051699, 0.068484 ], [20, -8361.960000, 0.065329, 0.005597, 0.073092 ], [19, -8361.980000, 0.063720, 0.012620, 0.073310 ], [196, -8362.440000, 0.040466, 0.046564, 0.073127 ] ], "n": ["FDJVGXF01BSS33" ] }, {"p": [[21, -8764.250000, 0.241191, 0.017640, 0.064045 ], [22, -8764.250000, 0.241137, 0.000007, 0.064042 ], [18, -8764.250000, 0.240919, 0.051699, 0.064041 ], [196, -8764.600000, 0.170275, 0.043558, 0.062879 ], [20, -8765.750000, 0.053984, 0.005541, 0.068370 ], [19, -8765.770000, 0.052493, 0.012620, 0.068579 ] ], "n": ["FDJVGXF01EQVCZ", "FDJVGXF01A3P8N" ] }, {"p": [[21, -8857.520000, 0.241756, 0.017640, 0.063147 ], [22, -8857.520000, 0.241705, 0.000007, 0.063148 ], [18, -8857.520000, 0.241484, 0.051699, 0.063151 ], [196, -8857.870000, 0.169731, 0.043505, 0.061825 ], [20, -8859.030000, 0.053416, 0.005530, 0.067425 ], [19, -8859.060000, 0.051909, 0.012620, 0.067624 ] ], "n": ["FDJVGXF01EMP0L" ] }, {"p": [[21, -8756.560000, 0.298567, 0.017640, 0.050185 ], [22, -8756.560000, 0.298561, 0.000007, 0.050186 ], [18, -8756.570000, 0.298231, 0.051699, 0.050190 ], [20, -8758.290000, 0.053301, 0.005391, 0.054467 ], [19, -8758.320000, 0.051340, 0.012620, 0.054636 ] ], "n": ["FDJVGXF01DYC5M_rvcmp", "FDJVGXF01AYXVW_rvcmp" ] }, {"p": [[21, -9393.890000, 0.335770, 0.016952, 0.077000 ], [18, -9393.900000, 0.332727, 0.051153, 0.076860 ], [22, -9393.910000, 0.331502, 0.000007, 0.077313 ] ], "n": ["FDJVGXF01DFDUU_rvcmp" ] }, {"p": [[21, -9049.150000, 0.545070, 0.014824, 0.128769 ], [18, -9050.260000, 0.178560, 0.049070, 0.128461 ], [22, -9050.300000, 0.172684, 0.000006, 0.130199 ], [196, -9051.070000, 0.079736, 0.033559, 0.089578 ], [170, -9052.700000, 0.015638, 0.009104, 0.110595 ], [208, -9053.810000, 0.005143, 0.015849, 0.127643 ], [171, -9054.290000, 0.003170, 0.007158, 0.109472 ] ], "n": ["FDJVGXF01DR5DG_rvcmp" ] }, {"p": [[21, -5096.750000, 0.680130, 0.009659, 0.105775 ], [19, -5098.440000, 0.125415, 0.007818, 0.127615 ], [20, -5098.770000, 0.090584, 0.006659, 0.132604 ], [22, -5099.670000, 0.036703, 0.004488, 0.106745 ], [151, -5099.710000, 0.035412, 0.000007, 0.126940 ], [18, -5099.820000, 0.031756, 0.050158, 0.114060 ] ], "n": ["FDJVGXF01AK7Z0", "FDJVGXF01CI761" ] }, {"p": [[21, -5174.880000, 0.685963, 0.009681, 0.104253 ], [19, -5176.610000, 0.122703, 0.007801, 0.125831 ], [20, -5176.940000, 0.088018, 0.006659, 0.130750 ], [22, -5177.810000, 0.036974, 0.004606, 0.104939 ], [151, -5177.870000, 0.034679, 0.000007, 0.125188 ], [18, -5177.960000, 0.031663, 0.050060, 0.112306 ] ], "n": ["FDJVGXF01DQNVD" ] }, {"p": [[21, -5586.930000, 0.525919, 0.009466, 0.119094 ], [151, -5587.840000, 0.210875, 0.000007, 0.129028 ], [19, -5588.420000, 0.118469, 0.007921, 0.138188 ], [20, -5588.710000, 0.088721, 0.006659, 0.142648 ], [22, -5589.820000, 0.029139, 0.003531, 0.121782 ], [18, -5589.900000, 0.026878, 0.050786, 0.127034 ] ], "n": ["FDJVGXF01EEXIW_rvcmp" ] }, {"p": [[21, -8760.780000, 0.764831, 0.009283, 0.113684 ], [20, -8762.920000, 0.089692, 0.006659, 0.130551 ], [19, -8762.920000, 0.089654, 0.012620, 0.130551 ], [18, -8764.090000, 0.027983, 0.050809, 0.119543 ], [22, -8764.090000, 0.027839, 0.000007, 0.120118 ] ], "n": ["FDJVGXF01C5K53" ] }, {"p": [[22, -2915.980000, 0.167996, 0.023900, 0.048112 ], [210, -2916.020000, 0.161655, 0.017507, 0.056369 ], [225, -2916.020000, 0.161619, 0.036449, 0.056488 ], [226, -2916.020000, 0.161540, 0.000008, 0.056493 ], [208, -2916.120000, 0.146836, 0.011944, 0.051939 ], [209, -2916.200000, 0.134710, 0.006837, 0.054137 ], [206, -2916.920000, 0.065644, 0.000001, 0.075954 ] ], "n": ["FDJVGXF01EKSSX_rvcmp", "FDJVGXF01B68CK_rvcmp", "FDJVGXF01BI0WX_rvcmp", "FDJVGXF01CBQYG_rvcmp" ] }, {"p": [[22, -9367.150000, 0.299014, 0.020167, 0.125235 ], [210, -9367.290000, 0.260603, 0.008701, 0.114952 ], [226, -9367.800000, 0.156182, 0.013928, 0.102518 ], [205, -9368.340000, 0.091177, 0.034259, 0.126778 ], [208, -9368.440000, 0.082744, 0.022260, 0.129085 ], [209, -9368.470000, 0.079838, 0.001012, 0.130155 ], [18, -9369.440000, 0.030442, 0.039566, 0.133067 ] ], "n": ["FDJVGXF01DHZEC_rvcmp" ] }, {"p": [[22, -8749.080000, 0.943543, 0.015018, 0.058031 ], [226, -8752.790000, 0.023113, 0.019501, 0.055572 ], [18, -8753.000000, 0.018753, 0.046923, 0.068025 ], [21, -8753.250000, 0.014591, 0.017643, 0.072504 ] ], "n": ["FDJVGXF01DNYHY" ] }, {"p": [[22, -6966.420000, 0.654951, 0.014096, 0.073132 ], [2, -6967.240000, 0.288348, 0.014318, 0.061974 ], [18, -6969.070000, 0.046428, 0.039858, 0.083710 ], [226, -6970.580000, 0.010273, 0.027924, 0.079237 ] ], "n": ["FDJVGXF01DGBP7_rvcmp" ] }, {"p": [[22, -6964.780000, 0.631228, 0.013526, 0.067780 ], [2, -6965.570000, 0.287010, 0.014967, 0.057475 ], [18, -6967.300000, 0.050529, 0.039609, 0.076551 ], [226, -6968.820000, 0.011115, 0.027573, 0.072719 ], [17, -6968.920000, 0.010060, 0.049256, 0.074865 ], [227, -6968.920000, 0.010058, 0.000009, 0.074868 ] ], "n": ["FDJVGXF01DUF87_rvcmp" ] }, {"p": [[22, -9441.470000, 0.647056, 0.013638, 0.066579 ], [226, -9442.680000, 0.192521, 0.023682, 0.058617 ], [227, -9443.700000, 0.069329, 0.000005, 0.062512 ], [17, -9443.700000, 0.069326, 0.049256, 0.062509 ], [18, -9444.860000, 0.021769, 0.047504, 0.076894 ] ], "n": ["FDJVGXF01DPQJQ", "FDJVGXF01EUBGX", "FDJVGXF01DG1KE" ] }, {"p": [[22, -7971.610000, 0.833365, 0.012877, 0.045942 ], [205, -7973.380000, 0.141658, 0.016486, 0.040738 ], [204, -7975.120000, 0.024977, 0.012657, 0.047316 ] ], "n": ["FDJVGXF01A2K5F_rvcmp" ] }, {"p": [[22, -9083.850000, 0.341257, 0.011880, 0.112346 ], [196, -9084.010000, 0.288788, 0.037225, 0.078003 ], [18, -9084.540000, 0.170038, 0.051699, 0.120338 ], [208, -9085.550000, 0.062069, 0.019500, 0.111303 ], [205, -9085.830000, 0.047090, 0.038635, 0.114857 ], [209, -9085.830000, 0.047080, 0.000007, 0.114860 ], [170, -9085.900000, 0.043679, 0.010216, 0.104607 ] ], "n": ["FDJVGXF01DX64R" ] }, {"p": [[22, -9493.480000, 0.503611, 0.012101, 0.110554 ], [18, -9493.530000, 0.478967, 0.031586, 0.103810 ], [226, -9496.840000, 0.017422, 0.017080, 0.102923 ] ], "n": ["FDJVGXF01BF7RQ_rvcmp" ] }, {"p": [[22, -5582.050000, 0.491019, 0.011540, 0.083643 ], [28, -5583.220000, 0.151923, 0.000006, 0.059147 ], [2, -5583.300000, 0.139896, 0.013198, 0.069440 ], [18, -5583.930000, 0.075040, 0.040262, 0.094530 ], [21, -5584.210000, 0.056564, 0.016509, 0.099343 ], [154, -5584.230000, 0.055650, 0.020817, 0.095971 ], [170, -5584.850000, 0.029908, 0.001994, 0.098123 ] ], "n": ["FDJVGXF01C9I07" ] }, {"p": [[22, -6053.370000, 0.697262, 0.011585, 0.075418 ], [2, -6054.870000, 0.154421, 0.014645, 0.063296 ], [18, -6055.640000, 0.071773, 0.047143, 0.087533 ], [21, -6055.670000, 0.069455, 0.016361, 0.089888 ], [226, -6057.960000, 0.007089, 0.027422, 0.081533 ] ], "n": ["FDJVGXF01BAPDX_rvcmp" ] }, {"p": [[22, -6799.140000, 0.680899, 0.012082, 0.075222 ], [2, -6800.720000, 0.140079, 0.014257, 0.064586 ], [18, -6800.870000, 0.120855, 0.039424, 0.080774 ], [21, -6801.600000, 0.058167, 0.016482, 0.089068 ] ], "n": ["FDJVGXF01A0X4A_rvcmp" ] }, {"p": [[22, -6375.530000, 0.716238, 0.012317, 0.074751 ], [2, -6377.000000, 0.164205, 0.014093, 0.062778 ], [18, -6378.000000, 0.060739, 0.047216, 0.087721 ], [21, -6378.030000, 0.058819, 0.016382, 0.089903 ] ], "n": ["FDJVGXF01BXZSF" ] }, {"p": [[22, -4490.610000, 0.627871, 0.011733, 0.074100 ], [2, -4492.140000, 0.136292, 0.016529, 0.066055 ], [18, -4492.290000, 0.117437, 0.033063, 0.088367 ], [21, -4492.920000, 0.062721, 0.016440, 0.094638 ], [226, -4493.730000, 0.027865, 0.031612, 0.081953 ], [227, -4493.730000, 0.027813, 0.000006, 0.082228 ] ], "n": ["FDJVGXF01CP2D6_rvcmp" ] }, {"p": [[22, -5283.330000, 0.823992, 0.011834, 0.067054 ], [18, -5285.450000, 0.099020, 0.039871, 0.078540 ], [21, -5285.820000, 0.068439, 0.016299, 0.083946 ], [2, -5287.900000, 0.008550, 0.017422, 0.070203 ] ], "n": ["FDJVGXF01DEQXQ" ] }, {"p": [[22, -4906.210000, 0.828014, 0.011880, 0.064839 ], [18, -4908.360000, 0.096591, 0.039895, 0.077724 ], [21, -4908.730000, 0.066721, 0.016296, 0.083616 ], [2, -4910.770000, 0.008673, 0.017237, 0.068477 ] ], "n": ["FDJVGXF01A5GV4_rvcmp" ] }, {"p": [[22, -5397.850000, 0.837648, 0.011875, 0.064819 ], [18, -5400.010000, 0.096656, 0.039824, 0.075969 ], [21, -5400.400000, 0.065696, 0.016266, 0.081312 ] ], "n": ["FDJVGXF01CTOLS", "FDJVGXF01BY8LZ", "FDJVGXF01DEQXN", "FDJVGXF01EP3G9_rvcmp" ] }, {"p": [[22, -5622.340000, 0.497746, 0.012218, 0.063494 ], [205, -5622.590000, 0.389629, 0.023497, 0.070181 ], [21, -5624.600000, 0.052065, 0.017642, 0.072396 ], [19, -5624.650000, 0.049277, 0.012620, 0.074766 ], [209, -5626.130000, 0.011283, 0.006837, 0.077110 ] ], "n": ["FDJVGXF01D44GE_rvcmp" ] }, {"p": [[22, -5614.660000, 0.505089, 0.012299, 0.055552 ], [205, -5615.020000, 0.354677, 0.023520, 0.062338 ], [21, -5617.060000, 0.045857, 0.017641, 0.064524 ], [20, -5617.120000, 0.043193, 0.005469, 0.066727 ], [19, -5617.150000, 0.041861, 0.012620, 0.067124 ], [209, -5618.660000, 0.009323, 0.006837, 0.068705 ] ], "n": ["FDJVGXF01EHQS6_rvcmp", "FDJVGXF01D3DDV_rvcmp", "FDJVGXF01B2QGK_rvcmp", "FDJVGXF01AYXKC_rvcmp", "FDJVGXF01ERHT8_rvcmp" ] }, {"p": [[22, -5628.620000, 0.322446, 0.011036, 0.335857 ], [19, -5629.280000, 0.166040, 0.000006, 0.373100 ], [21, -5629.360000, 0.153771, 0.017642, 0.366053 ], [18, -5629.360000, 0.153758, 0.051699, 0.366048 ], [38, -5630.170000, 0.068000, 0.076823, 0.376496 ], [193, -5630.170000, 0.067993, 0.016731, 0.376501 ], [194, -5630.170000, 0.067993, 0.000007, 0.376515 ] ], "n": ["FDJVGXF01EA5M3" ] }, {"p": [[22, -7717.090000, 0.567396, 0.011448, 0.244312 ], [21, -7718.190000, 0.188560, 0.017644, 0.262479 ], [38, -7719.430000, 0.054502, 0.073275, 0.257869 ], [193, -7719.460000, 0.052837, 0.016731, 0.263198 ], [194, -7719.460000, 0.052826, 0.000007, 0.263210 ], [28, -7719.640000, 0.044197, 0.000006, 0.246324 ], [35, -7719.750000, 0.039684, 0.011822, 0.265900 ] ], "n": ["FDJVGXF01D3ERO" ] }, {"p": [[22, -7414.900000, 0.473150, 0.011299, 0.240073 ], [18, -7416.000000, 0.158222, 0.051699, 0.258545 ], [21, -7416.000000, 0.158207, 0.017644, 0.258549 ], [208, -7416.930000, 0.062156, 0.005868, 0.244548 ], [206, -7417.100000, 0.052354, 0.000001, 0.255476 ], [207, -7417.100000, 0.052354, 0.000001, 0.255476 ], [38, -7417.290000, 0.043559, 0.074250, 0.255960 ] ], "n": ["FDJVGXF01DRUVX_rvcmp" ] }, {"p": [[22, -8634.790000, 0.732384, 0.011183, 0.106522 ], [18, -8636.690000, 0.109276, 0.051173, 0.116562 ], [21, -8636.700000, 0.108994, 0.017641, 0.116941 ], [226, -8638.550000, 0.017101, 0.005563, 0.110058 ], [210, -8638.560000, 0.016956, 0.014839, 0.113096 ], [225, -8638.660000, 0.015289, 0.036449, 0.114309 ] ], "n": ["FDJVGXF01CF0XW_rvcmp" ] }, {"p": [[22, -8441.960000, 0.829793, 0.011352, 0.097676 ], [18, -8443.990000, 0.108013, 0.050447, 0.107426 ], [226, -8445.510000, 0.023776, 0.011511, 0.098419 ], [2, -8445.620000, 0.021300, 0.019434, 0.095146 ], [210, -8445.840000, 0.017119, 0.014632, 0.104562 ] ], "n": ["FDJVGXF01CMX3V" ] }, {"p": [[22, -6656.310000, 0.666910, 0.011432, 0.071236 ], [18, -6657.880000, 0.138927, 0.039218, 0.075260 ], [2, -6657.930000, 0.131925, 0.014937, 0.061318 ], [21, -6658.690000, 0.062238, 0.016399, 0.083872 ] ], "n": ["FDJVGXF01A4IF9_rvcmp" ] }, {"p": [[22, -8981.030000, 0.695748, 0.010849, 0.066999 ], [226, -8982.920000, 0.105435, 0.023384, 0.058442 ], [18, -8983.330000, 0.069652, 0.047324, 0.072922 ], [21, -8983.530000, 0.057143, 0.017643, 0.076983 ], [17, -8983.990000, 0.036013, 0.049256, 0.062614 ], [227, -8983.990000, 0.036008, 0.000006, 0.062617 ] ], "n": ["FDJVGXF01EVFCB" ] }, {"p": [[22, -7141.920000, 0.788321, 0.011313, 0.066880 ], [18, -7143.230000, 0.211679, 0.036486, 0.069322 ] ], "n": ["FDJVGXF01CWNZP_rvcmp", "FDJVGXF01B1WZO_rvcmp" ] }, {"p": [[22, -3786.790000, 0.767111, 0.011062, 0.065583 ], [18, -3788.440000, 0.146934, 0.034299, 0.079558 ], [21, -3788.980000, 0.085955, 0.015308, 0.086274 ] ], "n": ["FDJVGXF01BDGXM_rvcmp" ] }, {"p": [[22, -6393.510000, 0.437025, 0.010321, 0.291393 ], [21, -6394.310000, 0.196139, 0.017639, 0.312046 ], [18, -6394.310000, 0.196121, 0.051696, 0.312057 ], [148, -6395.580000, 0.054895, 0.073715, 0.287845 ], [194, -6395.810000, 0.043760, 0.000007, 0.317668 ], [149, -6395.960000, 0.037536, 0.034304, 0.272688 ], [210, -6396.040000, 0.034524, 0.006050, 0.306459 ] ], "n": ["FDJVGXF01A61OK_rvcmp" ] }, {"p": [[22, -6518.670000, 0.450850, 0.010198, 0.284949 ], [18, -6519.480000, 0.201661, 0.051699, 0.305331 ], [21, -6519.480000, 0.201654, 0.017644, 0.305328 ], [193, -6521.080000, 0.040538, 0.016731, 0.313063 ], [194, -6521.080000, 0.040532, 0.000007, 0.313082 ], [35, -6521.310000, 0.032386, 0.013080, 0.317575 ], [195, -6521.310000, 0.032380, 0.000009, 0.317572 ] ], "n": ["FDJVGXF01ENFXJ" ] }, {"p": [[22, -8098.260000, 0.624693, 0.008892, 0.092349 ], [18, -8099.530000, 0.175998, 0.046542, 0.096620 ], [21, -8099.690000, 0.149878, 0.017640, 0.099328 ], [208, -8101.390000, 0.027529, 0.015759, 0.098554 ], [205, -8102.310000, 0.010967, 0.037983, 0.103660 ], [209, -8102.310000, 0.010935, 0.000007, 0.104082 ] ], "n": ["FDJVGXF01B1SI3_rvcmp" ] }, {"p": [[22, -7742.180000, 0.830428, 0.009385, 0.072561 ], [18, -7744.690000, 0.067295, 0.050523, 0.082882 ], [21, -7744.700000, 0.066638, 0.017640, 0.083492 ], [20, -7745.330000, 0.035639, 0.004941, 0.088199 ] ], "n": ["FDJVGXF01BGCWG_rvcmp" ] }, {"p": [[22, -8116.320000, 0.432899, 0.007415, 0.043692 ], [196, -8116.890000, 0.243117, 0.052776, 0.044010 ], [20, -8117.270000, 0.166579, 0.000008, 0.050211 ], [21, -8118.120000, 0.071382, 0.017642, 0.048837 ], [19, -8118.420000, 0.052969, 0.012620, 0.050994 ], [204, -8119.250000, 0.022986, 0.006195, 0.058276 ], [200, -8120.080000, 0.010069, 0.012685, 0.063975 ] ], "n": ["FDJVGXF01EK578_rvcmp", "FDJVGXF01BMIPR_rvcmp" ] }, {"p": [[22, -7700.000000, 0.259307, 0.006053, 0.067207 ], [18, -7700.020000, 0.253999, 0.044938, 0.067186 ], [21, -7700.390000, 0.175992, 0.017641, 0.071790 ], [19, -7700.570000, 0.146840, 0.012620, 0.074896 ], [20, -7700.570000, 0.146595, 0.006657, 0.074889 ], [204, -7702.710000, 0.017267, 0.012282, 0.068861 ] ], "n": ["FDJVGXF01A17E7" ] }, {"p": [[22, -6282.140000, 0.265651, 0.000007, 0.312496 ], [18, -6282.140000, 0.265602, 0.051699, 0.312511 ], [21, -6282.140000, 0.265314, 0.017640, 0.312514 ], [149, -6283.110000, 0.100244, 0.019491, 0.297416 ], [148, -6283.730000, 0.054248, 0.119619, 0.316263 ], [127, -6284.160000, 0.034979, 0.040911, 0.317481 ], [208, -6285.080000, 0.013962, 0.004882, 0.304195 ] ], "n": ["FDJVGXF01CXCEM" ] }, {"p": [[25, -7548.420000, 0.322884, 0.013577, 0.070185 ], [205, -7548.440000, 0.316332, 0.000009, 0.070531 ], [204, -7548.440000, 0.316284, 0.020145, 0.070531 ], [202, -7551.400000, 0.016409, 0.035634, 0.062473 ], [209, -7551.860000, 0.010377, 0.002327, 0.079589 ], [22, -7551.900000, 0.009939, 0.019245, 0.080059 ], [24, -7552.140000, 0.007775, 0.000009, 0.086799 ] ], "n": ["FDJVGXF01E0TI0" ] }, {"p": [[25, -5881.700000, 0.288593, 0.011895, 0.056320 ], [205, -5881.840000, 0.251127, 0.000007, 0.057142 ], [204, -5881.840000, 0.250948, 0.020143, 0.057141 ], [20, -5882.480000, 0.133119, 0.000007, 0.064712 ], [226, -5883.890000, 0.032552, 0.015797, 0.043371 ], [22, -5884.280000, 0.021949, 0.016434, 0.064604 ], [24, -5884.290000, 0.021713, 0.000009, 0.071494 ] ], "n": ["FDJVGXF01BER0Y" ] }, {"p": [[25, -7196.200000, 0.323894, 0.011291, 0.074983 ], [204, -7196.230000, 0.313467, 0.016776, 0.073899 ], [205, -7196.430000, 0.257122, 0.000009, 0.075721 ], [208, -7198.510000, 0.032148, 0.005063, 0.086473 ], [206, -7198.710000, 0.026425, 0.000001, 0.089984 ], [207, -7198.710000, 0.026425, 0.000001, 0.089984 ], [24, -7198.960000, 0.020518, 0.000009, 0.090029 ] ], "n": ["FDJVGXF01CX8JF_rvcmp" ] }, {"p": [[25, -6501.510000, 0.331815, 0.011347, 0.063491 ], [204, -6501.520000, 0.331760, 0.016586, 0.062138 ], [205, -6501.760000, 0.258412, 0.000009, 0.064228 ], [208, -6504.100000, 0.025023, 0.005638, 0.075996 ], [206, -6504.370000, 0.019090, 0.000001, 0.080257 ], [207, -6504.370000, 0.019090, 0.000001, 0.080257 ], [24, -6504.620000, 0.014810, 0.000009, 0.080313 ] ], "n": ["FDJVGXF01A523Y_rvcmp" ] }, {"p": [[25, -7294.250000, 0.305122, 0.005501, 0.073479 ], [24, -7294.900000, 0.158889, 0.000009, 0.079530 ], [23, -7294.920000, 0.156492, 0.003604, 0.079522 ], [150, -7294.940000, 0.153350, 0.007819, 0.072550 ], [154, -7295.560000, 0.082156, 0.003047, 0.071342 ], [153, -7295.690000, 0.072281, 0.026997, 0.074671 ], [204, -7295.700000, 0.071709, 0.018581, 0.075710 ] ], "n": ["FDJVGXF01CY5JN" ] }, {"p": [[25, -4663.070000, 0.415364, 0.006242, 0.028094 ], [204, -4663.950000, 0.171527, 0.016945, 0.028270 ], [205, -4664.110000, 0.146471, 0.000006, 0.029536 ], [24, -4664.200000, 0.134337, 0.000009, 0.034388 ], [23, -4664.210000, 0.132301, 0.003604, 0.034372 ] ], "n": ["FDJVGXF01EN425" ] }, {"p": [[25, -5279.500000, 0.384556, 0.004185, 0.047567 ], [24, -5280.030000, 0.227282, 0.000009, 0.052484 ], [23, -5280.040000, 0.223664, 0.003604, 0.052477 ], [204, -5281.120000, 0.076202, 0.017952, 0.049224 ], [205, -5281.190000, 0.071240, 0.000006, 0.050023 ], [196, -5282.620000, 0.017056, 0.041669, 0.030225 ] ], "n": ["FDJVGXF01EQDJB" ] }, {"p": [[25, -2720.170000, 0.199961, 0.002591, 0.165221 ], [23, -2720.200000, 0.192676, 0.003604, 0.169054 ], [24, -2720.200000, 0.192676, 0.001125, 0.169054 ], [39, -2720.320000, 0.170961, 0.000006, 0.170057 ], [204, -2720.760000, 0.110516, 0.020143, 0.175797 ], [205, -2720.760000, 0.110507, 0.000009, 0.175796 ], [197, -2722.340000, 0.022703, 0.000006, 0.210278 ] ], "n": ["FDJVGXF01B8PSX_rvcmp" ] }, {"p": [[26, -7188.250000, 0.386827, 0.087265, 0.065688 ], [196, -7188.800000, 0.221806, 0.002452, 0.071176 ], [195, -7188.820000, 0.217057, 0.009446, 0.073209 ], [35, -7190.060000, 0.063148, 0.003882, 0.081949 ], [38, -7190.250000, 0.051923, 0.052037, 0.077211 ], [171, -7190.810000, 0.029755, 0.028664, 0.067591 ], [194, -7190.820000, 0.029484, 0.006266, 0.082479 ] ], "n": ["FDJVGXF01AY8A2" ] }, {"p": [[26, -9785.140000, 0.378815, 0.085621, 0.125408 ], [196, -9785.200000, 0.355986, 0.013721, 0.127073 ], [195, -9785.870000, 0.182999, 0.009446, 0.137527 ], [28, -9787.330000, 0.042319, 0.024823, 0.131278 ], [226, -9788.090000, 0.019911, 0.018198, 0.110773 ], [22, -9788.770000, 0.010087, 0.013555, 0.133021 ], [34, -9788.790000, 0.009883, 0.007060, 0.143981 ] ], "n": ["FDJVGXF01D9CL6" ] }, {"p": [[26, -7437.980000, 0.502622, 0.082239, 0.097808 ], [196, -7438.590000, 0.271218, 0.010533, 0.108413 ], [195, -7438.770000, 0.226160, 0.009446, 0.114154 ] ], "n": ["FDJVGXF01D4M9I_rvcmp" ] }, {"p": [[26, -7415.530000, 0.520418, 0.080891, 0.095791 ], [196, -7416.170000, 0.274383, 0.013660, 0.105985 ], [195, -7416.460000, 0.205199, 0.009446, 0.113181 ] ], "n": ["FDJVGXF01DPKM4_rvcmp" ] }, {"p": [[26, -8650.750000, 0.668765, 0.073940, 0.100025 ], [196, -8652.270000, 0.146170, 0.015581, 0.111131 ], [195, -8653.300000, 0.052139, 0.009446, 0.124997 ], [226, -8653.490000, 0.042994, 0.021774, 0.099733 ], [34, -8653.630000, 0.037669, 0.000007, 0.128628 ], [33, -8653.630000, 0.037620, 0.020031, 0.128631 ], [17, -8654.570000, 0.014643, 0.036770, 0.097095 ] ], "n": ["FDJVGXF01C3ZUR_rvcmp" ] }, {"p": [[26, -8544.590000, 0.501009, 0.064494, 0.115150 ], [189, -8544.790000, 0.408167, 0.069580, 0.107416 ], [188, -8547.280000, 0.034000, 0.043171, 0.134307 ], [190, -8547.300000, 0.033131, 0.013901, 0.134622 ], [40, -8547.640000, 0.023692, 0.059244, 0.123122 ] ], "n": ["FDJVGXF01B1LFA" ] }, {"p": [[26, -6492.670000, 0.674984, 0.059215, 0.121916 ], [38, -6494.440000, 0.115589, 0.056011, 0.124175 ], [189, -6494.920000, 0.071300, 0.080055, 0.138213 ], [193, -6495.500000, 0.039743, 0.009724, 0.143873 ], [188, -6495.510000, 0.039322, 0.041639, 0.149450 ], [195, -6495.720000, 0.032099, 0.009446, 0.146900 ], [190, -6495.890000, 0.026962, 0.000153, 0.153334 ] ], "n": ["FDJVGXF01CUK8T_rvcmp" ] }, {"p": [[26, -7543.650000, 1.000000, 0.012900, 0.004624 ] ], "n": ["FDJVGXF01CB6R6_rvcmp" ] }, {"p": [[26, -6148.540000, 0.393406, 0.000006, 1.999990 ], [14, -6149.500000, 0.149561, 0.000006, 1.999990 ], [2, -6149.870000, 0.103705, 0.036220, 1.999990 ], [228, -6149.870000, 0.103674, 0.000005, 1.999990 ], [39, -6149.910000, 0.099593, 0.000006, 1.999990 ], [1, -6150.190000, 0.075030, 0.096269, 1.999990 ], [0, -6150.190000, 0.075030, 0.066512, 1.999990 ] ], "n": ["FDJVGXF01AFNGW" ] }, {"p": [[26, -7408.260000, 0.591385, 0.000006, 1.999990 ], [14, -7409.740000, 0.135109, 0.000006, 1.999990 ], [2, -7410.470000, 0.065269, 0.036220, 1.999990 ], [38, -7410.680000, 0.052552, 0.003874, 1.999990 ], [36, -7410.680000, 0.052546, 0.000009, 1.999990 ], [37, -7410.680000, 0.052546, 0.000009, 1.999990 ], [195, -7410.720000, 0.050593, 0.000009, 1.999990 ] ], "n": ["FDJVGXF01ETYCA" ] }, {"p": [[26, -7539.030000, 0.269078, 0.000006, 1.999990 ], [2, -7539.610000, 0.150161, 0.036220, 1.999990 ], [228, -7539.610000, 0.150115, 0.000005, 1.999990 ], [227, -7539.610000, 0.150101, 0.012980, 1.999990 ], [1, -7539.940000, 0.108320, 0.096269, 1.999990 ], [0, -7539.940000, 0.108319, 0.066512, 1.999990 ], [14, -7540.470000, 0.063906, 0.048824, 1.999990 ] ], "n": ["FDJVGXF01DZUNB" ] }, {"p": [[27, -5502.140000, 0.319339, 0.057286, 0.054812 ], [34, -5502.560000, 0.209897, 0.011137, 0.063932 ], [35, -5502.930000, 0.146168, 0.002260, 0.064910 ], [38, -5503.020000, 0.133263, 0.042277, 0.065028 ], [196, -5503.720000, 0.066049, 0.008533, 0.054450 ], [194, -5503.730000, 0.065586, 0.000007, 0.068670 ], [195, -5503.820000, 0.059697, 0.004561, 0.063798 ] ], "n": ["FDJVGXF01DYDV9_rvcmp" ] }, {"p": [[27, -8753.250000, 0.480622, 0.050950, 0.345543 ], [196, -8754.490000, 0.138849, 0.024994, 0.298571 ], [195, -8754.900000, 0.092407, 0.003437, 0.323949 ], [35, -8754.990000, 0.084673, 0.013080, 0.329554 ], [194, -8754.990000, 0.084592, 0.006696, 0.329553 ], [204, -8755.320000, 0.060648, 0.003601, 0.326005 ], [26, -8755.360000, 0.058209, 0.097406, 0.319995 ] ], "n": ["FDJVGXF01COGD3", "FDJVGXF01DB5FM" ] }, {"p": [[27, -7541.970000, 1.000000, 0.051013, 0.102601 ] ], "n": ["FDJVGXF01E2POB_rvcmp" ] }, {"p": [[27, -8252.080000, 1.000000, 0.044840, 0.119610 ] ], "n": ["FDJVGXF01DFJYN" ] }, {"p": [[27, -8575.950000, 0.441439, 0.041832, 0.110988 ], [191, -8577.400000, 0.103152, 0.002698, 0.128775 ], [190, -8577.440000, 0.099045, 0.034335, 0.129588 ], [171, -8577.440000, 0.099044, 0.034630, 0.129585 ], [192, -8577.450000, 0.098275, 0.016900, 0.132782 ], [193, -8577.510000, 0.093008, 0.000730, 0.134753 ], [33, -8577.850000, 0.066038, 0.012553, 0.125908 ] ], "n": ["FDJVGXF01BT0P0" ] }, {"p": [[27, -4263.960000, 0.564470, 0.041935, 0.058075 ], [34, -4265.300000, 0.147662, 0.009810, 0.072352 ], [36, -4266.040000, 0.070694, 0.000009, 0.084567 ], [38, -4266.040000, 0.070474, 0.000009, 0.084563 ], [28, -4266.290000, 0.054819, 0.042091, 0.073487 ], [29, -4266.440000, 0.047307, 0.025261, 0.079211 ], [33, -4266.500000, 0.044574, 0.020031, 0.081548 ] ], "n": ["FDJVGXF01BFWNO_rvcmp" ] }, {"p": [[27, -7461.450000, 1.000000, 0.035734, 0.198678 ] ], "n": ["FDJVGXF01E1PZO" ] }, {"p": [[27, -4417.180000, 0.296322, 0.036107, 0.188909 ], [1, -4417.780000, 0.162792, 0.056749, 0.138474 ], [40, -4417.900000, 0.144268, 0.049608, 0.215464 ], [191, -4418.120000, 0.116404, 0.005550, 0.226032 ], [190, -4418.170000, 0.110253, 0.034335, 0.228249 ], [192, -4418.280000, 0.099065, 0.000005, 0.228487 ], [189, -4418.610000, 0.070897, 0.053508, 0.189541 ] ], "n": ["FDJVGXF01DPAGA" ] }, {"p": [[27, -8146.750000, 0.886981, 0.033031, 0.171195 ], [29, -8150.370000, 0.023772, 0.026137, 0.191592 ], [34, -8150.420000, 0.022558, 0.014780, 0.202076 ], [190, -8150.630000, 0.018381, 0.013225, 0.199783 ], [38, -8150.630000, 0.018248, 0.054964, 0.185963 ], [33, -8150.810000, 0.015294, 0.016076, 0.198447 ], [188, -8150.840000, 0.014766, 0.030099, 0.194250 ] ], "n": ["FDJVGXF01B0502_rvcmp" ] }, {"p": [[27, -8480.600000, 0.987834, 0.033353, 0.125391 ], [171, -8485.000000, 0.012166, 0.027474, 0.111686 ] ], "n": ["FDJVGXF01BEWVV" ] }, {"p": [[27, -8873.900000, 0.984622, 0.031482, 0.161094 ], [29, -8878.060000, 0.015378, 0.011348, 0.175154 ] ], "n": ["FDJVGXF01C3UNG" ] }, {"p": [[27, -7658.150000, 0.496547, 0.025129, 0.226669 ], [191, -7659.270000, 0.161940, 0.006116, 0.219079 ], [190, -7659.590000, 0.117591, 0.034335, 0.223343 ], [171, -7659.590000, 0.117553, 0.034630, 0.223348 ], [192, -7660.410000, 0.052044, 0.005630, 0.223407 ], [40, -7660.580000, 0.044019, 0.086016, 0.226846 ], [39, -7662.030000, 0.010305, 0.011861, 0.238159 ] ], "n": ["FDJVGXF01EE4Q1_rvcmp", "FDJVGXF01CG2V8_rvcmp" ] }, {"p": [[27, -8494.520000, 1.000000, 0.024380, 0.160097 ] ], "n": ["FDJVGXF01B4NK4" ] }, {"p": [[27, -8069.610000, 0.982754, 0.020683, 0.354160 ], [202, -8073.650000, 0.017246, 0.008546, 0.294292 ] ], "n": ["FDJVGXF01EHNCM" ] }, {"p": [[27, -8794.890000, 0.948750, 0.018039, 0.168500 ], [189, -8797.810000, 0.051250, 0.031566, 0.122540 ] ], "n": ["FDJVGXF01CXKE2_rvcmp" ] }, {"p": [[27, -8113.830000, 1.000000, 0.011034, 0.248635 ] ], "n": ["FDJVGXF01BPCLK_rvcmp" ] }, {"p": [[27, -8130.950000, 1.000000, 0.003503, 0.209133 ] ], "n": ["FDJVGXF01DVR9S_rvcmp" ] }, {"p": [[27, -7570.730000, 0.639660, 0.001875, 0.255345 ], [191, -7572.630000, 0.095670, 0.007141, 0.242888 ], [40, -7572.740000, 0.085202, 0.057089, 0.228434 ], [190, -7573.110000, 0.058757, 0.033150, 0.248040 ], [171, -7573.120000, 0.058551, 0.034630, 0.248905 ], [192, -7573.460000, 0.041758, 0.000005, 0.249257 ], [29, -7574.170000, 0.020402, 0.008150, 0.221989 ] ], "n": ["FDJVGXF01ADV5J" ] }, {"p": [[27, -8016.640000, 0.778360, 0.000009, 0.333906 ], [189, -8018.040000, 0.191564, 0.016830, 0.312409 ], [190, -8020.580000, 0.015038, 0.000008, 0.353306 ], [188, -8020.580000, 0.015038, 0.052299, 0.353304 ] ], "n": ["FDJVGXF01ET3VX_rvcmp" ] }, {"p": [[27, -5875.360000, 1.000000, 0.000009, 0.291627 ] ], "n": ["FDJVGXF01EKMU2" ] }, {"p": [[27, -6304.870000, 1.000000, 0.000009, 0.277141 ] ], "n": ["FDJVGXF01DD0OW" ] }, {"p": [[27, -8519.870000, 0.797720, 0.000009, 0.223913 ], [191, -8522.370000, 0.065216, 0.000008, 0.209334 ], [171, -8522.370000, 0.065204, 0.034630, 0.209332 ], [190, -8522.370000, 0.065146, 0.034335, 0.209334 ], [40, -8524.640000, 0.006713, 0.066534, 0.207001 ] ], "n": ["FDJVGXF01B7K9G" ] }, {"p": [[28, -7087.020000, 0.208578, 0.029011, 0.286693 ], [29, -7087.170000, 0.180399, 0.036116, 0.297542 ], [33, -7087.280000, 0.160913, 0.000010, 0.305114 ], [32, -7087.280000, 0.160901, 0.015226, 0.305105 ], [31, -7087.730000, 0.103004, 0.001925, 0.313224 ], [30, -7087.730000, 0.103004, 0.001608, 0.313224 ], [40, -7087.940000, 0.083201, 0.066894, 0.319652 ] ], "n": ["FDJVGXF01E4PPJ_rvcmp" ] }, {"p": [[28, -7154.900000, 0.213921, 0.028682, 0.280870 ], [29, -7155.070000, 0.182092, 0.035805, 0.291756 ], [33, -7155.190000, 0.160769, 0.000010, 0.299549 ], [32, -7155.190000, 0.160757, 0.015226, 0.299555 ], [31, -7155.650000, 0.101727, 0.001925, 0.307674 ], [30, -7155.650000, 0.101727, 0.001608, 0.307681 ], [27, -7155.900000, 0.079008, 0.038892, 0.298900 ] ], "n": ["FDJVGXF01ELF81_rvcmp" ] }, {"p": [[28, -7621.560000, 0.784069, 0.020793, 0.105895 ], [226, -7623.610000, 0.101207, 0.017045, 0.101445 ], [210, -7624.600000, 0.037569, 0.010185, 0.120880 ], [1, -7624.970000, 0.025894, 0.050442, 0.098915 ], [34, -7625.270000, 0.019192, 0.000849, 0.128410 ], [17, -7625.430000, 0.016283, 0.038141, 0.103179 ], [26, -7625.470000, 0.015785, 0.072570, 0.113443 ] ], "n": ["FDJVGXF01DU45W" ] }, {"p": [[28, -8150.130000, 0.857109, 0.020590, 0.097505 ], [226, -8152.760000, 0.061399, 0.014270, 0.094204 ], [210, -8153.420000, 0.031874, 0.010110, 0.110986 ], [34, -8154.150000, 0.015311, 0.001184, 0.118005 ], [205, -8154.430000, 0.011535, 0.037133, 0.124377 ], [208, -8154.450000, 0.011396, 0.023820, 0.126001 ], [209, -8154.450000, 0.011376, 0.000008, 0.126217 ] ], "n": ["FDJVGXF01DDHVB_rvcmp" ] }, {"p": [[28, -8732.760000, 0.401198, 0.018383, 0.111358 ], [226, -8733.310000, 0.232012, 0.014155, 0.104019 ], [210, -8733.830000, 0.138400, 0.010059, 0.120409 ], [208, -8734.490000, 0.071140, 0.018540, 0.131322 ], [205, -8734.720000, 0.056702, 0.038282, 0.134115 ], [209, -8734.720000, 0.056643, 0.000007, 0.134525 ], [225, -8734.970000, 0.043905, 0.036449, 0.118523 ] ], "n": ["FDJVGXF01EPNHK_rvcmp" ] }, {"p": [[28, -8735.770000, 0.401269, 0.018383, 0.111327 ], [226, -8736.320000, 0.232132, 0.014150, 0.103981 ], [210, -8736.840000, 0.138367, 0.010060, 0.120374 ], [208, -8737.500000, 0.071088, 0.018539, 0.131285 ], [205, -8737.730000, 0.056653, 0.038277, 0.134073 ], [209, -8737.730000, 0.056592, 0.000007, 0.134494 ], [225, -8737.980000, 0.043898, 0.036449, 0.118496 ] ], "n": ["FDJVGXF01C55VE_rvcmp" ] }, {"p": [[28, -8686.640000, 0.251000, 0.015457, 0.285717 ], [27, -8686.950000, 0.184268, 0.037601, 0.288896 ], [38, -8687.090000, 0.159867, 0.054112, 0.279957 ], [34, -8687.460000, 0.110353, 0.000007, 0.301796 ], [33, -8687.460000, 0.110324, 0.020031, 0.301797 ], [26, -8687.640000, 0.092098, 0.097406, 0.307066 ], [195, -8687.640000, 0.092091, 0.009446, 0.307071 ] ], "n": ["FDJVGXF01D2V22" ] }, {"p": [[28, -6758.460000, 0.961130, 0.015403, 0.107414 ], [1, -6761.670000, 0.038870, 0.023967, 0.109655 ] ], "n": ["FDJVGXF01EHYHY_rvcmp" ] }, {"p": [[28, -6830.530000, 1.000000, 0.015382, 0.105398 ] ], "n": ["FDJVGXF01EW47W_rvcmp", "FDJVGXF01A3SD0_rvcmp", "FDJVGXF01DG74P_rvcmp", "FDJVGXF01CW7A1_rvcmp" ] }, {"p": [[28, -7052.400000, 1.000000, 0.015369, 0.101695 ] ], "n": ["FDJVGXF01BC051" ] }, {"p": [[28, -4264.790000, 0.563518, 0.000006, 0.030971 ], [22, -4266.200000, 0.137728, 0.012974, 0.071761 ], [38, -4266.730000, 0.080549, 0.062722, 0.067609 ], [27, -4266.920000, 0.066417, 0.057149, 0.067303 ], [35, -4267.060000, 0.057861, 0.005345, 0.070558 ], [193, -4267.270000, 0.047125, 0.015824, 0.080709 ], [194, -4267.270000, 0.046801, 0.000007, 0.080829 ] ], "n": ["FDJVGXF01AK3EJ_rvcmp" ] }, {"p": [[29, -7075.160000, 0.316776, 0.040951, 0.124289 ], [32, -7075.310000, 0.271848, 0.014936, 0.129256 ], [33, -7075.310000, 0.271390, 0.000010, 0.129346 ], [31, -7077.130000, 0.044039, 0.001925, 0.140845 ], [30, -7077.130000, 0.044017, 0.001608, 0.140845 ], [190, -7077.480000, 0.031031, 0.018935, 0.132868 ], [171, -7077.870000, 0.020898, 0.026287, 0.137670 ] ], "n": ["FDJVGXF01CJZMI" ] }, {"p": [[29, -4272.950000, 0.178561, 0.029909, 0.274528 ], [33, -4273.040000, 0.163512, 0.000010, 0.282634 ], [32, -4273.040000, 0.163478, 0.015226, 0.282639 ], [28, -4273.100000, 0.154448, 0.048759, 0.283219 ], [34, -4273.100000, 0.154362, 0.000007, 0.283233 ], [31, -4273.610000, 0.092819, 0.001925, 0.299591 ], [30, -4273.610000, 0.092819, 0.001608, 0.299584 ] ], "n": ["FDJVGXF01ATIJK_rvcmp" ] }, {"p": [[29, -4245.760000, 0.183923, 0.029112, 0.257568 ], [33, -4245.870000, 0.164292, 0.000010, 0.266315 ], [32, -4245.870000, 0.164256, 0.015226, 0.266320 ], [28, -4245.930000, 0.154939, 0.048759, 0.266804 ], [34, -4245.930000, 0.154846, 0.000007, 0.266817 ], [31, -4246.480000, 0.088872, 0.001925, 0.283134 ], [30, -4246.480000, 0.088872, 0.001608, 0.283127 ] ], "n": ["FDJVGXF01B3QSM_rvcmp" ] }, {"p": [[29, -4871.430000, 0.579528, 0.019369, 0.174551 ], [28, -4873.320000, 0.087510, 0.023571, 0.175732 ], [26, -4873.390000, 0.081443, 0.039661, 0.198622 ], [27, -4873.450000, 0.076387, 0.046675, 0.176235 ], [33, -4873.470000, 0.074640, 0.010873, 0.197984 ], [34, -4873.610000, 0.065482, 0.000007, 0.196667 ], [39, -4874.230000, 0.035011, 0.000006, 0.220005 ] ], "n": ["FDJVGXF01AK9MM", "FDJVGXF01EAP1T" ] }, {"p": [[29, -8090.520000, 0.451493, 0.000006, 0.404868 ], [28, -8091.120000, 0.246879, 0.000006, 0.401663 ], [40, -8092.100000, 0.092673, 0.009897, 0.427511 ], [34, -8092.590000, 0.057112, 0.000007, 0.432758 ], [33, -8092.590000, 0.057110, 0.020031, 0.432752 ], [38, -8092.750000, 0.048307, 0.069299, 0.433190 ], [26, -8092.790000, 0.046426, 0.080460, 0.429622 ] ], "n": ["FDJVGXF01AYDNG" ] }, {"p": [[29, -8815.800000, 1.000000, 0.000006, 0.288753 ] ], "n": ["FDJVGXF01BKLB9_rvcmp" ] }, {"p": [[29, -5761.260000, 0.898807, 0.000006, 0.258513 ], [40, -5764.410000, 0.038425, 0.057750, 0.255693 ], [192, -5764.890000, 0.023772, 0.001042, 0.275250 ], [191, -5764.900000, 0.023715, 0.015648, 0.275874 ], [190, -5765.340000, 0.015281, 0.028144, 0.277102 ] ], "n": ["FDJVGXF01B7XA4_rvcmp" ] }, {"p": [[29, -6499.070000, 0.834613, 0.000006, 0.257147 ], [28, -6502.050000, 0.042232, 0.029109, 0.269024 ], [33, -6502.310000, 0.032687, 0.000010, 0.286191 ], [32, -6502.310000, 0.032680, 0.015226, 0.286194 ], [34, -6502.520000, 0.026437, 0.000007, 0.288807 ], [31, -6503.050000, 0.015676, 0.001925, 0.300005 ], [30, -6503.050000, 0.015676, 0.001608, 0.300001 ] ], "n": ["FDJVGXF01DI1YF_rvcmp" ] }, {"p": [[31, -8045.170000, 0.330072, 0.000008, 0.308291 ], [29, -8045.950000, 0.151520, 0.028068, 0.306626 ], [40, -8046.040000, 0.138221, 0.000720, 0.316620 ], [32, -8046.240000, 0.113836, 0.008482, 0.313236 ], [33, -8046.310000, 0.106154, 0.000010, 0.314181 ], [30, -8046.350000, 0.102107, 0.001608, 0.317904 ], [177, -8046.910000, 0.058090, 0.000009, 0.355336 ] ], "n": ["FDJVGXF01DOJCP" ] }, {"p": [[31, -4726.800000, 0.194414, 0.000008, 0.250616 ], [30, -4726.800000, 0.194414, 0.000006, 0.250616 ], [32, -4726.810000, 0.194348, 0.000007, 0.250617 ], [27, -4727.380000, 0.109759, 0.027251, 0.234662 ], [28, -4727.430000, 0.103547, 0.035953, 0.243550 ], [33, -4727.450000, 0.101759, 0.000010, 0.257401 ], [29, -4727.450000, 0.101758, 0.046702, 0.257394 ] ], "n": ["FDJVGXF01AW2QG" ] }, {"p": [[31, -6288.280000, 0.186718, 0.000008, 0.246558 ], [30, -6288.280000, 0.186718, 0.000006, 0.246558 ], [32, -6288.280000, 0.186679, 0.000007, 0.246553 ], [28, -6288.650000, 0.128559, 0.035942, 0.240041 ], [29, -6288.700000, 0.122409, 0.041188, 0.245345 ], [33, -6288.750000, 0.117081, 0.000010, 0.249271 ], [189, -6289.230000, 0.071837, 0.054112, 0.226860 ] ], "n": ["FDJVGXF01EOSEH_rvcmp" ] }, {"p": [[31, -4169.380000, 0.218182, 0.000008, 0.182375 ], [30, -4169.380000, 0.218182, 0.000006, 0.182375 ], [32, -4169.380000, 0.218104, 0.000007, 0.182374 ], [29, -4170.160000, 0.099773, 0.046702, 0.187393 ], [33, -4170.160000, 0.099762, 0.000010, 0.187402 ], [28, -4170.460000, 0.073866, 0.044395, 0.185578 ], [34, -4170.490000, 0.072131, 0.000007, 0.190970 ] ], "n": ["FDJVGXF01EVSH3_rvcmp" ] }, {"p": [[33, -8208.690000, 0.486362, 0.008908, 0.092767 ], [32, -8209.880000, 0.147711, 0.015226, 0.100686 ], [194, -8210.180000, 0.109723, 0.002533, 0.103308 ], [28, -8210.350000, 0.092525, 0.045337, 0.096891 ], [34, -8210.400000, 0.087712, 0.000007, 0.098753 ], [193, -8210.840000, 0.056853, 0.016731, 0.105309 ], [192, -8211.930000, 0.019115, 0.009166, 0.095966 ] ], "n": ["FDJVGXF01DCTSU" ] }, {"p": [[33, -2691.780000, 0.250596, 0.000010, 0.000008 ], [29, -2691.780000, 0.250561, 0.046702, 0.000006 ], [32, -2691.780000, 0.250547, 0.015226, 0.000006 ], [34, -2691.860000, 0.230000, 0.000006, 0.000008 ], [35, -2694.850000, 0.011614, 0.000006, 0.000009 ], [31, -2696.100000, 0.003341, 0.001925, 0.012214 ], [30, -2696.100000, 0.003341, 0.001608, 0.012214 ] ], "n": ["FDJVGXF01BB0IM_rvcmp", "FDJVGXF01DWWKJ_rvcmp", "FDJVGXF01BQIGM_rvcmp" ] }, {"p": [[34, -3775.760000, 0.279284, 0.013488, 0.009167 ], [35, -3775.760000, 0.277579, 0.000006, 0.009191 ], [27, -3775.760000, 0.277568, 0.070440, 0.009191 ], [33, -3777.370000, 0.055799, 0.020031, 0.009875 ], [28, -3777.370000, 0.055791, 0.048759, 0.009884 ], [38, -3777.980000, 0.030182, 0.017966, 0.011942 ], [36, -3778.220000, 0.023797, 0.000009, 0.018156 ] ], "n": ["FDJVGXF01E0FKB" ] }, {"p": [[34, -5009.290000, 0.336056, 0.010012, 0.034424 ], [35, -5009.640000, 0.236740, 0.002293, 0.035065 ], [196, -5009.830000, 0.196693, 0.008756, 0.027162 ], [195, -5010.640000, 0.087359, 0.005082, 0.034088 ], [33, -5011.090000, 0.055689, 0.020031, 0.041990 ], [194, -5011.200000, 0.049703, 0.006696, 0.038883 ], [38, -5011.480000, 0.037758, 0.048406, 0.040167 ] ], "n": ["FDJVGXF01BOA9N_rvcmp" ] }, {"p": [[34, -4856.530000, 0.279036, 0.010173, 0.026730 ], [196, -4856.850000, 0.203294, 0.008684, 0.018685 ], [35, -4856.900000, 0.194173, 0.002471, 0.027037 ], [27, -4857.000000, 0.174673, 0.070440, 0.027959 ], [195, -4857.860000, 0.073979, 0.005360, 0.025621 ], [33, -4858.530000, 0.038016, 0.020031, 0.034971 ], [194, -4858.560000, 0.036830, 0.006696, 0.031053 ] ], "n": ["FDJVGXF01BF4ZH_rvcmp", "FDJVGXF01D2AEW_rvcmp", "FDJVGXF01AN94K_rvcmp" ] }, {"p": [[34, -4686.420000, 0.324557, 0.008734, 0.024076 ], [196, -4686.880000, 0.204798, 0.009562, 0.016903 ], [27, -4687.110000, 0.162362, 0.070440, 0.025798 ], [35, -4687.250000, 0.141531, 0.006526, 0.028935 ], [195, -4687.990000, 0.067468, 0.005151, 0.023701 ], [33, -4688.020000, 0.065508, 0.020031, 0.029062 ], [194, -4688.690000, 0.033776, 0.006696, 0.028746 ] ], "n": ["FDJVGXF01DNF8C_rvcmp" ] }, {"p": [[34, -4689.110000, 0.323398, 0.008734, 0.024066 ], [196, -4689.570000, 0.204135, 0.009572, 0.016895 ], [27, -4689.800000, 0.161769, 0.070440, 0.025796 ], [35, -4689.910000, 0.144563, 0.006526, 0.022794 ], [195, -4690.680000, 0.067229, 0.005151, 0.023690 ], [33, -4690.710000, 0.065259, 0.020031, 0.029045 ], [194, -4691.370000, 0.033648, 0.006696, 0.028739 ] ], "n": ["FDJVGXF01C6JWZ" ] }, {"p": [[34, -4480.410000, 0.515996, 0.006122, 0.014612 ], [33, -4481.400000, 0.192943, 0.020031, 0.016072 ], [35, -4481.630000, 0.152838, 0.000006, 0.016126 ], [29, -4482.620000, 0.056934, 0.043740, 0.020382 ], [32, -4482.670000, 0.054059, 0.015226, 0.021360 ], [195, -4483.780000, 0.017797, 0.005612, 0.014244 ], [38, -4484.420000, 0.009432, 0.018786, 0.024949 ] ], "n": ["FDJVGXF01EF2ZF_rvcmp" ] }, {"p": [[34, -4385.160000, 0.551948, 0.005601, 0.007911 ], [33, -4386.110000, 0.213932, 0.020031, 0.008380 ], [35, -4386.600000, 0.131372, 0.000006, 0.009309 ], [29, -4387.580000, 0.049037, 0.042951, 0.011890 ], [32, -4387.690000, 0.044285, 0.015226, 0.013395 ], [38, -4389.870000, 0.004987, 0.014439, 0.019023 ], [36, -4389.990000, 0.004438, 0.000009, 0.023562 ] ], "n": ["FDJVGXF01CPIPJ", "FDJVGXF01DRUD1" ] }, {"p": [[34, -2751.070000, 0.612253, 0.005977, 0.000008 ], [33, -2752.150000, 0.207854, 0.020031, 0.000008 ], [35, -2752.560000, 0.137506, 0.000006, 0.000009 ], [195, -2754.600000, 0.017932, 0.000009, 0.011486 ], [194, -2754.600000, 0.017926, 0.006696, 0.011487 ], [38, -2755.610000, 0.006529, 0.076823, 0.013352 ] ], "n": ["FDJVGXF01E32DQ_rvcmp", "FDJVGXF01DZ5JQ_rvcmp" ] }, {"p": [[34, -3379.210000, 0.610403, 0.005989, 0.000008 ], [33, -3380.290000, 0.207005, 0.020031, 0.000008 ], [35, -3380.700000, 0.137841, 0.000006, 0.000009 ], [32, -3382.820000, 0.016494, 0.015226, 0.004956 ], [195, -3382.980000, 0.014131, 0.000009, 0.008851 ], [194, -3382.980000, 0.014126, 0.006696, 0.008856 ] ], "n": ["FDJVGXF01BOPK9", "FDJVGXF01CS07I_rvcmp" ] }, {"p": [[34, -3737.670000, 0.609757, 0.005964, 0.000008 ], [33, -3738.740000, 0.207846, 0.020031, 0.000008 ], [35, -3739.160000, 0.137024, 0.000006, 0.000009 ], [32, -3741.330000, 0.015677, 0.015226, 0.003920 ], [195, -3741.530000, 0.012780, 0.000009, 0.007750 ], [194, -3741.530000, 0.012776, 0.006696, 0.007751 ], [38, -3742.660000, 0.004140, 0.076825, 0.009051 ] ], "n": ["FDJVGXF01DG78X" ] }, {"p": [[37, -2941.210000, 0.205062, 0.001050, 0.011100 ], [36, -2941.210000, 0.205055, 0.000392, 0.011102 ], [38, -2941.210000, 0.205046, 0.000005, 0.011108 ], [194, -2941.780000, 0.116069, 0.000007, 0.011074 ], [193, -2941.780000, 0.116034, 0.016731, 0.011074 ], [35, -2942.190000, 0.076374, 0.013078, 0.010893 ], [195, -2942.190000, 0.076359, 0.000009, 0.010887 ] ], "n": ["FDJVGXF01DK2IL_rvcmp" ] }, {"p": [[37, -3002.860000, 0.207747, 0.001057, 0.010760 ], [36, -3002.860000, 0.207740, 0.000398, 0.010762 ], [38, -3002.860000, 0.207731, 0.000005, 0.010762 ], [194, -3003.430000, 0.117592, 0.000007, 0.010719 ], [193, -3003.430000, 0.117556, 0.016731, 0.010720 ], [35, -3003.850000, 0.077417, 0.013078, 0.010537 ], [27, -3004.040000, 0.064216, 0.070440, 0.010211 ] ], "n": ["FDJVGXF01BKUZO_rvcmp" ] }, {"p": [[38, -4389.820000, 0.622291, 0.036927, 0.168334 ], [27, -4391.290000, 0.142084, 0.031389, 0.195385 ], [37, -4392.180000, 0.058621, 0.002319, 0.231171 ], [36, -4392.180000, 0.058621, 0.001199, 0.231167 ], [33, -4392.530000, 0.041216, 0.014141, 0.204838 ], [193, -4392.570000, 0.039606, 0.004247, 0.215666 ], [192, -4392.620000, 0.037560, 0.022464, 0.219012 ] ], "n": ["FDJVGXF01AX1XU" ] }, {"p": [[38, -5005.960000, 0.272955, 0.036152, 0.045702 ], [35, -5006.490000, 0.161323, 0.004278, 0.047279 ], [196, -5006.610000, 0.141864, 0.009466, 0.033773 ], [27, -5006.690000, 0.131723, 0.070440, 0.049071 ], [194, -5006.940000, 0.102720, 0.000007, 0.048326 ], [193, -5006.940000, 0.102644, 0.016731, 0.048324 ], [195, -5007.110000, 0.086772, 0.003416, 0.043918 ] ], "n": ["FDJVGXF01A14WV" ] }, {"p": [[39, -4598.410000, 0.169965, 0.015889, 0.278196 ], [193, -4598.590000, 0.142036, 0.000008, 0.293331 ], [192, -4598.590000, 0.142015, 0.022464, 0.293333 ], [38, -4598.630000, 0.136764, 0.076823, 0.297622 ], [194, -4598.630000, 0.136744, 0.000007, 0.297627 ], [196, -4598.630000, 0.136247, 0.000010, 0.293277 ], [195, -4598.630000, 0.136229, 0.009446, 0.293287 ] ], "n": ["FDJVGXF01B0VT1_rvcmp" ] }, {"p": [[39, -4661.100000, 0.172658, 0.015769, 0.270216 ], [193, -4661.300000, 0.141802, 0.000008, 0.285076 ], [192, -4661.300000, 0.141781, 0.022464, 0.285078 ], [196, -4661.340000, 0.136034, 0.000010, 0.284980 ], [195, -4661.340000, 0.136014, 0.009446, 0.284985 ], [38, -4661.340000, 0.135866, 0.076823, 0.289323 ], [194, -4661.340000, 0.135845, 0.000007, 0.289333 ] ], "n": ["FDJVGXF01DI2Q5", "FDJVGXF01APVY4" ] }, {"p": [[39, -2616.910000, 0.371083, 0.011719, 0.029263 ], [190, -2617.240000, 0.267240, 0.009321, 0.027562 ], [205, -2618.520000, 0.073822, 0.000007, 0.043403 ], [204, -2618.520000, 0.073797, 0.020143, 0.043398 ], [25, -2618.520000, 0.073768, 0.014512, 0.043407 ], [196, -2618.570000, 0.070169, 0.000010, 0.041398 ], [195, -2618.570000, 0.070121, 0.009446, 0.041400 ] ], "n": ["FDJVGXF01EFQH4_rvcmp" ] }, {"p": [[39, -3901.470000, 0.251301, 0.009835, 0.109960 ], [190, -3901.690000, 0.201958, 0.018101, 0.108118 ], [34, -3902.180000, 0.123774, 0.000608, 0.130203 ], [33, -3902.180000, 0.123491, 0.020031, 0.130829 ], [29, -3902.350000, 0.103864, 0.046702, 0.134200 ], [171, -3902.390000, 0.099611, 0.031112, 0.113474 ], [191, -3902.430000, 0.096000, 0.000008, 0.116689 ] ], "n": ["FDJVGXF01CLTHA" ] }, {"p": [[39, -6492.780000, 1.000000, 0.005258, 0.024366 ] ], "n": ["FDJVGXF01AFET7" ] }, {"p": [[39, -3751.040000, 0.239880, 0.000006, 0.295663 ], [29, -3751.120000, 0.222172, 0.000006, 0.310543 ], [167, -3751.670000, 0.127800, 0.000008, 0.281584 ], [151, -3751.770000, 0.115081, 0.000007, 0.340280 ], [171, -3751.930000, 0.098439, 0.001538, 0.344289 ], [149, -3751.930000, 0.098314, 0.063739, 0.345315 ], [170, -3751.930000, 0.098313, 0.018724, 0.345319 ] ], "n": ["FDJVGXF01CD0V5" ] }, {"p": [[40, -7351.360000, 0.243770, 0.064968, 0.138430 ], [192, -7351.520000, 0.207621, 0.012056, 0.150422 ], [149, -7351.780000, 0.160413, 0.038290, 0.114484 ], [171, -7352.130000, 0.113366, 0.020146, 0.143555 ], [39, -7352.190000, 0.106637, 0.021827, 0.160322 ], [193, -7352.240000, 0.100737, 0.000008, 0.162317 ], [191, -7352.640000, 0.067457, 0.007862, 0.153095 ] ], "n": ["FDJVGXF01DA51F" ] }, {"p": [[40, -5927.500000, 0.264380, 0.062612, 0.142518 ], [192, -5927.810000, 0.193444, 0.012191, 0.157604 ], [149, -5927.900000, 0.177115, 0.039103, 0.120925 ], [39, -5928.410000, 0.106030, 0.021179, 0.169849 ], [193, -5928.470000, 0.100253, 0.000008, 0.171827 ], [171, -5928.490000, 0.098728, 0.017591, 0.153717 ], [191, -5928.980000, 0.060051, 0.011998, 0.163414 ] ], "n": ["FDJVGXF01AOYHI" ] }, {"p": [[40, -6917.390000, 0.513125, 0.060544, 0.129058 ], [192, -6918.840000, 0.120271, 0.005055, 0.149334 ], [191, -6918.950000, 0.107874, 0.015648, 0.150823 ], [190, -6919.310000, 0.075084, 0.034335, 0.152179 ], [171, -6919.310000, 0.075026, 0.034630, 0.152186 ], [39, -6919.410000, 0.067658, 0.012365, 0.156288 ], [28, -6919.920000, 0.040962, 0.030353, 0.159886 ] ], "n": ["FDJVGXF01C794H" ] }, {"p": [[40, -6743.190000, 0.326190, 0.054919, 0.103919 ], [38, -6743.550000, 0.229056, 0.059882, 0.108165 ], [193, -6744.120000, 0.129299, 0.008136, 0.121297 ], [26, -6744.240000, 0.113878, 0.097406, 0.129670 ], [195, -6744.240000, 0.113863, 0.009446, 0.129676 ], [192, -6745.070000, 0.049903, 0.013478, 0.126012 ], [189, -6745.350000, 0.037811, 0.059105, 0.101751 ] ], "n": ["FDJVGXF01BHLXE" ] }, {"p": [[40, -5092.630000, 0.308732, 0.044753, 0.473982 ], [192, -5093.020000, 0.209361, 0.000005, 0.508740 ], [191, -5093.020000, 0.209317, 0.015648, 0.508741 ], [193, -5094.060000, 0.073576, 0.000008, 0.526621 ], [39, -5094.060000, 0.073575, 0.025399, 0.526627 ], [38, -5094.130000, 0.069037, 0.076823, 0.526439 ], [29, -5094.330000, 0.056402, 0.000006, 0.527534 ] ], "n": ["FDJVGXF01A3XD4" ] }, {"p": [[40, -4726.410000, 0.760962, 0.038868, 0.141689 ], [189, -4728.920000, 0.061545, 0.029295, 0.159271 ], [191, -4729.350000, 0.040127, 0.015648, 0.185840 ], [192, -4729.350000, 0.040114, 0.000005, 0.185845 ], [27, -4729.490000, 0.035029, 0.020378, 0.189434 ], [190, -4729.590000, 0.031557, 0.030632, 0.185317 ], [171, -4729.620000, 0.030667, 0.034630, 0.189743 ] ], "n": ["FDJVGXF01A4I83" ] }, {"p": [[40, -8851.540000, 0.875607, 0.020885, 0.282963 ], [38, -8854.460000, 0.047061, 0.047732, 0.292386 ], [193, -8855.270000, 0.021034, 0.006850, 0.322703 ], [29, -8855.420000, 0.018065, 0.005765, 0.316543 ], [192, -8855.570000, 0.015578, 0.022464, 0.329483 ], [191, -8855.800000, 0.012401, 0.000008, 0.329554 ], [34, -8855.990000, 0.010254, 0.014240, 0.330980 ] ], "n": ["FDJVGXF01CCFV1" ] }, {"p": [[40, -2816.800000, 0.423833, 0.019033, 0.133227 ], [149, -2817.070000, 0.324398, 0.024917, 0.094660 ], [191, -2818.520000, 0.076319, 0.012681, 0.150562 ], [192, -2818.610000, 0.069967, 0.000005, 0.153313 ], [148, -2819.200000, 0.038771, 0.029076, 0.101645 ], [162, -2819.350000, 0.033356, 0.000005, 0.182495 ], [163, -2819.350000, 0.033356, 0.000007, 0.182495 ] ], "n": ["FDJVGXF01E3HCE" ] }, {"p": [[40, -5682.820000, 0.956613, 0.017061, 0.218498 ], [151, -5686.870000, 0.016766, 0.006743, 0.257700 ], [152, -5686.950000, 0.015368, 0.007516, 0.256068 ], [153, -5687.270000, 0.011253, 0.004451, 0.261264 ] ], "n": ["FDJVGXF01AOJEQ_rvcmp" ] }, {"p": [[50, -5253.880000, 0.274406, 0.000008, 1.582230 ], [51, -5254.470000, 0.151137, 0.196060, 1.634300 ], [60, -5254.700000, 0.121000, 0.000006, 1.668060 ], [52, -5254.700000, 0.121000, 0.092957, 1.668050 ], [59, -5254.700000, 0.121000, 0.039608, 1.668050 ], [53, -5254.830000, 0.105892, 0.000006, 1.685530 ], [56, -5254.830000, 0.105565, 0.000009, 1.689540 ] ], "n": ["FDJVGXF01CNQFK" ] }, {"p": [[65, -4705.050000, 0.177114, 0.223601, 1.999990 ], [37, -4705.210000, 0.151343, 0.000009, 1.999990 ], [36, -4705.210000, 0.151343, 0.000009, 1.999990 ], [38, -4705.210000, 0.151320, 0.000009, 1.999990 ], [66, -4705.330000, 0.133482, 0.000007, 1.999990 ], [64, -4705.330000, 0.133478, 0.347492, 1.999990 ], [9, -4705.600000, 0.101921, 0.000008, 1.999990 ] ], "n": ["FDJVGXF01EZU4N_rvcmp", "FDJVGXF01B0X78_rvcmp" ] }, {"p": [[65, -7187.180000, 0.434361, 0.057306, 1.999990 ], [73, -7188.700000, 0.094971, 0.065085, 1.999990 ], [68, -7188.710000, 0.094527, 0.067647, 1.999990 ], [74, -7188.710000, 0.094524, 0.000009, 1.999990 ], [72, -7188.710000, 0.094252, 0.263281, 1.999990 ], [71, -7188.710000, 0.094249, 0.079029, 1.999990 ], [70, -7188.720000, 0.093115, 0.490388, 1.999990 ] ], "n": ["FDJVGXF01BU5S3" ] }, {"p": [[70, -7142.740000, 0.351172, 0.530580, 1.452650 ], [71, -7142.860000, 0.310021, 0.000010, 1.530600 ], [73, -7144.160000, 0.084655, 0.000007, 1.693500 ], [72, -7144.160000, 0.084644, 0.263281, 1.693490 ], [68, -7144.290000, 0.073869, 0.067647, 1.740840 ], [74, -7144.290000, 0.073867, 0.000009, 1.740840 ], [66, -7145.520000, 0.021772, 0.108039, 1.856570 ] ], "n": ["FDJVGXF01B16PZ_rvcmp" ] }, {"p": [[76, -5729.170000, 0.958801, 0.050177, 0.350206 ], [77, -5732.960000, 0.021518, 0.207696, 0.360811 ], [19, -5733.050000, 0.019682, 0.000006, 0.324320 ] ], "n": ["FDJVGXF01EZGSA", "FDJVGXF01DHOIS", "FDJVGXF01EN2KD", "FDJVGXF01BGP0B", "FDJVGXF01CYI70" ] }, {"p": [[77, -2525.760000, 0.197960, 0.210163, 0.404921 ], [76, -2525.760000, 0.197743, 0.138323, 0.406483 ], [78, -2525.760000, 0.197603, 0.000008, 0.406483 ], [57, -2526.090000, 0.142237, 0.003602, 0.428880 ], [86, -2526.240000, 0.122371, 0.000007, 0.485847 ], [56, -2526.460000, 0.098211, 0.074592, 0.418339 ], [67, -2527.260000, 0.043874, 0.124498, 0.320033 ] ], "n": ["FDJVGXF01DNDT7" ] }, {"p": [[80, -4604.640000, 0.661735, 0.027934, 0.017933 ], [98, -4605.670000, 0.235997, 0.020494, 0.030096 ], [101, -4607.660000, 0.032174, 0.018812, 0.042387 ], [102, -4607.660000, 0.032148, 0.000005, 0.042381 ], [100, -4608.220000, 0.018487, 0.035413, 0.043297 ], [106, -4608.690000, 0.011563, 0.002434, 0.051403 ], [107, -4609.070000, 0.007895, 0.009012, 0.049026 ] ], "n": ["FDJVGXF01EWN6U" ] }, {"p": [[88, -7380.950000, 0.831891, 0.012117, 0.174910 ], [99, -7382.550000, 0.168109, 0.000006, 0.201624 ] ], "n": ["FDJVGXF01D7743" ] }, {"p": [[91, -4271.070000, 0.315406, 0.020097, 0.000009 ], [94, -4271.070000, 0.315272, 0.039199, 0.000006 ], [95, -4271.080000, 0.315134, 0.000007, 0.000009 ], [96, -4273.530000, 0.027106, 0.027498, 0.000006 ], [97, -4273.530000, 0.027082, 0.000006, 0.000009 ] ], "n": ["FDJVGXF01COAXF" ] }, {"p": [[91, -4790.420000, 0.265379, 0.018578, 0.083840 ], [94, -4790.430000, 0.263825, 0.039199, 0.083871 ], [95, -4790.430000, 0.263772, 0.000008, 0.083871 ], [96, -4791.540000, 0.086629, 0.027500, 0.087459 ], [97, -4791.540000, 0.086588, 0.000005, 0.087458 ], [92, -4793.150000, 0.017282, 0.000005, 0.096662 ], [93, -4793.200000, 0.016525, 0.002453, 0.096667 ] ], "n": ["FDJVGXF01CDXTH" ] }, {"p": [[91, -6557.310000, 0.311233, 0.017470, 0.064477 ], [94, -6557.330000, 0.305814, 0.039199, 0.064531 ], [95, -6557.330000, 0.305529, 0.000008, 0.064531 ], [96, -6559.880000, 0.023827, 0.027500, 0.069617 ], [97, -6559.880000, 0.023805, 0.000005, 0.069608 ], [92, -6560.350000, 0.014918, 0.005357, 0.072940 ], [93, -6560.350000, 0.014875, 0.002453, 0.072931 ] ], "n": ["FDJVGXF01DBSFJ" ] }, {"p": [[91, -8560.370000, 0.364627, 0.014868, 0.039063 ], [95, -8560.550000, 0.304691, 0.001827, 0.037973 ], [94, -8560.720000, 0.257789, 0.039199, 0.038827 ], [96, -8562.680000, 0.036455, 0.027500, 0.041880 ], [97, -8562.680000, 0.036438, 0.000005, 0.041874 ] ], "n": ["FDJVGXF01BX0MO_rvcmp" ] }, {"p": [[91, -6972.830000, 0.351256, 0.014913, 0.005056 ], [94, -6972.910000, 0.324775, 0.039199, 0.005129 ], [95, -6972.910000, 0.323969, 0.000008, 0.005129 ] ], "n": ["FDJVGXF01CSHXA_rvcmp" ] }, {"p": [[91, -8780.350000, 0.642793, 0.013949, 0.045399 ], [95, -8781.830000, 0.146511, 0.000008, 0.048708 ], [94, -8781.830000, 0.146413, 0.039199, 0.048703 ], [96, -8783.350000, 0.032149, 0.027500, 0.051441 ], [97, -8783.350000, 0.032133, 0.000005, 0.051444 ] ], "n": ["FDJVGXF01AIDG8_rvcmp", "FDJVGXF01DXA5V_rvcmp" ] }, {"p": [[91, -8551.810000, 0.709247, 0.013971, 0.033195 ], [95, -8553.490000, 0.133045, 0.000008, 0.036348 ], [94, -8553.490000, 0.132891, 0.039199, 0.036347 ], [96, -8555.160000, 0.024816, 0.027500, 0.039177 ] ], "n": ["FDJVGXF01DSJSA" ] }, {"p": [[91, -4031.760000, 0.598185, 0.013190, 0.018968 ], [103, -4032.710000, 0.230729, 0.000007, 0.027634 ], [95, -4033.760000, 0.080418, 0.000008, 0.024651 ], [97, -4034.450000, 0.040645, 0.000005, 0.028925 ], [96, -4034.450000, 0.040626, 0.027500, 0.028932 ], [112, -4035.910000, 0.009395, 0.007821, 0.028428 ] ], "n": ["FDJVGXF01CQPYV" ] }, {"p": [[91, -8770.720000, 1.000000, 0.007056, 0.061371 ] ], "n": ["FDJVGXF01CD42S_rvcmp" ] }, {"p": [[91, -8435.690000, 1.000000, 0.006508, 0.003112 ] ], "n": ["FDJVGXF01DDIQU_rvcmp" ] }, {"p": [[91, -8045.590000, 1.000000, 0.005559, 0.023239 ] ], "n": ["FDJVGXF01AKE7H_rvcmp" ] }, {"p": [[91, -7654.100000, 0.981270, 0.004268, 0.014477 ], [98, -7658.060000, 0.018730, 0.028308, 0.018154 ] ], "n": ["FDJVGXF01DZWVS_rvcmp" ] }, {"p": [[91, -7668.570000, 0.985688, 0.004399, 0.009574 ], [98, -7672.800000, 0.014312, 0.028008, 0.012959 ] ], "n": ["FDJVGXF01BNVHS_rvcmp", "FDJVGXF01BN1TA_rvcmp" ] }, {"p": [[91, -7458.550000, 1.000000, 0.002194, 0.009349 ] ], "n": ["FDJVGXF01EB87R_rvcmp" ] }, {"p": [[91, -3147.970000, 0.932996, 0.000010, 0.010161 ], [107, -3150.610000, 0.067004, 0.011338, 0.006548 ] ], "n": ["FDJVGXF01CT8L2" ] }, {"p": [[91, -3878.730000, 0.345262, 0.000010, 0.000010 ], [95, -3879.330000, 0.189186, 0.000008, 0.000006 ], [94, -3879.330000, 0.189049, 0.039199, 0.000006 ], [97, -3879.760000, 0.122924, 0.000005, 0.000006 ], [96, -3879.760000, 0.122823, 0.027500, 0.000006 ], [90, -3881.840000, 0.015380, 0.040800, 0.000006 ], [98, -3881.840000, 0.015375, 0.000006, 0.000007 ] ], "n": ["FDJVGXF01BA67J_rvcmp", "FDJVGXF01EJGZO_rvcmp" ] }, {"p": [[91, -3567.400000, 0.535857, 0.000010, 0.000010 ], [95, -3568.350000, 0.208224, 0.000008, 0.000006 ], [94, -3568.350000, 0.208136, 0.039199, 0.000006 ], [97, -3570.510000, 0.023901, 0.000005, 0.000006 ], [96, -3570.510000, 0.023882, 0.027500, 0.000006 ] ], "n": ["FDJVGXF01BN5NS", "FDJVGXF01CBW0V" ] }, {"p": [[92, -7385.460000, 0.437230, 0.000005, 0.375406 ], [94, -7386.070000, 0.236897, 0.011266, 0.387712 ], [93, -7386.530000, 0.149695, 0.002453, 0.395694 ], [96, -7386.680000, 0.128911, 0.000007, 0.430910 ], [95, -7387.680000, 0.047267, 0.000008, 0.442571 ] ], "n": ["FDJVGXF01DYW39_rvcmp" ] }, {"p": [[92, -3171.330000, 0.191206, 0.000005, 0.066052 ], [91, -3171.330000, 0.191191, 0.000010, 0.066052 ], [94, -3171.380000, 0.183008, 0.000010, 0.066075 ], [93, -3171.380000, 0.182330, 0.002453, 0.066078 ], [95, -3171.600000, 0.147055, 0.000008, 0.066480 ], [90, -3172.080000, 0.090116, 0.032365, 0.054778 ], [97, -3173.870000, 0.015093, 0.009613, 0.072928 ] ], "n": ["FDJVGXF01BHQHK_rvcmp" ] }, {"p": [[92, -3149.800000, 0.208580, 0.000005, 0.061622 ], [91, -3149.800000, 0.208563, 0.000010, 0.061626 ], [94, -3149.850000, 0.199617, 0.000010, 0.061647 ], [93, -3149.850000, 0.198875, 0.002453, 0.061649 ], [95, -3150.070000, 0.159968, 0.000008, 0.061995 ], [97, -3152.640000, 0.012199, 0.000005, 0.071541 ], [96, -3152.640000, 0.012198, 0.027500, 0.071544 ] ], "n": ["FDJVGXF01CIWT1" ] }, {"p": [[94, -4303.370000, 0.415424, 0.016196, 0.110324 ], [92, -4304.400000, 0.147428, 0.003101, 0.121184 ], [93, -4304.680000, 0.112071, 0.002453, 0.127032 ], [96, -4304.900000, 0.089370, 0.012969, 0.128662 ], [97, -4304.930000, 0.087230, 0.015024, 0.130123 ], [90, -4304.980000, 0.083185, 0.040800, 0.132911 ], [95, -4305.220000, 0.065291, 0.003223, 0.129745 ] ], "n": ["FDJVGXF01E4CX1_rvcmp" ] }, {"p": [[96, -6812.330000, 0.318743, 0.027500, 0.062015 ], [97, -6812.330000, 0.318462, 0.000005, 0.062013 ], [95, -6812.330000, 0.318398, 0.008662, 0.062017 ], [91, -6814.990000, 0.022200, 0.020097, 0.069709 ], [94, -6814.990000, 0.022197, 0.039199, 0.069708 ] ], "n": ["FDJVGXF01EPE9H_rvcmp" ] }, {"p": [[96, -3398.990000, 0.270657, 0.027500, 0.057707 ], [97, -3398.990000, 0.270602, 0.000005, 0.057704 ], [95, -3398.990000, 0.270487, 0.008662, 0.057708 ], [94, -3400.490000, 0.060573, 0.039199, 0.065527 ], [91, -3400.490000, 0.060567, 0.020097, 0.065528 ], [92, -3401.060000, 0.034342, 0.000005, 0.072279 ], [93, -3401.100000, 0.032773, 0.002453, 0.072309 ] ], "n": ["FDJVGXF01AQEN6_rvcmp" ] }, {"p": [[96, -8436.950000, 0.296251, 0.027500, 0.037727 ], [95, -8436.950000, 0.296170, 0.008662, 0.037728 ], [97, -8436.950000, 0.296153, 0.000005, 0.037725 ], [91, -8438.620000, 0.055719, 0.020097, 0.039723 ], [94, -8438.630000, 0.055707, 0.039199, 0.039722 ] ], "n": ["FDJVGXF01DYJC3" ] }, {"p": [[96, -4931.260000, 0.293513, 0.027500, 0.023659 ], [95, -4931.260000, 0.293359, 0.008662, 0.023659 ], [97, -4931.260000, 0.293211, 0.000005, 0.023659 ], [91, -4932.850000, 0.059965, 0.020097, 0.026076 ], [94, -4932.850000, 0.059953, 0.039199, 0.026076 ] ], "n": ["FDJVGXF01CY75H_rvcmp" ] }, {"p": [[97, -6900.410000, 0.757300, 0.007090, 0.070911 ], [95, -6902.710000, 0.076110, 0.005228, 0.084481 ], [96, -6902.960000, 0.058821, 0.027500, 0.085255 ], [91, -6903.190000, 0.047104, 0.020097, 0.088585 ], [94, -6903.190000, 0.047095, 0.039199, 0.088589 ], [92, -6904.430000, 0.013570, 0.000005, 0.093427 ] ], "n": ["FDJVGXF01B6WPS" ] }, {"p": [[98, -7415.430000, 0.287386, 0.026731, 0.060709 ], [101, -7415.580000, 0.246916, 0.009940, 0.065004 ], [99, -7416.040000, 0.155747, 0.047715, 0.066873 ], [100, -7416.050000, 0.155583, 0.040628, 0.066874 ], [102, -7416.050000, 0.154369, 0.000005, 0.066932 ] ], "n": ["FDJVGXF01A9CN5_rvcmp" ] }, {"p": [[98, -7986.790000, 0.764732, 0.016719, 0.058849 ], [101, -7989.070000, 0.078481, 0.000005, 0.073333 ], [99, -7989.070000, 0.078439, 0.047715, 0.073334 ], [100, -7989.070000, 0.078348, 0.040628, 0.073337 ] ], "n": ["FDJVGXF01BG5L2_rvcmp" ] }, {"p": [[98, -5457.430000, 0.794994, 0.016481, 0.042794 ], [101, -5460.170000, 0.051327, 0.018813, 0.057717 ], [102, -5460.170000, 0.051306, 0.000005, 0.057710 ], [99, -5460.470000, 0.038252, 0.033057, 0.053265 ], [107, -5460.570000, 0.034566, 0.008820, 0.056280 ], [106, -5461.010000, 0.022159, 0.004361, 0.057596 ], [111, -5462.110000, 0.007396, 0.000007, 0.067823 ] ], "n": ["FDJVGXF01DGPDX_rvcmp" ] }, {"p": [[98, -6851.070000, 0.928888, 0.015176, 0.024296 ], [99, -6853.920000, 0.053971, 0.026970, 0.034854 ], [101, -6855.750000, 0.008581, 0.003975, 0.037003 ], [100, -6855.760000, 0.008561, 0.040628, 0.037107 ] ], "n": ["FDJVGXF01BEMTE" ] }, {"p": [[98, -8256.620000, 0.981437, 0.013147, 0.029377 ], [91, -8260.590000, 0.018563, 0.000010, 0.040407 ] ], "n": ["FDJVGXF01BLNDV" ] }, {"p": [[98, -8037.810000, 0.483180, 0.010748, 0.068080 ], [101, -8039.060000, 0.138712, 0.004768, 0.075958 ], [91, -8039.230000, 0.117186, 0.000367, 0.076499 ], [99, -8039.510000, 0.088153, 0.047715, 0.080405 ], [100, -8039.510000, 0.088107, 0.040628, 0.080410 ], [95, -8040.230000, 0.043004, 0.007119, 0.072969 ], [97, -8040.260000, 0.041658, 0.002846, 0.073160 ] ], "n": ["FDJVGXF01BLA1W_rvcmp", "FDJVGXF01CXNXZ_rvcmp" ] }, {"p": [[98, -8113.060000, 0.975528, 0.010740, 0.036212 ], [96, -8117.390000, 0.012841, 0.021706, 0.038782 ], [97, -8117.490000, 0.011631, 0.013213, 0.040634 ] ], "n": ["FDJVGXF01D4DWZ_rvcmp" ] }, {"p": [[98, -8129.970000, 0.975763, 0.010743, 0.035591 ], [96, -8134.310000, 0.012753, 0.021709, 0.038102 ], [97, -8134.420000, 0.011485, 0.013182, 0.039923 ] ], "n": ["FDJVGXF01DK0CF_rvcmp", "FDJVGXF01D4J8L_rvcmp" ] }, {"p": [[98, -7713.010000, 0.532546, 0.010055, 0.055415 ], [96, -7714.250000, 0.153885, 0.023774, 0.052968 ], [95, -7714.400000, 0.132600, 0.006710, 0.054358 ], [97, -7714.540000, 0.114871, 0.000005, 0.055683 ], [91, -7715.260000, 0.055967, 0.008268, 0.059538 ], [90, -7716.970000, 0.010130, 0.034866, 0.060120 ] ], "n": ["FDJVGXF01A6VRG" ] }, {"p": [[98, -5572.670000, 0.926148, 0.009797, 0.039998 ], [116, -5575.970000, 0.034019, 0.004166, 0.049851 ], [115, -5576.350000, 0.023200, 0.020395, 0.053567 ], [97, -5576.690000, 0.016633, 0.021481, 0.045176 ] ], "n": ["FDJVGXF01DZTOW_rvcmp" ] }, {"p": [[98, -7305.260000, 0.909458, 0.010308, 0.039954 ], [95, -7308.980000, 0.022059, 0.006472, 0.043999 ], [96, -7309.100000, 0.019402, 0.026069, 0.043982 ], [97, -7309.110000, 0.019275, 0.006137, 0.044288 ], [91, -7309.360000, 0.015043, 0.003834, 0.049662 ], [90, -7309.380000, 0.014764, 0.032931, 0.043551 ] ], "n": ["FDJVGXF01C8RIL_rvcmp" ] }, {"p": [[98, -7310.330000, 0.552111, 0.004438, 0.013636 ], [90, -7310.610000, 0.416978, 0.019300, 0.015954 ], [97, -7313.210000, 0.030911, 0.019052, 0.015130 ] ], "n": ["FDJVGXF01COCCL" ] }, {"p": [[99, -5134.700000, 0.333457, 0.047715, 0.117445 ], [101, -5134.700000, 0.333392, 0.000009, 0.117432 ], [100, -5134.700000, 0.333151, 0.040628, 0.117443 ] ], "n": ["FDJVGXF01EE1C0", "FDJVGXF01DMENF" ] }, {"p": [[99, -7577.130000, 0.335096, 0.046718, 0.043163 ], [100, -7577.140000, 0.332461, 0.040628, 0.043301 ], [101, -7577.140000, 0.332442, 0.000009, 0.043299 ] ], "n": ["FDJVGXF01CNATM_rvcmp" ] }, {"p": [[99, -8401.450000, 0.502724, 0.038108, 0.027041 ], [100, -8401.670000, 0.405831, 0.036342, 0.027534 ], [101, -8403.160000, 0.091446, 0.000947, 0.029564 ] ], "n": ["FDJVGXF01ADQBO_rvcmp" ] }, {"p": [[99, -8295.650000, 0.766979, 0.037756, 0.025098 ], [101, -8297.380000, 0.136462, 0.004531, 0.029294 ], [100, -8297.730000, 0.096560, 0.038517, 0.030743 ] ], "n": ["FDJVGXF01DOZP0_rvcmp" ] }, {"p": [[99, -8925.760000, 0.786011, 0.035736, 0.032897 ], [100, -8927.370000, 0.156484, 0.036700, 0.038702 ], [101, -8928.380000, 0.057506, 0.002473, 0.039503 ] ], "n": ["FDJVGXF01C6K5T" ] }, {"p": [[99, -7734.930000, 0.477771, 0.035422, 0.045134 ], [100, -7735.410000, 0.295308, 0.037856, 0.044215 ], [101, -7735.680000, 0.226921, 0.003618, 0.043543 ] ], "n": ["FDJVGXF01DCCT9_rvcmp" ] }, {"p": [[99, -7907.590000, 0.809185, 0.034962, 0.042337 ], [100, -7909.620000, 0.105566, 0.037962, 0.049213 ], [101, -7909.840000, 0.085250, 0.001595, 0.049467 ] ], "n": ["FDJVGXF01DJFWS_rvcmp" ] }, {"p": [[99, -8205.290000, 0.816739, 0.034938, 0.040531 ], [100, -8207.370000, 0.101449, 0.037959, 0.047119 ], [101, -8207.590000, 0.081812, 0.001662, 0.047310 ] ], "n": ["FDJVGXF01D8OH4" ] }, {"p": [[99, -6475.180000, 0.869666, 0.034852, 0.024661 ], [100, -6477.640000, 0.074250, 0.037446, 0.032531 ], [101, -6477.930000, 0.056084, 0.002065, 0.032135 ] ], "n": ["FDJVGXF01AW1AC", "FDJVGXF01AWUYU" ] }, {"p": [[99, -7449.140000, 0.576704, 0.029292, 0.158120 ], [100, -7450.200000, 0.200837, 0.030836, 0.163007 ], [101, -7450.810000, 0.108383, 0.000009, 0.172028 ], [98, -7451.040000, 0.086836, 0.017357, 0.166713 ], [94, -7453.130000, 0.010738, 0.012681, 0.158291 ], [93, -7453.220000, 0.009761, 0.000010, 0.167494 ], [88, -7453.590000, 0.006741, 0.035470, 0.177038 ] ], "n": ["FDJVGXF01DGA00_rvcmp" ] }, {"p": [[99, -6817.930000, 1.000000, 0.028675, 0.061645 ] ], "n": ["FDJVGXF01C55EU_rvcmp" ] }, {"p": [[99, -7479.330000, 0.692567, 0.027296, 0.107768 ], [98, -7480.800000, 0.158012, 0.017151, 0.118360 ], [100, -7481.250000, 0.100908, 0.030912, 0.117834 ], [101, -7481.990000, 0.048513, 0.003228, 0.124599 ] ], "n": ["FDJVGXF01BW7BG" ] }, {"p": [[99, -6960.640000, 1.000000, 0.013256, 0.075130 ] ], "n": ["FDJVGXF01ATCR1" ] }, {"p": [[99, -7850.950000, 0.356968, 0.000006, 0.072210 ], [98, -7851.010000, 0.336633, 0.008039, 0.055350 ], [96, -7851.370000, 0.233977, 0.016912, 0.048694 ], [97, -7853.240000, 0.036233, 0.000005, 0.054018 ], [95, -7853.240000, 0.036189, 0.008662, 0.054025 ] ], "n": ["FDJVGXF01CH8LC" ] }, {"p": [[100, -3460.800000, 0.333409, 0.040633, 0.133589 ], [99, -3460.800000, 0.333337, 0.047715, 0.133600 ], [101, -3460.800000, 0.333254, 0.000009, 0.133576 ] ], "n": ["FDJVGXF01B5B3E" ] }, {"p": [[100, -3470.380000, 0.333398, 0.040628, 0.069134 ], [101, -3470.380000, 0.333358, 0.000009, 0.069136 ], [99, -3470.380000, 0.333244, 0.047715, 0.069139 ] ], "n": ["FDJVGXF01BMHW5_rvcmp" ] }, {"p": [[100, -7873.340000, 0.401226, 0.035142, 0.053974 ], [101, -7873.640000, 0.299453, 0.000009, 0.056924 ], [99, -7873.640000, 0.299321, 0.047715, 0.056919 ] ], "n": ["FDJVGXF01CTU6F" ] }, {"p": [[100, -8353.190000, 0.317740, 0.033186, 0.176914 ], [99, -8353.470000, 0.238844, 0.042975, 0.179036 ], [101, -8353.540000, 0.222732, 0.000009, 0.182839 ], [104, -8354.650000, 0.073579, 0.002651, 0.179816 ], [105, -8354.650000, 0.073579, 0.002614, 0.179816 ], [106, -8354.650000, 0.073525, 0.000008, 0.179802 ] ], "n": ["FDJVGXF01BHQGA" ] }, {"p": [[100, -3415.710000, 0.430176, 0.029911, 0.045156 ], [99, -3416.130000, 0.284979, 0.047715, 0.051596 ], [101, -3416.130000, 0.284845, 0.000009, 0.051596 ] ], "n": ["FDJVGXF01A8NFC_rvcmp" ] }, {"p": [[100, -2591.760000, 0.549550, 0.028277, 0.013756 ], [99, -2592.650000, 0.225276, 0.047715, 0.020423 ], [101, -2592.650000, 0.225174, 0.000009, 0.020422 ] ], "n": ["FDJVGXF01D39J6_rvcmp" ] }, {"p": [[101, -7726.680000, 0.783055, 0.005842, 0.048733 ], [99, -7728.650000, 0.108480, 0.047715, 0.052038 ], [100, -7728.650000, 0.108465, 0.040628, 0.052034 ] ], "n": ["FDJVGXF01EXJTF_rvcmp" ] }, {"p": [[101, -8748.940000, 0.439425, 0.003706, 0.094270 ], [99, -8749.390000, 0.280365, 0.047715, 0.099951 ], [100, -8749.390000, 0.280210, 0.040628, 0.099956 ] ], "n": ["FDJVGXF01BNHRU_rvcmp" ] }, {"p": [[101, -8573.730000, 0.404302, 0.003058, 0.102933 ], [100, -8574.030000, 0.298490, 0.040038, 0.106855 ], [99, -8574.040000, 0.297208, 0.047715, 0.107441 ] ], "n": ["FDJVGXF01BJU15" ] }, {"p": [[101, -8270.160000, 0.402417, 0.002678, 0.079404 ], [100, -8270.460000, 0.298911, 0.040628, 0.082534 ], [99, -8270.460000, 0.298672, 0.047715, 0.082548 ] ], "n": ["FDJVGXF01BMACA", "FDJVGXF01DVROI_rvcmp" ] }, {"p": [[101, -7246.420000, 0.343654, 0.001573, 0.095897 ], [99, -7246.460000, 0.328257, 0.047715, 0.097423 ], [100, -7246.460000, 0.328089, 0.040628, 0.097412 ] ], "n": ["FDJVGXF01ENOD3" ] }, {"p": [[101, -7311.370000, 0.335414, 0.000654, 0.101429 ], [100, -7311.380000, 0.332359, 0.040542, 0.102192 ], [99, -7311.380000, 0.332227, 0.047715, 0.102260 ] ], "n": ["FDJVGXF01C9KOS" ] }, {"p": [[101, -7175.140000, 0.336424, 0.000807, 0.096768 ], [100, -7175.150000, 0.331997, 0.040277, 0.097545 ], [99, -7175.160000, 0.331579, 0.047715, 0.097811 ] ], "n": ["FDJVGXF01BN8R7", "FDJVGXF01BTWF0" ] }, {"p": [[101, -7136.700000, 0.334893, 0.000555, 0.086486 ], [99, -7136.700000, 0.333024, 0.046998, 0.087070 ], [100, -7136.700000, 0.332084, 0.040628, 0.087112 ] ], "n": ["FDJVGXF01A0JQI" ] }, {"p": [[101, -7196.810000, 0.333723, 0.000277, 0.111901 ], [100, -7196.810000, 0.333156, 0.040628, 0.112261 ], [99, -7196.810000, 0.333121, 0.047715, 0.112268 ] ], "n": ["FDJVGXF01A1OR6_rvcmp" ] }, {"p": [[107, -7979.530000, 0.529791, 0.013015, 0.044003 ], [102, -7981.030000, 0.117777, 0.009128, 0.043840 ], [110, -7981.100000, 0.109741, 0.007352, 0.047090 ], [111, -7981.120000, 0.107016, 0.000007, 0.047231 ], [112, -7981.420000, 0.079668, 0.000008, 0.047399 ], [114, -7981.940000, 0.047293, 0.000006, 0.048560 ], [100, -7983.630000, 0.008714, 0.027596, 0.045589 ] ], "n": ["FDJVGXF01CVK05" ] }, {"p": [[107, -8053.210000, 0.561968, 0.013067, 0.033004 ], [102, -8054.680000, 0.129037, 0.008897, 0.032193 ], [110, -8054.940000, 0.099976, 0.007316, 0.035618 ], [111, -8054.970000, 0.096883, 0.000007, 0.035736 ], [112, -8055.260000, 0.072071, 0.000008, 0.035783 ], [114, -8055.850000, 0.040064, 0.000006, 0.036941 ] ], "n": ["FDJVGXF01BE4X9", "FDJVGXF01BTEPV" ] }, {"p": [[107, -7666.300000, 0.339984, 0.013106, 0.023752 ], [98, -7666.900000, 0.186902, 0.031155, 0.021802 ], [102, -7666.940000, 0.178340, 0.005627, 0.021885 ], [101, -7667.470000, 0.105591, 0.018811, 0.023346 ], [91, -7667.470000, 0.105427, 0.000155, 0.027085 ], [111, -7668.210000, 0.050231, 0.000007, 0.026199 ], [100, -7668.610000, 0.033526, 0.040628, 0.026867 ] ], "n": ["FDJVGXF01DJB6P_rvcmp" ] }, {"p": [[107, -7662.070000, 0.923548, 0.006196, 0.018721 ], [103, -7665.630000, 0.026357, 0.007523, 0.024783 ], [106, -7665.630000, 0.026357, 0.007986, 0.024783 ], [104, -7665.730000, 0.023738, 0.000005, 0.025393 ] ], "n": ["FDJVGXF01ENS3X", "FDJVGXF01EVR7E" ] }, {"p": [[108, -6986.020000, 0.144091, 0.000001, 1.487940 ], [109, -6986.020000, 0.144091, 0.002625, 1.487950 ], [110, -6986.020000, 0.144090, 0.000008, 1.487940 ], [111, -6986.020000, 0.143993, 0.003796, 1.482470 ], [102, -6986.020000, 0.143985, 0.011080, 1.482460 ], [107, -6986.030000, 0.142921, 0.017331, 1.486640 ], [103, -6986.070000, 0.136827, 0.000007, 1.509300 ] ], "n": ["FDJVGXF01DQ4QQ" ] }, {"p": [[114, -7013.340000, 0.265268, 0.003600, 0.773263 ], [113, -7013.510000, 0.224139, 0.180105, 0.773938 ], [112, -7013.520000, 0.220693, 0.015823, 0.782841 ], [103, -7014.160000, 0.116650, 0.000007, 0.727390 ], [106, -7014.840000, 0.059205, 0.007986, 0.789788 ], [105, -7014.850000, 0.058540, 0.002614, 0.791176 ], [72, -7014.900000, 0.055506, 0.199553, 0.828865 ] ], "n": ["FDJVGXF01E0ZLL" ] }, {"p": [[114, -6624.070000, 0.303042, 0.003346, 1.070590 ], [113, -6624.070000, 0.302732, 0.128195, 1.047670 ], [112, -6624.200000, 0.265406, 0.015823, 1.084740 ], [73, -6626.060000, 0.041225, 0.041274, 1.183910 ], [71, -6626.320000, 0.031788, 0.073878, 1.239120 ], [72, -6626.320000, 0.031713, 0.263281, 1.236990 ], [70, -6626.600000, 0.024095, 0.549790, 1.298720 ] ], "n": ["FDJVGXF01DCDRY" ] }, {"p": [[116, -7058.890000, 0.241249, 0.023150, 0.872170 ], [117, -7058.890000, 0.241180, 0.000006, 0.872196 ], [115, -7059.190000, 0.178494, 0.033069, 0.854725 ], [114, -7059.190000, 0.178463, 0.011821, 0.854733 ], [113, -7060.040000, 0.075749, 0.120561, 0.817583 ], [112, -7060.320000, 0.057414, 0.015823, 0.857944 ], [103, -7061.060000, 0.027451, 0.000007, 0.797855 ] ], "n": ["FDJVGXF01DSMLK" ] }, {"p": [[118, -3952.440000, 0.754659, 0.025388, 0.153619 ], [83, -3954.250000, 0.123939, 0.075511, 0.171413 ], [119, -3954.270000, 0.121402, 0.000009, 0.174132 ] ], "n": ["FDJVGXF01BHVQB_rvcmp" ] }, {"p": [[127, -7779.010000, 0.527838, 0.033938, 0.091159 ], [149, -7779.120000, 0.472162, 0.000008, 0.093477 ] ], "n": ["FDJVGXF01BMGRR_rvcmp" ] }, {"p": [[127, -3351.200000, 0.301469, 0.033073, 0.032593 ], [149, -3351.260000, 0.284458, 0.000008, 0.033805 ], [126, -3351.850000, 0.156698, 0.083114, 0.035490 ], [29, -3352.310000, 0.099656, 0.026610, 0.057379 ], [196, -3352.870000, 0.056406, 0.032853, 0.042738 ], [31, -3352.980000, 0.050733, 0.000008, 0.074705 ], [32, -3352.980000, 0.050579, 0.000007, 0.074701 ] ], "n": ["FDJVGXF01EF0UY" ] }, {"p": [[127, -7205.960000, 0.683272, 0.021436, 0.026696 ], [149, -7207.150000, 0.208535, 0.004237, 0.030194 ], [125, -7207.800000, 0.108193, 0.055019, 0.032376 ] ], "n": ["FDJVGXF01EDQRP_rvcmp" ] }, {"p": [[128, -6538.650000, 0.145734, 0.000007, 1.999990 ], [130, -6538.650000, 0.145710, 0.000005, 1.999990 ], [129, -6538.650000, 0.145707, 0.004824, 1.999990 ], [140, -6538.660000, 0.145339, 0.000006, 1.999990 ], [2, -6538.660000, 0.144116, 0.036220, 1.999990 ], [147, -6538.720000, 0.136698, 0.065313, 1.999990 ], [148, -6538.720000, 0.136696, 0.000009, 1.999990 ] ], "n": ["FDJVGXF01E417W" ] }, {"p": [[128, -6066.250000, 0.919074, 0.000007, 0.005351 ], [130, -6069.380000, 0.040471, 0.000005, 0.006452 ], [129, -6069.380000, 0.040455, 0.004824, 0.006454 ] ], "n": ["FDJVGXF01CLDZW_rvcmp" ] }, {"p": [[128, -7515.000000, 0.351482, 0.000007, 0.000006 ], [130, -7515.070000, 0.325020, 0.000005, 0.000006 ], [129, -7515.080000, 0.323498, 0.004824, 0.000006 ] ], "n": ["FDJVGXF01C8LKU_rvcmp", "FDJVGXF01EL3RG" ] }, {"p": [[130, -7367.820000, 0.157818, 0.010632, 1.999990 ], [140, -7367.820000, 0.157818, 0.000006, 1.999990 ], [139, -7367.820000, 0.157797, 0.010556, 1.999990 ], [148, -7367.870000, 0.149674, 0.000009, 1.999990 ], [147, -7367.870000, 0.149673, 0.065313, 1.999990 ], [131, -7368.140000, 0.113612, 0.000001, 1.999990 ], [138, -7368.140000, 0.113609, 0.001320, 1.999990 ] ], "n": ["FDJVGXF01DL2MT_rvcmp" ] }, {"p": [[130, -7375.020000, 0.475927, 0.005093, 0.008358 ], [140, -7375.830000, 0.212971, 0.000006, 0.008607 ], [139, -7375.830000, 0.212795, 0.010556, 0.008608 ], [128, -7377.290000, 0.049298, 0.003643, 0.011932 ], [129, -7377.290000, 0.049010, 0.004824, 0.011933 ] ], "n": ["FDJVGXF01ECZV4" ] }, {"p": [[130, -7528.290000, 0.666633, 0.005110, 0.003992 ], [139, -7529.120000, 0.289798, 0.010556, 0.004124 ], [128, -7531.020000, 0.043569, 0.003643, 0.007219 ] ], "n": ["FDJVGXF01BDJTA" ] }, {"p": [[130, -7310.840000, 0.312938, 0.000010, 0.004331 ], [128, -7310.840000, 0.312766, 0.003643, 0.004325 ], [129, -7310.840000, 0.312140, 0.004824, 0.004331 ], [140, -7313.150000, 0.031082, 0.000006, 0.004453 ], [139, -7313.150000, 0.031075, 0.010556, 0.004454 ] ], "n": ["FDJVGXF01CXZHA_rvcmp" ] }, {"p": [[131, -5420.840000, 0.144016, 0.000001, 0.025524 ], [138, -5420.840000, 0.144014, 0.001320, 0.025524 ], [139, -5420.850000, 0.143632, 0.000009, 0.025524 ], [137, -5420.850000, 0.143510, 0.004966, 0.025525 ], [132, -5420.850000, 0.143320, 0.010863, 0.025526 ], [135, -5420.870000, 0.140790, 0.005910, 0.025533 ], [136, -5420.870000, 0.140718, 0.003789, 0.025533 ] ], "n": ["FDJVGXF01AIGJT" ] }, {"p": [[131, -7215.640000, 0.262641, 0.000001, 0.013227 ], [139, -7215.640000, 0.262331, 0.000005, 0.013218 ], [138, -7215.650000, 0.261556, 0.001320, 0.013218 ], [132, -7216.110000, 0.164009, 0.008607, 0.010233 ], [130, -7218.000000, 0.024733, 0.010632, 0.013131 ], [140, -7218.000000, 0.024729, 0.000006, 0.013130 ] ], "n": ["FDJVGXF01BRHTY_rvcmp" ] }, {"p": [[131, -5733.610000, 0.143915, 0.000001, 0.005704 ], [138, -5733.610000, 0.143912, 0.001320, 0.005704 ], [139, -5733.620000, 0.143788, 0.000005, 0.005704 ], [137, -5733.620000, 0.143756, 0.004966, 0.005704 ], [132, -5733.620000, 0.143672, 0.010862, 0.005704 ], [135, -5733.640000, 0.140547, 0.005910, 0.005706 ], [136, -5733.640000, 0.140410, 0.003788, 0.005706 ] ], "n": ["FDJVGXF01DPLLJ_rvcmp", "FDJVGXF01BKQDZ" ] }, {"p": [[131, -5135.980000, 0.143907, 0.000001, 0.006357 ], [138, -5135.980000, 0.143904, 0.001320, 0.006357 ], [137, -5135.980000, 0.143750, 0.004966, 0.006357 ], [139, -5135.980000, 0.143734, 0.000009, 0.006357 ], [132, -5135.980000, 0.143689, 0.010863, 0.006357 ], [135, -5136.010000, 0.140547, 0.005910, 0.006359 ], [136, -5136.010000, 0.140469, 0.003789, 0.006359 ] ], "n": ["FDJVGXF01DX3O4" ] }, {"p": [[131, -5902.580000, 0.143914, 0.000001, 0.005533 ], [138, -5902.580000, 0.143912, 0.001320, 0.005533 ], [137, -5902.580000, 0.143760, 0.004966, 0.005533 ], [132, -5902.580000, 0.143698, 0.010863, 0.005533 ], [139, -5902.580000, 0.143693, 0.000009, 0.005533 ], [135, -5902.600000, 0.140551, 0.005910, 0.005534 ], [136, -5902.600000, 0.140473, 0.003789, 0.005535 ] ], "n": ["FDJVGXF01D3855_rvcmp", "FDJVGXF01BZHST_rvcmp", "FDJVGXF01E193F_rvcmp", "FDJVGXF01CVSFI_rvcmp", "FDJVGXF01CQZLD_rvcmp", "FDJVGXF01A5U3U_rvcmp", "FDJVGXF01CXMMU_rvcmp" ] }, {"p": [[131, -5919.040000, 0.152183, 0.000001, 0.005211 ], [138, -5919.050000, 0.152095, 0.001317, 0.005211 ], [139, -5919.050000, 0.152075, 0.000009, 0.005210 ], [137, -5919.140000, 0.137822, 0.004966, 0.005215 ], [132, -5919.150000, 0.137590, 0.010862, 0.005215 ], [136, -5919.170000, 0.134217, 0.003788, 0.005216 ], [135, -5919.170000, 0.134017, 0.005909, 0.005216 ] ], "n": ["FDJVGXF01BPT51" ] }, {"p": [[131, -4343.850000, 0.149701, 0.000001, 0.000005 ], [138, -4343.850000, 0.149701, 0.001319, 0.000005 ], [137, -4343.850000, 0.149696, 0.004966, 0.000005 ], [139, -4343.850000, 0.149686, 0.000006, 0.000005 ], [132, -4343.850000, 0.149680, 0.000005, 0.000006 ], [130, -4344.030000, 0.125795, 0.010632, 0.000006 ], [140, -4344.030000, 0.125742, 0.000006, 0.000006 ] ], "n": ["FDJVGXF01CKX81" ] }, {"p": [[131, -5023.500000, 0.194397, 0.000001, 0.000005 ], [138, -5023.500000, 0.194387, 0.001319, 0.000005 ], [132, -5023.500000, 0.194365, 0.000005, 0.000006 ], [139, -5023.500000, 0.194257, 0.000006, 0.000005 ], [137, -5023.520000, 0.190556, 0.004966, 0.000005 ], [140, -5025.990000, 0.016022, 0.000006, 0.000006 ], [130, -5026.000000, 0.016015, 0.010632, 0.000006 ] ], "n": ["FDJVGXF01D6I11", "FDJVGXF01DQG0M" ] }, {"p": [[132, -9045.610000, 0.647220, 0.008211, 0.003637 ], [137, -9047.760000, 0.074839, 0.004966, 0.006919 ], [138, -9047.760000, 0.074839, 0.000005, 0.006920 ], [131, -9047.820000, 0.070515, 0.000001, 0.007148 ], [135, -9047.880000, 0.066422, 0.005910, 0.007149 ], [136, -9047.890000, 0.066165, 0.003788, 0.007150 ] ], "n": ["FDJVGXF01A8ZUE" ] }, {"p": [[132, -6977.680000, 0.955968, 0.007570, 0.000006 ], [138, -6981.170000, 0.029134, 0.000620, 0.004440 ], [137, -6982.450000, 0.008163, 0.004966, 0.004512 ], [131, -6982.640000, 0.006736, 0.000001, 0.008874 ] ], "n": ["FDJVGXF01BCIP2_rvcmp" ] }, {"p": [[132, -7237.450000, 0.435326, 0.007381, 0.013640 ], [138, -7238.950000, 0.096709, 0.000005, 0.017737 ], [137, -7238.950000, 0.096707, 0.004966, 0.017737 ], [131, -7238.970000, 0.094587, 0.000001, 0.017859 ], [139, -7238.980000, 0.094394, 0.000005, 0.017859 ], [135, -7239.010000, 0.091269, 0.005910, 0.017864 ], [136, -7239.010000, 0.091010, 0.003788, 0.017864 ] ], "n": ["FDJVGXF01AO7VS_rvcmp" ] }, {"p": [[132, -7396.450000, 0.442109, 0.006866, 0.005039 ], [135, -7396.930000, 0.274154, 0.002119, 0.008360 ], [138, -7397.530000, 0.150308, 0.000428, 0.005424 ], [137, -7398.440000, 0.060565, 0.004966, 0.005636 ], [134, -7399.190000, 0.028774, 0.000001, 0.012451 ], [139, -7399.250000, 0.026978, 0.002614, 0.009089 ], [131, -7399.710000, 0.017111, 0.000001, 0.012338 ] ], "n": ["FDJVGXF01B0F8P_rvcmp" ] }, {"p": [[132, -4764.280000, 0.840060, 0.007262, 0.000006 ], [137, -4767.500000, 0.033580, 0.004966, 0.006191 ], [138, -4767.500000, 0.033569, 0.000010, 0.006194 ], [131, -4767.560000, 0.031419, 0.000001, 0.006665 ], [135, -4767.590000, 0.030697, 0.005908, 0.006663 ], [136, -4767.590000, 0.030674, 0.003788, 0.006663 ] ], "n": ["FDJVGXF01DJR9E" ] }, {"p": [[132, -8083.600000, 0.925088, 0.007266, 0.000006 ], [137, -8087.590000, 0.017024, 0.004966, 0.003192 ], [138, -8087.590000, 0.017018, 0.000005, 0.003186 ], [131, -8087.790000, 0.013994, 0.000001, 0.003984 ], [135, -8087.830000, 0.013458, 0.005910, 0.003977 ], [136, -8087.830000, 0.013419, 0.003788, 0.003977 ] ], "n": ["FDJVGXF01BOZD6_rvcmp" ] }, {"p": [[132, -7014.870000, 0.665444, 0.006377, 0.010918 ], [139, -7016.690000, 0.108621, 0.004004, 0.014688 ], [138, -7017.100000, 0.071550, 0.001021, 0.016736 ], [131, -7017.170000, 0.066777, 0.000001, 0.017978 ], [130, -7017.440000, 0.051018, 0.008840, 0.014089 ], [135, -7018.420000, 0.019213, 0.003201, 0.018300 ], [137, -7018.520000, 0.017377, 0.004966, 0.016505 ] ], "n": ["FDJVGXF01BAPJZ" ] }, {"p": [[132, -4936.860000, 0.142950, 0.005435, 0.013257 ], [135, -4936.860000, 0.142864, 0.002961, 0.013290 ], [137, -4936.860000, 0.142853, 0.002486, 0.013294 ], [136, -4936.860000, 0.142843, 0.001902, 0.013299 ], [133, -4936.860000, 0.142833, 0.001201, 0.013302 ], [138, -4936.860000, 0.142829, 0.000645, 0.013304 ], [134, -4936.860000, 0.142827, 0.000001, 0.013305 ] ], "n": ["FDJVGXF01EOS1A_rvcmp", "FDJVGXF01B3VIU_rvcmp" ] }, {"p": [[132, -7151.250000, 0.919704, 0.005418, 0.004600 ], [138, -7154.740000, 0.028049, 0.000007, 0.008783 ], [131, -7154.810000, 0.026132, 0.000001, 0.009165 ], [139, -7154.810000, 0.026115, 0.000006, 0.009165 ] ], "n": ["FDJVGXF01BSJSQ_rvcmp" ] }, {"p": [[132, -6669.930000, 0.725590, 0.005458, 0.004846 ], [137, -6672.650000, 0.047777, 0.004966, 0.009456 ], [138, -6672.650000, 0.047777, 0.000005, 0.009457 ], [131, -6672.690000, 0.045658, 0.000001, 0.009688 ], [139, -6672.690000, 0.045601, 0.000005, 0.009694 ], [135, -6672.730000, 0.043862, 0.005910, 0.009690 ], [136, -6672.740000, 0.043735, 0.003788, 0.009691 ] ], "n": ["FDJVGXF01BYQBX_rvcmp" ] }, {"p": [[132, -7777.730000, 0.933986, 0.005437, 0.000006 ], [137, -7781.910000, 0.014321, 0.004966, 0.003638 ], [138, -7781.910000, 0.014319, 0.000005, 0.003632 ], [131, -7782.020000, 0.012806, 0.000001, 0.004103 ], [135, -7782.060000, 0.012302, 0.005910, 0.004100 ], [136, -7782.070000, 0.012266, 0.003788, 0.004100 ] ], "n": ["FDJVGXF01ANWZP_rvcmp" ] }, {"p": [[132, -5141.110000, 0.668522, 0.000005, 0.012804 ], [140, -5142.500000, 0.166838, 0.017164, 0.000006 ], [139, -5143.290000, 0.075854, 0.007324, 0.013431 ], [138, -5144.500000, 0.022567, 0.000005, 0.019272 ], [137, -5144.500000, 0.022567, 0.004966, 0.019272 ], [131, -5144.520000, 0.022089, 0.000001, 0.019421 ], [136, -5144.550000, 0.021564, 0.003788, 0.019429 ] ], "n": ["FDJVGXF01DRG7K" ] }, {"p": [[132, -8290.540000, 0.937456, 0.000007, 0.003936 ], [139, -8294.070000, 0.027381, 0.005647, 0.003680 ], [130, -8294.550000, 0.016992, 0.008326, 0.003416 ], [138, -8295.550000, 0.006241, 0.000010, 0.007498 ], [137, -8295.560000, 0.006196, 0.004966, 0.007496 ], [131, -8295.630000, 0.005734, 0.000001, 0.007877 ] ], "n": ["FDJVGXF01EMKP2" ] }, {"p": [[133, -7261.180000, 0.201025, 0.001210, 0.009050 ], [134, -7261.180000, 0.201016, 0.000001, 0.009052 ], [135, -7261.180000, 0.201013, 0.000006, 0.009052 ], [136, -7261.180000, 0.201009, 0.000007, 0.009052 ], [137, -7261.200000, 0.195937, 0.000010, 0.009053 ] ], "n": ["FDJVGXF01CXPZZ_rvcmp" ] }, {"p": [[133, -8258.370000, 0.201059, 0.001201, 0.007917 ], [134, -8258.370000, 0.201007, 0.000001, 0.007920 ], [135, -8258.370000, 0.201004, 0.000008, 0.007920 ], [136, -8258.370000, 0.201001, 0.000007, 0.007920 ], [137, -8258.400000, 0.195929, 0.000010, 0.007921 ] ], "n": ["FDJVGXF01E3CEA" ] }, {"p": [[133, -7027.850000, 0.312249, 0.001185, 0.004537 ], [134, -7027.850000, 0.312211, 0.000001, 0.004540 ], [135, -7027.850000, 0.311902, 0.000006, 0.004540 ], [132, -7029.740000, 0.047172, 0.007297, 0.004624 ], [137, -7031.830000, 0.005795, 0.000010, 0.008068 ], [136, -7031.840000, 0.005771, 0.003788, 0.008069 ], [138, -7032.000000, 0.004901, 0.000005, 0.008915 ] ], "n": ["FDJVGXF01BP62Q_rvcmp" ] }, {"p": [[133, -7690.830000, 0.347298, 0.000009, 0.021059 ], [136, -7691.270000, 0.224953, 0.000007, 0.021157 ], [135, -7691.340000, 0.209867, 0.005910, 0.021122 ], [137, -7691.340000, 0.209021, 0.000010, 0.021110 ], [134, -7694.500000, 0.008861, 0.000001, 0.025533 ] ], "n": ["FDJVGXF01B7EYW_rvcmp" ] }, {"p": [[133, -6211.610000, 0.967791, 0.000009, 0.020053 ], [134, -6215.020000, 0.032209, 0.000001, 0.025203 ] ], "n": ["FDJVGXF01A9H7J" ] }, {"p": [[133, -7621.030000, 0.806433, 0.000009, 0.016875 ], [135, -7622.850000, 0.131052, 0.002991, 0.017215 ], [136, -7624.590000, 0.022921, 0.003788, 0.020855 ], [137, -7624.600000, 0.022803, 0.000010, 0.020844 ], [134, -7624.910000, 0.016790, 0.000001, 0.021319 ] ], "n": ["FDJVGXF01B2CX4" ] }, {"p": [[133, -6664.220000, 0.353396, 0.000009, 0.009683 ], [136, -6664.670000, 0.226117, 0.000007, 0.009738 ], [135, -6664.750000, 0.208599, 0.005910, 0.009736 ], [137, -6664.760000, 0.207247, 0.000010, 0.009735 ], [134, -6668.560000, 0.004642, 0.000001, 0.014700 ] ], "n": ["FDJVGXF01EHE28_rvcmp" ] }, {"p": [[133, -6237.740000, 0.972919, 0.000009, 0.010256 ], [134, -6242.020000, 0.013547, 0.000001, 0.015576 ], [135, -6242.020000, 0.013534, 0.000008, 0.015575 ] ], "n": ["FDJVGXF01B9U2G" ] }, {"p": [[133, -7904.640000, 0.967795, 0.000009, 0.008199 ], [135, -7909.140000, 0.010738, 0.000006, 0.012420 ], [134, -7909.140000, 0.010735, 0.000001, 0.012426 ], [136, -7909.140000, 0.010732, 0.000007, 0.012423 ] ], "n": ["FDJVGXF01A3B1Y_rvcmp" ] }, {"p": [[134, -5777.390000, 0.250244, 0.000001, 0.011578 ], [135, -5777.390000, 0.250240, 0.000006, 0.011578 ], [136, -5777.390000, 0.250237, 0.000007, 0.011573 ], [133, -5777.400000, 0.249279, 0.002392, 0.011573 ] ], "n": ["FDJVGXF01BSBSB" ] }, {"p": [[134, -7873.070000, 0.325384, 0.000001, 0.008218 ], [135, -7873.070000, 0.324953, 0.000008, 0.008218 ], [133, -7873.070000, 0.324123, 0.002392, 0.008218 ], [136, -7875.610000, 0.025540, 0.003788, 0.009198 ] ], "n": ["FDJVGXF01CUFN8" ] }, {"p": [[134, -4661.580000, 0.333940, 0.000001, 0.000008 ], [135, -4661.580000, 0.333428, 0.000006, 0.000006 ], [133, -4661.590000, 0.332632, 0.002392, 0.000008 ] ], "n": ["FDJVGXF01CMIYW", "FDJVGXF01ER03M" ] }, {"p": [[134, -7260.760000, 0.201019, 0.000001, 0.009038 ], [133, -7260.760000, 0.201019, 0.000007, 0.009043 ], [135, -7260.760000, 0.201015, 0.000006, 0.009038 ], [136, -7260.760000, 0.201012, 0.000007, 0.009038 ], [137, -7260.780000, 0.195936, 0.000010, 0.009040 ] ], "n": ["FDJVGXF01EK9LF_rvcmp" ] }, {"p": [[134, -6194.170000, 0.142879, 0.000001, 0.000006 ], [133, -6194.170000, 0.142879, 0.000009, 0.000006 ], [136, -6194.170000, 0.142878, 0.000007, 0.000006 ], [135, -6194.170000, 0.142878, 0.000006, 0.000006 ], [137, -6194.170000, 0.142873, 0.004966, 0.000006 ], [138, -6194.170000, 0.142813, 0.001320, 0.000009 ], [132, -6194.170000, 0.142800, 0.000005, 0.000009 ] ], "n": ["FDJVGXF01B2KWB_rvcmp" ] }, {"p": [[135, -8615.520000, 0.544410, 0.002958, 0.007607 ], [132, -8616.330000, 0.241301, 0.008267, 0.007720 ], [137, -8617.850000, 0.053011, 0.000010, 0.010616 ], [138, -8617.970000, 0.047004, 0.000005, 0.011179 ], [131, -8618.010000, 0.045296, 0.000001, 0.011338 ], [133, -8618.280000, 0.034492, 0.001418, 0.011317 ], [134, -8618.280000, 0.034486, 0.000001, 0.011325 ] ], "n": ["FDJVGXF01DRNY6_rvcmp", "FDJVGXF01BTTJJ_rvcmp" ] }, {"p": [[135, -6187.250000, 0.142931, 0.002982, 0.005267 ], [137, -6187.250000, 0.142906, 0.002482, 0.005272 ], [136, -6187.250000, 0.142880, 0.001921, 0.005276 ], [138, -6187.250000, 0.142849, 0.000616, 0.005282 ], [134, -6187.250000, 0.142844, 0.000001, 0.005283 ], [131, -6187.250000, 0.142844, 0.000001, 0.005283 ], [139, -6187.250000, 0.142745, 0.000006, 0.005283 ] ], "n": ["FDJVGXF01DH8UR" ] }, {"p": [[135, -7918.580000, 0.391273, 0.003235, 0.003943 ], [132, -7919.380000, 0.175716, 0.009607, 0.003972 ], [137, -7919.630000, 0.137398, 0.001383, 0.004052 ], [136, -7919.640000, 0.136601, 0.003788, 0.004058 ], [138, -7919.640000, 0.136373, 0.000010, 0.004063 ], [134, -7921.900000, 0.014187, 0.000001, 0.007860 ], [131, -7922.420000, 0.008451, 0.000001, 0.007833 ] ], "n": ["FDJVGXF01AVDK2" ] }, {"p": [[135, -7450.450000, 0.392870, 0.002040, 0.008612 ], [139, -7451.180000, 0.189836, 0.005812, 0.007434 ], [130, -7451.510000, 0.135679, 0.008241, 0.006318 ], [140, -7451.740000, 0.107816, 0.000006, 0.006577 ], [138, -7452.130000, 0.073215, 0.000934, 0.010978 ], [131, -7452.280000, 0.062966, 0.000001, 0.012722 ], [134, -7452.800000, 0.037617, 0.000001, 0.012753 ] ], "n": ["FDJVGXF01ETCRK", "FDJVGXF01AXXCX", "FDJVGXF01CQ9NP" ] }, {"p": [[135, -7320.250000, 0.724536, 0.002359, 0.007737 ], [136, -7322.080000, 0.116134, 0.001922, 0.008799 ], [134, -7322.650000, 0.065519, 0.000001, 0.012991 ], [133, -7322.660000, 0.065270, 0.002392, 0.012991 ], [137, -7324.070000, 0.015902, 0.000010, 0.011082 ], [132, -7324.300000, 0.012641, 0.009039, 0.013228 ] ], "n": ["FDJVGXF01BIKH0" ] }, {"p": [[135, -7404.360000, 0.557954, 0.002054, 0.004229 ], [132, -7404.790000, 0.361276, 0.005627, 0.004225 ], [134, -7407.060000, 0.037284, 0.000001, 0.008372 ], [133, -7407.070000, 0.037143, 0.002392, 0.008372 ], [137, -7408.840000, 0.006343, 0.000010, 0.007635 ] ], "n": ["FDJVGXF01A6BE9_rvcmp" ] }, {"p": [[135, -7476.470000, 0.689104, 0.001496, 0.012515 ], [134, -7478.070000, 0.140201, 0.000001, 0.016331 ], [133, -7478.070000, 0.139766, 0.002394, 0.016331 ], [132, -7479.580000, 0.030928, 0.003697, 0.016699 ] ], "n": ["FDJVGXF01EP4MK" ] }, {"p": [[136, -6675.570000, 0.462885, 0.001918, 0.009913 ], [140, -6676.370000, 0.206595, 0.015066, 0.000006 ], [139, -6676.840000, 0.129733, 0.003653, 0.010135 ], [137, -6677.560000, 0.062916, 0.000010, 0.012441 ], [135, -6677.560000, 0.062881, 0.005910, 0.012440 ], [138, -6678.080000, 0.037537, 0.000005, 0.014652 ], [131, -6678.080000, 0.037452, 0.000001, 0.014674 ] ], "n": ["FDJVGXF01DSKDH_rvcmp" ] }, {"p": [[136, -7347.020000, 0.727639, 0.001924, 0.004400 ], [137, -7349.320000, 0.072616, 0.000010, 0.005938 ], [135, -7349.320000, 0.072588, 0.005910, 0.005937 ], [138, -7350.140000, 0.031889, 0.000005, 0.008672 ], [132, -7350.150000, 0.031860, 0.010863, 0.008672 ], [131, -7350.150000, 0.031722, 0.000001, 0.008704 ], [139, -7350.150000, 0.031686, 0.000005, 0.008704 ] ], "n": ["FDJVGXF01CFDMV" ] }, {"p": [[136, -5274.870000, 0.825498, 0.001925, 0.000006 ], [135, -5277.140000, 0.085351, 0.004128, 0.001699 ], [137, -5277.820000, 0.043072, 0.000010, 0.000134 ], [132, -5278.180000, 0.030089, 0.007997, 0.005897 ], [138, -5278.820000, 0.015989, 0.000010, 0.006150 ] ], "n": ["FDJVGXF01A9GJ5" ] }, {"p": [[136, -5995.640000, 0.344277, 0.000007, 0.016503 ], [135, -5995.720000, 0.317724, 0.005910, 0.016509 ], [137, -5995.730000, 0.315622, 0.000010, 0.016513 ], [134, -5999.070000, 0.011210, 0.000001, 0.022165 ], [133, -5999.070000, 0.011167, 0.002392, 0.022165 ] ], "n": ["FDJVGXF01B4HXX", "FDJVGXF01DHESL" ] }, {"p": [[136, -8058.720000, 0.503946, 0.000007, 0.016173 ], [135, -8058.800000, 0.465083, 0.005910, 0.016181 ], [134, -8062.200000, 0.015515, 0.000001, 0.020324 ], [133, -8062.200000, 0.015456, 0.002392, 0.020321 ] ], "n": ["FDJVGXF01D7MYF", "FDJVGXF01CHDUO" ] }, {"p": [[136, -8150.660000, 0.342137, 0.000007, 0.011747 ], [135, -8150.720000, 0.321357, 0.005910, 0.011672 ], [137, -8150.720000, 0.320687, 0.000010, 0.011653 ], [134, -8154.430000, 0.007925, 0.000001, 0.015739 ], [133, -8154.430000, 0.007895, 0.002392, 0.015739 ] ], "n": ["FDJVGXF01DZISV" ] }, {"p": [[136, -8036.580000, 0.351447, 0.000007, 0.003987 ], [135, -8036.670000, 0.323624, 0.005910, 0.003996 ], [137, -8036.670000, 0.321427, 0.000010, 0.003996 ], [134, -8041.190000, 0.003502, 0.000001, 0.008014 ] ], "n": ["FDJVGXF01DRGTB" ] }, {"p": [[138, -7213.990000, 0.278223, 0.000682, 0.009227 ], [136, -7214.000000, 0.275582, 0.001748, 0.009190 ], [139, -7214.930000, 0.109077, 0.001229, 0.011257 ], [131, -7214.980000, 0.102956, 0.000001, 0.012711 ], [132, -7215.010000, 0.100786, 0.009507, 0.009742 ], [137, -7215.260000, 0.078297, 0.004966, 0.009841 ], [135, -7215.610000, 0.055079, 0.004575, 0.011640 ] ], "n": ["FDJVGXF01AWLKR" ] }, {"p": [[138, -7193.460000, 0.345995, 0.000643, 0.004662 ], [134, -7194.370000, 0.138515, 0.000001, 0.008559 ], [133, -7194.380000, 0.137990, 0.002392, 0.008559 ], [132, -7194.510000, 0.121165, 0.009535, 0.004986 ], [137, -7194.770000, 0.093307, 0.004966, 0.005034 ], [139, -7194.900000, 0.081559, 0.000005, 0.008519 ], [131, -7194.900000, 0.081470, 0.000001, 0.008528 ] ], "n": ["FDJVGXF01E1IMM" ] }, {"p": [[138, -5130.640000, 0.143922, 0.001320, 0.000007 ], [131, -5130.640000, 0.143904, 0.000001, 0.000008 ], [139, -5130.640000, 0.143847, 0.000005, 0.000006 ], [137, -5130.640000, 0.143761, 0.004966, 0.000007 ], [132, -5130.640000, 0.143720, 0.010863, 0.000006 ], [135, -5130.670000, 0.140492, 0.005910, 0.000008 ], [136, -5130.670000, 0.140353, 0.003788, 0.000008 ] ], "n": ["FDJVGXF01AVMLL", "FDJVGXF01C374J", "FDJVGXF01D8C14", "FDJVGXF01CLDTB_rvcmp", "FDJVGXF01BNNUV", "FDJVGXF01BK9IG", "FDJVGXF01BO5BO" ] }, {"p": [[138, -2821.380000, 0.143316, 0.001320, 0.000007 ], [131, -2821.380000, 0.143307, 0.000001, 0.000008 ], [135, -2821.380000, 0.143306, 0.000006, 0.000008 ], [139, -2821.380000, 0.143247, 0.000005, 0.000006 ], [137, -2821.380000, 0.143164, 0.004966, 0.000007 ], [132, -2821.380000, 0.143111, 0.010863, 0.000006 ], [136, -2821.400000, 0.140548, 0.003788, 0.000008 ] ], "n": ["FDJVGXF01ADS38_rvcmp" ] }, {"p": [[139, -4245.940000, 0.331825, 0.010556, 0.000008 ], [130, -4245.940000, 0.331813, 0.010631, 0.000008 ], [140, -4245.940000, 0.331757, 0.000006, 0.000008 ], [128, -4250.900000, 0.002304, 0.003643, 0.005370 ], [129, -4250.910000, 0.002300, 0.004824, 0.005370 ] ], "n": ["FDJVGXF01DYONQ_rvcmp" ] }, {"p": [[139, -6419.500000, 0.375121, 0.004541, 0.005335 ], [138, -6420.220000, 0.182778, 0.000818, 0.006641 ], [130, -6420.230000, 0.180870, 0.008777, 0.005141 ], [131, -6420.540000, 0.132706, 0.000001, 0.009468 ], [132, -6421.240000, 0.065833, 0.009250, 0.005875 ], [137, -6421.710000, 0.041151, 0.004966, 0.006472 ], [135, -6422.360000, 0.021541, 0.004279, 0.009767 ] ], "n": ["FDJVGXF01CKG1U" ] }, {"p": [[139, -7484.580000, 0.661269, 0.005013, 0.003366 ], [130, -7485.430000, 0.284324, 0.010632, 0.002826 ], [138, -7487.290000, 0.044152, 0.000660, 0.004433 ], [131, -7488.750000, 0.010255, 0.000001, 0.008116 ] ], "n": ["FDJVGXF01CJ2JL" ] }, {"p": [[139, -7133.220000, 0.386195, 0.004938, 0.000006 ], [130, -7133.910000, 0.193915, 0.008812, 0.000006 ], [140, -7134.070000, 0.164996, 0.000006, 0.000006 ], [138, -7134.150000, 0.152569, 0.000630, 0.000006 ], [132, -7134.990000, 0.066026, 0.009235, 0.000006 ], [131, -7135.590000, 0.036299, 0.000001, 0.004172 ] ], "n": ["FDJVGXF01A01TX_rvcmp" ] }, {"p": [[139, -9133.970000, 0.582142, 0.002371, 0.007206 ], [132, -9134.810000, 0.251177, 0.008229, 0.007453 ], [136, -9136.670000, 0.038967, 0.003054, 0.010781 ], [137, -9136.840000, 0.032941, 0.004966, 0.010734 ], [138, -9136.840000, 0.032935, 0.000005, 0.010734 ], [135, -9136.900000, 0.031159, 0.005910, 0.010991 ], [131, -9136.910000, 0.030679, 0.000001, 0.011008 ] ], "n": ["FDJVGXF01DQPJF_rvcmp" ] }, {"p": [[140, -6170.920000, 0.188502, 0.027039, 0.115191 ], [148, -6171.020000, 0.171047, 0.024050, 0.107844 ], [137, -6171.300000, 0.128451, 0.004909, 0.124897 ], [138, -6171.310000, 0.128341, 0.000005, 0.125256 ], [132, -6171.310000, 0.128291, 0.010863, 0.125256 ], [131, -6171.310000, 0.127717, 0.000001, 0.125371 ], [139, -6171.310000, 0.127651, 0.000005, 0.125373 ] ], "n": ["FDJVGXF01DVG07" ] }, {"p": [[140, -5070.950000, 0.314561, 0.019597, 0.526614 ], [143, -5071.520000, 0.178109, 0.017650, 0.616520 ], [66, -5071.830000, 0.131399, 0.070198, 0.657958 ], [147, -5071.890000, 0.123350, 0.059057, 0.576223 ], [148, -5071.910000, 0.120709, 0.000009, 0.576876 ], [202, -5072.280000, 0.083664, 0.000006, 0.520545 ], [128, -5072.830000, 0.048208, 0.000007, 0.516921 ] ], "n": ["FDJVGXF01D1IUI" ] }, {"p": [[140, -4188.430000, 0.503578, 0.010319, 0.006123 ], [139, -4189.180000, 0.236240, 0.010556, 0.014473 ], [130, -4189.180000, 0.236231, 0.010632, 0.014473 ], [135, -4191.940000, 0.015025, 0.003000, 0.015190 ], [128, -4192.460000, 0.008927, 0.003643, 0.021883 ] ], "n": ["FDJVGXF01ETMYH" ] }, {"p": [[140, -4443.080000, 0.406181, 0.008476, 0.013241 ], [134, -4444.490000, 0.098970, 0.000001, 0.022409 ], [131, -4444.490000, 0.098970, 0.000001, 0.022409 ], [138, -4444.490000, 0.098970, 0.001319, 0.022409 ], [133, -4444.490000, 0.098970, 0.000009, 0.022409 ], [136, -4444.490000, 0.098970, 0.000007, 0.022409 ], [135, -4444.490000, 0.098970, 0.000006, 0.022409 ] ], "n": ["FDJVGXF01D4RB1_rvcmp" ] }, {"p": [[140, -2661.580000, 0.370956, 0.007635, 0.000006 ], [139, -2662.800000, 0.108861, 0.010556, 0.011499 ], [130, -2662.800000, 0.108860, 0.010632, 0.011495 ], [135, -2662.860000, 0.102840, 0.002986, 0.012395 ], [136, -2662.860000, 0.102832, 0.001875, 0.012403 ], [131, -2662.860000, 0.102826, 0.000001, 0.012412 ], [134, -2662.860000, 0.102825, 0.000001, 0.012408 ] ], "n": ["FDJVGXF01ETSPE" ] }, {"p": [[141, -2625.550000, 0.307988, 0.001828, 0.012296 ], [142, -2625.550000, 0.307926, 0.000001, 0.012308 ], [143, -2625.550000, 0.307922, 0.000006, 0.012304 ], [147, -2627.610000, 0.038923, 0.003682, 0.000006 ], [146, -2627.660000, 0.037242, 0.060923, 0.000006 ] ], "n": ["FDJVGXF01BK6PN_rvcmp" ] }, {"p": [[141, -2891.930000, 0.972896, 0.001828, 0.000006 ], [142, -2895.510000, 0.027104, 0.000001, 0.010915 ] ], "n": ["FDJVGXF01AX3NN_rvcmp" ] }, {"p": [[141, -6435.950000, 1.000000, 0.001219, 0.000006 ] ], "n": ["FDJVGXF01BTIP8" ] }, {"p": [[142, -6869.600000, 0.333718, 0.000001, 0.013546 ], [143, -6869.600000, 0.333377, 0.000008, 0.013543 ], [141, -6869.600000, 0.332904, 0.003648, 0.013547 ] ], "n": ["FDJVGXF01CFAI1" ] }, {"p": [[142, -3385.750000, 0.319812, 0.000001, 0.000007 ], [141, -3385.750000, 0.319811, 0.000007, 0.000007 ], [143, -3385.750000, 0.319750, 0.000006, 0.000006 ], [146, -3388.510000, 0.020315, 0.060923, 0.000006 ], [147, -3388.510000, 0.020312, 0.000008, 0.000006 ] ], "n": ["FDJVGXF01DQ6TF", "FDJVGXF01A51QA" ] }, {"p": [[142, -9034.580000, 0.333482, 0.000001, 0.000006 ], [141, -9034.580000, 0.333479, 0.000007, 0.000006 ], [143, -9034.580000, 0.333039, 0.000008, 0.000006 ] ], "n": ["FDJVGXF01DJVG4_rvcmp" ] }, {"p": [[142, -7234.100000, 0.333368, 0.000001, 0.013247 ], [141, -7234.100000, 0.333368, 0.000007, 0.013255 ], [143, -7234.100000, 0.333264, 0.000009, 0.013243 ] ], "n": ["FDJVGXF01BGWOV", "FDJVGXF01CLRF7" ] }, {"p": [[143, -6865.440000, 0.855030, 0.025097, 0.000006 ], [147, -6868.020000, 0.065253, 0.000008, 0.000006 ], [146, -6868.020000, 0.065159, 0.060923, 0.000006 ], [141, -6870.210000, 0.007280, 0.001842, 0.014159 ], [142, -6870.210000, 0.007278, 0.000001, 0.014165 ] ], "n": ["FDJVGXF01AQ3LC_rvcmp", "FDJVGXF01AFXQZ_rvcmp" ] }, {"p": [[143, -7365.040000, 0.830853, 0.013805, 0.000006 ], [142, -7366.630000, 0.169147, 0.000001, 0.008446 ] ], "n": ["FDJVGXF01BYR1G_rvcmp" ] }, {"p": [[143, -8098.340000, 0.652953, 0.011527, 0.005205 ], [141, -8099.660000, 0.173529, 0.001876, 0.012145 ], [142, -8099.660000, 0.173518, 0.000001, 0.012155 ] ], "n": ["FDJVGXF01EW1Z2", "FDJVGXF01EX20I" ] }, {"p": [[143, -7689.270000, 0.414132, 0.004400, 0.007355 ], [142, -7689.610000, 0.293291, 0.000001, 0.012144 ], [141, -7689.610000, 0.292576, 0.003648, 0.012149 ] ], "n": ["FDJVGXF01DI8GN_rvcmp" ] }, {"p": [[143, -6609.850000, 0.746332, 0.004229, 0.000006 ], [142, -6611.620000, 0.127245, 0.000001, 0.004846 ], [141, -6611.620000, 0.126423, 0.003648, 0.004846 ] ], "n": ["FDJVGXF01DIQTM_rvcmp", "FDJVGXF01AJGH5_rvcmp" ] }, {"p": [[148, -7299.210000, 0.205856, 0.085601, 1.558440 ], [22, -7299.300000, 0.187430, 0.028187, 1.590720 ], [56, -7299.430000, 0.165121, 0.035411, 1.398180 ], [13, -7299.570000, 0.143655, 0.000009, 1.536740 ], [225, -7299.870000, 0.106000, 0.036449, 1.654230 ], [52, -7299.970000, 0.096260, 0.003885, 1.575010 ], [149, -7299.980000, 0.095678, 0.010240, 1.525030 ] ], "n": ["FDJVGXF01BWPPJ_rvcmp" ] }, {"p": [[148, -3315.640000, 0.293596, 0.078751, 0.165776 ], [167, -3315.700000, 0.276687, 0.014138, 0.211653 ], [155, -3316.350000, 0.144339, 0.000006, 0.207621 ], [162, -3316.500000, 0.123884, 0.000005, 0.233272 ], [156, -3317.260000, 0.057997, 0.043598, 0.226445 ], [157, -3317.260000, 0.057996, 0.000006, 0.226444 ], [169, -3317.500000, 0.045500, 0.005276, 0.230866 ] ], "n": ["FDJVGXF01B503G" ] }, {"p": [[148, -5372.700000, 0.443335, 0.054279, 0.259461 ], [140, -5373.680000, 0.166111, 0.046581, 0.267004 ], [147, -5373.680000, 0.166042, 0.065313, 0.267001 ], [149, -5374.470000, 0.075243, 0.000008, 0.333858 ], [127, -5374.470000, 0.075220, 0.040911, 0.333870 ], [132, -5374.920000, 0.048087, 0.003188, 0.291572 ], [138, -5375.530000, 0.025961, 0.000005, 0.296234 ] ], "n": ["FDJVGXF01D8LWK_rvcmp" ] }, {"p": [[148, -5736.550000, 0.275929, 0.024601, 0.116279 ], [140, -5736.790000, 0.216993, 0.033314, 0.125225 ], [138, -5737.550000, 0.101587, 0.000005, 0.137563 ], [137, -5737.550000, 0.101560, 0.004968, 0.137516 ], [132, -5737.550000, 0.101549, 0.010863, 0.137563 ], [131, -5737.550000, 0.101216, 0.000001, 0.137678 ], [139, -5737.550000, 0.101166, 0.000005, 0.137679 ] ], "n": ["FDJVGXF01CJJ11" ] }, {"p": [[148, -5964.790000, 0.186827, 0.000009, 1.999990 ], [225, -5965.090000, 0.138428, 0.036449, 1.999990 ], [222, -5965.110000, 0.135073, 0.000009, 1.999990 ], [224, -5965.110000, 0.135034, 0.010740, 1.999990 ], [213, -5965.110000, 0.135034, 0.023979, 1.999990 ], [223, -5965.110000, 0.134804, 0.016737, 1.999990 ], [216, -5965.110000, 0.134799, 0.038817, 1.999990 ] ], "n": ["FDJVGXF01EHCC7_rvcmp" ] }, {"p": [[148, -3702.190000, 0.183650, 0.000009, 1.999990 ], [147, -3702.190000, 0.183646, 0.065313, 1.999990 ], [140, -3702.190000, 0.183641, 0.046582, 1.999990 ], [143, -3702.370000, 0.153443, 0.000008, 1.999990 ], [146, -3702.400000, 0.149451, 0.060923, 1.999990 ], [0, -3703.100000, 0.074343, 0.000008, 1.960390 ], [126, -3703.130000, 0.071825, 0.047265, 1.816950 ] ], "n": ["FDJVGXF01DCAR9_rvcmp" ] }, {"p": [[148, -6078.330000, 0.163256, 0.000009, 1.868790 ], [147, -6078.330000, 0.163250, 0.065313, 1.868830 ], [140, -6078.330000, 0.163247, 0.046582, 1.868800 ], [212, -6078.340000, 0.162756, 0.000008, 1.736350 ], [225, -6078.670000, 0.116609, 0.036449, 1.795480 ], [222, -6078.680000, 0.115916, 0.000009, 1.803950 ], [224, -6078.690000, 0.114966, 0.010740, 1.809520 ] ], "n": ["FDJVGXF01BCLYU_rvcmp" ] }, {"p": [[148, -5479.490000, 0.172235, 0.000009, 1.697450 ], [147, -5479.490000, 0.172227, 0.065313, 1.697490 ], [213, -5479.740000, 0.133518, 0.000006, 1.582040 ], [225, -5479.760000, 0.131687, 0.000009, 1.594760 ], [224, -5479.760000, 0.131687, 0.010740, 1.594770 ], [222, -5479.770000, 0.130063, 0.000009, 1.604550 ], [223, -5479.780000, 0.128583, 0.016737, 1.607350 ] ], "n": ["FDJVGXF01CKKZS" ] }, {"p": [[149, -7892.020000, 0.243928, 0.063738, 0.199750 ], [171, -7892.020000, 0.243909, 0.000008, 0.199760 ], [170, -7892.020000, 0.243794, 0.018724, 0.199759 ], [191, -7892.750000, 0.117453, 0.000008, 0.206784 ], [190, -7892.750000, 0.117434, 0.034335, 0.206774 ], [39, -7894.630000, 0.017934, 0.013859, 0.220401 ], [192, -7894.780000, 0.015548, 0.009937, 0.220919 ] ], "n": ["FDJVGXF01D7DG8_rvcmp" ] }, {"p": [[149, -3027.000000, 0.308670, 0.042582, 0.037480 ], [171, -3027.600000, 0.169575, 0.004336, 0.058110 ], [153, -3027.660000, 0.159548, 0.019512, 0.059828 ], [170, -3027.670000, 0.158471, 0.018724, 0.060576 ], [154, -3028.320000, 0.082852, 0.000007, 0.070365 ], [150, -3028.320000, 0.082788, 0.016957, 0.070358 ], [169, -3029.090000, 0.038097, 0.023387, 0.074562 ] ], "n": ["FDJVGXF01CDHY3" ] }, {"p": [[149, -7616.070000, 0.365816, 0.024579, 0.115179 ], [127, -7616.690000, 0.195900, 0.040911, 0.113790 ], [171, -7617.210000, 0.116644, 0.024563, 0.138173 ], [190, -7617.240000, 0.113961, 0.031426, 0.138584 ], [191, -7617.260000, 0.110699, 0.000008, 0.140486 ], [170, -7617.510000, 0.086430, 0.018724, 0.137474 ], [40, -7619.620000, 0.010551, 0.071825, 0.140047 ] ], "n": ["FDJVGXF01D5RDK_rvcmp" ] }, {"p": [[149, -7859.470000, 0.714002, 0.023643, 0.065584 ], [127, -7860.460000, 0.266646, 0.040911, 0.065541 ], [171, -7863.080000, 0.019352, 0.000008, 0.091486 ] ], "n": ["FDJVGXF01A31Z8_rvcmp" ] }, {"p": [[149, -6105.790000, 0.557956, 0.021300, 0.262656 ], [148, -6106.530000, 0.266359, 0.116820, 0.285370 ], [127, -6107.030000, 0.161365, 0.040911, 0.284073 ], [154, -6109.960000, 0.008658, 0.002126, 0.301759 ], [170, -6110.380000, 0.005661, 0.010643, 0.293237 ] ], "n": ["FDJVGXF01CD7FN_rvcmp" ] }, {"p": [[149, -4692.820000, 0.156258, 0.001277, 0.267483 ], [148, -4692.820000, 0.156162, 0.148117, 0.268221 ], [127, -4692.820000, 0.156128, 0.040911, 0.268234 ], [30, -4692.960000, 0.135807, 0.000006, 0.287788 ], [31, -4692.960000, 0.135807, 0.000008, 0.287806 ], [32, -4692.960000, 0.135797, 0.000007, 0.287807 ], [33, -4693.050000, 0.124041, 0.000010, 0.289128 ] ], "n": ["FDJVGXF01EXALQ_rvcmp" ] }, {"p": [[150, -4565.290000, 0.201967, 0.013936, 0.116502 ], [153, -4565.320000, 0.195101, 0.026997, 0.117676 ], [154, -4565.320000, 0.195065, 0.000007, 0.117677 ], [18, -4565.540000, 0.156286, 0.042159, 0.128399 ], [22, -4565.770000, 0.124913, 0.000007, 0.137235 ], [21, -4565.770000, 0.124878, 0.017640, 0.137231 ], [170, -4570.010000, 0.001789, 0.000009, 0.140219 ] ], "n": ["FDJVGXF01BP94M" ] }, {"p": [[152, -8500.510000, 0.334684, 0.022798, 0.124098 ], [153, -8500.950000, 0.215715, 0.010005, 0.129694 ], [151, -8501.170000, 0.173555, 0.014659, 0.132171 ], [154, -8501.350000, 0.143933, 0.005629, 0.129717 ], [150, -8501.480000, 0.126625, 0.016957, 0.133630 ], [170, -8504.620000, 0.005487, 0.003859, 0.130961 ] ], "n": ["FDJVGXF01A3BDZ_rvcmp", "FDJVGXF01AU0X5_rvcmp", "FDJVGXF01EXELD_rvcmp" ] }, {"p": [[152, -6120.540000, 0.477929, 0.021592, 0.168350 ], [151, -6120.730000, 0.393266, 0.000007, 0.170925 ], [153, -6121.850000, 0.128804, 0.000005, 0.176441 ] ], "n": ["FDJVGXF01AKJDE", "FDJVGXF01A4L25" ] }, {"p": [[152, -6215.320000, 0.468801, 0.022146, 0.094871 ], [151, -6215.890000, 0.263296, 0.009833, 0.095493 ], [153, -6216.360000, 0.164896, 0.000504, 0.096766 ], [196, -6217.610000, 0.047316, 0.026079, 0.082851 ], [38, -6218.260000, 0.024567, 0.031199, 0.112056 ], [40, -6218.630000, 0.017110, 0.061559, 0.089980 ], [205, -6218.830000, 0.014014, 0.019823, 0.095344 ] ], "n": ["FDJVGXF01A92O9" ] }, {"p": [[152, -7336.720000, 0.526145, 0.022468, 0.076251 ], [151, -7337.310000, 0.291753, 0.009891, 0.076898 ], [153, -7337.820000, 0.174920, 0.001007, 0.076657 ], [40, -7341.010000, 0.007182, 0.068956, 0.071776 ] ], "n": ["FDJVGXF01CA5RL" ] }, {"p": [[152, -4886.180000, 0.431038, 0.020505, 0.079776 ], [153, -4886.610000, 0.280584, 0.001055, 0.081496 ], [151, -4886.640000, 0.272372, 0.014659, 0.084184 ], [40, -4889.470000, 0.016006, 0.049556, 0.071326 ] ], "n": ["FDJVGXF01B6FHY" ] }, {"p": [[152, -7894.430000, 0.371874, 0.016894, 0.094034 ], [149, -7895.320000, 0.152010, 0.049239, 0.066945 ], [154, -7895.600000, 0.114819, 0.015837, 0.088348 ], [153, -7895.690000, 0.105185, 0.006429, 0.093230 ], [151, -7895.760000, 0.098160, 0.011601, 0.093952 ], [171, -7895.810000, 0.093381, 0.012125, 0.080318 ], [170, -7896.180000, 0.064571, 0.010043, 0.087387 ] ], "n": ["FDJVGXF01B561Z" ] }, {"p": [[153, -8554.990000, 0.924246, 0.011753, 0.080980 ], [149, -8558.550000, 0.026380, 0.050852, 0.074461 ], [171, -8558.690000, 0.022849, 0.010727, 0.086074 ], [152, -8558.970000, 0.017355, 0.029974, 0.101303 ], [170, -8559.600000, 0.009170, 0.015306, 0.093924 ] ], "n": ["FDJVGXF01CO5FC_rvcmp" ] }, {"p": [[153, -2477.970000, 0.226548, 0.011446, 0.159988 ], [151, -2478.430000, 0.144427, 0.014659, 0.186928 ], [152, -2478.430000, 0.144407, 0.029974, 0.186930 ], [149, -2478.510000, 0.132905, 0.063739, 0.178142 ], [171, -2478.510000, 0.132888, 0.000008, 0.178151 ], [170, -2478.510000, 0.132872, 0.018724, 0.178148 ], [39, -2478.940000, 0.085953, 0.003187, 0.195799 ] ], "n": ["FDJVGXF01EMJ2U" ] }, {"p": [[153, -2764.170000, 0.305109, 0.000007, 0.081293 ], [152, -2764.170000, 0.305099, 0.029974, 0.081310 ], [151, -2764.170000, 0.304989, 0.014659, 0.081308 ], [18, -2766.690000, 0.024757, 0.051699, 0.098316 ], [22, -2766.690000, 0.024757, 0.000007, 0.098313 ], [21, -2766.690000, 0.024740, 0.017640, 0.098320 ], [209, -2767.540000, 0.010549, 0.006837, 0.106067 ] ], "n": ["FDJVGXF01CDHY3_rvcmp" ] }, {"p": [[154, -6945.420000, 0.959355, 0.019746, 0.019332 ], [169, -6948.580000, 0.040645, 0.018628, 0.024577 ] ], "n": ["FDJVGXF01ES1QJ_rvcmp" ] }, {"p": [[154, -5001.520000, 0.327181, 0.019700, 0.013094 ], [169, -5001.550000, 0.315792, 0.014044, 0.015714 ], [159, -5002.490000, 0.123708, 0.006002, 0.028360 ], [167, -5002.920000, 0.080613, 0.027435, 0.028412 ], [168, -5003.350000, 0.052544, 0.003613, 0.030329 ], [157, -5003.350000, 0.052539, 0.005887, 0.030329 ], [155, -5003.450000, 0.047623, 0.012864, 0.030665 ] ], "n": ["FDJVGXF01D298Z_rvcmp", "FDJVGXF01EJRS5_rvcmp", "FDJVGXF01EUN41_rvcmp", "FDJVGXF01EFXAW_rvcmp" ] }, {"p": [[154, -7637.840000, 1.000000, 0.013700, 0.051007 ] ], "n": ["FDJVGXF01C5HGH_rvcmp" ] }, {"p": [[154, -7036.670000, 0.972908, 0.013202, 0.043934 ], [153, -7040.260000, 0.027092, 0.026997, 0.054951 ] ], "n": ["FDJVGXF01EJMGG" ] }, {"p": [[154, -3816.820000, 0.487098, 0.011617, 0.106240 ], [153, -3818.020000, 0.146889, 0.017579, 0.114027 ], [149, -3818.430000, 0.097182, 0.052552, 0.102683 ], [170, -3818.690000, 0.074904, 0.005639, 0.124997 ], [169, -3818.730000, 0.072088, 0.023387, 0.128691 ], [171, -3818.860000, 0.063177, 0.000008, 0.121621 ], [152, -3818.930000, 0.058662, 0.029974, 0.121505 ] ], "n": ["FDJVGXF01CJ582" ] }, {"p": [[154, -7417.770000, 0.924403, 0.010692, 0.047037 ], [153, -7420.270000, 0.075597, 0.018477, 0.055214 ] ], "n": ["FDJVGXF01EOB14", "FDJVGXF01C63HA", "FDJVGXF01ET7SO" ] }, {"p": [[155, -8033.050000, 0.158475, 0.010865, 0.051495 ], [156, -8033.070000, 0.155828, 0.042365, 0.050258 ], [157, -8033.100000, 0.151109, 0.000006, 0.051603 ], [169, -8033.170000, 0.139899, 0.000005, 0.051751 ], [168, -8033.170000, 0.139725, 0.003613, 0.051755 ], [165, -8033.200000, 0.136551, 0.003002, 0.049728 ], [167, -8033.340000, 0.118414, 0.023649, 0.044340 ] ], "n": ["FDJVGXF01E4IKQ_rvcmp" ] }, {"p": [[155, -6988.150000, 0.919910, 0.010101, 0.004780 ], [156, -6990.690000, 0.072056, 0.040757, 0.005474 ], [161, -6992.890000, 0.008035, 0.016182, 0.007528 ] ], "n": ["FDJVGXF01BDPG4" ] }, {"p": [[155, -6918.030000, 0.889692, 0.010172, 0.000009 ], [156, -6920.780000, 0.056705, 0.041414, 0.000005 ], [157, -6920.840000, 0.053602, 0.000006, 0.000006 ] ], "n": ["FDJVGXF01EU9B9" ] }, {"p": [[155, -6210.550000, 0.777879, 0.009087, 0.017610 ], [160, -6212.440000, 0.117759, 0.002863, 0.029434 ], [157, -6213.190000, 0.055689, 0.000622, 0.020088 ], [161, -6213.320000, 0.048673, 0.003698, 0.025183 ] ], "n": ["FDJVGXF01DVCVF_rvcmp" ] }, {"p": [[155, -6969.330000, 0.970924, 0.008545, 0.000009 ], [156, -6972.840000, 0.029076, 0.042552, 0.000005 ] ], "n": ["FDJVGXF01DKR11" ] }, {"p": [[155, -6841.200000, 0.953691, 0.009424, 0.000009 ], [156, -6844.220000, 0.046309, 0.041439, 0.000005 ] ], "n": ["FDJVGXF01CO480" ] }, {"p": [[155, -7196.940000, 0.312306, 0.008290, 0.000009 ], [157, -7197.240000, 0.230141, 0.000006, 0.000006 ], [169, -7197.340000, 0.209888, 0.000006, 0.000006 ], [168, -7197.340000, 0.209671, 0.003612, 0.000006 ], [166, -7199.650000, 0.020721, 0.001999, 0.000006 ], [160, -7199.830000, 0.017272, 0.007381, 0.000006 ] ], "n": ["FDJVGXF01DS0II" ] }, {"p": [[155, -7055.290000, 0.254017, 0.008301, 0.000009 ], [157, -7055.590000, 0.187403, 0.000006, 0.000006 ], [156, -7055.590000, 0.187112, 0.043598, 0.000006 ], [169, -7055.690000, 0.170410, 0.000006, 0.000006 ], [168, -7055.690000, 0.170233, 0.003612, 0.000006 ], [166, -7058.000000, 0.016811, 0.001999, 0.000006 ], [160, -7058.190000, 0.014013, 0.007381, 0.000006 ] ], "n": ["FDJVGXF01APT00" ] }, {"p": [[155, -8859.610000, 1.000000, 0.006133, 0.000009 ] ], "n": ["FDJVGXF01BS1BC_rvcmp" ] }, {"p": [[155, -6483.730000, 1.000000, 0.003777, 0.000009 ] ], "n": ["FDJVGXF01DRYOS_rvcmp" ] }, {"p": [[155, -6301.120000, 0.345452, 0.000006, 0.033775 ], [156, -6301.350000, 0.274016, 0.043598, 0.033846 ], [157, -6301.350000, 0.273834, 0.000006, 0.033847 ], [169, -6303.090000, 0.048099, 0.000006, 0.035537 ], [168, -6303.100000, 0.047940, 0.003612, 0.035538 ], [159, -6304.600000, 0.010659, 0.002352, 0.043944 ] ], "n": ["FDJVGXF01EXALQ" ] }, {"p": [[155, -8152.240000, 0.480363, 0.000006, 0.011923 ], [157, -8153.320000, 0.163391, 0.001530, 0.009646 ], [156, -8153.430000, 0.145576, 0.043598, 0.010882 ], [168, -8153.510000, 0.134337, 0.002660, 0.008259 ], [169, -8154.080000, 0.076333, 0.003110, 0.005582 ] ], "n": ["FDJVGXF01DR7NL_rvcmp" ] }, {"p": [[155, -5445.870000, 0.380729, 0.000006, 0.000006 ], [156, -5446.130000, 0.292637, 0.043598, 0.000006 ], [157, -5446.130000, 0.292383, 0.000006, 0.000006 ], [169, -5448.280000, 0.034251, 0.000006, 0.000006 ] ], "n": ["FDJVGXF01ATTC2_rvcmp" ] }, {"p": [[155, -7043.480000, 0.957203, 0.000006, 0.000006 ], [156, -7047.280000, 0.021418, 0.043598, 0.000006 ], [157, -7047.280000, 0.021380, 0.000006, 0.000006 ] ], "n": ["FDJVGXF01AXQF5_rvcmp" ] }, {"p": [[156, -7940.960000, 0.192084, 0.043598, 0.162312 ], [157, -7940.960000, 0.191852, 0.000006, 0.162323 ], [152, -7941.200000, 0.150875, 0.027190, 0.166036 ], [153, -7941.250000, 0.143757, 0.010694, 0.166671 ], [151, -7941.410000, 0.121927, 0.014659, 0.169808 ], [150, -7941.600000, 0.100815, 0.016562, 0.169695 ], [161, -7941.630000, 0.098690, 0.003142, 0.165592 ] ], "n": ["FDJVGXF01DD17R" ] }, {"p": [[156, -7107.690000, 0.331161, 0.039004, 0.000006 ], [157, -7107.860000, 0.279472, 0.000006, 0.000006 ], [155, -7107.860000, 0.279254, 0.012864, 0.000009 ], [161, -7108.790000, 0.110114, 0.014144, 0.000006 ] ], "n": ["FDJVGXF01BUUSC" ] }, {"p": [[156, -7188.430000, 0.459423, 0.039024, 0.000006 ], [155, -7188.600000, 0.387899, 0.012864, 0.000009 ], [161, -7189.530000, 0.152678, 0.014142, 0.000006 ] ], "n": ["FDJVGXF01BINP8" ] }, {"p": [[156, -8631.280000, 0.787774, 0.035424, 0.029829 ], [155, -8632.590000, 0.212226, 0.011646, 0.033031 ] ], "n": ["FDJVGXF01A0WFN" ] }, {"p": [[156, -8535.470000, 0.484013, 0.035236, 0.007529 ], [161, -8536.060000, 0.267888, 0.019096, 0.012456 ], [155, -8536.500000, 0.172465, 0.011277, 0.014959 ], [160, -8537.870000, 0.043903, 0.004443, 0.023010 ], [157, -8538.190000, 0.031731, 0.000547, 0.016482 ] ], "n": ["FDJVGXF01EUT0Q_rvcmp" ] }, {"p": [[156, -7348.850000, 0.409794, 0.033189, 0.000006 ], [155, -7349.290000, 0.263450, 0.012864, 0.000009 ], [157, -7349.290000, 0.263364, 0.000006, 0.000009 ], [169, -7351.400000, 0.031748, 0.000005, 0.000007 ], [168, -7351.410000, 0.031644, 0.003612, 0.000009 ] ], "n": ["FDJVGXF01ELZQ3" ] }, {"p": [[156, -7505.930000, 0.988029, 0.029827, 0.021579 ], [164, -7510.340000, 0.011971, 0.011055, 0.034218 ] ], "n": ["FDJVGXF01CPK4B" ] }, {"p": [[156, -8157.270000, 1.000000, 0.028362, 0.017192 ] ], "n": ["FDJVGXF01BOUVN" ] }, {"p": [[156, -8450.420000, 0.963382, 0.026244, 0.029413 ], [169, -8453.690000, 0.036618, 0.012719, 0.033335 ] ], "n": ["FDJVGXF01DIEMZ" ] }, {"p": [[156, -8533.640000, 0.618499, 0.026223, 0.017319 ], [160, -8534.430000, 0.280603, 0.003124, 0.041606 ], [158, -8535.720000, 0.077125, 0.016009, 0.044188 ], [161, -8536.900000, 0.023773, 0.021910, 0.034458 ] ], "n": ["FDJVGXF01BM0LU" ] }, {"p": [[156, -4932.190000, 0.969805, 0.025642, 0.000008 ], [157, -4935.660000, 0.030195, 0.000006, 0.000006 ] ], "n": ["FDJVGXF01A50J2_rvcmp" ] }, {"p": [[156, -5751.870000, 0.925523, 0.023127, 0.030889 ], [169, -5754.550000, 0.063596, 0.014680, 0.038096 ], [154, -5756.320000, 0.010882, 0.030340, 0.040912 ] ], "n": ["FDJVGXF01CAXIU" ] }, {"p": [[156, -8026.240000, 1.000000, 0.021424, 0.030421 ] ], "n": ["FDJVGXF01BTHJI" ] }, {"p": [[156, -7886.970000, 1.000000, 0.019536, 0.032334 ] ], "n": ["FDJVGXF01CV576" ] }, {"p": [[156, -7044.040000, 0.984531, 0.017995, 0.016303 ], [169, -7048.190000, 0.015469, 0.015766, 0.018549 ] ], "n": ["FDJVGXF01D8ZRC" ] }, {"p": [[156, -3368.160000, 0.206274, 0.000009, 0.000009 ], [155, -3368.260000, 0.186481, 0.012865, 0.000006 ], [157, -3368.260000, 0.186440, 0.000006, 0.000009 ], [169, -3368.680000, 0.122347, 0.000006, 0.000008 ], [168, -3368.680000, 0.122122, 0.003613, 0.000009 ], [154, -3369.010000, 0.088172, 0.030340, 0.000006 ], [170, -3369.010000, 0.088164, 0.000009, 0.000005 ] ], "n": ["FDJVGXF01DWGJY" ] }, {"p": [[156, -7016.410000, 0.372866, 0.000008, 0.000006 ], [155, -7016.690000, 0.280191, 0.012864, 0.000009 ], [157, -7016.690000, 0.279957, 0.000006, 0.000009 ], [169, -7018.820000, 0.033558, 0.000005, 0.000007 ], [168, -7018.820000, 0.033429, 0.003612, 0.000009 ] ], "n": ["FDJVGXF01A1ZF5_rvcmp" ] }, {"p": [[158, -8531.270000, 0.844369, 0.010577, 0.025817 ], [160, -8532.960000, 0.155631, 0.004116, 0.031472 ] ], "n": ["FDJVGXF01ARWGQ_rvcmp" ] }, {"p": [[158, -5112.460000, 0.229320, 0.007237, 0.447277 ], [167, -5112.770000, 0.168601, 0.023906, 0.428526 ], [149, -5112.970000, 0.138961, 0.063739, 0.444914 ], [170, -5112.970000, 0.138948, 0.018724, 0.444922 ], [171, -5112.970000, 0.138946, 0.000008, 0.444909 ], [166, -5113.300000, 0.099158, 0.001999, 0.477735 ], [159, -5113.440000, 0.086067, 0.000006, 0.485093 ] ], "n": ["FDJVGXF01DH8C7_rvcmp" ] }, {"p": [[158, -9036.680000, 0.932177, 0.006238, 0.026953 ], [160, -9039.300000, 0.067823, 0.003932, 0.029348 ] ], "n": ["FDJVGXF01A9Y23" ] }, {"p": [[158, -4581.990000, 0.311999, 0.004914, 0.291159 ], [159, -4582.470000, 0.191965, 0.011552, 0.311146 ], [160, -4582.470000, 0.191879, 0.000007, 0.311139 ], [149, -4583.160000, 0.096084, 0.045181, 0.225341 ], [150, -4583.490000, 0.069380, 0.016957, 0.245361 ], [154, -4583.490000, 0.069362, 0.000007, 0.245370 ], [171, -4583.490000, 0.069331, 0.000008, 0.244944 ] ], "n": ["FDJVGXF01D4AN8", "FDJVGXF01EG76B", "FDJVGXF01A0XE2" ] }, {"p": [[158, -5813.630000, 0.945899, 0.001957, 0.059647 ], [160, -5817.060000, 0.030814, 0.002770, 0.064356 ], [159, -5817.340000, 0.023287, 0.006775, 0.066761 ] ], "n": ["FDJVGXF01COJV0" ] }, {"p": [[159, -5370.700000, 0.889906, 0.004818, 0.006163 ], [160, -5373.270000, 0.067538, 0.000007, 0.009471 ], [165, -5374.820000, 0.014437, 0.007352, 0.012499 ], [166, -5374.820000, 0.014398, 0.000008, 0.012500 ], [161, -5374.870000, 0.013721, 0.032465, 0.012493 ] ], "n": ["FDJVGXF01B9JIG_rvcmp" ] }, {"p": [[159, -6998.240000, 0.928119, 0.004795, 0.004597 ], [160, -7000.970000, 0.060594, 0.000007, 0.006671 ], [165, -7002.650000, 0.011287, 0.007352, 0.009290 ] ], "n": ["FDJVGXF01CLVU7", "FDJVGXF01EYURC", "FDJVGXF01EVEMN" ] }, {"p": [[159, -6052.700000, 0.985910, 0.000530, 0.021940 ], [165, -6056.950000, 0.014090, 0.002472, 0.021961 ] ], "n": ["FDJVGXF01ARS8Z" ] }, {"p": [[159, -8542.780000, 0.932740, 0.001412, 0.018049 ], [169, -8546.430000, 0.024153, 0.005425, 0.014448 ], [155, -8546.910000, 0.014930, 0.012455, 0.018731 ], [157, -8546.920000, 0.014872, 0.000006, 0.018693 ], [168, -8547.030000, 0.013304, 0.003612, 0.018783 ] ], "n": ["FDJVGXF01CTDOF_rvcmp" ] }, {"p": [[159, -7568.320000, 0.990820, 0.001192, 0.016023 ], [165, -7573.000000, 0.009180, 0.003255, 0.015806 ] ], "n": ["FDJVGXF01DZWUU" ] }, {"p": [[159, -4955.890000, 0.812681, 0.000006, 0.020157 ], [167, -4957.970000, 0.101618, 0.018717, 0.018124 ], [165, -4958.970000, 0.037247, 0.003907, 0.023138 ], [169, -4959.320000, 0.026334, 0.012507, 0.015444 ], [157, -4960.560000, 0.007588, 0.005887, 0.026436 ], [168, -4960.560000, 0.007588, 0.003613, 0.026437 ], [155, -4960.650000, 0.006944, 0.012865, 0.026740 ] ], "n": ["FDJVGXF01ELR2H_rvcmp" ] }, {"p": [[159, -3443.790000, 0.621391, 0.000006, 0.009450 ], [154, -3444.800000, 0.225733, 0.017821, 0.000006 ], [169, -3445.240000, 0.144701, 0.017012, 0.000007 ], [150, -3448.120000, 0.008175, 0.000742, 0.019032 ] ], "n": ["FDJVGXF01DA570_rvcmp" ] }, {"p": [[159, -4066.730000, 0.713471, 0.000006, 0.008048 ], [169, -4067.850000, 0.231738, 0.014337, 0.000006 ], [165, -4070.780000, 0.012421, 0.005354, 0.008859 ], [157, -4070.890000, 0.011088, 0.005887, 0.010452 ], [168, -4070.890000, 0.011083, 0.003612, 0.010461 ], [160, -4070.980000, 0.010104, 0.007224, 0.010084 ], [166, -4070.990000, 0.010095, 0.000008, 0.010256 ] ], "n": ["FDJVGXF01BHCBT_rvcmp" ] }, {"p": [[159, -4947.330000, 0.918133, 0.000006, 0.006578 ], [165, -4951.390000, 0.015839, 0.005224, 0.006110 ], [155, -4951.540000, 0.013611, 0.010797, 0.008971 ], [157, -4951.540000, 0.013582, 0.005887, 0.007789 ], [168, -4951.540000, 0.013576, 0.003612, 0.007779 ], [160, -4951.600000, 0.012778, 0.005934, 0.005993 ], [166, -4951.620000, 0.012482, 0.000008, 0.007409 ] ], "n": ["FDJVGXF01BHKG4_rvcmp" ] }, {"p": [[159, -4061.620000, 0.995177, 0.000006, 0.000006 ], [169, -4066.950000, 0.004823, 0.013046, 0.000006 ] ], "n": ["FDJVGXF01AZOG4_rvcmp" ] }, {"p": [[160, -3727.940000, 0.613450, 0.004383, 0.060260 ], [158, -3729.420000, 0.139129, 0.014806, 0.069386 ], [159, -3729.630000, 0.112835, 0.011552, 0.073669 ], [169, -3730.300000, 0.057607, 0.012311, 0.036944 ], [164, -3730.710000, 0.038366, 0.012850, 0.050574 ], [161, -3731.320000, 0.020798, 0.029300, 0.054239 ], [165, -3731.480000, 0.017815, 0.000007, 0.058462 ] ], "n": ["FDJVGXF01B33FQ" ] }, {"p": [[160, -6455.770000, 0.162556, 0.003397, 0.228094 ], [165, -6455.830000, 0.152105, 0.003926, 0.228200 ], [159, -6455.900000, 0.142856, 0.009976, 0.230720 ], [158, -6455.910000, 0.141520, 0.017418, 0.230701 ], [166, -6455.940000, 0.136905, 0.000008, 0.232599 ], [168, -6455.970000, 0.132620, 0.000007, 0.232950 ], [164, -6455.980000, 0.131436, 0.020696, 0.228464 ] ], "n": ["FDJVGXF01DD617_rvcmp" ] }, {"p": [[160, -8788.090000, 0.628820, 0.002934, 0.040213 ], [158, -8789.180000, 0.210606, 0.015393, 0.042175 ], [159, -8789.460000, 0.160574, 0.011552, 0.043977 ] ], "n": ["FDJVGXF01D07AB_rvcmp" ] }, {"p": [[160, -8892.780000, 0.678355, 0.003001, 0.026701 ], [158, -8894.030000, 0.195054, 0.015228, 0.027971 ], [159, -8894.460000, 0.126591, 0.011552, 0.029900 ] ], "n": ["FDJVGXF01EU8BE" ] }, {"p": [[160, -8392.660000, 0.688401, 0.003007, 0.023981 ], [158, -8393.940000, 0.192038, 0.015204, 0.025171 ], [159, -8394.410000, 0.119562, 0.011551, 0.027245 ] ], "n": ["FDJVGXF01CW7IC_rvcmp" ] }, {"p": [[160, -7585.130000, 0.360042, 0.002066, 0.181552 ], [158, -7585.160000, 0.346508, 0.011388, 0.183853 ], [159, -7585.330000, 0.293450, 0.011199, 0.186653 ] ], "n": ["FDJVGXF01A424Q" ] }, {"p": [[160, -7192.250000, 0.211070, 0.000007, 0.004300 ], [159, -7192.250000, 0.210865, 0.011552, 0.004306 ], [169, -7192.480000, 0.166924, 0.004577, 0.000005 ], [165, -7192.940000, 0.105617, 0.007352, 0.004333 ], [166, -7192.940000, 0.105350, 0.000008, 0.004333 ], [164, -7192.990000, 0.100122, 0.020699, 0.004324 ], [161, -7192.990000, 0.100052, 0.032465, 0.004323 ] ], "n": ["FDJVGXF01ETJB9" ] }, {"p": [[161, -7291.310000, 0.373441, 0.026980, 0.156572 ], [164, -7291.650000, 0.266476, 0.017955, 0.159797 ], [165, -7291.780000, 0.233991, 0.000007, 0.162231 ], [166, -7293.600000, 0.038012, 0.001999, 0.176984 ], [168, -7293.600000, 0.037981, 0.000007, 0.176980 ], [155, -7293.770000, 0.032106, 0.004739, 0.175935 ], [157, -7294.350000, 0.017993, 0.005887, 0.179634 ] ], "n": ["FDJVGXF01EO8BI_rvcmp" ] }, {"p": [[161, -4994.790000, 0.700340, 0.026141, 0.006909 ], [165, -4996.610000, 0.113123, 0.000008, 0.014344 ], [164, -4996.610000, 0.113045, 0.020699, 0.014346 ], [159, -4997.540000, 0.044543, 0.000006, 0.020090 ], [169, -4997.970000, 0.028949, 0.015647, 0.004757 ] ], "n": ["FDJVGXF01ARGFQ_rvcmp" ] }, {"p": [[161, -8394.210000, 0.775393, 0.026397, 0.005462 ], [165, -8396.150000, 0.111314, 0.001053, 0.008620 ], [164, -8396.230000, 0.103015, 0.020699, 0.009275 ], [159, -8398.530000, 0.010278, 0.005966, 0.012148 ] ], "n": ["FDJVGXF01AS3FJ" ] }, {"p": [[161, -4982.390000, 0.905858, 0.025920, 0.000005 ], [165, -4985.350000, 0.047082, 0.000008, 0.003727 ], [164, -4985.350000, 0.047060, 0.020699, 0.003725 ] ], "n": ["FDJVGXF01DLG57", "FDJVGXF01AEFP2" ] }, {"p": [[161, -4067.170000, 0.914465, 0.024982, 0.000005 ], [165, -4070.230000, 0.042773, 0.000008, 0.006456 ], [164, -4070.230000, 0.042762, 0.020699, 0.006455 ] ], "n": ["FDJVGXF01CYHI1_rvcmp", "FDJVGXF01EBZRV_rvcmp" ] }, {"p": [[161, -3866.160000, 0.618062, 0.025090, 0.000005 ], [159, -3866.810000, 0.324682, 0.000006, 0.008524 ], [164, -3869.150000, 0.031186, 0.020699, 0.007315 ], [165, -3869.330000, 0.026070, 0.002816, 0.005999 ] ], "n": ["FDJVGXF01D1JBL" ] }, {"p": [[161, -3175.110000, 0.951152, 0.024236, 0.000006 ], [164, -3178.780000, 0.024435, 0.020699, 0.006992 ], [165, -3178.780000, 0.024413, 0.000007, 0.007003 ] ], "n": ["FDJVGXF01DQEP4_rvcmp" ] }, {"p": [[161, -4374.740000, 0.518755, 0.023666, 0.000007 ], [159, -4375.140000, 0.346898, 0.004411, 0.006254 ], [165, -4377.260000, 0.041486, 0.003676, 0.007237 ], [169, -4377.770000, 0.025039, 0.010859, 0.000009 ], [160, -4377.770000, 0.024864, 0.006981, 0.008990 ], [166, -4377.780000, 0.024816, 0.000008, 0.009402 ], [164, -4378.090000, 0.018142, 0.020699, 0.006849 ] ], "n": ["FDJVGXF01EKR2F" ] }, {"p": [[161, -7998.160000, 0.840548, 0.022222, 0.036180 ], [169, -8001.010000, 0.048555, 0.010237, 0.034509 ], [164, -8001.530000, 0.028973, 0.020699, 0.047130 ], [165, -8001.530000, 0.028956, 0.000007, 0.047128 ], [168, -8001.700000, 0.024439, 0.001107, 0.043464 ], [166, -8002.110000, 0.016195, 0.001999, 0.046240 ], [155, -8002.380000, 0.012336, 0.000006, 0.048614 ] ], "n": ["FDJVGXF01C2SQT_rvcmp" ] }, {"p": [[161, -6169.100000, 0.498806, 0.017709, 0.164975 ], [164, -6170.340000, 0.144797, 0.020699, 0.174954 ], [165, -6170.340000, 0.144726, 0.000007, 0.174961 ], [166, -6171.290000, 0.055755, 0.000008, 0.184401 ], [160, -6171.290000, 0.055702, 0.007381, 0.184409 ], [168, -6171.340000, 0.053375, 0.000007, 0.184722 ], [169, -6171.470000, 0.046840, 0.006367, 0.178465 ] ], "n": ["FDJVGXF01BWLKH_rvcmp" ] }, {"p": [[161, -9013.270000, 0.968884, 0.015180, 0.015739 ], [157, -9016.710000, 0.031116, 0.003472, 0.023588 ] ], "n": ["FDJVGXF01A1GA0" ] }, {"p": [[161, -8495.250000, 1.000000, 0.013932, 0.010939 ] ], "n": ["FDJVGXF01DQ8PK_rvcmp" ] }, {"p": [[161, -7047.640000, 0.619269, 0.013304, 0.162386 ], [165, -7049.590000, 0.088116, 0.000007, 0.175950 ], [164, -7049.590000, 0.088045, 0.020699, 0.175958 ], [160, -7050.090000, 0.053578, 0.007381, 0.182682 ], [166, -7050.090000, 0.053552, 0.000008, 0.182695 ], [159, -7050.110000, 0.052502, 0.000006, 0.183253 ], [167, -7050.260000, 0.044939, 0.033973, 0.184594 ] ], "n": ["FDJVGXF01B07MY" ] }, {"p": [[161, -5630.660000, 1.000000, 0.010894, 0.018145 ] ], "n": ["FDJVGXF01AS2WY_rvcmp" ] }, {"p": [[161, -4229.040000, 1.000000, 0.005904, 0.028610 ] ], "n": ["FDJVGXF01BA6QW_rvcmp" ] }, {"p": [[161, -3607.280000, 1.000000, 0.003628, 0.010436 ] ], "n": ["FDJVGXF01E2A59_rvcmp" ] }, {"p": [[161, -6206.450000, 0.552176, 0.000007, 0.005202 ], [156, -6207.750000, 0.149290, 0.043594, 0.005125 ], [157, -6207.750000, 0.149274, 0.000006, 0.005126 ], [155, -6207.750000, 0.149260, 0.012864, 0.005126 ] ], "n": ["FDJVGXF01A256J_rvcmp" ] }, {"p": [[162, -6838.770000, 0.975351, 0.004054, 0.013034 ], [164, -6842.450000, 0.024649, 0.007643, 0.008987 ] ], "n": ["FDJVGXF01DALMR" ] }, {"p": [[162, -4723.890000, 0.343597, 0.000005, 0.234764 ], [163, -4723.890000, 0.343050, 0.000007, 0.234767 ], [164, -4724.490000, 0.189588, 0.000005, 0.246051 ], [150, -4725.550000, 0.065657, 0.000008, 0.274790 ], [161, -4725.880000, 0.047070, 0.015729, 0.251220 ], [201, -4727.800000, 0.006878, 0.000009, 0.251761 ], [202, -4728.310000, 0.004161, 0.061774, 0.258122 ] ], "n": ["FDJVGXF01D4YQ1" ] }, {"p": [[162, -4722.670000, 0.337342, 0.000005, 0.225788 ], [163, -4722.670000, 0.336806, 0.000007, 0.225792 ], [164, -4723.290000, 0.180915, 0.000005, 0.236769 ], [150, -4724.420000, 0.058523, 0.000008, 0.265070 ], [161, -4724.700000, 0.044396, 0.015557, 0.240610 ], [165, -4725.350000, 0.022983, 0.000007, 0.267900 ], [154, -4725.540000, 0.019034, 0.000007, 0.271727 ] ], "n": ["FDJVGXF01B27AA" ] }, {"p": [[164, -7527.090000, 0.255544, 0.014989, 0.129580 ], [155, -7527.300000, 0.206866, 0.004847, 0.133944 ], [161, -7527.450000, 0.178279, 0.029713, 0.133233 ], [165, -7527.680000, 0.141941, 0.000007, 0.135995 ], [157, -7528.280000, 0.077262, 0.000006, 0.137809 ], [166, -7528.380000, 0.070078, 0.001999, 0.142445 ], [168, -7528.380000, 0.070030, 0.000007, 0.142445 ] ], "n": ["FDJVGXF01C3PES_rvcmp" ] }, {"p": [[164, -7151.620000, 0.295355, 0.014941, 0.123827 ], [161, -7152.000000, 0.201714, 0.029693, 0.127686 ], [165, -7152.250000, 0.158200, 0.000007, 0.130662 ], [155, -7152.370000, 0.139764, 0.004880, 0.131964 ], [166, -7152.970000, 0.076587, 0.001999, 0.137476 ], [168, -7152.970000, 0.076512, 0.000007, 0.137479 ], [157, -7153.360000, 0.051868, 0.000006, 0.135897 ] ], "n": ["FDJVGXF01DLGO6_rvcmp" ] }, {"p": [[164, -3757.020000, 0.503438, 0.013914, 0.009277 ], [169, -3757.830000, 0.225570, 0.012326, 0.000006 ], [161, -3758.360000, 0.132759, 0.032465, 0.014534 ], [165, -3758.360000, 0.132641, 0.000007, 0.014536 ], [168, -3761.520000, 0.005593, 0.003612, 0.026007 ] ], "n": ["FDJVGXF01C6KKI" ] }, {"p": [[164, -5683.770000, 0.825483, 0.012195, 0.005991 ], [155, -5685.320000, 0.174517, 0.008300, 0.011393 ] ], "n": ["FDJVGXF01D97BL_rvcmp", "FDJVGXF01D4VRH_rvcmp" ] }, {"p": [[164, -5550.060000, 0.900699, 0.007894, 0.012676 ], [162, -5553.160000, 0.040709, 0.010708, 0.022973 ], [163, -5553.160000, 0.040651, 0.006754, 0.022974 ], [155, -5553.980000, 0.017941, 0.006009, 0.024389 ] ], "n": ["FDJVGXF01BUGF0_rvcmp" ] }, {"p": [[165, -5414.350000, 0.229090, 0.005750, 0.000006 ], [166, -5414.520000, 0.194957, 0.000008, 0.000006 ], [160, -5414.520000, 0.194827, 0.007381, 0.000006 ], [167, -5414.600000, 0.179701, 0.033973, 0.000006 ], [168, -5414.600000, 0.179649, 0.000007, 0.000006 ], [169, -5417.160000, 0.013819, 0.000006, 0.000006 ], [158, -5417.710000, 0.007958, 0.017418, 0.002107 ] ], "n": ["FDJVGXF01DXHE5_rvcmp" ] }, {"p": [[165, -6176.870000, 0.421826, 0.005089, 0.016222 ], [167, -6177.570000, 0.207874, 0.026670, 0.016546 ], [168, -6178.180000, 0.113803, 0.000007, 0.018092 ], [166, -6178.180000, 0.113776, 0.001999, 0.018094 ], [160, -6179.040000, 0.048156, 0.005415, 0.021215 ], [158, -6179.050000, 0.047294, 0.017418, 0.022042 ], [159, -6179.050000, 0.047272, 0.011552, 0.022042 ] ], "n": ["FDJVGXF01D027R_rvcmp" ] }, {"p": [[165, -6501.580000, 0.177577, 0.003466, 0.193929 ], [164, -6501.730000, 0.153458, 0.020699, 0.194264 ], [161, -6501.730000, 0.153396, 0.032465, 0.194270 ], [166, -6501.760000, 0.148655, 0.000008, 0.198777 ], [160, -6501.760000, 0.148504, 0.007381, 0.198776 ], [168, -6501.790000, 0.144317, 0.000007, 0.199009 ], [169, -6502.460000, 0.074094, 0.009563, 0.190624 ] ], "n": ["FDJVGXF01E3DCK_rvcmp" ] }, {"p": [[167, -7282.000000, 0.370541, 0.023082, 0.080586 ], [158, -7282.230000, 0.294312, 0.013941, 0.085157 ], [160, -7283.310000, 0.099315, 0.002620, 0.087322 ], [159, -7283.510000, 0.081898, 0.011552, 0.089460 ], [154, -7283.790000, 0.061892, 0.017615, 0.082518 ], [165, -7284.080000, 0.046049, 0.007352, 0.090987 ], [166, -7284.080000, 0.045993, 0.000008, 0.090994 ] ], "n": ["FDJVGXF01EGVNK_rvcmp" ] }, {"p": [[167, -7394.210000, 0.381657, 0.018893, 0.031414 ], [158, -7394.320000, 0.343279, 0.000009, 0.038715 ], [169, -7395.760000, 0.081009, 0.007403, 0.034166 ], [156, -7396.150000, 0.054934, 0.040755, 0.037894 ], [157, -7396.320000, 0.046602, 0.005887, 0.040976 ], [168, -7396.320000, 0.046539, 0.003613, 0.040977 ], [155, -7396.330000, 0.045979, 0.012864, 0.040981 ] ], "n": ["FDJVGXF01DE4E1" ] }, {"p": [[167, -7819.850000, 1.000000, 0.016748, 0.054861 ] ], "n": ["FDJVGXF01DDYJ5_rvcmp", "FDJVGXF01ATROJ_rvcmp" ] }, {"p": [[167, -2380.180000, 0.552422, 0.017055, 0.033289 ], [23, -2381.930000, 0.096157, 0.000007, 0.050451 ], [24, -2381.930000, 0.096156, 0.000009, 0.050451 ], [158, -2382.330000, 0.063889, 0.008393, 0.062730 ], [159, -2382.330000, 0.063856, 0.005298, 0.062798 ], [160, -2382.340000, 0.063825, 0.000007, 0.062847 ], [166, -2382.340000, 0.063695, 0.000008, 0.062759 ] ], "n": ["FDJVGXF01AJDEO_rvcmp" ] }, {"p": [[167, -8252.900000, 1.000000, 0.016413, 0.037819 ] ], "n": ["FDJVGXF01BSD6A" ] }, {"p": [[167, -7793.760000, 1.000000, 0.013598, 0.039140 ] ], "n": ["FDJVGXF01DYDVU" ] }, {"p": [[167, -6294.240000, 0.474035, 0.000008, 1.391180 ], [26, -6295.260000, 0.171650, 0.024915, 1.742300 ], [73, -6296.060000, 0.076706, 0.028578, 1.607230 ], [72, -6296.140000, 0.071414, 0.263281, 1.638850 ], [71, -6296.140000, 0.071409, 0.079029, 1.638870 ], [148, -6296.190000, 0.067394, 0.148117, 1.462050 ], [127, -6296.190000, 0.067392, 0.040911, 1.462060 ] ], "n": ["FDJVGXF01BGO8N_rvcmp" ] }, {"p": [[168, -8106.150000, 0.373918, 0.002754, 0.016079 ], [169, -8106.440000, 0.278475, 0.001721, 0.014961 ], [157, -8106.470000, 0.272040, 0.005887, 0.016372 ], [156, -8108.830000, 0.025702, 0.043598, 0.018777 ], [155, -8108.830000, 0.025691, 0.012865, 0.018779 ], [166, -8109.190000, 0.017861, 0.001999, 0.019159 ], [165, -8110.230000, 0.006313, 0.004985, 0.018711 ] ], "n": ["FDJVGXF01CA81S_rvcmp" ] }, {"p": [[168, -7808.700000, 0.391834, 0.002737, 0.008242 ], [169, -7809.060000, 0.274885, 0.000005, 0.008441 ], [157, -7809.060000, 0.274839, 0.005887, 0.008441 ], [156, -7811.660000, 0.020309, 0.043598, 0.010116 ], [155, -7811.660000, 0.020296, 0.012864, 0.010110 ], [166, -7812.130000, 0.012696, 0.001999, 0.010662 ], [165, -7813.040000, 0.005142, 0.005116, 0.009763 ] ], "n": ["FDJVGXF01C1PAH" ] }, {"p": [[168, -6793.990000, 0.401006, 0.002720, 0.004654 ], [169, -6794.370000, 0.274802, 0.000005, 0.004850 ], [157, -6794.370000, 0.274732, 0.005887, 0.004851 ], [156, -6797.130000, 0.017287, 0.043598, 0.006315 ], [155, -6797.140000, 0.017274, 0.012864, 0.006316 ], [166, -6797.650000, 0.010315, 0.001999, 0.006838 ], [165, -6798.460000, 0.004584, 0.005176, 0.005758 ] ], "n": ["FDJVGXF01BIS5A" ] }, {"p": [[168, -7944.410000, 0.403745, 0.002713, 0.003873 ], [169, -7944.790000, 0.274686, 0.000005, 0.004038 ], [157, -7944.790000, 0.274629, 0.005887, 0.004038 ], [156, -7947.610000, 0.016425, 0.043598, 0.005104 ], [155, -7947.610000, 0.016414, 0.012864, 0.005105 ], [166, -7948.140000, 0.009662, 0.001999, 0.005427 ], [165, -7948.920000, 0.004439, 0.005207, 0.004606 ] ], "n": ["FDJVGXF01DT4AR_rvcmp" ] }, {"p": [[168, -5481.210000, 0.393179, 0.002123, 0.005606 ], [169, -5481.880000, 0.201446, 0.000007, 0.005637 ], [157, -5481.880000, 0.201366, 0.005887, 0.005639 ], [156, -5482.230000, 0.142326, 0.034851, 0.000006 ], [166, -5483.060000, 0.061683, 0.001999, 0.008571 ] ], "n": ["FDJVGXF01CK4HZ_rvcmp" ] }, {"p": [[168, -6783.890000, 0.453762, 0.002085, 0.004608 ], [169, -6784.590000, 0.226440, 0.000005, 0.004715 ], [157, -6784.590000, 0.226282, 0.005887, 0.004719 ], [166, -6785.810000, 0.066451, 0.001999, 0.006491 ], [156, -6787.400000, 0.013538, 0.043598, 0.005994 ], [155, -6787.410000, 0.013527, 0.012864, 0.005995 ] ], "n": ["FDJVGXF01CWS9R_rvcmp" ] }, {"p": [[168, -7205.520000, 0.333633, 0.002093, 0.004340 ], [169, -7205.710000, 0.276059, 0.011517, 0.000006 ], [170, -7206.210000, 0.166604, 0.000009, 0.000006 ], [157, -7206.220000, 0.166329, 0.005887, 0.004433 ], [166, -7207.470000, 0.047606, 0.001999, 0.006080 ], [156, -7209.050000, 0.009769, 0.043598, 0.005603 ] ], "n": ["FDJVGXF01E3W9Q_rvcmp" ] }, {"p": [[168, -7376.950000, 0.380124, 0.002136, 0.004098 ], [169, -7377.620000, 0.194927, 0.000007, 0.004057 ], [157, -7377.620000, 0.194834, 0.005887, 0.004058 ], [156, -7377.710000, 0.178257, 0.034979, 0.000006 ], [166, -7378.940000, 0.051859, 0.001999, 0.006018 ] ], "n": ["FDJVGXF01BZPLE" ] }, {"p": [[168, -7243.450000, 0.474199, 0.002101, 0.000009 ], [169, -7244.170000, 0.230915, 0.000005, 0.000007 ], [157, -7244.170000, 0.230721, 0.005887, 0.000009 ], [166, -7245.850000, 0.043342, 0.001999, 0.000006 ], [156, -7247.270000, 0.010420, 0.043598, 0.000006 ], [155, -7247.270000, 0.010403, 0.012864, 0.000009 ] ], "n": ["FDJVGXF01EVTOH_rvcmp", "FDJVGXF01D7MRO", "FDJVGXF01A8SQ3", "FDJVGXF01CEVXD" ] }, {"p": [[168, -7341.430000, 0.501062, 0.001912, 0.000009 ], [169, -7342.290000, 0.212390, 0.000005, 0.000007 ], [157, -7342.290000, 0.212203, 0.005887, 0.000009 ], [166, -7343.660000, 0.053927, 0.001896, 0.000006 ], [156, -7345.260000, 0.010879, 0.039706, 0.000006 ], [155, -7345.390000, 0.009539, 0.012864, 0.000009 ] ], "n": ["FDJVGXF01CCEGB_rvcmp" ] }, {"p": [[168, -7469.280000, 0.508581, 0.001867, 0.000009 ], [169, -7470.180000, 0.208215, 0.000005, 0.000007 ], [157, -7470.180000, 0.208120, 0.005887, 0.000009 ], [166, -7471.470000, 0.056820, 0.001895, 0.000006 ], [156, -7473.300000, 0.009198, 0.042695, 0.000006 ], [155, -7473.310000, 0.009065, 0.012864, 0.000009 ] ], "n": ["FDJVGXF01B6BK0", "FDJVGXF01AP6X8_rvcmp" ] }, {"p": [[169, -9192.910000, 0.669984, 0.019992, 0.099478 ], [170, -9194.330000, 0.162186, 0.000009, 0.101826 ], [154, -9194.330000, 0.162120, 0.030340, 0.101833 ], [149, -9197.670000, 0.005710, 0.045329, 0.084529 ] ], "n": ["FDJVGXF01DR66X_rvcmp" ] }, {"p": [[169, -8322.520000, 0.725974, 0.015607, 0.008671 ], [154, -8324.190000, 0.137148, 0.030340, 0.010608 ], [170, -8324.190000, 0.136878, 0.000009, 0.010610 ] ], "n": ["FDJVGXF01BYRHV_rvcmp" ] }, {"p": [[169, -7221.840000, 0.453381, 0.015762, 0.000006 ], [170, -7222.260000, 0.299408, 0.004074, 0.000005 ], [156, -7222.540000, 0.225109, 0.021859, 0.003763 ], [171, -7225.070000, 0.018045, 0.000008, 0.002259 ], [157, -7226.560000, 0.004057, 0.004604, 0.005047 ] ], "n": ["FDJVGXF01DLFZ5_rvcmp" ] }, {"p": [[169, -5560.040000, 0.726153, 0.013593, 0.023332 ], [164, -5561.700000, 0.137767, 0.012782, 0.033840 ], [156, -5563.010000, 0.037181, 0.043598, 0.044062 ], [157, -5563.010000, 0.037159, 0.000006, 0.044061 ], [155, -5563.010000, 0.037158, 0.012865, 0.044061 ], [165, -5563.430000, 0.024581, 0.000007, 0.043237 ] ], "n": ["FDJVGXF01CW0CE_rvcmp" ] }, {"p": [[169, -5223.070000, 0.447610, 0.013991, 0.018289 ], [154, -5223.590000, 0.267726, 0.022877, 0.018556 ], [170, -5224.300000, 0.131798, 0.000009, 0.022347 ], [163, -5224.330000, 0.127631, 0.000007, 0.030849 ], [168, -5226.850000, 0.010199, 0.003612, 0.023857 ], [160, -5226.990000, 0.008883, 0.000007, 0.032660 ], [164, -5227.360000, 0.006152, 0.013389, 0.028987 ] ], "n": ["FDJVGXF01BGLYC_rvcmp", "FDJVGXF01B6IAB_rvcmp" ] }, {"p": [[169, -4842.470000, 0.372109, 0.014293, 0.000007 ], [154, -4842.950000, 0.230588, 0.024183, 0.000006 ], [159, -4843.210000, 0.177811, 0.000006, 0.013647 ], [170, -4843.320000, 0.158634, 0.000009, 0.000006 ], [156, -4844.930000, 0.031597, 0.038090, 0.007608 ], [167, -4845.700000, 0.014725, 0.030022, 0.009797 ], [168, -4845.710000, 0.014536, 0.003612, 0.009767 ] ], "n": ["FDJVGXF01A9RP7_rvcmp", "FDJVGXF01CLCFZ_rvcmp", "FDJVGXF01CZDGO_rvcmp" ] }, {"p": [[169, -5860.190000, 0.187111, 0.012970, 0.272142 ], [159, -5860.190000, 0.185780, 0.000006, 0.292178 ], [161, -5860.290000, 0.169015, 0.020089, 0.290334 ], [160, -5860.620000, 0.121356, 0.003502, 0.293666 ], [165, -5860.670000, 0.114941, 0.004630, 0.294351 ], [158, -5860.710000, 0.111391, 0.017422, 0.296263 ], [166, -5860.710000, 0.110405, 0.000008, 0.298244 ] ], "n": ["FDJVGXF01CH0SV", "FDJVGXF01AYKEW", "FDJVGXF01A24F8" ] }, {"p": [[169, -7135.180000, 0.372418, 0.013024, 0.001964 ], [168, -7135.600000, 0.245804, 0.002073, 0.013226 ], [157, -7136.240000, 0.128543, 0.005887, 0.013458 ], [170, -7136.320000, 0.118738, 0.000009, 0.000006 ], [156, -7136.740000, 0.078120, 0.023734, 0.011522 ], [166, -7137.070000, 0.056377, 0.001999, 0.016017 ] ], "n": ["FDJVGXF01A1M91_rvcmp" ] }, {"p": [[169, -6471.260000, 0.664118, 0.013160, 0.000008 ], [170, -6472.780000, 0.145363, 0.000009, 0.000084 ], [157, -6473.400000, 0.078067, 0.005887, 0.009379 ], [168, -6473.400000, 0.078001, 0.003613, 0.009378 ], [156, -6474.420000, 0.028150, 0.036582, 0.009421 ], [166, -6475.910000, 0.006301, 0.001668, 0.012321 ] ], "n": ["FDJVGXF01EG01C" ] }, {"p": [[169, -7083.240000, 0.697960, 0.012060, 0.027418 ], [167, -7085.190000, 0.099132, 0.019595, 0.030412 ], [158, -7085.540000, 0.069859, 0.000009, 0.039164 ], [154, -7085.740000, 0.057435, 0.025688, 0.028309 ], [170, -7085.910000, 0.048044, 0.000707, 0.028503 ], [157, -7087.130000, 0.014198, 0.004538, 0.039627 ], [159, -7087.190000, 0.013371, 0.005607, 0.036686 ] ], "n": ["FDJVGXF01BTULW" ] }, {"p": [[169, -5220.230000, 0.653058, 0.012382, 0.013599 ], [163, -5221.540000, 0.175109, 0.000007, 0.024457 ], [154, -5221.830000, 0.131600, 0.030340, 0.018308 ], [168, -5223.740000, 0.019418, 0.003612, 0.016044 ], [160, -5224.270000, 0.011504, 0.000007, 0.025924 ], [164, -5224.480000, 0.009312, 0.012209, 0.020770 ] ], "n": ["FDJVGXF01DD6V5_rvcmp" ] }, {"p": [[169, -7392.300000, 0.216786, 0.011305, 0.192696 ], [166, -7392.730000, 0.140588, 0.001999, 0.207593 ], [168, -7392.730000, 0.140459, 0.000007, 0.207590 ], [165, -7392.730000, 0.139881, 0.005758, 0.205348 ], [160, -7392.750000, 0.138113, 0.006370, 0.206129 ], [161, -7392.760000, 0.136381, 0.027043, 0.199712 ], [157, -7393.200000, 0.087792, 0.000006, 0.206582 ] ], "n": ["FDJVGXF01AG6LK_rvcmp" ] }, {"p": [[169, -8459.780000, 0.578540, 0.010578, 0.037236 ], [154, -8460.300000, 0.341665, 0.020053, 0.034242 ], [168, -8462.590000, 0.034693, 0.003612, 0.043790 ], [161, -8463.540000, 0.013435, 0.024284, 0.044690 ], [160, -8463.720000, 0.011245, 0.006055, 0.047821 ], [166, -8463.810000, 0.010230, 0.000282, 0.048569 ], [165, -8463.820000, 0.010192, 0.007352, 0.048516 ] ], "n": ["FDJVGXF01AM4AD_rvcmp" ] }, {"p": [[169, -4990.570000, 0.534162, 0.009642, 0.000009 ], [154, -4991.750000, 0.165442, 0.024687, 0.000006 ], [167, -4992.520000, 0.076062, 0.029173, 0.006073 ], [157, -4992.770000, 0.059599, 0.005887, 0.006505 ], [168, -4992.770000, 0.059585, 0.003613, 0.006504 ], [155, -4992.810000, 0.057312, 0.011294, 0.007654 ], [166, -4992.990000, 0.047838, 0.001999, 0.006817 ] ], "n": ["FDJVGXF01CTZ07_rvcmp", "FDJVGXF01ELS0N_rvcmp" ] }, {"p": [[169, -5221.500000, 0.372691, 0.009266, 0.015173 ], [160, -5222.360000, 0.157881, 0.000007, 0.024789 ], [159, -5222.360000, 0.157733, 0.011552, 0.024789 ], [164, -5222.870000, 0.094793, 0.015388, 0.022994 ], [165, -5223.020000, 0.082068, 0.007352, 0.025005 ], [166, -5223.020000, 0.081880, 0.000008, 0.025006 ], [168, -5223.450000, 0.052955, 0.003612, 0.021364 ] ], "n": ["FDJVGXF01CU2T7_rvcmp" ] }, {"p": [[169, -7245.180000, 0.718688, 0.009227, 0.014142 ], [159, -7246.890000, 0.129591, 0.007927, 0.018815 ], [160, -7248.010000, 0.042390, 0.000007, 0.021796 ], [157, -7248.060000, 0.040165, 0.005887, 0.016048 ], [168, -7248.060000, 0.040150, 0.003613, 0.016057 ], [164, -7248.940000, 0.016658, 0.014353, 0.019064 ], [165, -7249.240000, 0.012358, 0.007352, 0.023266 ] ], "n": ["FDJVGXF01AGMX4_rvcmp" ] }, {"p": [[169, -7212.620000, 0.373919, 0.007352, 0.009064 ], [155, -7213.310000, 0.187631, 0.011303, 0.014999 ], [157, -7213.360000, 0.179038, 0.000006, 0.014947 ], [168, -7213.460000, 0.161489, 0.003613, 0.015025 ], [165, -7214.430000, 0.061505, 0.004066, 0.013150 ], [167, -7215.590000, 0.019251, 0.032083, 0.015305 ], [166, -7215.700000, 0.017167, 0.001999, 0.015890 ] ], "n": ["FDJVGXF01B0W9G_rvcmp", "FDJVGXF01DPKAW_rvcmp" ] }, {"p": [[169, -7890.220000, 0.836287, 0.005637, 0.004195 ], [168, -7892.380000, 0.095821, 0.002767, 0.006554 ], [157, -7892.730000, 0.067892, 0.005887, 0.006678 ] ], "n": ["FDJVGXF01DDX2Q", "FDJVGXF01BZ3K6" ] }, {"p": [[170, -3177.370000, 0.281475, 0.008380, 0.123334 ], [198, -3177.960000, 0.155176, 0.000006, 0.124473 ], [169, -3178.090000, 0.136259, 0.016880, 0.127857 ], [149, -3178.120000, 0.132837, 0.014240, 0.119503 ], [127, -3178.160000, 0.127962, 0.040911, 0.120931 ], [154, -3178.500000, 0.091291, 0.026654, 0.129278 ], [196, -3178.690000, 0.075001, 0.044805, 0.116176 ] ], "n": ["FDJVGXF01AJKD3" ] }, {"p": [[174, -7929.590000, 0.271058, 0.000006, 0.329694 ], [177, -7929.730000, 0.235609, 0.002254, 0.326993 ], [173, -7930.430000, 0.116828, 0.022616, 0.330974 ], [183, -7930.430000, 0.116799, 0.000009, 0.330961 ], [182, -7930.440000, 0.116754, 0.007651, 0.330975 ], [176, -7930.820000, 0.079138, 0.001771, 0.331855 ], [178, -7931.040000, 0.063813, 0.000008, 0.336649 ] ], "n": ["FDJVGXF01BJZDD" ] }, {"p": [[175, -3927.680000, 0.190319, 0.002821, 0.179142 ], [174, -3927.820000, 0.166400, 0.006047, 0.171038 ], [176, -3927.820000, 0.166369, 0.000006, 0.171032 ], [185, -3928.140000, 0.120812, 0.000001, 0.179373 ], [184, -3928.140000, 0.120793, 0.000001, 0.179367 ], [177, -3928.160000, 0.117690, 0.017452, 0.167512 ], [178, -3928.160000, 0.117617, 0.000008, 0.167514 ] ], "n": ["FDJVGXF01EC7MM" ] }, {"p": [[175, -3678.710000, 0.215352, 0.003486, 0.147520 ], [174, -3678.860000, 0.186902, 0.000005, 0.135223 ], [176, -3678.860000, 0.186412, 0.000006, 0.141269 ], [177, -3679.250000, 0.126622, 0.000008, 0.121227 ], [178, -3679.250000, 0.125667, 0.000008, 0.138677 ], [181, -3679.710000, 0.079523, 0.037176, 0.138259 ], [182, -3679.710000, 0.079522, 0.000007, 0.138252 ] ], "n": ["FDJVGXF01CV5NL" ] }, {"p": [[182, -7174.310000, 0.311206, 0.000007, 0.004305 ], [178, -7174.310000, 0.310757, 0.004073, 0.004305 ], [183, -7175.110000, 0.138948, 0.002135, 0.003858 ], [173, -7175.130000, 0.137370, 0.022616, 0.004331 ], [172, -7176.190000, 0.047495, 0.005527, 0.003972 ], [187, -7176.420000, 0.037531, 0.005300, 0.000056 ], [176, -7177.230000, 0.016692, 0.006160, 0.005217 ] ], "n": ["FDJVGXF01C64GQ_rvcmp" ] }, {"p": [[183, -8665.400000, 0.198031, 0.000009, 0.003816 ], [173, -8665.400000, 0.198023, 0.022616, 0.003807 ], [182, -8665.400000, 0.197603, 0.007651, 0.003815 ], [186, -8665.440000, 0.188943, 0.008949, 0.003867 ], [187, -8665.440000, 0.188873, 0.000005, 0.003867 ], [184, -8668.030000, 0.014264, 0.000001, 0.007556 ], [185, -8668.030000, 0.014264, 0.000001, 0.007556 ] ], "n": ["FDJVGXF01ED316_rvcmp" ] }, {"p": [[185, -3387.720000, 0.171275, 0.000001, 0.237838 ], [184, -3387.720000, 0.171252, 0.000001, 0.237842 ], [186, -3387.720000, 0.171098, 0.000009, 0.237846 ], [175, -3387.850000, 0.150387, 0.000005, 0.257219 ], [121, -3388.050000, 0.123056, 0.000005, 0.326285 ], [174, -3388.190000, 0.106483, 0.003468, 0.243596 ], [176, -3388.190000, 0.106450, 0.000006, 0.246176 ] ], "n": ["FDJVGXF01A2O3J" ] }, {"p": [[186, -5792.700000, 0.230693, 0.003018, 0.213319 ], [185, -5792.850000, 0.198883, 0.000001, 0.219276 ], [184, -5792.850000, 0.198852, 0.000001, 0.219276 ], [187, -5793.180000, 0.143783, 0.000005, 0.212270 ], [183, -5793.180000, 0.143703, 0.017940, 0.212274 ], [175, -5794.140000, 0.054627, 0.000005, 0.244408 ], [188, -5794.760000, 0.029459, 0.000006, 0.218280 ] ], "n": ["FDJVGXF01A3V1Q" ] }, {"p": [[188, -3644.130000, 0.345454, 0.048087, 0.043702 ], [189, -3644.190000, 0.327314, 0.096145, 0.044900 ], [190, -3644.190000, 0.327232, 0.000008, 0.044906 ] ], "n": ["FDJVGXF01C4DZ8" ] }, {"p": [[188, -6165.230000, 0.275797, 0.042962, 0.284427 ], [190, -6165.330000, 0.250360, 0.000008, 0.284607 ], [189, -6165.330000, 0.250352, 0.096145, 0.284599 ], [185, -6166.690000, 0.064387, 0.000001, 0.355524 ], [184, -6166.690000, 0.064382, 0.000001, 0.355522 ], [186, -6166.690000, 0.064360, 0.000009, 0.355502 ], [187, -6167.440000, 0.030362, 0.010168, 0.341888 ] ], "n": ["FDJVGXF01CE1QS" ] }, {"p": [[188, -8682.220000, 0.457407, 0.029949, 0.096016 ], [187, -8683.330000, 0.150678, 0.003342, 0.118691 ], [183, -8683.640000, 0.109921, 0.013947, 0.114423 ], [32, -8683.960000, 0.079919, 0.003944, 0.112708 ], [186, -8684.070000, 0.071587, 0.006865, 0.120508 ], [30, -8684.150000, 0.065864, 0.000006, 0.116524 ], [31, -8684.170000, 0.064624, 0.001925, 0.116524 ] ], "n": ["FDJVGXF01CAHH6" ] }, {"p": [[188, -7244.070000, 0.822138, 0.025533, 0.112825 ], [187, -7246.600000, 0.065583, 0.008328, 0.134491 ], [172, -7246.890000, 0.049158, 0.006306, 0.138336 ], [189, -7247.280000, 0.033277, 0.091953, 0.119600 ], [190, -7247.390000, 0.029844, 0.000008, 0.123507 ] ], "n": ["FDJVGXF01EIVTC" ] }, {"p": [[188, -4715.760000, 0.579848, 0.020031, 0.102407 ], [187, -4717.290000, 0.124698, 0.011025, 0.137579 ], [172, -4717.290000, 0.124641, 0.008421, 0.137572 ], [186, -4718.330000, 0.044225, 0.008949, 0.147261 ], [183, -4718.330000, 0.044225, 0.017940, 0.147267 ], [184, -4718.400000, 0.041182, 0.000001, 0.148401 ], [185, -4718.400000, 0.041182, 0.000001, 0.148401 ] ], "n": ["FDJVGXF01DTFHM" ] }, {"p": [[188, -6069.730000, 0.360069, 0.019094, 0.109199 ], [172, -6070.350000, 0.194647, 0.003487, 0.121334 ], [187, -6070.350000, 0.193736, 0.011025, 0.123791 ], [175, -6071.140000, 0.088305, 0.000005, 0.144535 ], [189, -6071.610000, 0.054841, 0.096145, 0.111549 ], [190, -6071.620000, 0.054817, 0.000008, 0.111557 ], [174, -6071.640000, 0.053584, 0.002409, 0.138643 ] ], "n": ["FDJVGXF01AP96B_rvcmp" ] }, {"p": [[189, -8343.920000, 0.334650, 0.095112, 0.106440 ], [188, -8343.930000, 0.332693, 0.052299, 0.107571 ], [190, -8343.930000, 0.332657, 0.000008, 0.107571 ] ], "n": ["FDJVGXF01EKTAN", "FDJVGXF01CZOX5" ] }, {"p": [[189, -5357.470000, 0.256877, 0.079975, 0.291542 ], [190, -5357.560000, 0.235041, 0.000008, 0.300127 ], [188, -5357.560000, 0.235028, 0.052299, 0.300138 ], [28, -5358.590000, 0.083451, 0.028857, 0.275674 ], [33, -5358.810000, 0.067216, 0.009908, 0.284629 ], [34, -5358.880000, 0.062616, 0.000007, 0.286027 ], [40, -5358.920000, 0.059772, 0.042326, 0.284712 ] ], "n": ["FDJVGXF01CUTHQ_rvcmp" ] }, {"p": [[189, -5028.630000, 0.496925, 0.060065, 0.125921 ], [188, -5029.660000, 0.176477, 0.049689, 0.167948 ], [190, -5029.670000, 0.175538, 0.000008, 0.167992 ], [171, -5031.010000, 0.045759, 0.034630, 0.189987 ], [191, -5031.010000, 0.045756, 0.000008, 0.189989 ], [172, -5031.420000, 0.030322, 0.000008, 0.195077 ], [187, -5031.460000, 0.029221, 0.011025, 0.201555 ] ], "n": ["FDJVGXF01A0TPT_rvcmp" ] }, {"p": [[189, -7387.730000, 0.367287, 0.055119, 0.145803 ], [190, -7387.770000, 0.351275, 0.016253, 0.160867 ], [172, -7388.830000, 0.122234, 0.000008, 0.187072 ], [188, -7389.440000, 0.066555, 0.040161, 0.169049 ], [175, -7390.050000, 0.036093, 0.003837, 0.193222 ], [171, -7390.130000, 0.033358, 0.034630, 0.174744 ], [174, -7390.490000, 0.023197, 0.000006, 0.197038 ] ], "n": ["FDJVGXF01CTVOI_rvcmp" ] }, {"p": [[189, -5095.260000, 0.464567, 0.053150, 0.070470 ], [188, -5096.550000, 0.127012, 0.029332, 0.115562 ], [185, -5096.840000, 0.095293, 0.000001, 0.148383 ], [184, -5096.840000, 0.095280, 0.000001, 0.148381 ], [186, -5096.840000, 0.095190, 0.000009, 0.148382 ], [190, -5097.160000, 0.069398, 0.000008, 0.118083 ], [172, -5097.420000, 0.053259, 0.000009, 0.128967 ] ], "n": ["FDJVGXF01CIWVJ" ] }, {"p": [[189, -6941.490000, 0.713053, 0.000006, 1.999990 ], [71, -6944.100000, 0.052483, 0.000010, 1.999990 ], [70, -6944.100000, 0.052483, 0.564406, 1.999990 ], [98, -6944.160000, 0.049426, 0.013678, 1.999990 ], [88, -6944.170000, 0.048559, 0.021340, 1.999990 ], [113, -6944.310000, 0.042452, 0.130263, 1.999990 ], [90, -6944.330000, 0.041544, 0.000010, 1.999990 ] ], "n": ["FDJVGXF01CGWE1_rvcmp" ] }, {"p": [[190, -7637.670000, 0.276344, 0.031620, 0.139789 ], [171, -7637.690000, 0.271430, 0.034630, 0.141566 ], [191, -7637.690000, 0.271306, 0.000008, 0.141571 ], [40, -7638.440000, 0.128564, 0.068284, 0.135983 ], [192, -7639.480000, 0.045483, 0.000005, 0.149896 ], [189, -7642.060000, 0.003436, 0.096145, 0.140501 ], [188, -7642.060000, 0.003436, 0.052299, 0.140503 ] ], "n": ["FDJVGXF01E02JA_rvcmp" ] }, {"p": [[190, -7229.830000, 0.508442, 0.027584, 0.111889 ], [191, -7230.700000, 0.212408, 0.003718, 0.116181 ], [171, -7230.850000, 0.182623, 0.034630, 0.117763 ], [40, -7232.110000, 0.051814, 0.065332, 0.107648 ], [27, -7232.980000, 0.021779, 0.039995, 0.122742 ], [192, -7233.320000, 0.015543, 0.000005, 0.122788 ], [38, -7234.060000, 0.007391, 0.059467, 0.117012 ] ], "n": ["FDJVGXF01BQ9MS_rvcmp" ] }, {"p": [[190, -7916.610000, 0.350228, 0.028365, 0.081550 ], [171, -7916.750000, 0.306638, 0.034630, 0.084809 ], [191, -7916.750000, 0.306403, 0.000008, 0.084815 ], [192, -7919.350000, 0.022650, 0.006552, 0.090506 ], [39, -7919.830000, 0.014081, 0.025399, 0.093953 ] ], "n": ["FDJVGXF01ETFX3" ] }, {"p": [[190, -7911.990000, 0.360850, 0.027692, 0.075584 ], [171, -7912.170000, 0.302957, 0.034634, 0.079197 ], [191, -7912.170000, 0.302698, 0.000008, 0.079192 ], [192, -7914.840000, 0.020958, 0.006464, 0.084638 ], [39, -7915.350000, 0.012537, 0.025399, 0.088178 ] ], "n": ["FDJVGXF01CB1TY" ] }, {"p": [[190, -6176.770000, 0.274326, 0.026089, 0.217405 ], [191, -6176.870000, 0.248539, 0.000008, 0.225945 ], [171, -6176.870000, 0.248480, 0.034630, 0.225941 ], [40, -6177.460000, 0.137942, 0.058152, 0.225075 ], [192, -6178.410000, 0.053167, 0.000005, 0.242613 ], [188, -6179.450000, 0.018773, 0.052300, 0.215678 ], [189, -6179.450000, 0.018773, 0.096145, 0.215672 ] ], "n": ["FDJVGXF01AQAQI" ] }, {"p": [[190, -3618.850000, 0.289104, 0.025273, 0.037790 ], [191, -3619.460000, 0.157124, 0.015648, 0.053623 ], [40, -3619.460000, 0.157120, 0.086917, 0.053634 ], [192, -3619.460000, 0.157095, 0.000005, 0.053636 ], [171, -3619.640000, 0.130641, 0.034630, 0.049503 ], [39, -3620.280000, 0.068958, 0.018698, 0.054288 ], [196, -3620.830000, 0.039958, 0.023560, 0.048142 ] ], "n": ["FDJVGXF01D8GQZ" ] }, {"p": [[190, -6431.700000, 0.573840, 0.020809, 0.126641 ], [171, -6433.370000, 0.107847, 0.034634, 0.135002 ], [191, -6433.370000, 0.107788, 0.000008, 0.135015 ], [189, -6433.410000, 0.103842, 0.083864, 0.123373 ], [188, -6433.830000, 0.068301, 0.052299, 0.132098 ], [40, -6435.080000, 0.019488, 0.082859, 0.140923 ], [192, -6435.110000, 0.018893, 0.000005, 0.143749 ] ], "n": ["FDJVGXF01BN306_rvcmp" ] }, {"p": [[190, -3888.350000, 0.355813, 0.019974, 0.043650 ], [40, -3888.840000, 0.218453, 0.071189, 0.054377 ], [171, -3888.910000, 0.203287, 0.024237, 0.053349 ], [191, -3889.760000, 0.086864, 0.004923, 0.062474 ], [192, -3889.810000, 0.083127, 0.000005, 0.067262 ], [149, -3890.890000, 0.028091, 0.054288, 0.056863 ], [39, -3891.030000, 0.024365, 0.020409, 0.075061 ] ], "n": ["FDJVGXF01BWFPL_rvcmp" ] }, {"p": [[190, -7862.460000, 0.425013, 0.019147, 0.182590 ], [189, -7863.600000, 0.135627, 0.083940, 0.178570 ], [40, -7863.820000, 0.108870, 0.061066, 0.177801 ], [191, -7863.990000, 0.091733, 0.000008, 0.192241 ], [171, -7863.990000, 0.091705, 0.034630, 0.192238 ], [188, -7864.080000, 0.084005, 0.052299, 0.187065 ], [29, -7864.370000, 0.063046, 0.020048, 0.177041 ] ], "n": ["FDJVGXF01AT043_rvcmp" ] }, {"p": [[190, -7144.950000, 0.556633, 0.018208, 0.134278 ], [189, -7146.690000, 0.097611, 0.096145, 0.137838 ], [188, -7146.690000, 0.097590, 0.052299, 0.137840 ], [171, -7146.850000, 0.082700, 0.034630, 0.143942 ], [191, -7146.850000, 0.082690, 0.000008, 0.143940 ], [39, -7147.500000, 0.043305, 0.018414, 0.143402 ], [29, -7147.590000, 0.039470, 0.021226, 0.124935 ] ], "n": ["FDJVGXF01EAE9F" ] }, {"p": [[191, -7610.030000, 0.172028, 0.000008, 1.999990 ], [190, -7610.030000, 0.172024, 0.034335, 1.999990 ], [205, -7610.100000, 0.160367, 0.038635, 1.999990 ], [22, -7610.100000, 0.160215, 0.028187, 1.999990 ], [35, -7610.460000, 0.112108, 0.000006, 1.999990 ], [34, -7610.460000, 0.112101, 0.014780, 1.999990 ], [194, -7610.460000, 0.111159, 0.006696, 1.999990 ] ], "n": ["FDJVGXF01C04K5_rvcmp" ] }, {"p": [[192, -3797.630000, 0.192360, 0.011955, 0.055541 ], [189, -3797.660000, 0.187806, 0.050634, 0.000007 ], [190, -3797.700000, 0.179901, 0.009907, 0.043473 ], [188, -3797.810000, 0.160357, 0.052299, 0.043009 ], [193, -3798.320000, 0.096596, 0.004535, 0.063553 ], [40, -3798.330000, 0.095738, 0.078115, 0.047103 ], [191, -3798.420000, 0.087242, 0.008873, 0.054578 ] ], "n": ["FDJVGXF01EIKZ9" ] }, {"p": [[192, -6840.630000, 0.302017, 0.010746, 0.156983 ], [39, -6840.810000, 0.252684, 0.000006, 0.165704 ], [191, -6841.570000, 0.118872, 0.013262, 0.161706 ], [40, -6841.650000, 0.109800, 0.086918, 0.163476 ], [193, -6841.770000, 0.096868, 0.000008, 0.170236 ], [27, -6841.780000, 0.096003, 0.031526, 0.170789 ], [38, -6843.180000, 0.023757, 0.076823, 0.176156 ] ], "n": ["FDJVGXF01A1YA4" ] }, {"p": [[193, -5254.070000, 0.348177, 0.010077, 0.068733 ], [194, -5255.030000, 0.133231, 0.001511, 0.074084 ], [38, -5255.060000, 0.128736, 0.076823, 0.074117 ], [190, -5255.230000, 0.108675, 0.024823, 0.079069 ], [195, -5255.310000, 0.100883, 0.000009, 0.077128 ], [26, -5255.390000, 0.092402, 0.092211, 0.073043 ], [196, -5255.440000, 0.087898, 0.000010, 0.075427 ] ], "n": ["FDJVGXF01B9OVH" ] }, {"p": [[193, -9056.910000, 0.209920, 0.000567, 0.247451 ], [192, -9056.920000, 0.209471, 0.022464, 0.248140 ], [39, -9056.920000, 0.209412, 0.025399, 0.248135 ], [27, -9057.390000, 0.130202, 0.040960, 0.229604 ], [38, -9057.680000, 0.097617, 0.054710, 0.225241 ], [29, -9057.970000, 0.073388, 0.028567, 0.238493 ], [40, -9058.010000, 0.069990, 0.069742, 0.248019 ] ], "n": ["FDJVGXF01A9GJQ_rvcmp" ] }, {"p": [[195, -3942.400000, 0.332638, 0.007000, 0.094449 ], [196, -3942.620000, 0.265835, 0.003967, 0.092096 ], [35, -3943.690000, 0.091040, 0.013080, 0.110699 ], [22, -3943.750000, 0.086194, 0.013580, 0.069052 ], [226, -3943.790000, 0.082582, 0.014774, 0.078114 ], [170, -3943.950000, 0.070858, 0.018724, 0.091974 ], [149, -3943.950000, 0.070852, 0.063739, 0.091968 ] ], "n": ["FDJVGXF01AL8PP_rvcmp" ] }, {"p": [[196, -2039.470000, 0.196871, 0.077870, 0.123944 ], [199, -2039.470000, 0.196799, 0.013298, 0.124374 ], [167, -2039.660000, 0.162452, 0.000008, 0.099911 ], [197, -2039.790000, 0.142507, 0.024513, 0.132986 ], [198, -2039.790000, 0.142478, 0.013117, 0.132980 ], [170, -2040.060000, 0.108479, 0.011556, 0.095374 ], [171, -2040.830000, 0.050413, 0.006155, 0.103205 ] ], "n": ["FDJVGXF01BB3AB" ] }, {"p": [[196, -8415.230000, 0.333493, 0.078189, 0.094582 ], [200, -8415.230000, 0.333403, 0.000006, 0.094584 ], [199, -8415.230000, 0.333104, 0.013298, 0.094594 ] ], "n": ["FDJVGXF01EB7TH_rvcmp" ] }, {"p": [[196, -6944.330000, 0.282072, 0.073993, 0.062249 ], [199, -6944.470000, 0.246317, 0.013298, 0.066939 ], [200, -6944.470000, 0.246166, 0.000006, 0.066937 ], [198, -6945.130000, 0.126536, 0.009840, 0.070863 ], [197, -6945.460000, 0.091423, 0.024513, 0.072550 ], [152, -6947.960000, 0.007485, 0.021245, 0.066283 ] ], "n": ["FDJVGXF01CT8Y3_rvcmp" ] }, {"p": [[196, -7025.000000, 0.308301, 0.072808, 0.054051 ], [199, -7025.240000, 0.243291, 0.013298, 0.059999 ], [200, -7025.240000, 0.243153, 0.000006, 0.059997 ], [198, -7025.980000, 0.116193, 0.009824, 0.064048 ], [197, -7026.330000, 0.081561, 0.024513, 0.065661 ], [152, -7028.720000, 0.007500, 0.021274, 0.059018 ] ], "n": ["FDJVGXF01B6GF7" ] }, {"p": [[196, -8391.840000, 0.606154, 0.067784, 0.080409 ], [199, -8393.210000, 0.154844, 0.006848, 0.092559 ], [198, -8393.830000, 0.083075, 0.012632, 0.098469 ], [197, -8393.840000, 0.082071, 0.024513, 0.098926 ], [200, -8393.950000, 0.073856, 0.000006, 0.093069 ] ], "n": ["FDJVGXF01BUKAR" ] }, {"p": [[196, -7307.800000, 0.233857, 0.068361, 0.043145 ], [154, -7308.110000, 0.172324, 0.014500, 0.039653 ], [200, -7308.170000, 0.161206, 0.008413, 0.051574 ], [204, -7308.260000, 0.147579, 0.000010, 0.051803 ], [203, -7308.260000, 0.147486, 0.009988, 0.051802 ], [199, -7308.540000, 0.111651, 0.013298, 0.052841 ], [198, -7310.000000, 0.025897, 0.007680, 0.058203 ] ], "n": ["FDJVGXF01BHL3Q" ] }, {"p": [[196, -7895.370000, 0.664468, 0.066138, 0.086251 ], [199, -7897.000000, 0.130567, 0.007405, 0.100034 ], [200, -7897.600000, 0.071496, 0.000006, 0.100664 ], [198, -7897.670000, 0.066941, 0.012786, 0.106638 ], [197, -7897.670000, 0.066529, 0.024513, 0.106987 ] ], "n": ["FDJVGXF01BWVSY" ] }, {"p": [[196, -7882.360000, 0.815986, 0.060068, 0.051241 ], [198, -7884.780000, 0.072821, 0.000006, 0.073682 ], [204, -7885.020000, 0.057350, 0.007953, 0.064359 ], [200, -7885.950000, 0.022580, 0.007928, 0.068540 ], [203, -7886.240000, 0.016894, 0.009990, 0.070694 ], [199, -7886.400000, 0.014369, 0.013295, 0.070447 ] ], "n": ["FDJVGXF01BL3V3" ] }, {"p": [[196, -7751.170000, 0.715831, 0.059488, 0.069044 ], [198, -7752.910000, 0.124819, 0.000006, 0.090247 ], [204, -7753.510000, 0.068536, 0.007550, 0.081784 ], [200, -7754.260000, 0.032512, 0.008021, 0.086542 ], [203, -7754.470000, 0.026381, 0.009988, 0.088488 ], [199, -7754.630000, 0.022380, 0.013298, 0.088419 ], [202, -7755.490000, 0.009542, 0.053792, 0.082228 ] ], "n": ["FDJVGXF01ECD0V" ] }, {"p": [[196, -7872.820000, 0.724998, 0.059456, 0.067867 ], [198, -7874.620000, 0.119770, 0.000006, 0.088939 ], [204, -7875.200000, 0.067332, 0.007582, 0.080507 ], [200, -7875.960000, 0.031521, 0.008012, 0.085165 ], [203, -7876.170000, 0.025441, 0.009988, 0.087110 ], [199, -7876.330000, 0.021586, 0.013298, 0.087023 ], [202, -7877.170000, 0.009353, 0.053663, 0.080803 ] ], "n": ["FDJVGXF01E0AWL" ] }, {"p": [[196, -7779.080000, 0.757375, 0.059418, 0.063546 ], [198, -7781.040000, 0.106602, 0.000006, 0.085149 ], [204, -7781.540000, 0.064432, 0.007682, 0.076378 ], [200, -7782.340000, 0.028991, 0.007971, 0.081003 ], [203, -7782.570000, 0.022997, 0.009988, 0.083018 ], [199, -7782.730000, 0.019602, 0.013298, 0.082885 ] ], "n": ["FDJVGXF01COG51" ] }, {"p": [[196, -6811.450000, 0.608285, 0.058865, 0.054420 ], [198, -6813.040000, 0.124340, 0.000006, 0.076350 ], [204, -6813.470000, 0.080993, 0.018941, 0.070598 ], [25, -6813.470000, 0.080644, 0.014128, 0.070563 ], [205, -6813.480000, 0.080318, 0.000009, 0.070751 ], [206, -6815.320000, 0.012709, 0.000002, 0.081972 ], [207, -6815.320000, 0.012709, 0.000002, 0.081972 ] ], "n": ["FDJVGXF01BUJKY" ] }, {"p": [[196, -7795.520000, 0.841211, 0.058846, 0.051724 ], [198, -7798.110000, 0.063373, 0.000006, 0.074766 ], [204, -7798.370000, 0.048923, 0.007951, 0.065377 ], [200, -7799.290000, 0.019428, 0.007918, 0.069658 ], [203, -7799.580000, 0.014606, 0.009990, 0.071826 ], [199, -7799.740000, 0.012460, 0.013295, 0.071577 ] ], "n": ["FDJVGXF01DWJ78", "FDJVGXF01AZF0B" ] }, {"p": [[196, -7831.760000, 0.844185, 0.058842, 0.051258 ], [198, -7834.370000, 0.061823, 0.000006, 0.074216 ], [204, -7834.620000, 0.048379, 0.007969, 0.064860 ], [200, -7835.550000, 0.019092, 0.007916, 0.069097 ], [203, -7835.830000, 0.014310, 0.009990, 0.071260 ], [199, -7835.990000, 0.012211, 0.013295, 0.071014 ] ], "n": ["FDJVGXF01B64PK", "FDJVGXF01E3CZ5" ] }, {"p": [[196, -8192.880000, 0.471478, 0.055618, 0.052926 ], [204, -8193.770000, 0.194430, 0.005847, 0.063104 ], [20, -8194.220000, 0.123161, 0.000005, 0.058928 ], [200, -8194.490000, 0.094654, 0.012685, 0.068490 ], [21, -8195.340000, 0.040380, 0.000008, 0.059858 ], [19, -8195.340000, 0.040300, 0.012620, 0.059860 ], [22, -8195.470000, 0.035598, 0.000007, 0.059319 ] ], "n": ["FDJVGXF01CF8WG_rvcmp" ] }, {"p": [[196, -7975.070000, 0.966533, 0.055388, 0.050621 ], [198, -7978.800000, 0.023234, 0.000006, 0.077885 ], [204, -7979.620000, 0.010233, 0.004927, 0.069573 ] ], "n": ["FDJVGXF01EPGLV_rvcmp" ] }, {"p": [[196, -6569.210000, 0.765766, 0.054489, 0.052827 ], [204, -6571.240000, 0.100188, 0.004706, 0.062801 ], [200, -6571.780000, 0.058222, 0.012685, 0.069129 ], [203, -6571.790000, 0.058188, 0.009990, 0.069130 ], [199, -6572.980000, 0.017636, 0.013295, 0.072024 ] ], "n": ["FDJVGXF01AT5GT_rvcmp" ] }, {"p": [[196, -5370.700000, 0.436635, 0.052974, 0.075023 ], [198, -5370.910000, 0.353967, 0.000006, 0.094540 ], [206, -5372.980000, 0.044615, 0.000002, 0.102192 ], [207, -5372.980000, 0.044615, 0.000002, 0.102192 ], [208, -5372.980000, 0.044610, 0.000006, 0.102188 ], [25, -5373.140000, 0.037780, 0.014512, 0.096005 ], [205, -5373.140000, 0.037779, 0.000009, 0.096008 ] ], "n": ["FDJVGXF01C3NSG" ] }, {"p": [[196, -8719.270000, 0.567337, 0.052631, 0.049382 ], [22, -8720.650000, 0.142481, 0.014308, 0.045071 ], [204, -8720.780000, 0.125484, 0.005335, 0.064227 ], [200, -8721.390000, 0.068374, 0.012685, 0.068665 ], [203, -8721.390000, 0.068250, 0.009988, 0.068660 ], [205, -8722.280000, 0.028074, 0.023598, 0.047214 ] ], "n": ["FDJVGXF01BN5PL" ] }, {"p": [[196, -7803.190000, 0.806672, 0.052332, 0.028215 ], [20, -7805.360000, 0.092376, 0.000007, 0.050390 ], [202, -7806.130000, 0.042610, 0.045509, 0.035610 ], [204, -7806.300000, 0.035936, 0.008427, 0.044564 ], [22, -7807.380000, 0.012308, 0.007768, 0.047817 ], [21, -7807.570000, 0.010098, 0.000009, 0.053651 ] ], "n": ["FDJVGXF01BVKT9" ] }, {"p": [[196, -5745.580000, 0.353549, 0.050931, 0.030915 ], [204, -5745.730000, 0.303290, 0.012080, 0.036370 ], [22, -5746.860000, 0.098115, 0.005098, 0.045460 ], [20, -5746.920000, 0.092907, 0.000007, 0.050495 ], [21, -5747.090000, 0.078359, 0.017640, 0.048886 ], [19, -5747.270000, 0.065599, 0.012620, 0.050740 ], [25, -5749.350000, 0.008181, 0.008146, 0.042739 ] ], "n": ["FDJVGXF01C2JDD_rvcmp" ] }, {"p": [[196, -8242.410000, 0.583997, 0.049683, 0.072746 ], [203, -8243.890000, 0.133158, 0.005725, 0.088676 ], [204, -8244.250000, 0.092694, 0.003826, 0.086102 ], [201, -8244.380000, 0.081088, 0.019126, 0.092176 ], [200, -8244.540000, 0.069423, 0.012685, 0.090236 ], [197, -8245.420000, 0.028613, 0.014493, 0.090770 ], [199, -8246.380000, 0.011026, 0.012750, 0.093027 ] ], "n": ["FDJVGXF01D9HJO_rvcmp" ] }, {"p": [[196, -8038.070000, 0.918864, 0.050132, 0.044456 ], [202, -8040.690000, 0.066821, 0.041298, 0.050293 ], [204, -8042.230000, 0.014316, 0.005133, 0.063560 ] ], "n": ["FDJVGXF01EBN6A" ] }, {"p": [[196, -7679.720000, 0.989610, 0.049375, 0.063674 ], [204, -7684.280000, 0.010390, 0.005127, 0.079546 ] ], "n": ["FDJVGXF01C5GUR" ] }, {"p": [[196, -7670.960000, 1.000000, 0.048685, 0.041116 ] ], "n": ["FDJVGXF01D4XPV_rvcmp" ] }, {"p": [[196, -8078.700000, 1.000000, 0.048928, 0.033863 ] ], "n": ["FDJVGXF01A4UZP_rvcmp" ] }, {"p": [[196, -7474.630000, 0.928954, 0.047800, 0.069715 ], [204, -7478.120000, 0.028116, 0.003534, 0.086173 ], [200, -7478.390000, 0.021474, 0.012685, 0.090758 ], [203, -7478.390000, 0.021455, 0.009988, 0.090760 ] ], "n": ["FDJVGXF01C4RVK_rvcmp" ] }, {"p": [[196, -7532.940000, 0.398679, 0.045657, 0.097741 ], [149, -7533.140000, 0.326713, 0.045616, 0.092047 ], [171, -7534.090000, 0.126675, 0.012998, 0.109845 ], [170, -7534.680000, 0.070209, 0.012424, 0.116945 ], [169, -7535.130000, 0.044532, 0.015914, 0.130818 ], [154, -7535.830000, 0.022199, 0.024061, 0.125489 ], [199, -7536.530000, 0.010994, 0.008070, 0.116482 ] ], "n": ["FDJVGXF01A4Y5B_rvcmp" ] }, {"p": [[196, -7994.750000, 0.979357, 0.045617, 0.072077 ], [204, -7998.610000, 0.020643, 0.003313, 0.090534 ] ], "n": ["FDJVGXF01CQLPK_rvcmp" ] }, {"p": [[196, -7947.280000, 0.985993, 0.041945, 0.096325 ], [149, -7951.530000, 0.014007, 0.038269, 0.086603 ] ], "n": ["FDJVGXF01AZERP_rvcmp" ] }, {"p": [[196, -7588.490000, 1.000000, 0.041817, 0.047501 ] ], "n": ["FDJVGXF01AIBBG_rvcmp" ] }, {"p": [[196, -7586.010000, 1.000000, 0.041673, 0.041796 ] ], "n": ["FDJVGXF01CTFU5_rvcmp" ] }, {"p": [[196, -9418.490000, 1.000000, 0.040808, 0.042382 ] ], "n": ["FDJVGXF01BJKMV" ] }, {"p": [[196, -7418.430000, 1.000000, 0.040869, 0.024153 ] ], "n": ["FDJVGXF01EC135_rvcmp" ] }, {"p": [[196, -8900.320000, 0.332974, 0.040258, 0.060417 ], [20, -8900.970000, 0.173678, 0.003651, 0.066006 ], [21, -8901.080000, 0.156852, 0.017640, 0.063728 ], [18, -8901.080000, 0.156838, 0.051699, 0.063724 ], [22, -8901.080000, 0.156831, 0.000007, 0.063725 ], [19, -8903.000000, 0.022827, 0.012620, 0.069241 ] ], "n": ["FDJVGXF01BD9BV" ] }, {"p": [[196, -6592.640000, 0.236752, 0.038604, 0.096319 ], [203, -6592.920000, 0.179034, 0.005247, 0.109319 ], [197, -6593.050000, 0.158060, 0.014336, 0.105819 ], [202, -6593.270000, 0.126664, 0.061774, 0.113307 ], [204, -6593.310000, 0.121196, 0.003749, 0.106114 ], [200, -6593.540000, 0.096820, 0.012685, 0.111285 ], [26, -6593.710000, 0.081475, 0.084336, 0.095953 ] ], "n": ["FDJVGXF01AOPC8" ] }, {"p": [[196, -7887.050000, 0.968112, 0.039320, 0.059778 ], [149, -7890.470000, 0.031888, 0.044821, 0.057088 ] ], "n": ["FDJVGXF01CA7H0_rvcmp" ] }, {"p": [[196, -8495.110000, 0.849726, 0.038712, 0.048477 ], [208, -8497.850000, 0.054820, 0.020489, 0.082722 ], [209, -8497.970000, 0.048462, 0.000896, 0.083838 ], [205, -8498.000000, 0.046993, 0.038635, 0.084418 ] ], "n": ["FDJVGXF01B7DVG" ] }, {"p": [[196, -9384.040000, 1.000000, 0.039222, 0.041231 ] ], "n": ["FDJVGXF01D13RT", "FDJVGXF01AGSBK", "FDJVGXF01AGYM2" ] }, {"p": [[196, -8558.730000, 0.415073, 0.037620, 0.066634 ], [170, -8559.270000, 0.241544, 0.013808, 0.087106 ], [171, -8559.760000, 0.148802, 0.006358, 0.086306 ], [149, -8560.030000, 0.113128, 0.060948, 0.086444 ], [208, -8560.710000, 0.057419, 0.011475, 0.102047 ], [206, -8562.280000, 0.012017, 0.000001, 0.112930 ], [207, -8562.280000, 0.012017, 0.000001, 0.112930 ] ], "n": ["FDJVGXF01CDB8S_rvcmp" ] }, {"p": [[196, -7630.100000, 0.897359, 0.038423, 0.060341 ], [208, -7633.320000, 0.035617, 0.021369, 0.101280 ], [205, -7633.400000, 0.033049, 0.038635, 0.102705 ], [25, -7634.350000, 0.012788, 0.004566, 0.109487 ], [23, -7634.540000, 0.010594, 0.003604, 0.114978 ], [24, -7634.540000, 0.010594, 0.001125, 0.114980 ] ], "n": ["FDJVGXF01ESOTP" ] }, {"p": [[196, -8183.990000, 1.000000, 0.034859, 0.052921 ] ], "n": ["FDJVGXF01CEK8I" ] }, {"p": [[196, -8229.790000, 0.856147, 0.034116, 0.073813 ], [20, -8231.660000, 0.132701, 0.002161, 0.079774 ], [21, -8234.130000, 0.011151, 0.008414, 0.081824 ] ], "n": ["FDJVGXF01A21S9" ] }, {"p": [[196, -7958.090000, 0.848982, 0.034277, 0.072432 ], [20, -7959.900000, 0.139401, 0.002153, 0.078290 ], [21, -7962.380000, 0.011617, 0.008416, 0.080354 ] ], "n": ["FDJVGXF01CD822" ] }, {"p": [[196, -8860.900000, 0.662861, 0.034229, 0.063006 ], [20, -8861.690000, 0.300537, 0.002143, 0.068169 ], [21, -8864.230000, 0.023541, 0.008335, 0.069430 ], [22, -8864.820000, 0.013061, 0.000007, 0.071508 ] ], "n": ["FDJVGXF01C8CC6" ] }, {"p": [[196, -8941.080000, 0.673436, 0.034219, 0.062301 ], [20, -8941.880000, 0.302901, 0.002142, 0.067543 ], [21, -8944.430000, 0.023662, 0.008337, 0.068762 ] ], "n": ["FDJVGXF01BFWFZ_rvcmp" ] }, {"p": [[196, -8520.740000, 0.867317, 0.034115, 0.058830 ], [20, -8522.700000, 0.123012, 0.002140, 0.066185 ], [21, -8525.240000, 0.009671, 0.008451, 0.067383 ] ], "n": ["FDJVGXF01BIB4C_rvcmp", "FDJVGXF01BIIFU_rvcmp" ] }, {"p": [[196, -9121.960000, 1.000000, 0.034209, 0.050494 ] ], "n": ["FDJVGXF01EFUI5" ] }, {"p": [[196, -8541.330000, 1.000000, 0.032329, 0.087571 ] ], "n": ["FDJVGXF01B77JO_rvcmp" ] }, {"p": [[196, -8895.140000, 0.547319, 0.031643, 0.063020 ], [20, -8895.440000, 0.404905, 0.002131, 0.067897 ], [21, -8898.020000, 0.030884, 0.008230, 0.069162 ], [22, -8898.620000, 0.016891, 0.000007, 0.071233 ] ], "n": ["FDJVGXF01AYCEV_rvcmp", "FDJVGXF01CD86M" ] }, {"p": [[196, -8887.370000, 0.569150, 0.031610, 0.057491 ], [20, -8887.720000, 0.400866, 0.002124, 0.063238 ], [21, -8890.310000, 0.029984, 0.008249, 0.064241 ] ], "n": ["FDJVGXF01DSHXR", "FDJVGXF01D0K44" ] }, {"p": [[196, -9116.970000, 0.576083, 0.031595, 0.055157 ], [20, -9117.350000, 0.394636, 0.002116, 0.061160 ], [21, -9119.950000, 0.029281, 0.008254, 0.062005 ] ], "n": ["FDJVGXF01C10A6", "FDJVGXF01B28O0", "FDJVGXF01D97CS" ] }, {"p": [[196, -9164.220000, 1.000000, 0.031867, 0.049981 ] ], "n": ["FDJVGXF01C3VYL" ] }, {"p": [[196, -8914.460000, 1.000000, 0.032293, 0.043262 ] ], "n": ["FDJVGXF01CWWBX_rvcmp" ] }, {"p": [[196, -8863.320000, 0.934798, 0.031135, 0.058639 ], [205, -8865.980000, 0.065202, 0.016827, 0.067802 ] ], "n": ["FDJVGXF01BNGHO_rvcmp" ] }, {"p": [[196, -8964.040000, 0.918543, 0.031002, 0.056659 ], [20, -8966.460000, 0.081457, 0.002129, 0.066740 ] ], "n": ["FDJVGXF01BVZKQ", "FDJVGXF01C9MCQ" ] }, {"p": [[196, -5634.990000, 0.674862, 0.031027, 0.025869 ], [20, -5636.010000, 0.243426, 0.002565, 0.048538 ], [205, -5637.950000, 0.034893, 0.024064, 0.046664 ], [21, -5638.050000, 0.031494, 0.008441, 0.048607 ], [22, -5638.770000, 0.015325, 0.000007, 0.052321 ] ], "n": ["FDJVGXF01DGJ01_rvcmp" ] }, {"p": [[196, -7666.600000, 0.925944, 0.029582, 0.069010 ], [171, -7669.420000, 0.054793, 0.019332, 0.078507 ], [149, -7670.470000, 0.019264, 0.051115, 0.074932 ] ], "n": ["FDJVGXF01D4TZH_rvcmp" ] }, {"p": [[196, -7495.850000, 0.834743, 0.030405, 0.043397 ], [194, -7498.790000, 0.044172, 0.005468, 0.063123 ], [195, -7498.820000, 0.042697, 0.000009, 0.064093 ], [35, -7498.820000, 0.042686, 0.013080, 0.064093 ], [193, -7499.000000, 0.035702, 0.009011, 0.058959 ] ], "n": ["FDJVGXF01D1TYA_rvcmp" ] }, {"p": [[196, -7496.050000, 1.000000, 0.030478, 0.025669 ] ], "n": ["FDJVGXF01A0CI8_rvcmp", "FDJVGXF01E4QCO_rvcmp" ] }, {"p": [[196, -7029.300000, 1.000000, 0.029397, 0.028968 ] ], "n": ["FDJVGXF01EJ8C2_rvcmp" ] }, {"p": [[196, -6640.670000, 1.000000, 0.029480, 0.027799 ] ], "n": ["FDJVGXF01EF44K" ] }, {"p": [[196, -7228.590000, 1.000000, 0.029399, 0.027380 ] ], "n": ["FDJVGXF01AY8F7_rvcmp", "FDJVGXF01ETELX" ] }, {"p": [[196, -7025.560000, 1.000000, 0.029384, 0.025805 ] ], "n": ["FDJVGXF01CC9AF_rvcmp", "FDJVGXF01DF8QT_rvcmp" ] }, {"p": [[196, -7095.660000, 1.000000, 0.029371, 0.025227 ] ], "n": ["FDJVGXF01CZZBW" ] }, {"p": [[196, -7284.440000, 1.000000, 0.029413, 0.023976 ] ], "n": ["FDJVGXF01AIUBY" ] }, {"p": [[196, -7399.670000, 1.000000, 0.029329, 0.023466 ] ], "n": ["FDJVGXF01C5A8J" ] }, {"p": [[196, -6057.010000, 1.000000, 0.028202, 0.031115 ] ], "n": ["FDJVGXF01BKZTI" ] }, {"p": [[196, -6260.970000, 1.000000, 0.028150, 0.030049 ] ], "n": ["FDJVGXF01BF7TV_rvcmp" ] }, {"p": [[196, -8454.130000, 1.000000, 0.026773, 0.024041 ] ], "n": ["FDJVGXF01ATVL8_rvcmp" ] }, {"p": [[196, -7755.640000, 1.000000, 0.026858, 0.021985 ] ], "n": ["FDJVGXF01DO2W6", "FDJVGXF01CJ3JL_rvcmp", "FDJVGXF01DMK5Z", "FDJVGXF01B6KYY", "FDJVGXF01AJJZ3", "FDJVGXF01B9WO5" ] }, {"p": [[196, -8122.810000, 0.780265, 0.025961, 0.093228 ], [26, -8124.480000, 0.145857, 0.084244, 0.094682 ], [195, -8125.160000, 0.073878, 0.009446, 0.108314 ] ], "n": ["FDJVGXF01AIQNC" ] }, {"p": [[196, -8861.450000, 0.698950, 0.023903, 0.095178 ], [26, -8862.780000, 0.184308, 0.086885, 0.099182 ], [195, -8863.240000, 0.116742, 0.009446, 0.109808 ] ], "n": ["FDJVGXF01A347I_rvcmp" ] }, {"p": [[196, -9252.750000, 0.886171, 0.024262, 0.071528 ], [26, -9255.480000, 0.057735, 0.095171, 0.088236 ], [195, -9255.510000, 0.056094, 0.009446, 0.090404 ] ], "n": ["FDJVGXF01BE798" ] }, {"p": [[196, -6324.510000, 0.280741, 0.022989, 0.062607 ], [195, -6324.840000, 0.200769, 0.009446, 0.067110 ], [20, -6325.100000, 0.154630, 0.000007, 0.059758 ], [204, -6325.130000, 0.150066, 0.005420, 0.066547 ], [200, -6325.740000, 0.081656, 0.012685, 0.072823 ], [21, -6325.890000, 0.070682, 0.000009, 0.060646 ], [22, -6326.030000, 0.061456, 0.000007, 0.060017 ] ], "n": ["FDJVGXF01DLPQ3" ] }, {"p": [[196, -5960.580000, 0.286472, 0.018574, 0.060570 ], [195, -5960.820000, 0.225982, 0.009446, 0.064389 ], [20, -5961.010000, 0.186000, 0.000005, 0.056908 ], [21, -5961.800000, 0.084424, 0.000008, 0.057793 ], [19, -5961.800000, 0.084325, 0.012620, 0.057795 ], [22, -5961.930000, 0.074416, 0.000007, 0.057091 ], [204, -5962.170000, 0.058382, 0.005438, 0.068752 ] ], "n": ["FDJVGXF01CAM4D" ] }, {"p": [[196, -5479.100000, 0.894452, 0.018982, 0.025053 ], [34, -5481.980000, 0.050588, 0.009865, 0.046009 ], [35, -5482.290000, 0.036941, 0.002199, 0.046826 ], [195, -5483.010000, 0.018019, 0.006631, 0.043262 ] ], "n": ["FDJVGXF01D7LWG" ] }, {"p": [[196, -5550.620000, 0.896865, 0.018982, 0.024772 ], [34, -5553.520000, 0.049419, 0.009870, 0.045557 ], [35, -5553.830000, 0.036052, 0.002209, 0.046358 ], [195, -5554.550000, 0.017664, 0.006643, 0.042786 ] ], "n": ["FDJVGXF01DERCR_rvcmp" ] }, {"p": [[196, -5902.360000, 0.286914, 0.018495, 0.061145 ], [195, -5902.590000, 0.227063, 0.009446, 0.064956 ], [20, -5902.800000, 0.184999, 0.000005, 0.057365 ], [21, -5903.590000, 0.084066, 0.000008, 0.058264 ], [19, -5903.590000, 0.083967, 0.012620, 0.058266 ], [22, -5903.710000, 0.074039, 0.000007, 0.057563 ], [204, -5903.940000, 0.058954, 0.005408, 0.069379 ] ], "n": ["FDJVGXF01ELK3H" ] }, {"p": [[196, -9453.860000, 0.494183, 0.014874, 0.106815 ], [26, -9454.500000, 0.261761, 0.088692, 0.110801 ], [195, -9454.790000, 0.196052, 0.009446, 0.119177 ], [28, -9456.420000, 0.038186, 0.026172, 0.113917 ], [34, -9457.780000, 0.009818, 0.007910, 0.125393 ] ], "n": ["FDJVGXF01DFHEL" ] }, {"p": [[196, -9482.830000, 0.496849, 0.014933, 0.105759 ], [26, -9483.470000, 0.261599, 0.088581, 0.109664 ], [195, -9483.770000, 0.193916, 0.009446, 0.118106 ], [28, -9485.400000, 0.038019, 0.026156, 0.112877 ], [34, -9486.770000, 0.009616, 0.007911, 0.124295 ] ], "n": ["FDJVGXF01ALIXY", "FDJVGXF01D8H6T" ] }, {"p": [[196, -9387.920000, 0.485203, 0.015187, 0.102023 ], [26, -9388.590000, 0.250003, 0.088174, 0.105752 ], [195, -9388.930000, 0.177872, 0.009446, 0.114704 ], [28, -9389.810000, 0.073822, 0.020649, 0.109569 ], [34, -9391.960000, 0.008545, 0.007880, 0.120995 ], [35, -9392.590000, 0.004556, 0.002539, 0.124361 ] ], "n": ["FDJVGXF01C6L6H" ] }, {"p": [[196, -9475.680000, 0.505960, 0.014752, 0.100541 ], [26, -9476.380000, 0.252033, 0.089165, 0.104730 ], [195, -9476.670000, 0.189387, 0.009446, 0.112895 ], [28, -9477.950000, 0.052620, 0.013743, 0.112319 ] ], "n": ["FDJVGXF01EEB9Z" ] }, {"p": [[196, -9486.900000, 0.506301, 0.014761, 0.100444 ], [26, -9487.600000, 0.252026, 0.089150, 0.104621 ], [195, -9487.880000, 0.189122, 0.009446, 0.112786 ], [28, -9489.160000, 0.052551, 0.013749, 0.112217 ] ], "n": ["FDJVGXF01EO7B2" ] }, {"p": [[196, -8179.640000, 0.601504, 0.013934, 0.045441 ], [195, -8180.310000, 0.307232, 0.009446, 0.051377 ], [204, -8181.960000, 0.058989, 0.014726, 0.058169 ], [23, -8183.020000, 0.020341, 0.000007, 0.065314 ], [205, -8183.560000, 0.011934, 0.010475, 0.054850 ] ], "n": ["FDJVGXF01CMLNU" ] }, {"p": [[196, -3778.790000, 0.228977, 0.013876, 0.018384 ], [27, -3779.200000, 0.152242, 0.063247, 0.029150 ], [195, -3779.250000, 0.145071, 0.005000, 0.031408 ], [26, -3779.300000, 0.136961, 0.097406, 0.029571 ], [35, -3779.310000, 0.136914, 0.013080, 0.034189 ], [194, -3779.310000, 0.136859, 0.006696, 0.034189 ], [38, -3780.080000, 0.062976, 0.076823, 0.035312 ] ], "n": ["FDJVGXF01A1DVC" ] }, {"p": [[196, -6577.830000, 0.320911, 0.012759, 0.114137 ], [28, -6578.130000, 0.237607, 0.004549, 0.123779 ], [26, -6578.190000, 0.225188, 0.086986, 0.118745 ], [195, -6578.440000, 0.175572, 0.009446, 0.127876 ], [20, -6580.930000, 0.014520, 0.004209, 0.148269 ], [22, -6580.970000, 0.013907, 0.008652, 0.142320 ], [18, -6581.100000, 0.012295, 0.044609, 0.140873 ] ], "n": ["FDJVGXF01EDE5P" ] }, {"p": [[196, -5331.250000, 0.354057, 0.006744, 0.070885 ], [195, -5331.280000, 0.344339, 0.009446, 0.072499 ], [20, -5332.420000, 0.110047, 0.000005, 0.064279 ], [21, -5333.190000, 0.050890, 0.000008, 0.065415 ], [19, -5333.190000, 0.050831, 0.012620, 0.065418 ], [22, -5333.290000, 0.045925, 0.000007, 0.064700 ], [204, -5333.340000, 0.043912, 0.005023, 0.078949 ] ], "n": ["FDJVGXF01CS2Q4_rvcmp" ] }, {"p": [[196, -4978.890000, 0.353148, 0.007254, 0.067571 ], [195, -4978.930000, 0.341698, 0.009446, 0.069411 ], [20, -4980.050000, 0.110976, 0.000005, 0.061052 ], [21, -4980.830000, 0.050920, 0.000008, 0.062189 ], [19, -4980.830000, 0.050860, 0.012620, 0.062192 ], [22, -4980.930000, 0.046203, 0.000007, 0.061390 ], [18, -4980.930000, 0.046195, 0.051699, 0.061396 ] ], "n": ["FDJVGXF01COYEX_rvcmp" ] }, {"p": [[196, -9167.130000, 0.208024, 0.006316, 0.139217 ], [226, -9167.180000, 0.199064, 0.021167, 0.129895 ], [26, -9167.290000, 0.177014, 0.096855, 0.145039 ], [195, -9167.290000, 0.176785, 0.009446, 0.145563 ], [2, -9167.890000, 0.097077, 0.036220, 0.133682 ], [227, -9167.890000, 0.097076, 0.012980, 0.133689 ], [27, -9168.660000, 0.044961, 0.067692, 0.146667 ] ], "n": ["FDJVGXF01DLNEP" ] }, {"p": [[197, -8447.030000, 0.208646, 0.024513, 0.749380 ], [199, -8447.030000, 0.208622, 0.000006, 0.749378 ], [198, -8447.030000, 0.208600, 0.013117, 0.749409 ], [196, -8447.440000, 0.138504, 0.075613, 0.783211 ], [200, -8447.450000, 0.136761, 0.000006, 0.791678 ], [14, -8448.300000, 0.058715, 0.086246, 0.762736 ], [202, -8448.680000, 0.040153, 0.000008, 0.691462 ] ], "n": ["FDJVGXF01DQXQU_rvcmp" ] }, {"p": [[197, -6663.900000, 0.297521, 0.016536, 0.043956 ], [199, -6664.280000, 0.203574, 0.011362, 0.045596 ], [200, -6664.300000, 0.199605, 0.000006, 0.045810 ], [196, -6664.300000, 0.199592, 0.078187, 0.045811 ], [198, -6664.990000, 0.099708, 0.010289, 0.049339 ] ], "n": ["FDJVGXF01DJ34Q_rvcmp" ] }, {"p": [[197, -7035.400000, 0.257529, 0.012650, 0.048986 ], [200, -7035.850000, 0.163002, 0.008172, 0.051254 ], [204, -7035.940000, 0.149490, 0.000010, 0.051214 ], [203, -7035.940000, 0.149361, 0.009988, 0.051219 ], [199, -7036.130000, 0.124039, 0.013298, 0.052927 ], [196, -7036.130000, 0.123851, 0.078185, 0.052926 ], [198, -7037.460000, 0.032728, 0.013117, 0.056221 ] ], "n": ["FDJVGXF01D4K0O_rvcmp" ] }, {"p": [[197, -4176.670000, 0.619937, 0.006774, 0.113861 ], [204, -4178.540000, 0.095505, 0.003499, 0.116593 ], [200, -4178.710000, 0.080421, 0.012685, 0.124730 ], [203, -4178.710000, 0.080381, 0.009989, 0.124730 ], [196, -4178.870000, 0.068847, 0.032200, 0.113438 ], [18, -4179.760000, 0.028295, 0.045531, 0.091709 ], [22, -4179.820000, 0.026615, 0.001715, 0.091447 ] ], "n": ["FDJVGXF01EANTM_rvcmp" ] }, {"p": [[198, -4102.340000, 0.471711, 0.000006, 0.109432 ], [196, -4102.470000, 0.414399, 0.047843, 0.091673 ], [226, -4105.000000, 0.033151, 0.028254, 0.101862 ], [17, -4105.140000, 0.028887, 0.049256, 0.104599 ], [206, -4105.650000, 0.017285, 0.000002, 0.131758 ], [207, -4105.650000, 0.017285, 0.000002, 0.131758 ], [208, -4105.650000, 0.017284, 0.000006, 0.131755 ] ], "n": ["FDJVGXF01CTI4R_rvcmp" ] }, {"p": [[198, -6213.560000, 0.441176, 0.000006, 0.080161 ], [196, -6213.870000, 0.325307, 0.058498, 0.063041 ], [206, -6215.790000, 0.047385, 0.000002, 0.086495 ], [207, -6215.790000, 0.047385, 0.000002, 0.086495 ], [204, -6215.810000, 0.046478, 0.018959, 0.080341 ], [25, -6215.820000, 0.046137, 0.014512, 0.080488 ], [205, -6215.820000, 0.046132, 0.000009, 0.080491 ] ], "n": ["FDJVGXF01BIVZQ_rvcmp", "FDJVGXF01BH316_rvcmp", "FDJVGXF01BXXOZ_rvcmp" ] }, {"p": [[200, -3376.270000, 0.182422, 0.012685, 0.108685 ], [204, -3376.270000, 0.182359, 0.000010, 0.108682 ], [203, -3376.270000, 0.182337, 0.009988, 0.108683 ], [199, -3376.630000, 0.127655, 0.000885, 0.108589 ], [197, -3376.630000, 0.127628, 0.024089, 0.108425 ], [196, -3376.740000, 0.113979, 0.048390, 0.101581 ], [202, -3377.050000, 0.083621, 0.045735, 0.108844 ] ], "n": ["FDJVGXF01EDN70_rvcmp", "FDJVGXF01BGV64_rvcmp", "FDJVGXF01AWDYC_rvcmp" ] }, {"p": [[200, -4756.300000, 0.220055, 0.012685, 0.080933 ], [203, -4756.310000, 0.220009, 0.009990, 0.080936 ], [204, -4756.310000, 0.219909, 0.000009, 0.080931 ], [197, -4756.470000, 0.187171, 0.010870, 0.081325 ], [201, -4757.430000, 0.071324, 0.019126, 0.085717 ], [199, -4757.960000, 0.041985, 0.011251, 0.082851 ], [196, -4758.020000, 0.039546, 0.076825, 0.082888 ] ], "n": ["FDJVGXF01ASB9O" ] }, {"p": [[202, -7554.760000, 0.459974, 0.043934, 0.032369 ], [204, -7554.910000, 0.395066, 0.010874, 0.042530 ], [203, -7557.010000, 0.048507, 0.009378, 0.048355 ], [25, -7557.090000, 0.044744, 0.014061, 0.045997 ], [205, -7557.100000, 0.044389, 0.000008, 0.046152 ], [22, -7558.900000, 0.007320, 0.011373, 0.050466 ] ], "n": ["FDJVGXF01BYGE4_rvcmp" ] }, {"p": [[202, -7700.950000, 0.501220, 0.039127, 0.037162 ], [204, -7701.990000, 0.176831, 0.015522, 0.051750 ], [25, -7702.130000, 0.153429, 0.014512, 0.052263 ], [205, -7702.130000, 0.153400, 0.000006, 0.052266 ], [203, -7704.450000, 0.015120, 0.009615, 0.058042 ] ], "n": ["FDJVGXF01B80I4" ] }, {"p": [[202, -7113.570000, 0.254888, 0.038115, 0.040833 ], [204, -7113.590000, 0.250208, 0.015579, 0.051935 ], [205, -7113.720000, 0.217952, 0.000006, 0.052432 ], [25, -7113.720000, 0.217928, 0.014512, 0.052429 ], [226, -7115.780000, 0.027954, 0.015742, 0.040776 ], [203, -7116.040000, 0.021480, 0.009992, 0.059166 ], [210, -7116.850000, 0.009590, 0.004390, 0.056197 ] ], "n": ["FDJVGXF01B65ZD_rvcmp" ] }, {"p": [[202, -3768.090000, 0.254562, 0.015398, 0.108124 ], [196, -3768.590000, 0.154923, 0.019496, 0.104684 ], [26, -3768.700000, 0.139599, 0.097406, 0.109046 ], [195, -3768.700000, 0.139371, 0.009446, 0.109056 ], [200, -3768.790000, 0.126720, 0.012685, 0.115778 ], [203, -3768.790000, 0.126699, 0.009988, 0.115790 ], [20, -3769.570000, 0.058126, 0.000005, 0.085139 ] ], "n": ["FDJVGXF01BT8LZ" ] }, {"p": [[203, -7596.560000, 0.219382, 0.005248, 0.126265 ], [200, -7596.850000, 0.163303, 0.010835, 0.125245 ], [202, -7596.880000, 0.159791, 0.061774, 0.129660 ], [204, -7596.900000, 0.155954, 0.003469, 0.122885 ], [18, -7597.330000, 0.101319, 0.050321, 0.104151 ], [22, -7597.340000, 0.100128, 0.000007, 0.105557 ], [21, -7597.340000, 0.100122, 0.017640, 0.105552 ] ], "n": ["FDJVGXF01DHTNV_rvcmp" ] }, {"p": [[204, -7913.530000, 0.266466, 0.015044, 0.080083 ], [25, -7913.670000, 0.230400, 0.014512, 0.080699 ], [205, -7913.670000, 0.230392, 0.000009, 0.080710 ], [200, -7914.200000, 0.135842, 0.008280, 0.080708 ], [196, -7914.760000, 0.078031, 0.058077, 0.061191 ], [203, -7915.350000, 0.042890, 0.009990, 0.086954 ], [208, -7916.340000, 0.015979, 0.009084, 0.088751 ] ], "n": ["FDJVGXF01D8SLX_rvcmp" ] }, {"p": [[204, -2420.400000, 0.299367, 0.013545, 0.032751 ], [25, -2420.880000, 0.184783, 0.014512, 0.035628 ], [205, -2420.880000, 0.184731, 0.000009, 0.035626 ], [39, -2421.330000, 0.117938, 0.016042, 0.034380 ], [196, -2421.640000, 0.086462, 0.006845, 0.041909 ], [195, -2421.650000, 0.085590, 0.009446, 0.043873 ], [37, -2422.380000, 0.041129, 0.000006, 0.061533 ] ], "n": ["FDJVGXF01EPCRX_rvcmp" ] }, {"p": [[204, -2768.810000, 0.310291, 0.013609, 0.027211 ], [25, -2769.310000, 0.187559, 0.014512, 0.029349 ], [205, -2769.310000, 0.187509, 0.000009, 0.029347 ], [39, -2769.740000, 0.121249, 0.015967, 0.028182 ], [196, -2770.140000, 0.082028, 0.011213, 0.032872 ], [195, -2770.170000, 0.079645, 0.009446, 0.035930 ], [37, -2771.090000, 0.031719, 0.000006, 0.051765 ] ], "n": ["FDJVGXF01D48Q1" ] }, {"p": [[204, -7687.570000, 0.882632, 0.011591, 0.075174 ], [22, -7690.140000, 0.067368, 0.006951, 0.082132 ], [25, -7691.100000, 0.025790, 0.010361, 0.083133 ], [21, -7691.760000, 0.013384, 0.017640, 0.090019 ], [20, -7691.970000, 0.010825, 0.005580, 0.092744 ] ], "n": ["FDJVGXF01EX5JR_rvcmp" ] }, {"p": [[204, -7922.000000, 0.326008, 0.010795, 0.047244 ], [20, -7922.210000, 0.265854, 0.000007, 0.049364 ], [22, -7922.960000, 0.125425, 0.003943, 0.045109 ], [21, -7923.200000, 0.098180, 0.017640, 0.048278 ], [18, -7923.210000, 0.098049, 0.051699, 0.048278 ], [19, -7923.330000, 0.086484, 0.012620, 0.050099 ] ], "n": ["FDJVGXF01CQYQ6" ] }, {"p": [[204, -8023.260000, 0.362265, 0.010815, 0.046440 ], [20, -8023.470000, 0.293405, 0.000007, 0.048613 ], [22, -8024.210000, 0.140381, 0.003996, 0.044345 ], [21, -8024.460000, 0.108743, 0.017640, 0.047509 ], [19, -8024.590000, 0.095207, 0.012620, 0.049320 ] ], "n": ["FDJVGXF01DQJK1" ] }, {"p": [[204, -7443.450000, 0.508504, 0.009538, 0.051082 ], [20, -7444.200000, 0.238809, 0.000007, 0.052933 ], [22, -7445.000000, 0.107671, 0.003627, 0.048797 ], [21, -7445.200000, 0.088405, 0.017640, 0.051935 ], [200, -7446.510000, 0.023804, 0.012685, 0.064429 ], [203, -7446.510000, 0.023780, 0.009988, 0.064432 ], [196, -7447.480000, 0.009025, 0.057645, 0.057025 ] ], "n": ["FDJVGXF01DFRS3" ] }, {"p": [[204, -5245.230000, 0.358533, 0.009132, 0.089643 ], [20, -5245.990000, 0.166478, 0.000008, 0.076998 ], [200, -5246.210000, 0.134185, 0.012685, 0.100745 ], [196, -5246.290000, 0.123680, 0.050507, 0.088756 ], [21, -5246.710000, 0.081066, 0.000008, 0.078435 ], [22, -5246.810000, 0.073263, 0.001556, 0.076993 ], [199, -5246.970000, 0.062794, 0.007651, 0.101623 ] ], "n": ["FDJVGXF01AKLWC" ] }, {"p": [[204, -4621.190000, 0.387559, 0.009056, 0.088981 ], [200, -4622.150000, 0.148336, 0.012685, 0.101719 ], [203, -4622.150000, 0.148063, 0.009988, 0.101728 ], [196, -4622.260000, 0.132448, 0.050951, 0.088611 ], [199, -4622.900000, 0.070018, 0.007526, 0.102826 ], [197, -4623.110000, 0.056811, 0.024513, 0.108356 ], [198, -4623.110000, 0.056766, 0.013117, 0.108359 ] ], "n": ["FDJVGXF01DHD7T_rvcmp" ] }, {"p": [[204, -4575.000000, 0.354340, 0.009081, 0.088204 ], [196, -4575.410000, 0.235732, 0.032940, 0.086335 ], [200, -4575.970000, 0.134127, 0.012685, 0.100900 ], [203, -4575.970000, 0.133879, 0.009988, 0.100909 ], [199, -4576.730000, 0.062831, 0.007647, 0.101952 ], [197, -4576.950000, 0.050400, 0.024513, 0.107578 ], [20, -4577.520000, 0.028691, 0.000008, 0.082530 ] ], "n": ["FDJVGXF01EPCPG_rvcmp" ] }, {"p": [[204, -7598.810000, 0.420876, 0.008790, 0.050502 ], [22, -7599.210000, 0.283311, 0.009489, 0.042424 ], [196, -7599.650000, 0.181235, 0.048188, 0.046171 ], [20, -7601.090000, 0.043203, 0.000008, 0.052712 ], [200, -7601.280000, 0.035780, 0.012685, 0.061753 ], [21, -7601.790000, 0.021382, 0.017642, 0.050602 ], [19, -7602.200000, 0.014213, 0.012620, 0.053561 ] ], "n": ["FDJVGXF01B5LRT" ] }, {"p": [[204, -7648.820000, 0.420171, 0.008798, 0.050262 ], [22, -7649.210000, 0.284397, 0.009490, 0.042229 ], [196, -7649.660000, 0.181528, 0.048180, 0.045927 ], [20, -7651.100000, 0.043046, 0.000008, 0.052486 ], [200, -7651.300000, 0.035363, 0.012685, 0.061466 ], [21, -7651.800000, 0.021343, 0.017642, 0.050368 ], [19, -7652.220000, 0.014151, 0.012620, 0.053323 ] ], "n": ["FDJVGXF01BTVRT_rvcmp", "FDJVGXF01D181H_rvcmp", "FDJVGXF01A4VUJ_rvcmp" ] }, {"p": [[204, -3815.830000, 0.281582, 0.007602, 0.129995 ], [200, -3816.350000, 0.167935, 0.012685, 0.144251 ], [203, -3816.350000, 0.167808, 0.009988, 0.144267 ], [197, -3816.540000, 0.137654, 0.016553, 0.137442 ], [199, -3816.990000, 0.087810, 0.004201, 0.147176 ], [198, -3817.030000, 0.084694, 0.013117, 0.149898 ], [196, -3817.190000, 0.072518, 0.065003, 0.142972 ] ], "n": ["FDJVGXF01DPR33" ] }, {"p": [[204, -6808.400000, 0.631413, 0.008239, 0.064466 ], [200, -6810.350000, 0.089952, 0.012685, 0.077195 ], [203, -6810.350000, 0.089804, 0.009988, 0.077200 ], [20, -6810.580000, 0.070921, 0.000007, 0.065300 ], [196, -6810.620000, 0.068039, 0.053531, 0.065816 ], [22, -6811.600000, 0.025521, 0.002388, 0.063030 ], [21, -6811.650000, 0.024350, 0.000009, 0.066516 ] ], "n": ["FDJVGXF01CR501" ] }, {"p": [[204, -7697.720000, 0.732537, 0.008355, 0.056672 ], [200, -7699.740000, 0.097578, 0.012685, 0.068042 ], [203, -7699.740000, 0.097522, 0.009988, 0.068053 ], [202, -7700.750000, 0.035429, 0.046197, 0.059535 ], [196, -7701.150000, 0.023730, 0.061059, 0.062466 ], [20, -7701.740000, 0.013204, 0.000007, 0.064430 ] ], "n": ["FDJVGXF01BAYI3" ] }, {"p": [[204, -7930.470000, 0.747840, 0.008408, 0.055296 ], [200, -7932.540000, 0.094463, 0.012685, 0.066434 ], [203, -7932.540000, 0.094406, 0.009988, 0.066445 ], [202, -7933.800000, 0.026747, 0.048048, 0.058557 ], [196, -7933.930000, 0.023533, 0.060879, 0.060812 ], [20, -7934.520000, 0.013011, 0.000007, 0.063020 ] ], "n": ["FDJVGXF01DSZUX" ] }, {"p": [[204, -7064.590000, 0.559992, 0.007884, 0.055268 ], [20, -7066.000000, 0.137125, 0.000007, 0.056566 ], [200, -7066.450000, 0.086726, 0.012685, 0.066457 ], [203, -7066.460000, 0.086669, 0.009988, 0.066449 ], [22, -7066.840000, 0.058751, 0.003326, 0.052596 ], [21, -7067.000000, 0.050190, 0.017640, 0.055677 ], [196, -7067.890000, 0.020546, 0.062798, 0.061038 ] ], "n": ["FDJVGXF01C3KKN" ] }, {"p": [[204, -6582.580000, 0.456840, 0.006772, 0.086692 ], [200, -6583.650000, 0.156358, 0.012685, 0.097393 ], [203, -6583.650000, 0.156295, 0.009988, 0.097395 ], [196, -6583.990000, 0.111738, 0.052099, 0.085503 ], [201, -6584.810000, 0.049193, 0.015349, 0.100640 ], [202, -6584.980000, 0.041201, 0.061774, 0.102303 ], [199, -6585.360000, 0.028375, 0.012860, 0.100498 ] ], "n": ["FDJVGXF01DCRDD" ] }, {"p": [[204, -4417.870000, 0.340176, 0.006738, 0.061764 ], [203, -4418.430000, 0.195884, 0.004269, 0.073199 ], [202, -4418.630000, 0.160255, 0.057550, 0.072726 ], [201, -4418.680000, 0.152150, 0.019126, 0.075889 ], [200, -4419.210000, 0.089280, 0.012685, 0.076644 ], [196, -4420.180000, 0.033772, 0.075481, 0.080266 ], [197, -4420.350000, 0.028484, 0.016494, 0.085853 ] ], "n": ["FDJVGXF01A8GGP_rvcmp" ] }, {"p": [[204, -7632.920000, 0.241838, 0.005691, 0.062757 ], [196, -7633.060000, 0.210267, 0.055507, 0.050908 ], [170, -7633.520000, 0.132384, 0.007663, 0.073466 ], [200, -7633.600000, 0.121494, 0.012685, 0.068275 ], [203, -7633.610000, 0.121294, 0.009988, 0.068288 ], [154, -7633.740000, 0.105864, 0.030340, 0.079868 ], [149, -7634.200000, 0.066859, 0.059251, 0.063575 ] ], "n": ["FDJVGXF01CFIA4", "FDJVGXF01EJUSJ" ] }, {"p": [[204, -3162.070000, 0.512055, 0.005464, 0.168763 ], [200, -3163.440000, 0.129969, 0.012685, 0.185644 ], [203, -3163.440000, 0.129956, 0.009988, 0.185648 ], [201, -3164.100000, 0.067557, 0.017967, 0.196688 ], [202, -3164.100000, 0.067540, 0.061774, 0.196608 ], [199, -3164.470000, 0.046705, 0.003441, 0.197949 ], [196, -3164.480000, 0.046217, 0.046489, 0.189829 ] ], "n": ["FDJVGXF01B4C28" ] }, {"p": [[204, -7420.140000, 0.347943, 0.004764, 0.064711 ], [200, -7420.660000, 0.207964, 0.012685, 0.069658 ], [203, -7420.660000, 0.207584, 0.009988, 0.069663 ], [196, -7420.730000, 0.193321, 0.054140, 0.058578 ], [199, -7422.460000, 0.034173, 0.012918, 0.071108 ], [20, -7423.790000, 0.009015, 0.000005, 0.065076 ] ], "n": ["FDJVGXF01DUVCA" ] }, {"p": [[204, -7934.660000, 0.399654, 0.004788, 0.061898 ], [200, -7935.240000, 0.225614, 0.012685, 0.067113 ], [203, -7935.240000, 0.225483, 0.009988, 0.067114 ], [202, -7936.450000, 0.066894, 0.048062, 0.058934 ], [196, -7936.570000, 0.059212, 0.060871, 0.061191 ], [199, -7937.510000, 0.023143, 0.013298, 0.069889 ] ], "n": ["FDJVGXF01EW37D_rvcmp" ] }, {"p": [[205, -4873.990000, 0.222671, 0.034333, 0.093321 ], [208, -4874.100000, 0.199548, 0.024224, 0.100445 ], [209, -4874.100000, 0.199418, 0.000007, 0.100444 ], [206, -4874.820000, 0.097091, 0.000001, 0.111845 ], [207, -4874.820000, 0.097091, 0.000001, 0.111845 ], [22, -4874.840000, 0.095455, 0.024327, 0.100654 ], [210, -4874.910000, 0.088726, 0.000009, 0.102512 ] ], "n": ["FDJVGXF01E11AV_rvcmp" ] }, {"p": [[205, -7337.700000, 0.294046, 0.029883, 0.068329 ], [22, -7338.170000, 0.184536, 0.027378, 0.071825 ], [209, -7338.170000, 0.183154, 0.006837, 0.072137 ], [210, -7338.170000, 0.182922, 0.000009, 0.072147 ], [208, -7338.440000, 0.140986, 0.020690, 0.073992 ], [206, -7341.410000, 0.007178, 0.000001, 0.085707 ], [207, -7341.410000, 0.007178, 0.000001, 0.085707 ] ], "n": ["FDJVGXF01EGX25" ] }, {"p": [[205, -7418.430000, 0.363607, 0.026826, 0.069772 ], [152, -7418.810000, 0.247741, 0.024010, 0.084055 ], [153, -7419.010000, 0.201962, 0.005738, 0.076964 ], [171, -7419.740000, 0.097820, 0.021049, 0.067908 ], [40, -7420.470000, 0.047034, 0.072251, 0.068007 ], [190, -7421.260000, 0.021271, 0.029264, 0.072469 ], [191, -7421.300000, 0.020566, 0.008132, 0.076573 ] ], "n": ["FDJVGXF01AXQ6D" ] }, {"p": [[205, -7337.790000, 0.385661, 0.026834, 0.065110 ], [152, -7338.310000, 0.229671, 0.024083, 0.079299 ], [153, -7338.440000, 0.201322, 0.005960, 0.071713 ], [151, -7339.210000, 0.092873, 0.014659, 0.081514 ], [171, -7339.840000, 0.049926, 0.019243, 0.066154 ], [40, -7340.500000, 0.025661, 0.068721, 0.065786 ], [208, -7341.050000, 0.014886, 0.020051, 0.074861 ] ], "n": ["FDJVGXF01B2SXC" ] }, {"p": [[205, -7607.900000, 0.429262, 0.026862, 0.061736 ], [152, -7608.530000, 0.229408, 0.024146, 0.075079 ], [153, -7608.600000, 0.213828, 0.006106, 0.067590 ], [151, -7609.450000, 0.091149, 0.014659, 0.077184 ], [208, -7611.220000, 0.015460, 0.020019, 0.070978 ], [209, -7611.460000, 0.012203, 0.000007, 0.072686 ], [171, -7611.800000, 0.008690, 0.020471, 0.065295 ] ], "n": ["FDJVGXF01AGPIW" ] }, {"p": [[205, -8923.350000, 0.972151, 0.023197, 0.070025 ], [22, -8927.550000, 0.014637, 0.025291, 0.083019 ], [209, -8927.650000, 0.013212, 0.006837, 0.084777 ] ], "n": ["FDJVGXF01D5ED9" ] }, {"p": [[205, -8706.690000, 1.000000, 0.023070, 0.044057 ] ], "n": ["FDJVGXF01E06Z6_rvcmp" ] }, {"p": [[205, -6062.970000, 1.000000, 0.020023, 0.051283 ] ], "n": ["FDJVGXF01DZAZN_rvcmp" ] }, {"p": [[205, -7237.020000, 1.000000, 0.019512, 0.033403 ] ], "n": ["FDJVGXF01CPE1R_rvcmp" ] }, {"p": [[205, -6955.700000, 0.567819, 0.014205, 0.078906 ], [204, -6956.420000, 0.276388, 0.013637, 0.083756 ], [22, -6957.100000, 0.139436, 0.014137, 0.086767 ], [25, -6959.250000, 0.016357, 0.014513, 0.091588 ] ], "n": ["FDJVGXF01CIP9R_rvcmp" ] }, {"p": [[205, -7419.430000, 0.609185, 0.013367, 0.077640 ], [204, -7420.550000, 0.198532, 0.013496, 0.086085 ], [25, -7421.120000, 0.111984, 0.014512, 0.090411 ], [200, -7421.890000, 0.051867, 0.005610, 0.089254 ], [199, -7422.490000, 0.028432, 0.012803, 0.090561 ] ], "n": ["FDJVGXF01AK5U0" ] }, {"p": [[205, -5567.480000, 0.735916, 0.013145, 0.000111 ], [25, -5569.190000, 0.132170, 0.014512, 0.006967 ], [204, -5569.200000, 0.131914, 0.020143, 0.006967 ] ], "n": ["FDJVGXF01AOVEB", "FDJVGXF01EO822" ] }, {"p": [[205, -7069.180000, 0.396266, 0.006289, 0.056385 ], [204, -7069.490000, 0.290818, 0.014670, 0.055977 ], [25, -7070.010000, 0.172333, 0.008344, 0.062134 ], [24, -7070.980000, 0.065310, 0.000009, 0.069006 ], [23, -7071.000000, 0.064315, 0.003604, 0.069007 ], [226, -7073.400000, 0.005804, 0.027209, 0.069703 ], [227, -7073.520000, 0.005154, 0.000005, 0.071651 ] ], "n": ["FDJVGXF01BMGFG_rvcmp" ] }, {"p": [[205, -4309.980000, 0.320871, 0.000006, 0.048000 ], [25, -4309.980000, 0.320846, 0.014512, 0.047996 ], [204, -4309.980000, 0.320733, 0.020143, 0.047996 ], [196, -4313.020000, 0.015319, 0.062930, 0.042998 ], [200, -4313.440000, 0.010071, 0.012685, 0.057148 ], [23, -4313.940000, 0.006080, 0.003604, 0.058311 ], [24, -4313.940000, 0.006080, 0.001125, 0.058312 ] ], "n": ["FDJVGXF01CU478" ] }, {"p": [[205, -3231.020000, 0.243259, 0.000009, 0.046582 ], [25, -3231.020000, 0.243107, 0.014512, 0.046590 ], [204, -3231.020000, 0.242965, 0.020143, 0.046590 ], [190, -3232.010000, 0.090366, 0.027041, 0.040058 ], [191, -3232.310000, 0.067179, 0.015648, 0.051140 ], [192, -3232.310000, 0.067172, 0.000005, 0.051143 ], [39, -3232.690000, 0.045952, 0.019446, 0.049151 ] ], "n": ["FDJVGXF01EBB3U" ] }, {"p": [[205, -3388.470000, 0.215952, 0.000007, 0.042633 ], [25, -3388.470000, 0.215821, 0.014512, 0.042630 ], [204, -3388.470000, 0.215806, 0.020143, 0.042630 ], [190, -3388.610000, 0.187231, 0.021598, 0.025648 ], [191, -3389.820000, 0.056119, 0.007313, 0.037262 ], [171, -3389.840000, 0.054733, 0.034632, 0.035374 ], [192, -3389.850000, 0.054338, 0.000005, 0.040428 ] ], "n": ["FDJVGXF01DGL9L_rvcmp" ] }, {"p": [[205, -1836.300000, 0.312076, 0.000009, 0.000006 ], [204, -1836.300000, 0.312064, 0.020143, 0.000006 ], [25, -1836.300000, 0.311792, 0.014512, 0.000006 ], [206, -1839.160000, 0.017925, 0.000002, 0.016079 ], [207, -1839.160000, 0.017925, 0.000002, 0.016079 ], [208, -1839.160000, 0.017924, 0.000006, 0.016077 ], [209, -1839.710000, 0.010294, 0.000007, 0.009508 ] ], "n": ["FDJVGXF01E1J9N" ] }, {"p": [[208, -3253.110000, 0.193264, 0.018304, 0.059297 ], [205, -3253.410000, 0.143248, 0.038635, 0.065345 ], [209, -3253.410000, 0.143246, 0.000007, 0.065346 ], [22, -3253.470000, 0.135146, 0.028187, 0.066121 ], [23, -3253.520000, 0.128370, 0.001348, 0.067545 ], [24, -3253.520000, 0.128368, 0.000009, 0.067545 ], [25, -3253.520000, 0.128358, 0.000007, 0.067549 ] ], "n": ["FDJVGXF01CPHGI" ] }, {"p": [[208, -5070.520000, 0.247764, 0.009741, 0.125891 ], [22, -5071.150000, 0.131823, 0.024309, 0.129694 ], [206, -5071.170000, 0.129977, 0.000001, 0.131661 ], [207, -5071.170000, 0.129977, 0.000001, 0.131661 ], [209, -5071.240000, 0.121248, 0.000007, 0.133772 ], [205, -5071.240000, 0.121190, 0.038636, 0.133773 ], [210, -5071.260000, 0.118022, 0.000009, 0.133546 ] ], "n": ["FDJVGXF01EOYI2_rvcmp" ] }, {"p": [[208, -5537.520000, 0.307879, 0.009699, 0.076482 ], [22, -5538.240000, 0.148878, 0.022199, 0.076610 ], [206, -5538.490000, 0.116042, 0.000001, 0.082299 ], [207, -5538.490000, 0.116042, 0.000001, 0.082299 ], [209, -5538.600000, 0.104211, 0.000008, 0.082048 ], [205, -5538.600000, 0.104173, 0.038638, 0.082049 ], [210, -5538.610000, 0.102775, 0.000009, 0.081573 ] ], "n": ["FDJVGXF01C9WBH" ] }, {"p": [[208, -7662.010000, 0.322184, 0.006777, 0.074938 ], [206, -7662.370000, 0.224969, 0.000001, 0.079279 ], [207, -7662.370000, 0.224969, 0.000001, 0.079279 ], [205, -7663.140000, 0.104637, 0.025422, 0.072800 ], [209, -7663.660000, 0.061904, 0.000007, 0.077020 ], [22, -7664.360000, 0.030731, 0.028187, 0.076958 ], [204, -7664.370000, 0.030605, 0.016873, 0.076828 ] ], "n": ["FDJVGXF01DH0AP" ] }, {"p": [[209, -6518.480000, 0.143255, 0.000007, 1.999990 ], [208, -6518.480000, 0.143255, 0.024246, 1.999990 ], [210, -6518.490000, 0.143233, 0.000009, 1.999990 ], [22, -6518.490000, 0.143209, 0.028187, 1.999990 ], [206, -6518.490000, 0.142902, 0.000001, 1.999990 ], [207, -6518.490000, 0.142902, 0.000001, 1.999990 ], [225, -6518.500000, 0.141244, 0.036449, 1.999990 ] ], "n": ["FDJVGXF01DQ123" ] }, {"p": [[209, -8214.770000, 0.153733, 0.000007, 1.999990 ], [208, -8214.770000, 0.153733, 0.024246, 1.999990 ], [205, -8214.770000, 0.153713, 0.038635, 1.999990 ], [22, -8214.770000, 0.153629, 0.028187, 1.999990 ], [210, -8214.770000, 0.153604, 0.000009, 1.999990 ], [11, -8215.050000, 0.115794, 0.000001, 1.999990 ], [12, -8215.050000, 0.115794, 0.001169, 1.999990 ] ], "n": ["FDJVGXF01ELVFY" ] }, {"p": [[210, -4496.080000, 0.204297, 0.007982, 0.054073 ], [22, -4496.250000, 0.172586, 0.019501, 0.061094 ], [18, -4496.410000, 0.146770, 0.034265, 0.057041 ], [205, -4496.450000, 0.141133, 0.037591, 0.063419 ], [209, -4496.460000, 0.139655, 0.000327, 0.064929 ], [208, -4496.460000, 0.139526, 0.024246, 0.065016 ], [226, -4497.380000, 0.056033, 0.000008, 0.054599 ] ], "n": ["FDJVGXF01BUDHC_rvcmp" ] }, {"p": [[210, -7052.430000, 0.227704, 0.005242, 0.107803 ], [1, -7052.710000, 0.170850, 0.038659, 0.091028 ], [28, -7052.870000, 0.145984, 0.030471, 0.103485 ], [209, -7052.950000, 0.135514, 0.006837, 0.114239 ], [22, -7052.950000, 0.135437, 0.028184, 0.114236 ], [226, -7053.200000, 0.104631, 0.016951, 0.094825 ], [205, -7053.470000, 0.079880, 0.038635, 0.117809 ] ], "n": ["FDJVGXF01AKAVZ" ] }, {"p": [[210, -4408.380000, 0.183684, 0.003008, 0.076294 ], [209, -4408.430000, 0.175174, 0.006837, 0.079393 ], [17, -4408.620000, 0.143824, 0.042588, 0.065209 ], [227, -4408.710000, 0.132664, 0.000006, 0.070312 ], [226, -4408.710000, 0.132653, 0.032306, 0.070302 ], [2, -4408.740000, 0.128452, 0.029390, 0.071469 ], [205, -4408.950000, 0.103550, 0.034779, 0.078185 ] ], "n": ["FDJVGXF01D97QB", "FDJVGXF01EK67K" ] }, {"p": [[212, -5446.450000, 0.177020, 0.000008, 1.875070 ], [148, -5446.600000, 0.152409, 0.000009, 1.999990 ], [147, -5446.600000, 0.152404, 0.065313, 1.999990 ], [219, -5446.760000, 0.129941, 0.000007, 1.963770 ], [222, -5446.770000, 0.129563, 0.000009, 1.964850 ], [220, -5446.770000, 0.129332, 0.000010, 1.967560 ], [221, -5446.770000, 0.129331, 0.000007, 1.967560 ] ], "n": ["FDJVGXF01EOJUM" ] }, {"p": [[212, -6687.480000, 0.201742, 0.000008, 1.758780 ], [213, -6687.670000, 0.166305, 0.023979, 1.810920 ], [225, -6687.670000, 0.166292, 0.000009, 1.810940 ], [224, -6687.670000, 0.166274, 0.010740, 1.810950 ], [216, -6688.140000, 0.103848, 0.038817, 1.925440 ], [223, -6688.140000, 0.103846, 0.016737, 1.925450 ], [217, -6688.260000, 0.091694, 0.000007, 1.960230 ] ], "n": ["FDJVGXF01DE7G6" ] }, {"p": [[212, -5844.360000, 0.218666, 0.000008, 1.392960 ], [213, -5844.850000, 0.134052, 0.000006, 1.481820 ], [211, -5844.850000, 0.134048, 0.024188, 1.481840 ], [224, -5844.870000, 0.132082, 0.010740, 1.481440 ], [223, -5844.900000, 0.127675, 0.016737, 1.465350 ], [219, -5844.910000, 0.126887, 0.000007, 1.467610 ], [221, -5844.910000, 0.126589, 0.003442, 1.468380 ] ], "n": ["FDJVGXF01BFVWC" ] }, {"p": [[216, -6190.480000, 0.153197, 0.038817, 1.956730 ], [223, -6190.480000, 0.153197, 0.016737, 1.956730 ], [217, -6190.570000, 0.139264, 0.000007, 1.986310 ], [218, -6190.580000, 0.138645, 0.000008, 1.990310 ], [219, -6190.580000, 0.138589, 0.000007, 1.988710 ], [220, -6190.580000, 0.138558, 0.000010, 1.988900 ], [221, -6190.580000, 0.138551, 0.000007, 1.988950 ] ], "n": ["FDJVGXF01DYSMW_rvcmp" ] }, {"p": [[225, -6003.560000, 0.528706, 0.021517, 0.139417 ], [226, -6004.220000, 0.273760, 0.014420, 0.138100 ], [210, -6005.360000, 0.087346, 0.018069, 0.159472 ], [213, -6006.430000, 0.029997, 0.012619, 0.157705 ], [17, -6006.480000, 0.028692, 0.045334, 0.142780 ], [227, -6006.500000, 0.027994, 0.000006, 0.145434 ], [26, -6006.680000, 0.023505, 0.062933, 0.136823 ] ], "n": ["FDJVGXF01B4C28_rvcmp" ] }, {"p": [[226, -8182.470000, 0.351874, 0.027567, 0.092646 ], [17, -8182.660000, 0.288658, 0.049256, 0.094209 ], [227, -8182.660000, 0.288331, 0.000006, 0.094215 ], [210, -8185.230000, 0.022172, 0.001237, 0.114524 ], [22, -8185.240000, 0.021914, 0.028187, 0.115508 ], [209, -8185.240000, 0.021912, 0.006837, 0.115505 ], [205, -8186.690000, 0.005140, 0.017645, 0.112229 ] ], "n": ["FDJVGXF01CR3K7_rvcmp" ] }, {"p": [[226, -8993.280000, 0.359096, 0.027636, 0.091496 ], [17, -8993.480000, 0.295073, 0.049256, 0.092812 ], [227, -8993.480000, 0.294736, 0.000006, 0.092818 ], [210, -8996.160000, 0.020165, 0.001442, 0.111974 ], [209, -8996.180000, 0.019840, 0.006837, 0.113008 ], [2, -8997.310000, 0.006393, 0.021524, 0.093841 ], [205, -8997.620000, 0.004697, 0.017317, 0.109916 ] ], "n": ["FDJVGXF01A5PLY_rvcmp" ] }, {"p": [[226, -9345.660000, 0.476005, 0.025996, 0.064178 ], [227, -9346.300000, 0.250939, 0.000005, 0.067922 ], [17, -9346.300000, 0.250898, 0.049256, 0.067919 ], [22, -9348.730000, 0.022158, 0.009196, 0.079539 ] ], "n": ["FDJVGXF01E07G7_rvcmp" ] }, {"p": [[226, -9209.070000, 0.268078, 0.025935, 0.057826 ], [21, -9209.620000, 0.153975, 0.016907, 0.074566 ], [18, -9209.630000, 0.152762, 0.050954, 0.074257 ], [22, -9209.640000, 0.151724, 0.000007, 0.074890 ], [17, -9209.760000, 0.134437, 0.049256, 0.061676 ], [227, -9209.760000, 0.134432, 0.000006, 0.061679 ], [2, -9213.140000, 0.004592, 0.020772, 0.059117 ] ], "n": ["FDJVGXF01DJLDB_rvcmp" ] }, {"p": [[226, -8393.860000, 0.460198, 0.024848, 0.077347 ], [17, -8394.390000, 0.269911, 0.045534, 0.076859 ], [227, -8394.430000, 0.259062, 0.000006, 0.079789 ], [2, -8397.600000, 0.010830, 0.015813, 0.081625 ] ], "n": ["FDJVGXF01A2ND0", "FDJVGXF01EHY46" ] }, {"p": [[226, -8848.720000, 0.538745, 0.024569, 0.053849 ], [227, -8849.600000, 0.224338, 0.000425, 0.058826 ], [17, -8849.600000, 0.223507, 0.049256, 0.058890 ], [240, -8852.420000, 0.013410, 0.013508, 0.049632 ] ], "n": ["FDJVGXF01EIQP5_rvcmp" ] }, {"p": [[226, -9128.370000, 0.317273, 0.024035, 0.120119 ], [2, -9128.820000, 0.202166, 0.030892, 0.119749 ], [227, -9128.930000, 0.181127, 0.012980, 0.124127 ], [228, -9128.930000, 0.181012, 0.000005, 0.124128 ], [17, -9129.390000, 0.114902, 0.045240, 0.121453 ], [1, -9132.870000, 0.003520, 0.066692, 0.109553 ] ], "n": ["FDJVGXF01DC3TP_rvcmp", "FDJVGXF01BUJZR_rvcmp" ] }, {"p": [[226, -8960.100000, 0.599704, 0.023700, 0.047352 ], [227, -8961.210000, 0.198269, 0.000696, 0.052955 ], [17, -8961.220000, 0.196432, 0.049256, 0.053047 ], [22, -8964.780000, 0.005594, 0.024696, 0.070768 ] ], "n": ["FDJVGXF01BQME8", "FDJVGXF01BS98Y" ] }, {"p": [[226, -7666.410000, 0.374970, 0.023072, 0.104550 ], [210, -7667.520000, 0.122688, 0.000009, 0.131802 ], [22, -7667.520000, 0.122661, 0.028187, 0.131810 ], [209, -7667.520000, 0.122526, 0.006837, 0.131810 ], [17, -7667.540000, 0.120896, 0.049251, 0.109450 ], [227, -7667.540000, 0.120744, 0.000006, 0.109453 ], [21, -7669.590000, 0.015515, 0.014920, 0.141860 ] ], "n": ["FDJVGXF01ETRIS_rvcmp" ] }, {"p": [[226, -8687.470000, 0.484812, 0.022548, 0.052675 ], [227, -8688.540000, 0.165219, 0.000006, 0.056919 ], [17, -8688.540000, 0.165183, 0.049256, 0.056917 ], [204, -8689.480000, 0.064549, 0.012854, 0.066038 ], [205, -8689.510000, 0.062787, 0.012765, 0.065089 ], [209, -8690.210000, 0.031345, 0.004620, 0.070373 ], [22, -8690.390000, 0.026105, 0.026109, 0.071271 ] ], "n": ["FDJVGXF01BBDIC" ] }, {"p": [[226, -8958.610000, 0.633335, 0.022859, 0.042092 ], [227, -8959.940000, 0.167884, 0.000661, 0.048183 ], [17, -8959.950000, 0.166411, 0.049256, 0.048248 ], [22, -8962.230000, 0.016906, 0.023438, 0.063464 ], [210, -8962.320000, 0.015463, 0.002545, 0.062214 ] ], "n": ["FDJVGXF01B54J6" ] }, {"p": [[226, -8954.730000, 0.657370, 0.023269, 0.037023 ], [227, -8956.070000, 0.172190, 0.000701, 0.043138 ], [17, -8956.080000, 0.170440, 0.049256, 0.043211 ] ], "n": ["FDJVGXF01E1RU5", "FDJVGXF01DTZMC", "FDJVGXF01BW2IU", "FDJVGXF01B7RY8" ] }, {"p": [[226, -9100.930000, 0.700480, 0.022558, 0.036222 ], [227, -9102.470000, 0.149818, 0.000136, 0.042674 ], [17, -9102.480000, 0.149702, 0.049256, 0.042677 ] ], "n": ["FDJVGXF01B4FSY" ] }, {"p": [[226, -8187.160000, 0.351812, 0.021858, 0.098210 ], [210, -8187.960000, 0.157467, 0.000009, 0.120048 ], [22, -8187.960000, 0.157392, 0.028187, 0.120056 ], [209, -8187.960000, 0.157264, 0.006837, 0.120055 ], [17, -8188.510000, 0.090886, 0.046789, 0.101647 ], [200, -8188.950000, 0.058479, 0.008675, 0.113883 ], [204, -8189.740000, 0.026700, 0.004299, 0.119800 ] ], "n": ["FDJVGXF01CY2XG" ] }, {"p": [[226, -5552.560000, 0.591176, 0.021814, 0.055925 ], [17, -5553.620000, 0.204520, 0.049252, 0.060839 ], [227, -5553.620000, 0.204304, 0.000006, 0.060849 ] ], "n": ["FDJVGXF01BBM1B_rvcmp" ] }, {"p": [[226, -8847.850000, 0.499970, 0.022262, 0.050335 ], [227, -8849.000000, 0.158035, 0.000006, 0.054533 ], [17, -8849.000000, 0.158001, 0.049256, 0.054539 ], [204, -8849.890000, 0.064722, 0.012861, 0.063559 ], [205, -8849.910000, 0.063647, 0.012857, 0.062608 ], [209, -8850.650000, 0.030366, 0.004619, 0.067779 ], [22, -8850.840000, 0.025259, 0.026004, 0.068609 ] ], "n": ["FDJVGXF01D6GZ5_rvcmp" ] }, {"p": [[226, -8749.410000, 0.615362, 0.022347, 0.045914 ], [227, -8750.580000, 0.189454, 0.000006, 0.050218 ], [204, -8751.720000, 0.060748, 0.012682, 0.059594 ], [205, -8751.730000, 0.059984, 0.013176, 0.058688 ], [209, -8752.530000, 0.027101, 0.004563, 0.063888 ], [210, -8752.600000, 0.025175, 0.003981, 0.062382 ], [22, -8752.730000, 0.022177, 0.025968, 0.064719 ] ], "n": ["FDJVGXF01B2CQ6_rvcmp" ] }, {"p": [[226, -8839.580000, 0.631908, 0.022040, 0.040313 ], [227, -8840.880000, 0.171633, 0.000006, 0.044618 ], [17, -8840.880000, 0.171616, 0.049256, 0.044625 ], [210, -8843.400000, 0.013788, 0.005397, 0.057445 ], [22, -8843.620000, 0.011055, 0.024938, 0.060604 ] ], "n": ["FDJVGXF01C6QUM_rvcmp" ] }, {"p": [[226, -8844.300000, 0.760393, 0.022221, 0.039564 ], [227, -8845.580000, 0.211883, 0.000006, 0.043782 ], [210, -8848.280000, 0.014169, 0.005541, 0.056501 ], [22, -8848.320000, 0.013555, 0.021511, 0.059346 ] ], "n": ["FDJVGXF01AZKUX_rvcmp" ] }, {"p": [[226, -7758.930000, 0.551594, 0.021099, 0.096460 ], [17, -7759.830000, 0.224393, 0.049256, 0.101204 ], [227, -7759.830000, 0.224012, 0.000006, 0.101211 ] ], "n": ["FDJVGXF01BLAW1" ] }, {"p": [[226, -9266.680000, 0.287583, 0.020871, 0.086761 ], [210, -9267.000000, 0.208446, 0.000009, 0.107018 ], [22, -9267.000000, 0.208372, 0.028187, 0.107025 ], [209, -9267.000000, 0.208221, 0.006837, 0.107020 ], [17, -9268.390000, 0.052027, 0.049256, 0.091910 ], [205, -9269.370000, 0.019430, 0.026742, 0.105602 ], [208, -9269.570000, 0.015920, 0.020689, 0.105504 ] ], "n": ["FDJVGXF01C7551" ] }, {"p": [[226, -7899.660000, 0.641751, 0.020507, 0.068135 ], [17, -7900.970000, 0.173593, 0.036024, 0.061377 ], [227, -7901.720000, 0.081895, 0.000006, 0.072150 ], [228, -7902.270000, 0.047264, 0.000005, 0.078311 ], [2, -7902.270000, 0.047263, 0.036220, 0.078312 ], [1, -7904.020000, 0.008235, 0.068839, 0.073669 ] ], "n": ["FDJVGXF01B3YSF_rvcmp" ] }, {"p": [[226, -8095.620000, 0.615465, 0.019591, 0.080560 ], [17, -8096.570000, 0.239706, 0.041771, 0.078471 ], [227, -8097.070000, 0.144828, 0.000006, 0.086379 ] ], "n": ["FDJVGXF01DVV5Y_rvcmp" ] }, {"p": [[226, -8647.850000, 0.390540, 0.020201, 0.047896 ], [22, -8648.790000, 0.152417, 0.023114, 0.064621 ], [209, -8648.870000, 0.141789, 0.005344, 0.064597 ], [210, -8648.940000, 0.131944, 0.001834, 0.064036 ], [227, -8649.600000, 0.068199, 0.000005, 0.055004 ], [17, -8649.600000, 0.068193, 0.049256, 0.055002 ], [205, -8649.970000, 0.046919, 0.023165, 0.063179 ] ], "n": ["FDJVGXF01BP2AX" ] }, {"p": [[226, -8838.250000, 0.371555, 0.019758, 0.047344 ], [209, -8839.030000, 0.170311, 0.004683, 0.063659 ], [22, -8839.200000, 0.142931, 0.025899, 0.064312 ], [210, -8839.210000, 0.141921, 0.001894, 0.063333 ], [205, -8839.890000, 0.072113, 0.023505, 0.062226 ], [227, -8840.110000, 0.057748, 0.000006, 0.054524 ], [204, -8840.390000, 0.043421, 0.012912, 0.063974 ] ], "n": ["FDJVGXF01AP643", "FDJVGXF01AYG31" ] }, {"p": [[226, -8835.560000, 0.371388, 0.019762, 0.047365 ], [209, -8836.340000, 0.170363, 0.004683, 0.063674 ], [22, -8836.510000, 0.142979, 0.025899, 0.064327 ], [210, -8836.520000, 0.141962, 0.001893, 0.063348 ], [205, -8837.200000, 0.072130, 0.023499, 0.062231 ], [227, -8837.420000, 0.057741, 0.000006, 0.054529 ], [204, -8837.710000, 0.043435, 0.012908, 0.063990 ] ], "n": ["FDJVGXF01AUW88" ] }, {"p": [[226, -6107.690000, 0.644055, 0.020463, 0.035835 ], [227, -6109.240000, 0.135927, 0.000006, 0.040585 ], [17, -6109.240000, 0.135922, 0.049256, 0.040583 ], [22, -6110.460000, 0.040206, 0.012667, 0.052701 ], [21, -6111.030000, 0.022697, 0.017643, 0.055999 ], [210, -6111.100000, 0.021193, 0.009487, 0.052678 ] ], "n": ["FDJVGXF01C7HFL_rvcmp" ] }, {"p": [[226, -9425.300000, 0.368314, 0.017926, 0.115035 ], [205, -9425.610000, 0.271049, 0.027844, 0.133824 ], [22, -9426.350000, 0.129463, 0.017416, 0.138592 ], [26, -9427.000000, 0.067585, 0.080697, 0.128304 ], [17, -9427.000000, 0.067367, 0.033912, 0.118917 ], [196, -9427.240000, 0.053067, 0.017550, 0.132249 ], [210, -9427.450000, 0.043155, 0.007167, 0.132912 ] ], "n": ["FDJVGXF01A39LX_rvcmp" ] }, {"p": [[226, -8164.820000, 0.665159, 0.017643, 0.040602 ], [210, -8166.930000, 0.080563, 0.005066, 0.056548 ], [22, -8167.130000, 0.066399, 0.025108, 0.059710 ], [209, -8167.230000, 0.060068, 0.006835, 0.060595 ], [227, -8167.400000, 0.050514, 0.000006, 0.048174 ], [205, -8167.540000, 0.043795, 0.014769, 0.056322 ], [204, -8167.810000, 0.033501, 0.014539, 0.058650 ] ], "n": ["FDJVGXF01DLDAM_rvcmp" ] }, {"p": [[226, -7762.390000, 0.840647, 0.017612, 0.030959 ], [210, -7765.110000, 0.055537, 0.005691, 0.048317 ], [22, -7765.230000, 0.048944, 0.022461, 0.052178 ], [209, -7765.500000, 0.037443, 0.006837, 0.053214 ], [205, -7766.270000, 0.017428, 0.015153, 0.049083 ] ], "n": ["FDJVGXF01BWU05_rvcmp", "FDJVGXF01BW1CN_rvcmp" ] }, {"p": [[226, -8147.700000, 0.310259, 0.016506, 0.075740 ], [210, -8147.890000, 0.257436, 0.006124, 0.090837 ], [209, -8148.640000, 0.122180, 0.006837, 0.097469 ], [22, -8148.640000, 0.122103, 0.028184, 0.097473 ], [208, -8148.850000, 0.098621, 0.018656, 0.096245 ], [205, -8149.200000, 0.069349, 0.038635, 0.099997 ], [17, -8150.440000, 0.020051, 0.045357, 0.081116 ] ], "n": ["FDJVGXF01DVLFF_rvcmp" ] }, {"p": [[226, -7741.710000, 0.788221, 0.017433, 0.031904 ], [210, -7744.260000, 0.061585, 0.005508, 0.049528 ], [22, -7744.510000, 0.048113, 0.024944, 0.053398 ], [209, -7744.630000, 0.042718, 0.006837, 0.054340 ], [205, -7744.850000, 0.034092, 0.015083, 0.049731 ], [204, -7745.150000, 0.025271, 0.014237, 0.052227 ] ], "n": ["FDJVGXF01D0TIM_rvcmp" ] }, {"p": [[226, -7617.130000, 0.855245, 0.017272, 0.026149 ], [210, -7620.080000, 0.044799, 0.006010, 0.044504 ], [22, -7620.430000, 0.031715, 0.025318, 0.049201 ], [209, -7620.530000, 0.028560, 0.006837, 0.049957 ], [205, -7620.700000, 0.024071, 0.015412, 0.045299 ], [204, -7621.140000, 0.015610, 0.015358, 0.048486 ] ], "n": ["FDJVGXF01B1Y4W_rvcmp" ] }, {"p": [[226, -7831.960000, 0.726600, 0.016232, 0.083842 ], [210, -7834.430000, 0.061925, 0.018069, 0.100678 ], [225, -7834.430000, 0.061921, 0.036449, 0.100684 ], [17, -7834.490000, 0.058342, 0.039442, 0.083774 ], [227, -7834.850000, 0.040654, 0.000006, 0.091917 ], [2, -7835.320000, 0.025282, 0.036220, 0.098600 ], [228, -7835.320000, 0.025277, 0.000005, 0.098604 ] ], "n": ["FDJVGXF01D2C4P" ] }, {"p": [[229, -6777.200000, 0.201563, 0.000006, 1.999990 ], [235, -6777.360000, 0.171282, 0.000006, 1.999990 ], [233, -6777.360000, 0.171278, 0.062297, 1.999990 ], [234, -6777.360000, 0.171277, 0.079656, 1.999990 ], [237, -6777.680000, 0.124736, 0.000006, 1.999990 ], [236, -6777.680000, 0.124727, 0.061431, 1.999990 ], [240, -6778.940000, 0.035137, 0.020199, 1.999990 ] ], "n": ["FDJVGXF01B139S" ] }, {"p": [[229, -6484.760000, 0.308300, 0.000006, 1.687020 ], [236, -6485.560000, 0.139205, 0.061433, 1.850520 ], [235, -6485.560000, 0.139202, 0.045058, 1.850560 ], [237, -6485.560000, 0.139184, 0.000010, 1.850430 ], [234, -6485.720000, 0.117731, 0.000008, 1.995650 ], [233, -6485.740000, 0.115640, 0.062297, 1.992730 ], [230, -6486.780000, 0.040737, 0.047159, 1.994230 ] ], "n": ["FDJVGXF01COS50" ] }, {"p": [[237, -2600.620000, 0.196217, 0.004984, 0.035760 ], [235, -2600.760000, 0.171435, 0.033033, 0.035334 ], [236, -2600.810000, 0.162601, 0.061101, 0.036501 ], [234, -2600.940000, 0.142742, 0.066879, 0.037274 ], [233, -2601.180000, 0.112090, 0.062297, 0.041235 ], [238, -2601.210000, 0.108625, 0.026413, 0.044321 ], [239, -2601.230000, 0.106289, 0.000006, 0.045176 ] ], "n": ["FDJVGXF01BHEJN", "FDJVGXF01A2KPF" ] }, {"p": [[238, -6284.840000, 0.773704, 0.006143, 0.093370 ], [235, -6287.060000, 0.083706, 0.031479, 0.086311 ], [237, -6287.410000, 0.058873, 0.013082, 0.098341 ], [239, -6287.410000, 0.058844, 0.000006, 0.098348 ], [232, -6288.830000, 0.014342, 0.014309, 0.100514 ], [228, -6289.140000, 0.010532, 0.004961, 0.100060 ] ], "n": ["FDJVGXF01CS1OP_rvcmp" ] }, {"p": [[238, -5973.420000, 0.857507, 0.005674, 0.085892 ], [237, -5976.230000, 0.051583, 0.013082, 0.091867 ], [239, -5976.230000, 0.051551, 0.000006, 0.091869 ], [235, -5976.500000, 0.039359, 0.042794, 0.089827 ] ], "n": ["FDJVGXF01D798E" ] }, {"p": [[239, -6507.240000, 0.162787, 0.013015, 0.455661 ], [232, -6507.250000, 0.162744, 0.018799, 0.455637 ], [240, -6507.250000, 0.162692, 0.000006, 0.455663 ], [237, -6507.320000, 0.151271, 0.011406, 0.478425 ], [238, -6507.350000, 0.146875, 0.027842, 0.480591 ], [10, -6507.400000, 0.139747, 0.043940, 0.398095 ], [4, -6508.030000, 0.073884, 0.076256, 0.513393 ] ], "n": ["FDJVGXF01C9ZEB_rvcmp" ] }, {"p": [[248, -2948.110000, 0.512844, 0.051585, 0.039636 ], [249, -2948.950000, 0.221226, 0.012515, 0.058715 ], [250, -2948.950000, 0.221201, 0.021035, 0.058715 ], [228, -2951.820000, 0.012512, 0.021550, 0.074312 ], [226, -2951.920000, 0.011348, 0.022349, 0.069918 ], [17, -2951.940000, 0.011122, 0.035118, 0.064973 ], [227, -2952.070000, 0.009746, 0.000006, 0.074462 ] ], "n": ["FDJVGXF01CV89O_rvcmp" ] } ], "metadata": {"invocation": "guppy to_json" }, "version": 1, "fields": ["edge_num", "likelihood", "like_weight_ratio", "distal_length", "pendant_length" ] }pplacer-1.1.alpha19/tests/data/moran/rounded_dmsp.jplace000066400000000000000000004247211303154601500233010ustar00rootroot00000000000000{"tree": "((((((Cyanophora_paradoxa_:0.0665203[0],Mesostigma_viride_:0.0962753[1]):0.0362291[2],((chloroplast_Cyanidium_sp._Monte_Rotaro.AY391365_:0.123946[3],((chloroplast_Galdieria_sulphuraria.AY541295_:0.076265[4],((chloroplast_Galdieria_sulphuraria.AY119731_:2.68035e-06[5],chloroplast_Cyanidium_caldarium.X52758_:0.0195896[6]):0.0312019[7],chloroplast_Galdieria_sulphuraria.AY541294_:0.0188214[8]):0.0324389[9]):0.133418[10],((chloroplast_Cyanidioschyzon_merolae.AY119730_:2.68035e-06[11],chloroplast_Cyanidioschyzon_merolae_strain_DBV201.AY119729_:0.00117862[12]):0.0762594[13],chloroplast_Cyanidium_caldarium.AY541290_:0.203636[14]):0.0380657[15]):0.0194682[16]):0.0492622[17],(((chloroplast_Vaucheria_litorea.AF227740_:0.0517049[18],(plastid_Tribonema_aequale.AY528860_:0.0126259[19],chloroplast_Bumilleriopsis_filiformis.X79223_:0.00666588[20]):0.017649[21]):0.0281935[22],(((chloroplast_Skeletonema_costatum.AY119761_:0.00361095[23],Thalassiosira_pseudonana_:0.00113368[24]):0.0145191[25],(((Bigelowiella_natans_:0.097412[26],((Chlamydomonas_reinhardtii_:0.0704485[27],(chloroplast_Picochlorum_sp._RCC289.EU851960_:0.0487654[28],(Chlorella_vulgaris_:0.0467075[29],(chloroplast_Chlorella_pyrenoidosa.EU043047_:0.00161427[30],chloroplast_Auxenochlorella_protothecoides.EU043045_:0.00193294[31]):0.0152331[32]):0.0200406[33]):0.0147874[34]):0.0130863[35],((chloroplast_Chlorella_vulgaris.EU043044_:0.00120893[36],chloroplast_Chlorella_pyrenoidosa.EU043049_:0.00232797[37]):0.0768327[38],(plastid_Tetraselmis_marina.AY857618_:0.0254053[39],(chloroplast_Pseudochlorella_sp._CCAP_211_1A.EU043048_:0.0869235[40],(((((Synechococcus_sp._PCC_7002___gi170076636refNC_010475_:0.0621893[41],(((Nostock_punctiforme_gi186680550refNC_010628_:0.112883[42],((Nostoc_sp._PCC_7120_gi17227497refNC_003272_:0.00889436[43],Anabaena_variabilis_A_gi75906225refNC_007413_:0.0221131[44]):0.038336[45],(Nodularia_spumige_gi119512239refNZ_AAVW01000065_:0.0504455[46],Fremyella_diplosiphon.FDIPSBA_:0.051697[47]):0.0178891[48]):0.0237368[49]):0.0326133[50],(Lyngbya_sp_PCC_8106___gi119483230refNZ_AAVU01000001_:0.231009[51],(Microcystis_aerouginosa_gi166362741refNC_010296_:0.0929627[52],((Cyanothece_sp._ATCC_51142.CAU39610_:0.0123916[53],Cyanothece_sp._CCY_0110___gi126657681refNZ_AAXW01000012_:0.0313088[54]):0.0369935[55],(Cyanothece_sp._PCC_7425_gi218437013refNC_011729_:0.0746015[56],Cyanothece_sp._PCC_8801_gi218244892refNC_011726_:0.0616473[57]):0.0148311[58]):0.0396174[59]):0.0228094[60]):0.0166279[61]):0.0233005[62],(Synechocystis_sp_PCC_6803___gi16329170refNC_000911_:0.0535075[63],((((((Cyanothece_sp._CC_gi126660325refNZ_AAXW01000053_:0.347497[64],Synechococcus_sp._PCC_7335_gi225144522refNW_002475532_:0.317895[65]):0.108045[66],Mastigocladus_laminosus.AF170924_:0.264356[67]):0.0676548[68],((Synechococcus_sp._JA-3-3Ab__gi86604733refNC_007775_:0.0973541[69],Synechococcus_sp._JA-2-3Ba____gi86607503refNC_007776_:0.564415[70]):0.0790386[71],Gloeobacter_violaceus_gi37519569refNC_005125.1_:0.263289[72]):0.11791[73]):0.0379309[74],(Thermosynechococcus_gi22297544refNC_004113_:0.11758[75],(Cyanothece_sp._PCC_7425_gi220905643refNC_011884_:0.138332[76],Acaryochloris_marina_MBIC11017.AB303650_:0.216398[77]):0.0159655[78]):0.0287204[79]):0.0341087[80],((Prochlorothrix_hollandica.X14308_:2.68035e-06[81],Prochlorothrix_hollandica.X14523_:0.00128006[82]):0.081034[83],((Synechococcus_elongatus_PCC_7942___gi81298811refNC_007604_:0.0105928[84],Synechococcus_elongatus_PCC_6301___gi56750010refNC_006576_:0.00276979[85]):0.107743[86],((Synechococcus_sp._WH_5701__gi87301761refNZ_AANO01000004_:0.0111919[87],Synechococcus_sp._WH_5701__gi87303211refNZ_AANO01000010_:0.0726788[88]):0.0147436[89],(((((Synechococcus_sp._RCC307_gi148241099refNC_009482_:0.0408099[90],((Synechococcus_sp._WH_8102_gi33864539refNC_005070_:0.0201067[91],(Synechococcus_sp._CC9902_gi78183584refNC_007513_:0.00536202[92],Synechococcus_sp._BL107_gi211594587refNZ_DS022298_:0.00246287[93]):0.0392091[94]):0.00867041[95],Synechococcus_sp._CC9605_gi78211558refNC_007516_:0.0275067[96]):0.0214861[97]):0.0346913[98],(Synechococcus_sp.__RS9916__gi116074999refNZ_AAUA01000003_:0.0477208[99],Synechococcus_sp._gi87123618refNZ_AANP01000002_:0.0406377[100]):0.0188201[101]):0.0110855[102],((Synechococcus_sp._WH_7803___gi148238336refNC_009481_:0.00753009[103],(Synechococcus_sp.__WH_7805__gi88807077refNZ_AAOK01000001_:0.00265618[104],Synechococcus_sp._WH_7805__gi88807768refNZ_AAOK01000002_:0.0026187[105]):0.00799342[106]):0.0173394[107],(Synechococcus_sp._RS9917___gi87125174refNZ_AANP01000006_:2.68035e-06[108],Synechococcus_sp._RS9917___gi87124875refNZ_AANP01000005_:0.0026301[109]):0.00794167[110]):0.0038034[111]):0.0158306[112],Synechococcus_sp._RS9917__gi87124182refNZ_AANP01000003_:0.192923[113]):0.0118268[114],Cyanobium_sp._PCC_70_gi223490194refNW_002243451_:0.0330768[115]):0.0231555[116]):0.0518051[117]):0.0453212[118]):0.0351102[119]):0.0447589[120],Microcoleus_chthonoplastes_PCC_7420___gi224400128refNW_002435220_:0.0843742[121]):0.0306188[122]):0.0369097[123]):0.0349985[124]):0.0577156[125],Trichodesmium_erythr_gi113473942refNC_008312_:0.106684[126]):0.0409208[127],(((Prochlorococcus_marinus_subsp._pastoris_str._CCMP1986_gi33860560refNC_005072_:0.00365008[128],Prochlorococcus_marinus_str._MIT_9515___gi123965234refNC_008817_:0.00483373[129]):0.0106366[130],(Prochlorococcus_marinus_str._AS9601_gi123967536refNC_008816_:2.68035e-06[131],(Prochlorococcus_marinus_str._MIT_9301__gi126695337refNC_009091_:0.0108685[132],((Procholococcus_marinus_str._MIT_9202_gi225077649refNW_002467725_:0.00240146[133],Procholococcus_marinus_str._MIT_9215___gi157412338refNC_009840_:2.68035e-06[134]):0.00591536[135],Prochlorococcus_marinus_str._MIT_9312_gi78778385refNC_007577_:0.00379511[136]):0.0049759[137]):0.00132484[138]):0.0105617[139]):0.0465879[140],((Procholococcus_marinus_str._NATL2A___gi162958048refNC_007335.2_:0.00365548[141],Prochlorococcus_marinus_str._NATL1A___gi124024712refNC_008819_:2.68035e-06[142]):0.0615085[143],(Prochlorococcus_marinus_subsp._marinus_str._CCMP1375_gi33239452refNC_005042_:0.100663[144],Procholococcus_marinus_str._MIT_9211___gi159902540refNC_009976_:0.0611398[145]):0.060931[146]):0.0653211[147]):0.148126[148]):0.0637467[149],((chloroplast_Pavlova_gyrans.AJ575575_:0.0169655[150],(chloroplast_Pavlova_lutheri.AY119755_:0.0146662[151],chloroplast_Pavlova_gyrans.AY119754_:0.0299817[152]):0.0270032[153]):0.0303472[154],((chloroplast_Chrysochromulina_polylepis.AJ575572_:0.0128709[155],chloroplast_Imantonia_rotunda.EU851963_:0.0436031[156]):0.00589301[157],(((chloroplast_Isochrysis_galbana.AJ575574_:0.0174268[158],chloroplast_Emiliania_huxleyi.AJ575573_:0.0115577[159]):0.00738805[160],(chloroplast_Phaeocystis_antarctica.AY119756_:0.0324724[161],(chloroplast_Prymnesium_parvum.AY119758_:0.0107131[162],chloroplast_Prymnesium_parvum.AJ575576_:0.00676058[163]):0.020704[164]):0.00735947[165]):0.00200676[166],chloroplast_Pleurochrysis_carterae.AY119757_:0.0339814[167]):0.00361886[168]):0.0233927[169]):0.0187331[170]):0.0346389[171],((chloroplast_Mantoniella_squamata.EU851964_:0.00842936[172],((plastid_uncultured_Prasinophyceae.AY176630_:0.0226216[173],(((chloroplast_Ostreococcus_sp._RCC344.EU851961_:0.00605274[174],Ostreococcus_tauri_:0.010265[175]):0.00616569[176],chloroplast_Ostreococcus_sp._RCC789.EU851970_:0.01746[177]):0.00408084[178],(uncultured_Prasinophyceae.AY509537_:0.0209825[179],chloroplast_Bathycoccus_prasinos.EU851955_:0.00805147[180]):0.0371846[181]):0.00765875[182]):0.0179484[183],(chloroplast_Micromonas_pusilla.EU851965_:2.68035e-06[184],plastid_uncultured_Prasinophyceae.AY176639_:2.68035e-06[185]):0.0089575[186]):0.0110303[187]):0.0523059[188],chloroplast_Pycnococcus_provasolii.EU851957_:0.0961508[189]):0.0343432[190]):0.015656[191]):0.0224695[192]):0.0167387[193]):0.00670223[194]):0.00945502[195]):0.0781944[196],(Fragilariopsis_psbA_:0.0245188[197],Pmultiseries_psbA_:0.0131238[198]):0.0133041[199]):0.0126908[200],(Phaeodactylum_tricornutum_:0.0191354[201],plastid_Ballia_callitricha.DQ787635_:0.061781[202]):0.00999794[203]):0.0201532[204]):0.0386439[205],(chloroplast_Heterosigma_akashiwo.AY119759_:2.68035e-06[206],chloroplast_Heterosigma_carterae.HCU18090_:2.68035e-06[207]):0.0242521[208]):0.00684342[209]):0.018078[210],((chloroplast_Pachydictyon_coriaceum.AY422614_:0.0241936[211],chloroplast_Dictyota_dichotoma_var._linearis.AY422632_:0.00853816[212]):0.0239851[213],((chloroplast_Fucus_vesiculosus.DQ307679_:0.0343612[214],chloroplast_Ectocarpus_siliculosus.X56695_:0.0397557[215]):0.038827[216],((plastid_Padina_japonica.AY430360_:0.0143668[217],(plastid_Padina_arborescens.AY430357_:0.0162365[218],plastid_Padina_crassa.AY430358_:0.00695945[219]):0.00495696[220]):0.00344828[221],chloroplast_Padina_crassa.AY422643_:0.00886928[222]):0.0167452[223]):0.0107453[224]):0.0364574[225]):0.032314[226]):0.0129864[227]):0.0215549[228],(chloroplast_Flintiella_sanguinaria.AY119740_:0.047233[229],chloroplast_Porphyridium_aerugineum.AY119741_:0.0471646[230]):0.0174241[231]):0.0188085[232],(((chloroplast_Erythrotrichia_carnea.AY119739_:0.0623046[233],chloroplast_Rhodochaete_parvula.AY119743_:0.0796661[234]):0.0450641[235],chloroplast_Rhodosorus_marinus.AY119744_:0.0614381[236]):0.0130888[237],chloroplast_Bangiopsis_subsimplex.AY119736_:0.0278478[238]):0.0130213[239]):0.0469411[240],(chloroplast_Palmaria_palmata.PPU28165_:0.0983928[241],(plastid_Antithamnionella_sp._A31.DQ787640_:0.0189374[242],(plastid_Carpoblepharis_flaccida.DQ787643_:0.104554[243],chloroplast_Antithamnion_sp.X55364_:0.0274272[244]):0.00842288[245]):0.0306715[246]):0.0178171[247]):0.0709634[248],Porphyra_yezoensis_:0.0125208[249],Porphyra_purpurea_:0.0210402[250]):0[251];", "placements": [{"p": [[0, -3117.130000, 0.214473, 0.000008, 0.801891 ], [148, -3117.400000, 0.164538, 0.054804, 1.302960 ], [1, -3117.470000, 0.152677, 0.096269, 1.006950 ], [2, -3117.470000, 0.152674, 0.000009, 1.006960 ], [227, -3117.640000, 0.129693, 0.012980, 1.076140 ], [65, -3117.790000, 0.111540, 0.056959, 1.580190 ], [226, -3118.190000, 0.074404, 0.032306, 1.269280 ] ], "n": ["FDJVGXF02HY3U1_rvcmp" ] }, {"p": [[1, -5564.800000, 1.000000, 0.028081, 0.091769 ] ], "n": ["FDJVGXF02FE4ZQ_rvcmp" ] }, {"p": [[1, -4583.080000, 0.193989, 0.015939, 0.134691 ], [39, -4583.210000, 0.170963, 0.010180, 0.158900 ], [29, -4583.420000, 0.137486, 0.038169, 0.162950 ], [33, -4583.500000, 0.127677, 0.000010, 0.169180 ], [32, -4583.500000, 0.127633, 0.015226, 0.169184 ], [28, -4583.550000, 0.121153, 0.048759, 0.169104 ], [34, -4583.550000, 0.121100, 0.000007, 0.169109 ] ], "n": ["FDJVGXF02JKSVL" ] }, {"p": [[2, -9265.180000, 0.240808, 0.036220, 1.999990 ], [228, -9265.180000, 0.240776, 0.000005, 1.999990 ], [227, -9265.180000, 0.240754, 0.012980, 1.999990 ], [226, -9266.400000, 0.071450, 0.009177, 1.999990 ], [225, -9266.420000, 0.069870, 0.036449, 1.999990 ], [222, -9266.440000, 0.068171, 0.008861, 1.999990 ], [223, -9266.440000, 0.068171, 0.000008, 1.999990 ] ], "n": ["FDJVGXF02HT5SH" ] }, {"p": [[2, -7259.210000, 0.214693, 0.036220, 1.999990 ], [228, -7259.210000, 0.214652, 0.000005, 1.999990 ], [227, -7259.210000, 0.214632, 0.012980, 1.999990 ], [14, -7259.850000, 0.112963, 0.105287, 1.999990 ], [1, -7260.160000, 0.083002, 0.096269, 1.999990 ], [0, -7260.160000, 0.083001, 0.066512, 1.999990 ], [26, -7260.230000, 0.077058, 0.000006, 1.999990 ] ], "n": ["FDJVGXF02I73WJ" ] }, {"p": [[2, -7952.220000, 0.238765, 0.036220, 1.999990 ], [228, -7952.220000, 0.238719, 0.000005, 1.999990 ], [227, -7952.220000, 0.238696, 0.012980, 1.999990 ], [1, -7953.170000, 0.092233, 0.096269, 1.999990 ], [0, -7953.170000, 0.092231, 0.066512, 1.999990 ], [17, -7953.640000, 0.057799, 0.049256, 1.999990 ], [236, -7953.970000, 0.041557, 0.013580, 1.999990 ] ], "n": ["FDJVGXF02HYRJW" ] }, {"p": [[2, -7716.890000, 0.185400, 0.036220, 1.999990 ], [228, -7716.890000, 0.185343, 0.000005, 1.999990 ], [227, -7716.890000, 0.185326, 0.012980, 1.999990 ], [0, -7717.210000, 0.134744, 0.066512, 1.999990 ], [1, -7717.210000, 0.134744, 0.096269, 1.999990 ], [212, -7717.560000, 0.095123, 0.000008, 1.999990 ], [148, -7717.740000, 0.079320, 0.000009, 1.999990 ] ], "n": ["FDJVGXF02HTJMS_rvcmp" ] }, {"p": [[2, -7538.870000, 0.186782, 0.036220, 1.999990 ], [228, -7538.870000, 0.186725, 0.000005, 1.999990 ], [227, -7538.870000, 0.186707, 0.012980, 1.999990 ], [0, -7539.190000, 0.135408, 0.066512, 1.999990 ], [1, -7539.190000, 0.135407, 0.096269, 1.999990 ], [140, -7539.640000, 0.086107, 0.000006, 1.999990 ], [148, -7539.680000, 0.082865, 0.000009, 1.999990 ] ], "n": ["FDJVGXF02FLZ15" ] }, {"p": [[2, -8338.270000, 0.177564, 0.036220, 1.928570 ], [228, -8338.270000, 0.177507, 0.000005, 1.928630 ], [227, -8338.270000, 0.177492, 0.012980, 1.928620 ], [1, -8338.380000, 0.159003, 0.000006, 1.951050 ], [0, -8338.570000, 0.131264, 0.066512, 1.990660 ], [27, -8338.890000, 0.095404, 0.000009, 1.823090 ], [225, -8339.040000, 0.081766, 0.036449, 1.999990 ] ], "n": ["FDJVGXF02FYRCH" ] }, {"p": [[2, -6100.350000, 0.171663, 0.036220, 1.844040 ], [228, -6100.350000, 0.171606, 0.000005, 1.844090 ], [227, -6100.350000, 0.171590, 0.012980, 1.844090 ], [39, -6100.370000, 0.167646, 0.000006, 1.862610 ], [0, -6100.680000, 0.122459, 0.000008, 1.904720 ], [1, -6100.690000, 0.121815, 0.096269, 1.915330 ], [173, -6101.200000, 0.073222, 0.000006, 1.999990 ] ], "n": ["FDJVGXF02G57P7_rvcmp" ] }, {"p": [[2, -7810.420000, 0.215305, 0.036220, 1.655950 ], [228, -7810.420000, 0.215240, 0.000005, 1.655980 ], [227, -7810.420000, 0.215209, 0.012980, 1.655990 ], [0, -7810.890000, 0.134706, 0.066512, 1.736650 ], [1, -7810.890000, 0.134705, 0.096269, 1.736670 ], [17, -7812.040000, 0.042420, 0.049256, 1.922970 ], [226, -7812.040000, 0.042415, 0.032306, 1.923010 ] ], "n": ["FDJVGXF02IT1QW_rvcmp" ] }, {"p": [[2, -7981.470000, 0.787658, 0.018109, 0.048789 ], [22, -7982.920000, 0.184419, 0.013857, 0.062557 ], [227, -7985.430000, 0.014995, 0.004520, 0.063698 ], [226, -7985.580000, 0.012928, 0.029215, 0.063044 ] ], "n": ["FDJVGXF02GF4N8_rvcmp" ] }, {"p": [[2, -8427.140000, 0.843013, 0.018208, 0.045379 ], [22, -8429.010000, 0.129976, 0.013853, 0.058437 ], [227, -8431.200000, 0.014508, 0.004623, 0.059398 ], [226, -8431.350000, 0.012503, 0.028921, 0.058576 ] ], "n": ["FDJVGXF02FGRUW_rvcmp" ] }, {"p": [[2, -6445.550000, 0.814195, 0.014551, 0.056385 ], [22, -6447.200000, 0.156056, 0.015072, 0.076987 ], [227, -6449.890000, 0.010561, 0.004432, 0.076702 ], [18, -6449.920000, 0.010220, 0.038510, 0.089123 ], [226, -6450.060000, 0.008968, 0.030600, 0.077008 ] ], "n": ["FDJVGXF02HOSTB" ] }, {"p": [[2, -7315.100000, 0.785974, 0.014800, 0.053668 ], [22, -7316.560000, 0.183428, 0.013452, 0.069732 ], [18, -7319.240000, 0.012536, 0.041899, 0.078575 ], [227, -7319.500000, 0.009653, 0.004365, 0.070890 ], [226, -7319.640000, 0.008409, 0.029422, 0.070430 ] ], "n": ["FDJVGXF02HKV83_rvcmp" ] }, {"p": [[2, -7111.610000, 0.762892, 0.014101, 0.060062 ], [22, -7112.930000, 0.203447, 0.013952, 0.077812 ], [18, -7115.470000, 0.016037, 0.039961, 0.088032 ], [227, -7115.990000, 0.009466, 0.004388, 0.079675 ], [226, -7116.140000, 0.008158, 0.030096, 0.079691 ] ], "n": ["FDJVGXF02GF2S4_rvcmp" ] }, {"p": [[4, -1560.940000, 0.328346, 0.000009, 0.156150 ], [10, -1561.800000, 0.138353, 0.020064, 0.143011 ], [9, -1561.890000, 0.127178, 0.032431, 0.159127 ], [7, -1561.910000, 0.124723, 0.012753, 0.173881 ], [5, -1561.990000, 0.114552, 0.000001, 0.190687 ], [6, -1561.990000, 0.114552, 0.019580, 0.190687 ], [202, -1562.780000, 0.052295, 0.000008, 0.173378 ] ], "n": ["FDJVGXF02IMOR4" ] }, {"p": [[7, -5861.490000, 0.238659, 0.005765, 0.492369 ], [6, -5861.520000, 0.231081, 0.009808, 0.509158 ], [5, -5861.520000, 0.231061, 0.000001, 0.509233 ], [9, -5862.440000, 0.092037, 0.000008, 0.480130 ], [8, -5862.440000, 0.091980, 0.018812, 0.480138 ], [10, -5862.910000, 0.057591, 0.000008, 0.498955 ], [4, -5862.910000, 0.057591, 0.076256, 0.498973 ] ], "n": ["FDJVGXF02IO5UD" ] }, {"p": [[10, -4736.410000, 0.173624, 0.117143, 1.087830 ], [26, -4736.510000, 0.157391, 0.062410, 1.309950 ], [3, -4736.620000, 0.141439, 0.123938, 1.153590 ], [16, -4736.620000, 0.141431, 0.019459, 1.153590 ], [17, -4736.620000, 0.141424, 0.000006, 1.153600 ], [199, -4736.760000, 0.122498, 0.013298, 1.264610 ], [198, -4736.760000, 0.122192, 0.013117, 1.262170 ] ], "n": ["FDJVGXF02FJJ4E" ] }, {"p": [[10, -2739.510000, 0.301321, 0.059672, 0.194339 ], [244, -2739.700000, 0.250479, 0.000007, 0.289785 ], [167, -2740.220000, 0.149006, 0.000008, 0.304215 ], [64, -2740.550000, 0.106606, 0.201744, 0.235930 ], [6, -2740.910000, 0.074162, 0.001738, 0.283306 ], [9, -2741.010000, 0.067598, 0.013546, 0.252405 ], [7, -2741.290000, 0.050827, 0.031193, 0.285868 ] ], "n": ["FDJVGXF02FSPQ4_rvcmp" ] }, {"p": [[10, -2874.220000, 0.357474, 0.046026, 0.131018 ], [29, -2875.200000, 0.134654, 0.024073, 0.217957 ], [28, -2875.330000, 0.117833, 0.039567, 0.214014 ], [33, -2875.350000, 0.115112, 0.000010, 0.228547 ], [32, -2875.350000, 0.115079, 0.015226, 0.228547 ], [34, -2875.400000, 0.110466, 0.000007, 0.229077 ], [31, -2876.200000, 0.049381, 0.001925, 0.246419 ] ], "n": ["FDJVGXF02HKPJT", "FDJVGXF02IZZZK" ] }, {"p": [[10, -2626.940000, 0.265067, 0.036090, 0.145359 ], [9, -2627.640000, 0.131969, 0.005782, 0.206560 ], [7, -2627.660000, 0.128693, 0.031193, 0.216556 ], [8, -2627.660000, 0.128692, 0.018812, 0.216562 ], [5, -2627.700000, 0.124321, 0.000001, 0.218520 ], [6, -2627.700000, 0.124251, 0.019580, 0.218538 ], [197, -2627.950000, 0.097006, 0.000006, 0.247332 ] ], "n": ["FDJVGXF02HYG0J_rvcmp" ] }, {"p": [[10, -6544.690000, 0.332762, 0.032944, 0.407233 ], [4, -6545.090000, 0.223638, 0.076256, 0.498602 ], [9, -6545.090000, 0.223522, 0.032431, 0.498612 ], [239, -6546.480000, 0.055598, 0.013015, 0.484459 ], [232, -6546.480000, 0.055582, 0.018799, 0.484440 ], [240, -6546.480000, 0.055566, 0.000006, 0.484458 ], [237, -6546.520000, 0.053332, 0.011450, 0.508824 ] ], "n": ["FDJVGXF02F2HFE_rvcmp" ] }, {"p": [[11, -6864.780000, 0.278804, 0.000001, 1.043280 ], [12, -6864.780000, 0.278804, 0.000009, 1.043270 ], [13, -6864.780000, 0.278748, 0.000009, 1.043280 ], [148, -6866.280000, 0.061855, 0.096694, 1.206030 ], [56, -6866.700000, 0.040845, 0.039334, 1.112120 ], [51, -6866.840000, 0.035437, 0.164389, 1.082770 ], [127, -6867.170000, 0.025507, 0.040911, 1.209000 ] ], "n": ["FDJVGXF02JFXRU" ] }, {"p": [[11, -3076.720000, 0.233127, 0.000001, 0.754007 ], [12, -3076.720000, 0.233127, 0.000009, 0.754007 ], [13, -3076.720000, 0.233090, 0.000009, 0.754004 ], [0, -3077.630000, 0.093581, 0.000008, 0.849447 ], [65, -3077.830000, 0.076319, 0.000009, 1.425200 ], [1, -3077.990000, 0.065378, 0.096269, 1.011570 ], [2, -3077.990000, 0.065377, 0.000009, 1.011590 ] ], "n": ["FDJVGXF02HYHTY_rvcmp", "FDJVGXF02HTSXB_rvcmp" ] }, {"p": [[13, -5769.980000, 0.291611, 0.064845, 0.607318 ], [14, -5770.030000, 0.277925, 0.203630, 0.610159 ], [15, -5770.030000, 0.277886, 0.000009, 0.610165 ], [10, -5771.890000, 0.043041, 0.117176, 0.677724 ], [16, -5771.930000, 0.041310, 0.000010, 0.708501 ], [11, -5772.130000, 0.034113, 0.000001, 0.714205 ], [12, -5772.130000, 0.034113, 0.001169, 0.714210 ] ], "n": ["FDJVGXF02IVI8D_rvcmp" ] }, {"p": [[14, -3326.800000, 0.281519, 0.140724, 0.430414 ], [13, -3327.190000, 0.191388, 0.076254, 0.498052 ], [15, -3327.190000, 0.191342, 0.000009, 0.498052 ], [9, -3327.970000, 0.087026, 0.000008, 0.637821 ], [7, -3327.970000, 0.087015, 0.031194, 0.637827 ], [10, -3328.040000, 0.081374, 0.016508, 0.614993 ], [4, -3328.050000, 0.080335, 0.076256, 0.643355 ] ], "n": ["FDJVGXF02JXEFU_rvcmp" ] }, {"p": [[17, -7895.780000, 0.159436, 0.049256, 1.766100 ], [227, -7895.780000, 0.159417, 0.000006, 1.766110 ], [226, -7895.780000, 0.159401, 0.032306, 1.766120 ], [205, -7895.960000, 0.133044, 0.002012, 1.779580 ], [25, -7895.960000, 0.132783, 0.014512, 1.784070 ], [3, -7895.970000, 0.131500, 0.123938, 1.797630 ], [23, -7896.020000, 0.124419, 0.003604, 1.818720 ] ], "n": ["FDJVGXF02FTMSK" ] }, {"p": [[17, -7466.330000, 0.338658, 0.042709, 0.095338 ], [226, -7466.370000, 0.328472, 0.030162, 0.099519 ], [227, -7466.420000, 0.312368, 0.000006, 0.100215 ], [2, -7469.420000, 0.015512, 0.016303, 0.100631 ], [210, -7470.550000, 0.004990, 0.003185, 0.125792 ] ], "n": ["FDJVGXF02I4B0Q", "FDJVGXF02G4XFH", "FDJVGXF02GYT9J" ] }, {"p": [[17, -7844.150000, 0.677994, 0.029153, 0.054526 ], [226, -7845.530000, 0.170499, 0.025843, 0.067870 ], [227, -7845.990000, 0.107736, 0.000006, 0.070088 ], [16, -7846.890000, 0.043772, 0.015289, 0.051226 ] ], "n": ["FDJVGXF02H1V5W" ] }, {"p": [[18, -4819.310000, 0.227240, 0.051699, 0.370612 ], [22, -4819.310000, 0.227218, 0.000007, 0.370600 ], [21, -4819.310000, 0.227179, 0.017640, 0.370627 ], [19, -4819.980000, 0.116073, 0.000006, 0.396647 ], [20, -4820.500000, 0.069431, 0.006659, 0.417083 ], [189, -4820.540000, 0.066432, 0.096145, 0.399197 ], [188, -4820.540000, 0.066427, 0.052299, 0.399192 ] ], "n": ["FDJVGXF02HNZ3V_rvcmp" ] }, {"p": [[19, -5955.550000, 0.634081, 0.003958, 0.137929 ], [21, -5956.370000, 0.278987, 0.009223, 0.128295 ], [20, -5957.960000, 0.056639, 0.006659, 0.150048 ], [22, -5959.250000, 0.015673, 0.003400, 0.131306 ], [18, -5959.320000, 0.014620, 0.051391, 0.136503 ] ], "n": ["FDJVGXF02IDX33_rvcmp" ] }, {"p": [[19, -5835.510000, 0.283598, 0.000006, 0.345107 ], [22, -5835.890000, 0.194713, 0.010135, 0.336322 ], [21, -5836.130000, 0.153542, 0.002510, 0.355877 ], [20, -5836.140000, 0.151823, 0.006659, 0.359469 ], [18, -5836.550000, 0.100371, 0.051696, 0.361527 ], [193, -5837.100000, 0.057977, 0.016731, 0.364424 ], [194, -5837.100000, 0.057976, 0.000007, 0.364437 ] ], "n": ["FDJVGXF02HV7EN" ] }, {"p": [[19, -6081.420000, 0.328596, 0.000006, 0.316783 ], [22, -6081.880000, 0.207631, 0.009372, 0.307884 ], [21, -6082.080000, 0.170130, 0.003619, 0.324369 ], [20, -6082.110000, 0.165162, 0.006659, 0.329487 ], [18, -6082.540000, 0.107620, 0.051696, 0.329535 ], [193, -6084.790000, 0.011393, 0.016731, 0.359091 ], [35, -6084.970000, 0.009468, 0.013080, 0.364712 ] ], "n": ["FDJVGXF02FXK0E", "FDJVGXF02FXRBW" ] }, {"p": [[20, -6041.450000, 0.212686, 0.006061, 0.053393 ], [21, -6041.460000, 0.211136, 0.000009, 0.053528 ], [19, -6041.460000, 0.210896, 0.012620, 0.053530 ], [22, -6041.630000, 0.178460, 0.002436, 0.051363 ], [18, -6041.670000, 0.171397, 0.051699, 0.052825 ], [205, -6044.080000, 0.015426, 0.023868, 0.055316 ] ], "n": ["FDJVGXF02JXNPL_rvcmp" ] }, {"p": [[20, -7802.800000, 0.228456, 0.005173, 0.048403 ], [21, -7802.850000, 0.217162, 0.000009, 0.048642 ], [19, -7802.850000, 0.216726, 0.012620, 0.048644 ], [22, -7803.100000, 0.168918, 0.000008, 0.048049 ], [18, -7803.100000, 0.168738, 0.051699, 0.048058 ] ], "n": ["FDJVGXF02HWVVX_rvcmp" ] }, {"p": [[20, -7118.550000, 0.736979, 0.002575, 0.065074 ], [21, -7120.540000, 0.100252, 0.008709, 0.065662 ], [22, -7121.110000, 0.056990, 0.001310, 0.067691 ], [18, -7121.120000, 0.056417, 0.051699, 0.068217 ], [19, -7121.250000, 0.049362, 0.012620, 0.069848 ] ], "n": ["FDJVGXF02GL3AG_rvcmp" ] }, {"p": [[20, -8610.600000, 0.418928, 0.002147, 0.070329 ], [22, -8611.150000, 0.240142, 0.011262, 0.066819 ], [205, -8611.640000, 0.147739, 0.026261, 0.069352 ], [196, -8611.660000, 0.145234, 0.032785, 0.068332 ], [21, -8612.860000, 0.043632, 0.010574, 0.070412 ], [209, -8615.170000, 0.004324, 0.006837, 0.077002 ] ], "n": ["FDJVGXF02FCTOG" ] }, {"p": [[20, -5886.570000, 0.323980, 0.000005, 0.060356 ], [204, -5887.240000, 0.165046, 0.005279, 0.073106 ], [21, -5887.650000, 0.109149, 0.000009, 0.061708 ], [19, -5887.660000, 0.108977, 0.012620, 0.061711 ], [22, -5887.760000, 0.098468, 0.000009, 0.061016 ], [18, -5887.760000, 0.098371, 0.051699, 0.061019 ], [200, -5887.780000, 0.096009, 0.012685, 0.080188 ] ], "n": ["FDJVGXF02FQOVG" ] }, {"p": [[20, -6359.030000, 0.271724, 0.000005, 0.052818 ], [196, -6359.360000, 0.196169, 0.030552, 0.055346 ], [21, -6359.830000, 0.122073, 0.000009, 0.053579 ], [19, -6359.830000, 0.121928, 0.012620, 0.053581 ], [22, -6359.960000, 0.107500, 0.000009, 0.052866 ], [18, -6359.960000, 0.107434, 0.051699, 0.052872 ], [204, -6360.340000, 0.073172, 0.005682, 0.063256 ] ], "n": ["FDJVGXF02F8HX9" ] }, {"p": [[21, -8764.250000, 0.241199, 0.017640, 0.064045 ], [22, -8764.250000, 0.241103, 0.000009, 0.064040 ], [18, -8764.250000, 0.240931, 0.051699, 0.064041 ], [196, -8764.600000, 0.170284, 0.043558, 0.062879 ], [20, -8765.750000, 0.053987, 0.005550, 0.068370 ], [19, -8765.770000, 0.052496, 0.012620, 0.068575 ] ], "n": ["FDJVGXF02HW4T9" ] }, {"p": [[21, -8438.750000, 0.283393, 0.017640, 0.062480 ], [22, -8438.750000, 0.283285, 0.000009, 0.062475 ], [18, -8438.750000, 0.283077, 0.051699, 0.062480 ], [20, -8440.260000, 0.062200, 0.005525, 0.066981 ], [19, -8440.290000, 0.060431, 0.012620, 0.067196 ], [196, -8441.080000, 0.027614, 0.044543, 0.066445 ] ], "n": ["FDJVGXF02IR6E7" ] }, {"p": [[21, -8761.550000, 0.256121, 0.017640, 0.059333 ], [22, -8761.550000, 0.256062, 0.000008, 0.059329 ], [18, -8761.550000, 0.255831, 0.051699, 0.059333 ], [196, -8761.900000, 0.180216, 0.043290, 0.057365 ], [19, -8763.150000, 0.051770, 0.012620, 0.063837 ] ], "n": ["FDJVGXF02GL7HB" ] }, {"p": [[21, -9500.630000, 0.335409, 0.017035, 0.080590 ], [18, -9500.640000, 0.332424, 0.051473, 0.080673 ], [22, -9500.640000, 0.332167, 0.000007, 0.080860 ] ], "n": ["FDJVGXF02JMMYF_rvcmp" ] }, {"p": [[21, -6868.190000, 0.546481, 0.015098, 0.175658 ], [18, -6869.050000, 0.231355, 0.047990, 0.175304 ], [22, -6869.090000, 0.222163, 0.000010, 0.176511 ] ], "n": ["FDJVGXF02FGMVP" ] }, {"p": [[21, -4573.070000, 0.681606, 0.009585, 0.111223 ], [19, -4574.640000, 0.141076, 0.007897, 0.135678 ], [20, -4574.940000, 0.105005, 0.006659, 0.141266 ], [22, -4575.980000, 0.037141, 0.004049, 0.113444 ], [18, -4576.030000, 0.035172, 0.046692, 0.119709 ] ], "n": ["FDJVGXF02HE4QW" ] }, {"p": [[21, -8945.440000, 0.762579, 0.009459, 0.112388 ], [19, -8947.610000, 0.086738, 0.011886, 0.128986 ], [20, -8947.630000, 0.085155, 0.006659, 0.129787 ], [18, -8948.570000, 0.033137, 0.049730, 0.116000 ], [22, -8948.600000, 0.032391, 0.000007, 0.117276 ] ], "n": ["FDJVGXF02I5I6G_rvcmp" ] }, {"p": [[21, -9130.550000, 0.672602, 0.007332, 0.102754 ], [19, -9132.040000, 0.151569, 0.012490, 0.115055 ], [20, -9132.040000, 0.151266, 0.006658, 0.115223 ], [22, -9134.340000, 0.015176, 0.007623, 0.102480 ], [18, -9134.820000, 0.009386, 0.051699, 0.108441 ] ], "n": ["FDJVGXF02ICZTI" ] }, {"p": [[22, -7148.800000, 0.739501, 0.016168, 0.081387 ], [209, -7150.960000, 0.084966, 0.005143, 0.091258 ], [208, -7151.100000, 0.073922, 0.015790, 0.087216 ], [210, -7151.200000, 0.066832, 0.000009, 0.092680 ], [18, -7152.300000, 0.022165, 0.028398, 0.082108 ], [205, -7152.870000, 0.012614, 0.035369, 0.092374 ] ], "n": ["FDJVGXF02H9DFJ" ] }, {"p": [[22, -3484.440000, 0.783978, 0.013036, 0.105787 ], [21, -3487.090000, 0.055667, 0.017640, 0.135841 ], [18, -3487.090000, 0.055665, 0.051699, 0.135839 ], [19, -3487.560000, 0.034949, 0.012620, 0.144740 ], [20, -3487.560000, 0.034948, 0.006659, 0.144741 ], [205, -3487.930000, 0.023987, 0.025181, 0.114760 ], [208, -3488.730000, 0.010807, 0.020091, 0.130032 ] ], "n": ["FDJVGXF02HH2NS" ] }, {"p": [[22, -5647.720000, 0.489265, 0.011545, 0.082964 ], [28, -5648.870000, 0.155655, 0.000006, 0.058515 ], [2, -5648.960000, 0.141107, 0.013181, 0.068886 ], [18, -5649.610000, 0.074071, 0.040245, 0.093766 ], [21, -5649.900000, 0.055613, 0.016497, 0.098567 ], [154, -5649.910000, 0.054865, 0.020821, 0.095248 ], [170, -5650.530000, 0.029424, 0.002051, 0.097343 ] ], "n": ["FDJVGXF02G2Y4K" ] }, {"p": [[22, -5657.600000, 0.489559, 0.011554, 0.082861 ], [28, -5658.750000, 0.155249, 0.000006, 0.058417 ], [2, -5658.840000, 0.141455, 0.013179, 0.068802 ], [18, -5659.490000, 0.074009, 0.040233, 0.093650 ], [21, -5659.770000, 0.055532, 0.016495, 0.098439 ], [154, -5659.790000, 0.054809, 0.020822, 0.095137 ], [170, -5660.410000, 0.029386, 0.002066, 0.097220 ] ], "n": ["FDJVGXF02F9HSE", "FDJVGXF02II7J3", "FDJVGXF02G63VE" ] }, {"p": [[22, -6113.880000, 0.707341, 0.012185, 0.080698 ], [2, -6115.420000, 0.151547, 0.014157, 0.067813 ], [18, -6116.220000, 0.067776, 0.047786, 0.094711 ], [21, -6116.240000, 0.066681, 0.016473, 0.096590 ], [226, -6118.540000, 0.006655, 0.027723, 0.088002 ] ], "n": ["FDJVGXF02FXXQP" ] }, {"p": [[22, -4769.320000, 0.792236, 0.011664, 0.078775 ], [18, -4771.270000, 0.113648, 0.040260, 0.092160 ], [21, -4771.550000, 0.085517, 0.016384, 0.097646 ], [2, -4773.850000, 0.008599, 0.017707, 0.082260 ] ], "n": ["FDJVGXF02H44BX" ] }, {"p": [[22, -6855.620000, 0.862594, 0.011860, 0.078437 ], [19, -6858.330000, 0.057582, 0.006034, 0.092879 ], [21, -6858.640000, 0.042081, 0.017640, 0.091164 ], [20, -6859.370000, 0.020381, 0.006659, 0.096796 ], [208, -6859.530000, 0.017362, 0.010929, 0.085832 ] ], "n": ["FDJVGXF02JV2HR" ] }, {"p": [[22, -5946.980000, 0.680164, 0.011519, 0.077607 ], [2, -5948.540000, 0.143296, 0.014716, 0.065161 ], [18, -5948.920000, 0.098164, 0.040075, 0.087708 ], [21, -5949.240000, 0.071379, 0.016411, 0.092374 ], [226, -5951.560000, 0.006997, 0.027529, 0.083874 ] ], "n": ["FDJVGXF02GQA01" ] }, {"p": [[22, -5397.850000, 0.837648, 0.011875, 0.064805 ], [18, -5400.010000, 0.096656, 0.039824, 0.075976 ], [21, -5400.400000, 0.065696, 0.016266, 0.081312 ] ], "n": ["FDJVGXF02GFZD0" ] }, {"p": [[22, -6643.550000, 0.583921, 0.012260, 0.056192 ], [205, -6644.430000, 0.242123, 0.026627, 0.061040 ], [21, -6645.940000, 0.053497, 0.017641, 0.063455 ], [20, -6646.010000, 0.050234, 0.005464, 0.065288 ], [19, -6646.040000, 0.048639, 0.012620, 0.065611 ], [196, -6647.530000, 0.010950, 0.048239, 0.073897 ], [209, -6647.560000, 0.010635, 0.006837, 0.066760 ] ], "n": ["FDJVGXF02FUX9G_rvcmp" ] }, {"p": [[22, -5320.680000, 0.286305, 0.010622, 0.363509 ], [19, -5321.210000, 0.169079, 0.000006, 0.403531 ], [21, -5321.320000, 0.151053, 0.017642, 0.397716 ], [18, -5321.320000, 0.151013, 0.051696, 0.397709 ], [20, -5321.720000, 0.101625, 0.006659, 0.422616 ], [194, -5322.080000, 0.070464, 0.000007, 0.413073 ], [193, -5322.080000, 0.070461, 0.016731, 0.413056 ] ], "n": ["FDJVGXF02F1O2E" ] }, {"p": [[22, -7727.700000, 0.709205, 0.010547, 0.090466 ], [18, -7728.670000, 0.269944, 0.051699, 0.102557 ], [196, -7731.230000, 0.020851, 0.035816, 0.084178 ] ], "n": ["FDJVGXF02GLM02" ] }, {"p": [[22, -4300.590000, 0.602370, 0.011475, 0.079915 ], [18, -4302.190000, 0.121455, 0.033712, 0.094761 ], [2, -4302.260000, 0.113650, 0.016774, 0.071164 ], [21, -4302.660000, 0.076347, 0.015454, 0.100229 ], [154, -4303.380000, 0.036888, 0.019745, 0.095900 ], [226, -4303.740000, 0.025738, 0.031816, 0.087929 ], [28, -4303.830000, 0.023552, 0.000006, 0.041483 ] ], "n": ["FDJVGXF02I60RH" ] }, {"p": [[22, -3498.720000, 0.654859, 0.010809, 0.057786 ], [21, -3500.170000, 0.152570, 0.009832, 0.081096 ], [18, -3500.460000, 0.114184, 0.035890, 0.073095 ], [19, -3501.530000, 0.039194, 0.012620, 0.105600 ], [20, -3501.530000, 0.039193, 0.006659, 0.105601 ] ], "n": ["FDJVGXF02I1GP4" ] }, {"p": [[22, -6495.510000, 0.448892, 0.010174, 0.286470 ], [18, -6496.310000, 0.202196, 0.051696, 0.306989 ], [21, -6496.310000, 0.202181, 0.017640, 0.306984 ], [193, -6497.910000, 0.040759, 0.016731, 0.314938 ], [194, -6497.910000, 0.040753, 0.000007, 0.314950 ], [35, -6498.130000, 0.032613, 0.013080, 0.319509 ], [195, -6498.130000, 0.032607, 0.000009, 0.319506 ] ], "n": ["FDJVGXF02F4WHG" ] }, {"p": [[22, -6447.900000, 0.487726, 0.009593, 0.083445 ], [210, -6448.710000, 0.216995, 0.011790, 0.086869 ], [225, -6449.590000, 0.090435, 0.036449, 0.093461 ], [18, -6449.930000, 0.064280, 0.048679, 0.091127 ], [21, -6449.990000, 0.060703, 0.017640, 0.093899 ], [196, -6450.310000, 0.043672, 0.040911, 0.096649 ], [20, -6450.500000, 0.036190, 0.006659, 0.098706 ] ], "n": ["FDJVGXF02FTY7D_rvcmp" ] }, {"p": [[22, -3264.030000, 0.471841, 0.009503, 0.063308 ], [18, -3264.540000, 0.283506, 0.040189, 0.081976 ], [21, -3264.870000, 0.203234, 0.017641, 0.087930 ], [208, -3267.770000, 0.011215, 0.002111, 0.088295 ], [206, -3267.790000, 0.010985, 0.000001, 0.091482 ], [207, -3267.790000, 0.010985, 0.000001, 0.091482 ], [173, -3268.080000, 0.008233, 0.015753, 0.075741 ] ], "n": ["FDJVGXF02JH59T" ] }, {"p": [[22, -6557.770000, 0.664041, 0.008803, 0.102194 ], [18, -6559.150000, 0.168022, 0.051699, 0.111302 ], [21, -6559.150000, 0.167937, 0.017640, 0.111298 ] ], "n": ["FDJVGXF02GXT72", "FDJVGXF02GEJJS", "FDJVGXF02HQACV" ] }, {"p": [[22, -8792.710000, 0.351791, 0.008698, 0.054756 ], [205, -8792.900000, 0.291240, 0.021720, 0.054246 ], [20, -8793.840000, 0.114068, 0.002597, 0.062597 ], [196, -8793.840000, 0.114001, 0.029581, 0.043978 ], [21, -8794.320000, 0.070731, 0.013696, 0.058001 ], [18, -8794.510000, 0.058170, 0.051699, 0.059146 ] ], "n": ["FDJVGXF02FJP4Y_rvcmp" ] }, {"p": [[22, -6445.290000, 0.527353, 0.007076, 0.046142 ], [20, -6446.100000, 0.234102, 0.000007, 0.053811 ], [21, -6446.970000, 0.098109, 0.017641, 0.052286 ], [19, -6447.240000, 0.075371, 0.012620, 0.054900 ], [196, -6447.550000, 0.054907, 0.038104, 0.057948 ], [204, -6449.240000, 0.010157, 0.005441, 0.070735 ] ], "n": ["FDJVGXF02F452C_rvcmp" ] }, {"p": [[22, -7762.610000, 0.261511, 0.006112, 0.066198 ], [18, -7762.630000, 0.256017, 0.044874, 0.066172 ], [21, -7763.010000, 0.175291, 0.017640, 0.070758 ], [19, -7763.200000, 0.145004, 0.012620, 0.073863 ], [20, -7763.200000, 0.144840, 0.006659, 0.073866 ], [204, -7765.330000, 0.017337, 0.012301, 0.067819 ] ], "n": ["FDJVGXF02IIBPI_rvcmp" ] }, {"p": [[22, -7637.040000, 0.666709, 0.006191, 0.053055 ], [21, -7638.470000, 0.159969, 0.017641, 0.058153 ], [19, -7638.640000, 0.134897, 0.012620, 0.060181 ], [196, -7639.900000, 0.038424, 0.040471, 0.062503 ] ], "n": ["FDJVGXF02JOJ52_rvcmp" ] }, {"p": [[22, -5988.020000, 0.176660, 0.004577, 0.446245 ], [225, -5988.100000, 0.164205, 0.026723, 0.441912 ], [18, -5988.170000, 0.152179, 0.051699, 0.456264 ], [21, -5988.170000, 0.152175, 0.017640, 0.456272 ], [226, -5988.230000, 0.144268, 0.000008, 0.461265 ], [19, -5988.510000, 0.108453, 0.000006, 0.473938 ], [20, -5988.570000, 0.102061, 0.006659, 0.472780 ] ], "n": ["FDJVGXF02JK252" ] }, {"p": [[22, -8627.460000, 0.321255, 0.002086, 0.080227 ], [18, -8627.510000, 0.304766, 0.051699, 0.081674 ], [21, -8627.510000, 0.304613, 0.017640, 0.081678 ], [19, -8628.990000, 0.069366, 0.000006, 0.091938 ] ], "n": ["FDJVGXF02JZTEH_rvcmp" ] }, {"p": [[22, -8561.020000, 0.328435, 0.002404, 0.074755 ], [18, -8561.090000, 0.305245, 0.051699, 0.076416 ], [21, -8561.090000, 0.305075, 0.017640, 0.076429 ], [19, -8562.700000, 0.061246, 0.000006, 0.086838 ] ], "n": ["FDJVGXF02JS345_rvcmp", "FDJVGXF02HEWI1_rvcmp", "FDJVGXF02FI6JK_rvcmp" ] }, {"p": [[22, -6282.140000, 0.265651, 0.000007, 0.312496 ], [18, -6282.140000, 0.265602, 0.051699, 0.312511 ], [21, -6282.140000, 0.265314, 0.017640, 0.312514 ], [149, -6283.110000, 0.100244, 0.019491, 0.297416 ], [148, -6283.730000, 0.054248, 0.119619, 0.316263 ], [127, -6284.160000, 0.034979, 0.040911, 0.317481 ], [208, -6285.080000, 0.013962, 0.004882, 0.304195 ] ], "n": ["FDJVGXF02JQJ7S" ] }, {"p": [[22, -7767.570000, 0.297045, 0.000008, 0.053836 ], [21, -7767.570000, 0.297014, 0.017640, 0.053840 ], [18, -7767.570000, 0.296677, 0.051699, 0.053836 ], [20, -7769.250000, 0.055455, 0.005506, 0.058768 ], [19, -7769.280000, 0.053809, 0.012620, 0.058958 ] ], "n": ["FDJVGXF02HCYN0" ] }, {"p": [[23, -3901.000000, 0.204318, 0.000007, 0.138743 ], [24, -3901.000000, 0.204318, 0.000009, 0.138743 ], [25, -3901.000000, 0.204212, 0.000007, 0.138733 ], [150, -3901.340000, 0.144461, 0.009001, 0.101321 ], [153, -3901.750000, 0.096351, 0.026997, 0.106561 ], [154, -3901.750000, 0.096336, 0.000007, 0.106556 ], [206, -3902.410000, 0.050005, 0.000001, 0.151504 ] ], "n": ["FDJVGXF02JDAVN" ] }, {"p": [[25, -7717.910000, 0.320906, 0.012996, 0.046082 ], [205, -7717.980000, 0.299317, 0.000009, 0.046529 ], [204, -7717.980000, 0.299314, 0.020143, 0.046523 ], [202, -7720.030000, 0.038590, 0.039140, 0.036840 ], [22, -7720.670000, 0.020361, 0.010215, 0.052594 ], [21, -7721.190000, 0.012043, 0.017640, 0.056337 ], [226, -7721.430000, 0.009470, 0.016047, 0.039565 ] ], "n": ["FDJVGXF02FMEJR" ] }, {"p": [[26, -5650.640000, 0.455852, 0.075537, 0.050416 ], [28, -5651.960000, 0.122071, 0.026559, 0.033260 ], [195, -5652.210000, 0.095355, 0.008722, 0.062156 ], [196, -5652.210000, 0.094841, 0.000010, 0.062303 ], [27, -5652.290000, 0.087557, 0.059377, 0.046468 ], [189, -5652.420000, 0.076941, 0.069519, 0.024990 ], [193, -5652.560000, 0.067383, 0.008076, 0.069170 ] ], "n": ["FDJVGXF02HBGX9" ] }, {"p": [[26, -6925.940000, 0.218431, 0.025708, 1.999990 ], [148, -6926.010000, 0.203730, 0.065801, 1.752400 ], [167, -6926.130000, 0.180280, 0.000008, 1.735720 ], [147, -6926.150000, 0.176832, 0.065313, 1.940050 ], [127, -6926.950000, 0.079260, 0.040911, 1.698140 ], [149, -6926.950000, 0.079259, 0.000008, 1.698150 ], [72, -6927.190000, 0.062208, 0.231647, 1.902260 ] ], "n": ["FDJVGXF02G7FCA" ] }, {"p": [[26, -7260.600000, 0.247643, 0.000006, 1.999990 ], [14, -7260.950000, 0.174290, 0.025079, 1.999990 ], [2, -7261.120000, 0.146807, 0.036220, 1.999990 ], [228, -7261.120000, 0.146769, 0.000005, 1.999990 ], [1, -7261.510000, 0.100021, 0.096269, 1.999990 ], [0, -7261.510000, 0.100020, 0.066512, 1.999990 ], [10, -7261.680000, 0.084451, 0.019198, 1.999990 ] ], "n": ["FDJVGXF02FHIUJ" ] }, {"p": [[26, -5411.570000, 1.000000, 0.000006, 0.092871 ] ], "n": ["FDJVGXF02GADLY_rvcmp" ] }, {"p": [[26, -6611.130000, 1.000000, 0.000006, 0.000006 ] ], "n": ["FDJVGXF02I5F8C_rvcmp" ] }, {"p": [[27, -6997.270000, 0.253447, 0.033878, 1.483110 ], [148, -6997.560000, 0.188935, 0.000009, 1.675090 ], [147, -6997.560000, 0.188906, 0.065313, 1.675130 ], [158, -6998.070000, 0.113014, 0.000009, 1.528030 ], [167, -6998.210000, 0.098695, 0.010289, 1.558800 ], [195, -6998.310000, 0.088716, 0.000009, 1.574360 ], [149, -6998.580000, 0.068287, 0.039685, 1.556220 ] ], "n": ["FDJVGXF02HRFXB_rvcmp" ] }, {"p": [[27, -8604.500000, 0.232391, 0.033632, 0.205524 ], [190, -8604.530000, 0.224145, 0.014113, 0.211015 ], [40, -8604.580000, 0.213555, 0.046417, 0.198717 ], [188, -8604.900000, 0.155565, 0.035186, 0.206690 ], [189, -8605.190000, 0.116164, 0.084528, 0.203818 ], [38, -8606.530000, 0.030430, 0.053042, 0.215546 ], [26, -8606.620000, 0.027749, 0.068494, 0.223648 ] ], "n": ["FDJVGXF02JCGD5_rvcmp" ] }, {"p": [[27, -1571.160000, 0.423882, 0.033936, 0.000009 ], [161, -1572.460000, 0.116114, 0.000008, 0.018341 ], [18, -1572.650000, 0.095536, 0.005683, 0.017612 ], [20, -1572.650000, 0.095433, 0.000007, 0.018227 ], [21, -1572.680000, 0.093169, 0.000009, 0.018237 ], [35, -1572.730000, 0.087956, 0.000006, 0.000005 ], [34, -1572.740000, 0.087911, 0.014780, 0.000010 ] ], "n": ["FDJVGXF02FIK4U" ] }, {"p": [[27, -5996.910000, 0.608052, 0.031022, 0.209381 ], [33, -5999.060000, 0.071095, 0.004928, 0.234467 ], [34, -5999.070000, 0.070276, 0.011819, 0.233997 ], [35, -5999.100000, 0.068558, 0.000006, 0.235870 ], [29, -5999.100000, 0.068192, 0.044151, 0.235636 ], [32, -5999.110000, 0.067799, 0.015226, 0.237038 ], [28, -5999.500000, 0.046028, 0.045841, 0.238133 ] ], "n": ["FDJVGXF02HLE4V_rvcmp" ] }, {"p": [[27, -7498.070000, 0.773853, 0.029961, 0.124147 ], [171, -7500.180000, 0.094002, 0.023431, 0.120473 ], [190, -7500.510000, 0.067188, 0.031155, 0.127315 ], [191, -7500.550000, 0.064956, 0.000504, 0.128798 ] ], "n": ["FDJVGXF02GY2VP" ] }, {"p": [[27, -4260.490000, 1.000000, 0.020931, 0.177290 ] ], "n": ["FDJVGXF02JD9QK" ] }, {"p": [[27, -8439.180000, 0.671244, 0.011931, 0.268882 ], [40, -8440.190000, 0.245369, 0.041956, 0.259400 ], [191, -8442.100000, 0.036078, 0.011768, 0.279196 ], [192, -8442.200000, 0.032632, 0.000005, 0.283581 ], [171, -8443.000000, 0.014677, 0.034630, 0.283123 ] ], "n": ["FDJVGXF02HSMJ1" ] }, {"p": [[27, -7207.070000, 1.000000, 0.003339, 0.288104 ] ], "n": ["FDJVGXF02GGOMJ" ] }, {"p": [[27, -8687.080000, 0.990522, 0.000007, 0.390029 ], [202, -8691.730000, 0.009478, 0.008314, 0.374407 ] ], "n": ["FDJVGXF02IYT0M" ] }, {"p": [[27, -9121.000000, 1.000000, 0.000009, 0.381143 ] ], "n": ["FDJVGXF02F41OT" ] }, {"p": [[27, -8009.940000, 0.606203, 0.000009, 0.317782 ], [40, -8011.010000, 0.207043, 0.024640, 0.302844 ], [190, -8012.210000, 0.062745, 0.025414, 0.301465 ], [39, -8012.700000, 0.038257, 0.000006, 0.297917 ], [191, -8012.720000, 0.037686, 0.005256, 0.305983 ], [171, -8012.870000, 0.032183, 0.034630, 0.310658 ], [181, -8013.580000, 0.015883, 0.000009, 0.334003 ] ], "n": ["FDJVGXF02F79AQ" ] }, {"p": [[28, -6002.150000, 0.321403, 0.048759, 0.089313 ], [34, -6002.160000, 0.321227, 0.000007, 0.089318 ], [33, -6002.160000, 0.321019, 0.020031, 0.089313 ], [35, -6004.620000, 0.027424, 0.000006, 0.097160 ], [226, -6006.810000, 0.003042, 0.017021, 0.097414 ], [31, -6006.850000, 0.002942, 0.000619, 0.116007 ], [30, -6006.850000, 0.002942, 0.000383, 0.116008 ] ], "n": ["FDJVGXF02IWIIX" ] }, {"p": [[28, -5567.750000, 0.215476, 0.036690, 0.132300 ], [33, -5568.070000, 0.156918, 0.020031, 0.142446 ], [34, -5568.070000, 0.156843, 0.000007, 0.142451 ], [29, -5568.090000, 0.153380, 0.043845, 0.141625 ], [32, -5568.110000, 0.151177, 0.015226, 0.143719 ], [40, -5568.320000, 0.121780, 0.060079, 0.119331 ], [31, -5569.330000, 0.044425, 0.001925, 0.154812 ] ], "n": ["FDJVGXF02I2UCU_rvcmp" ] }, {"p": [[28, -5402.340000, 0.190944, 0.036250, 0.142247 ], [27, -5402.370000, 0.185119, 0.048070, 0.138197 ], [34, -5402.580000, 0.150901, 0.003675, 0.152153 ], [33, -5402.660000, 0.139037, 0.020031, 0.155099 ], [40, -5402.770000, 0.124176, 0.052809, 0.127934 ], [29, -5402.900000, 0.109923, 0.037679, 0.154215 ], [32, -5402.990000, 0.099899, 0.015226, 0.159430 ] ], "n": ["FDJVGXF02JND44" ] }, {"p": [[28, -8283.440000, 0.843194, 0.020592, 0.101167 ], [226, -8286.010000, 0.065131, 0.013855, 0.097635 ], [210, -8286.590000, 0.036393, 0.010276, 0.113954 ], [34, -8287.370000, 0.016660, 0.001120, 0.121478 ], [205, -8287.620000, 0.012935, 0.037510, 0.128102 ], [208, -8287.630000, 0.012850, 0.023926, 0.129311 ], [209, -8287.630000, 0.012837, 0.000007, 0.129456 ] ], "n": ["FDJVGXF02FZ3A2_rvcmp", "FDJVGXF02GGF3J_rvcmp" ] }, {"p": [[28, -7908.490000, 0.851074, 0.020592, 0.100231 ], [226, -7911.140000, 0.060050, 0.014200, 0.097079 ], [210, -7911.720000, 0.033618, 0.009992, 0.114361 ], [34, -7912.420000, 0.016656, 0.001113, 0.121417 ], [205, -7912.680000, 0.012922, 0.037573, 0.128437 ], [208, -7912.680000, 0.012846, 0.023949, 0.129641 ], [209, -7912.680000, 0.012834, 0.000007, 0.129789 ] ], "n": ["FDJVGXF02HKR3S_rvcmp" ] }, {"p": [[28, -8001.940000, 0.670792, 0.008204, 0.069713 ], [196, -8002.680000, 0.320324, 0.024572, 0.088784 ], [171, -8006.270000, 0.008884, 0.012956, 0.098902 ] ], "n": ["FDJVGXF02HF7N8" ] }, {"p": [[29, -7511.910000, 0.267450, 0.016925, 0.215123 ], [190, -7512.370000, 0.168526, 0.034335, 0.226125 ], [191, -7512.370000, 0.168504, 0.000008, 0.226130 ], [171, -7512.370000, 0.168476, 0.034630, 0.226126 ], [40, -7512.880000, 0.100793, 0.061983, 0.221019 ], [38, -7513.040000, 0.085722, 0.027883, 0.219588 ], [192, -7513.790000, 0.040530, 0.003921, 0.237054 ] ], "n": ["FDJVGXF02HR1AU" ] }, {"p": [[29, -5546.890000, 0.212531, 0.015123, 0.294242 ], [33, -5547.210000, 0.153198, 0.000010, 0.308997 ], [32, -5547.210000, 0.153170, 0.015226, 0.309001 ], [28, -5547.220000, 0.152332, 0.039116, 0.298598 ], [34, -5547.270000, 0.144181, 0.000007, 0.309705 ], [31, -5547.720000, 0.092294, 0.001925, 0.322318 ], [30, -5547.720000, 0.092294, 0.001608, 0.322315 ] ], "n": ["FDJVGXF02FM12Y_rvcmp" ] }, {"p": [[31, -6111.430000, 0.215266, 0.000008, 0.198255 ], [30, -6111.430000, 0.215266, 0.000006, 0.198255 ], [32, -6111.430000, 0.215191, 0.000007, 0.198252 ], [29, -6112.170000, 0.102499, 0.046698, 0.201965 ], [33, -6112.170000, 0.102485, 0.000010, 0.201973 ], [28, -6112.480000, 0.074854, 0.046673, 0.202964 ], [34, -6112.490000, 0.074439, 0.000007, 0.204785 ] ], "n": ["FDJVGXF02F1T1E" ] }, {"p": [[31, -3533.880000, 0.190347, 0.000008, 0.161841 ], [30, -3533.880000, 0.190347, 0.000006, 0.161841 ], [32, -3533.880000, 0.190278, 0.000007, 0.161840 ], [152, -3533.900000, 0.185908, 0.007319, 0.145002 ], [33, -3534.720000, 0.082520, 0.000010, 0.166522 ], [29, -3534.720000, 0.082519, 0.046702, 0.166513 ], [28, -3534.770000, 0.078080, 0.036506, 0.151192 ] ], "n": ["FDJVGXF02GZV73_rvcmp" ] }, {"p": [[31, -4990.540000, 0.191853, 0.000008, 0.158338 ], [30, -4990.540000, 0.191853, 0.000006, 0.158338 ], [32, -4990.540000, 0.191789, 0.000007, 0.158336 ], [27, -4990.870000, 0.138472, 0.050812, 0.136299 ], [34, -4991.050000, 0.114904, 0.006488, 0.151965 ], [33, -4991.300000, 0.090037, 0.017815, 0.158886 ], [189, -4991.400000, 0.081093, 0.042579, 0.120649 ] ], "n": ["FDJVGXF02HYZ7D_rvcmp" ] }, {"p": [[31, -4010.530000, 0.239133, 0.000008, 0.138819 ], [30, -4010.530000, 0.239133, 0.000006, 0.138819 ], [32, -4010.530000, 0.238998, 0.000007, 0.138820 ], [29, -4011.640000, 0.078965, 0.046702, 0.145037 ], [33, -4011.640000, 0.078962, 0.000010, 0.145033 ], [34, -4011.870000, 0.062409, 0.000007, 0.146095 ], [28, -4011.870000, 0.062400, 0.048759, 0.146104 ] ], "n": ["FDJVGXF02FTMUL" ] }, {"p": [[34, -6200.400000, 0.215165, 0.011973, 0.165627 ], [35, -6200.480000, 0.199242, 0.000010, 0.169699 ], [27, -6200.480000, 0.199210, 0.070440, 0.169695 ], [195, -6200.880000, 0.133597, 0.000005, 0.174880 ], [194, -6200.880000, 0.133487, 0.006696, 0.174881 ], [196, -6201.320000, 0.085966, 0.000008, 0.176500 ], [33, -6202.260000, 0.033333, 0.012289, 0.169455 ] ], "n": ["FDJVGXF02HZX8C_rvcmp" ] }, {"p": [[34, -4967.710000, 0.336158, 0.010008, 0.034642 ], [35, -4968.060000, 0.236923, 0.002288, 0.035301 ], [196, -4968.250000, 0.195730, 0.008752, 0.027352 ], [195, -4969.060000, 0.087365, 0.005075, 0.034321 ], [33, -4969.500000, 0.056013, 0.020031, 0.042245 ], [194, -4969.620000, 0.049879, 0.006696, 0.039136 ], [38, -4969.890000, 0.037933, 0.048377, 0.040427 ] ], "n": ["FDJVGXF02JC28Z_rvcmp", "FDJVGXF02GOQPN" ] }, {"p": [[34, -5002.300000, 0.336076, 0.010011, 0.034465 ], [35, -5002.650000, 0.236775, 0.002287, 0.035109 ], [196, -5002.830000, 0.196510, 0.008755, 0.027205 ], [195, -5003.640000, 0.087360, 0.005080, 0.034139 ], [33, -5004.090000, 0.055751, 0.020031, 0.042037 ], [194, -5004.210000, 0.049737, 0.006696, 0.038936 ], [38, -5004.480000, 0.037791, 0.048402, 0.040207 ] ], "n": ["FDJVGXF02JIRJ4" ] }, {"p": [[34, -4870.680000, 0.278964, 0.010175, 0.026665 ], [196, -4871.000000, 0.203673, 0.008686, 0.018634 ], [35, -4871.040000, 0.194108, 0.002473, 0.026963 ], [27, -4871.150000, 0.174572, 0.070440, 0.027890 ], [195, -4872.010000, 0.073982, 0.005362, 0.025552 ], [33, -4872.680000, 0.037924, 0.020031, 0.034892 ], [194, -4872.710000, 0.036778, 0.006696, 0.030976 ] ], "n": ["FDJVGXF02GBL2M_rvcmp" ] }, {"p": [[34, -8905.190000, 0.243922, 0.008595, 0.127311 ], [27, -8905.660000, 0.153147, 0.065120, 0.126718 ], [35, -8905.750000, 0.138988, 0.000006, 0.130708 ], [195, -8905.870000, 0.123724, 0.007106, 0.133348 ], [196, -8905.880000, 0.122123, 0.003329, 0.130759 ], [26, -8905.950000, 0.114551, 0.097406, 0.134219 ], [28, -8906.050000, 0.103546, 0.042894, 0.127088 ] ], "n": ["FDJVGXF02H5LYX" ] }, {"p": [[34, -3283.190000, 0.304203, 0.006091, 0.042618 ], [28, -3283.890000, 0.151312, 0.045537, 0.040033 ], [33, -3283.990000, 0.137071, 0.020031, 0.044313 ], [35, -3284.070000, 0.126803, 0.000006, 0.048957 ], [27, -3284.070000, 0.126734, 0.070439, 0.048956 ], [195, -3284.570000, 0.076946, 0.000009, 0.054388 ], [194, -3284.570000, 0.076931, 0.006696, 0.054389 ] ], "n": ["FDJVGXF02FMWSU" ] }, {"p": [[34, -3598.420000, 0.608756, 0.005974, 0.000007 ], [33, -3599.500000, 0.207032, 0.020031, 0.000009 ], [35, -3599.910000, 0.137020, 0.000010, 0.000007 ], [32, -3602.060000, 0.016032, 0.015226, 0.004413 ], [195, -3602.240000, 0.013395, 0.000005, 0.008273 ], [194, -3602.240000, 0.013389, 0.006696, 0.008274 ], [38, -3603.360000, 0.004376, 0.076827, 0.009645 ] ], "n": ["FDJVGXF02I4R6Q_rvcmp" ] }, {"p": [[35, -3262.850000, 0.174070, 0.013080, 0.078704 ], [195, -3262.850000, 0.174055, 0.000009, 0.078694 ], [194, -3262.850000, 0.174020, 0.006696, 0.078692 ], [27, -3262.880000, 0.168677, 0.051545, 0.074268 ], [196, -3263.040000, 0.143502, 0.000008, 0.078468 ], [34, -3263.120000, 0.132899, 0.014780, 0.078731 ], [193, -3264.520000, 0.032776, 0.016731, 0.080589 ] ], "n": ["FDJVGXF02GZ37H" ] }, {"p": [[36, -3772.560000, 0.210414, 0.000009, 0.017435 ], [38, -3772.560000, 0.209748, 0.000007, 0.017434 ], [37, -3772.570000, 0.208940, 0.002319, 0.017435 ], [194, -3773.160000, 0.115617, 0.000007, 0.017522 ], [193, -3773.160000, 0.115574, 0.016731, 0.017522 ], [35, -3773.570000, 0.076248, 0.013078, 0.017531 ], [27, -3773.760000, 0.063460, 0.070440, 0.017397 ] ], "n": ["FDJVGXF02G5S7D" ] }, {"p": [[37, -2436.440000, 0.182449, 0.001061, 0.014078 ], [36, -2436.440000, 0.182444, 0.000407, 0.014086 ], [38, -2436.440000, 0.182435, 0.000008, 0.014079 ], [191, -2436.750000, 0.134671, 0.000009, 0.000006 ], [193, -2436.940000, 0.110664, 0.016731, 0.014104 ], [194, -2436.940000, 0.110641, 0.000007, 0.014104 ], [192, -2437.080000, 0.096697, 0.000005, 0.010894 ] ], "n": ["FDJVGXF02H01K4_rvcmp" ] }, {"p": [[37, -2910.280000, 0.207772, 0.001042, 0.011190 ], [36, -2910.280000, 0.207765, 0.000374, 0.011192 ], [38, -2910.280000, 0.207753, 0.000008, 0.011191 ], [194, -2910.850000, 0.117601, 0.000007, 0.011166 ], [193, -2910.850000, 0.117564, 0.016731, 0.011166 ], [35, -2911.260000, 0.077372, 0.013078, 0.010988 ], [27, -2911.450000, 0.064173, 0.070440, 0.010660 ] ], "n": ["FDJVGXF02F7PYV_rvcmp" ] }, {"p": [[38, -7746.750000, 0.487263, 0.058233, 0.106403 ], [192, -7748.360000, 0.097310, 0.021642, 0.133163 ], [193, -7748.360000, 0.096936, 0.000008, 0.134123 ], [39, -7748.360000, 0.096893, 0.025399, 0.134123 ], [171, -7748.580000, 0.078239, 0.030847, 0.118406 ], [190, -7748.670000, 0.071687, 0.034335, 0.121433 ], [191, -7748.670000, 0.071671, 0.000008, 0.121434 ] ], "n": ["FDJVGXF02JNZMF_rvcmp", "FDJVGXF02JN5X1_rvcmp" ] }, {"p": [[38, -7350.190000, 0.218908, 0.057052, 1.294380 ], [193, -7350.480000, 0.163210, 0.016731, 1.325020 ], [194, -7350.480000, 0.163176, 0.000007, 1.324960 ], [192, -7350.760000, 0.122701, 0.022464, 1.357340 ], [39, -7350.760000, 0.122691, 0.025399, 1.357350 ], [77, -7350.900000, 0.106637, 0.097106, 1.593850 ], [2, -7350.940000, 0.102678, 0.005591, 1.431020 ] ], "n": ["FDJVGXF02FZWSE_rvcmp", "FDJVGXF02F2FD5_rvcmp" ] }, {"p": [[38, -7609.050000, 0.603747, 0.036549, 0.084987 ], [26, -7610.440000, 0.150447, 0.081983, 0.075259 ], [27, -7610.800000, 0.105519, 0.054929, 0.083440 ], [195, -7611.590000, 0.047859, 0.009399, 0.088211 ], [34, -7611.690000, 0.043191, 0.009714, 0.092132 ], [35, -7612.110000, 0.028565, 0.003957, 0.094017 ], [194, -7612.430000, 0.020671, 0.000007, 0.096834 ] ], "n": ["FDJVGXF02GTM9N" ] }, {"p": [[38, -4971.370000, 0.273075, 0.036132, 0.045932 ], [35, -4971.890000, 0.161522, 0.004271, 0.047519 ], [196, -4972.030000, 0.140928, 0.009454, 0.033992 ], [27, -4972.090000, 0.132024, 0.070440, 0.049313 ], [194, -4972.340000, 0.102909, 0.000007, 0.048576 ], [193, -4972.340000, 0.102833, 0.016731, 0.048578 ], [195, -4972.510000, 0.086708, 0.003406, 0.044166 ] ], "n": ["FDJVGXF02FP1V7_rvcmp" ] }, {"p": [[38, -4693.080000, 0.315056, 0.030401, 0.035213 ], [196, -4693.590000, 0.188884, 0.010947, 0.021548 ], [35, -4693.910000, 0.136817, 0.004599, 0.037698 ], [27, -4694.160000, 0.106362, 0.070440, 0.039657 ], [194, -4694.370000, 0.086435, 0.000007, 0.038436 ], [193, -4694.370000, 0.086357, 0.016731, 0.038438 ], [195, -4694.450000, 0.080088, 0.003673, 0.033363 ] ], "n": ["FDJVGXF02IBL60" ] }, {"p": [[38, -6958.180000, 0.597162, 0.018283, 0.108809 ], [196, -6959.020000, 0.257204, 0.028729, 0.095868 ], [37, -6960.530000, 0.057238, 0.002319, 0.116741 ], [36, -6960.530000, 0.057016, 0.001199, 0.116742 ], [205, -6962.000000, 0.013072, 0.017372, 0.111696 ], [35, -6962.190000, 0.010858, 0.001950, 0.125166 ], [194, -6962.560000, 0.007451, 0.000007, 0.127382 ] ], "n": ["FDJVGXF02HJLY3" ] }, {"p": [[39, -8707.690000, 0.211625, 0.025399, 0.201455 ], [192, -8707.690000, 0.211602, 0.022464, 0.201460 ], [193, -8707.690000, 0.211431, 0.000008, 0.201454 ], [191, -8708.290000, 0.115865, 0.000008, 0.204244 ], [190, -8708.290000, 0.115857, 0.034335, 0.204236 ], [40, -8708.430000, 0.100675, 0.072715, 0.193895 ], [38, -8709.550000, 0.032945, 0.045660, 0.185638 ] ], "n": ["FDJVGXF02HIG4B" ] }, {"p": [[39, -7502.810000, 0.314238, 0.010616, 0.126463 ], [191, -7503.530000, 0.152581, 0.004349, 0.123573 ], [171, -7503.700000, 0.129166, 0.034630, 0.124367 ], [190, -7503.700000, 0.129065, 0.034335, 0.124369 ], [192, -7503.750000, 0.123210, 0.011581, 0.128731 ], [193, -7504.210000, 0.077530, 0.000008, 0.134824 ], [40, -7504.250000, 0.074209, 0.078856, 0.125064 ] ], "n": ["FDJVGXF02IJ4J6" ] }, {"p": [[39, -2768.000000, 0.954930, 0.005518, 0.026728 ], [40, -2771.840000, 0.020440, 0.066167, 0.037302 ], [192, -2772.240000, 0.013721, 0.022464, 0.046360 ], [204, -2772.470000, 0.010909, 0.017584, 0.052109 ] ], "n": ["FDJVGXF02INEUV" ] }, {"p": [[39, -8824.530000, 1.000000, 0.003729, 0.037689 ] ], "n": ["FDJVGXF02HQB4H" ] }, {"p": [[40, -8717.400000, 1.000000, 0.061066, 0.064478 ] ], "n": ["FDJVGXF02GI0SH" ] }, {"p": [[40, -6071.990000, 0.724419, 0.056106, 0.075059 ], [205, -6074.190000, 0.079864, 0.022906, 0.089484 ], [171, -6074.400000, 0.064824, 0.019804, 0.085194 ], [196, -6074.810000, 0.043377, 0.040536, 0.083482 ], [192, -6074.990000, 0.036197, 0.002252, 0.095943 ], [191, -6075.050000, 0.034098, 0.015648, 0.097229 ], [190, -6075.730000, 0.017220, 0.026526, 0.092286 ] ], "n": ["FDJVGXF02F73YJ_rvcmp" ] }, {"p": [[40, -6275.960000, 0.735533, 0.056166, 0.072167 ], [205, -6278.220000, 0.076600, 0.022873, 0.086627 ], [171, -6278.410000, 0.063319, 0.019808, 0.081752 ], [196, -6278.810000, 0.042517, 0.040511, 0.080388 ], [192, -6279.040000, 0.033896, 0.002300, 0.092250 ], [191, -6279.100000, 0.031767, 0.015648, 0.093511 ], [190, -6279.770000, 0.016369, 0.026347, 0.088426 ] ], "n": ["FDJVGXF02HKU98_rvcmp" ] }, {"p": [[40, -5329.310000, 0.785647, 0.050996, 0.101473 ], [189, -5331.610000, 0.079081, 0.066819, 0.116211 ], [190, -5332.230000, 0.042512, 0.021585, 0.131361 ], [191, -5332.590000, 0.029601, 0.010289, 0.136359 ], [192, -5332.650000, 0.027904, 0.000005, 0.138257 ], [171, -5332.760000, 0.025128, 0.034630, 0.136853 ], [38, -5333.670000, 0.010126, 0.042268, 0.150200 ] ], "n": ["FDJVGXF02JFU7C" ] }, {"p": [[40, -5834.380000, 0.649722, 0.049836, 0.119512 ], [38, -5836.550000, 0.074270, 0.000009, 0.177799 ], [37, -5836.550000, 0.074001, 0.002319, 0.177800 ], [36, -5836.550000, 0.073718, 0.001199, 0.177802 ], [190, -5836.910000, 0.051402, 0.022830, 0.141886 ], [39, -5837.180000, 0.039503, 0.008302, 0.152705 ], [192, -5837.230000, 0.037383, 0.007342, 0.149224 ] ], "n": ["FDJVGXF02IURA9_rvcmp" ] }, {"p": [[40, -5785.840000, 0.331542, 0.049289, 0.109788 ], [191, -5786.200000, 0.231332, 0.005069, 0.127960 ], [190, -5786.480000, 0.176246, 0.034335, 0.131202 ], [171, -5786.480000, 0.176046, 0.034630, 0.131212 ], [172, -5787.770000, 0.048471, 0.000008, 0.138435 ], [175, -5788.710000, 0.018860, 0.004370, 0.141867 ], [27, -5788.790000, 0.017503, 0.014940, 0.149184 ] ], "n": ["FDJVGXF02HLTR9" ] }, {"p": [[40, -6090.460000, 0.285142, 0.039512, 0.219815 ], [190, -6090.990000, 0.167363, 0.034335, 0.233138 ], [191, -6090.990000, 0.167317, 0.000008, 0.233138 ], [171, -6090.990000, 0.167257, 0.034630, 0.233138 ], [28, -6091.160000, 0.141760, 0.000006, 0.234861 ], [192, -6092.180000, 0.050987, 0.000005, 0.245038 ], [189, -6093.110000, 0.020175, 0.096145, 0.235363 ] ], "n": ["FDJVGXF02GK5VU_rvcmp", "FDJVGXF02FXNNH_rvcmp", "FDJVGXF02FJUZ3_rvcmp", "FDJVGXF02I05DU_rvcmp" ] }, {"p": [[40, -7350.060000, 1.000000, 0.034072, 0.118787 ] ], "n": ["FDJVGXF02JECP1_rvcmp" ] }, {"p": [[40, -9680.090000, 0.332769, 0.015512, 0.306461 ], [177, -9680.720000, 0.177336, 0.000051, 0.333465 ], [29, -9680.900000, 0.148034, 0.023035, 0.303217 ], [38, -9681.160000, 0.114688, 0.047016, 0.310416 ], [33, -9681.520000, 0.079960, 0.007462, 0.314035 ], [174, -9681.530000, 0.078822, 0.002435, 0.346080 ], [176, -9681.670000, 0.068391, 0.006160, 0.339945 ] ], "n": ["FDJVGXF02FUALA" ] }, {"p": [[50, -4467.160000, 0.269919, 0.000008, 1.140440 ], [148, -4467.870000, 0.132246, 0.139119, 1.125730 ], [127, -4467.890000, 0.130056, 0.040911, 1.144600 ], [149, -4467.890000, 0.130043, 0.000008, 1.144600 ], [51, -4467.890000, 0.129643, 0.200764, 1.168910 ], [125, -4468.050000, 0.109934, 0.057709, 1.178520 ], [57, -4468.170000, 0.098159, 0.000008, 1.176020 ] ], "n": ["FDJVGXF02JWXKC_rvcmp" ] }, {"p": [[65, -5480.060000, 0.316869, 0.103998, 1.999990 ], [66, -5480.910000, 0.135035, 0.000007, 1.999990 ], [64, -5480.910000, 0.135027, 0.347492, 1.999990 ], [67, -5481.120000, 0.109049, 0.264348, 1.999990 ], [0, -5481.180000, 0.103176, 0.000008, 1.999990 ], [1, -5481.210000, 0.100422, 0.096269, 1.999990 ], [2, -5481.210000, 0.100421, 0.000009, 1.999990 ] ], "n": ["FDJVGXF02H64TH_rvcmp" ] }, {"p": [[65, -7562.270000, 0.305976, 0.094073, 1.999990 ], [5, -7563.220000, 0.119135, 0.000001, 1.999990 ], [6, -7563.220000, 0.119135, 0.019580, 1.999990 ], [7, -7563.220000, 0.119129, 0.000008, 1.999990 ], [4, -7563.280000, 0.112213, 0.076256, 1.999990 ], [9, -7563.280000, 0.112210, 0.032431, 1.999990 ], [10, -7563.280000, 0.112201, 0.000008, 1.999990 ] ], "n": ["FDJVGXF02GV266_rvcmp" ] }, {"p": [[65, -7300.620000, 0.765762, 0.054968, 1.801190 ], [22, -7302.750000, 0.091098, 0.028187, 1.770850 ], [226, -7303.260000, 0.054883, 0.000008, 1.856390 ], [66, -7303.440000, 0.045630, 0.000007, 1.999990 ], [13, -7304.520000, 0.015634, 0.000009, 1.999990 ], [227, -7304.650000, 0.013695, 0.009919, 1.964270 ], [17, -7304.680000, 0.013297, 0.049256, 1.976680 ] ], "n": ["FDJVGXF02FK6DL" ] }, {"p": [[65, -5605.520000, 0.516474, 0.030546, 1.999990 ], [64, -5607.290000, 0.087894, 0.347492, 1.999990 ], [66, -5607.290000, 0.087892, 0.000007, 1.999990 ], [142, -5607.420000, 0.077059, 0.000001, 1.999990 ], [143, -5607.420000, 0.077058, 0.000008, 1.999990 ], [141, -5607.420000, 0.077056, 0.003648, 1.999990 ], [0, -5607.430000, 0.076568, 0.000008, 1.999990 ] ], "n": ["FDJVGXF02HFB4T" ] }, {"p": [[65, -5694.100000, 0.922325, 0.000010, 1.999990 ], [13, -5698.150000, 0.016130, 0.000009, 1.999990 ], [6, -5698.270000, 0.014342, 0.019580, 1.999990 ], [7, -5698.270000, 0.014341, 0.000008, 1.999990 ], [67, -5698.470000, 0.011690, 0.264348, 1.999990 ], [9, -5698.570000, 0.010639, 0.000008, 1.999990 ], [10, -5698.580000, 0.010533, 0.000008, 1.999990 ] ], "n": ["FDJVGXF02HK3GU_rvcmp" ] }, {"p": [[85, -7444.690000, 0.434812, 0.000005, 0.328240 ], [86, -7445.070000, 0.299056, 0.023547, 0.308996 ], [84, -7445.180000, 0.266133, 0.000005, 0.330565 ] ], "n": ["FDJVGXF02F4YCW_rvcmp" ] }, {"p": [[91, -5129.930000, 0.268737, 0.018576, 0.075928 ], [94, -5129.940000, 0.267149, 0.039199, 0.075962 ], [95, -5129.940000, 0.267099, 0.000008, 0.075961 ], [96, -5131.090000, 0.084158, 0.027500, 0.079042 ], [97, -5131.090000, 0.084098, 0.000005, 0.079041 ], [92, -5132.860000, 0.014400, 0.005357, 0.087468 ], [93, -5132.860000, 0.014359, 0.002453, 0.087468 ] ], "n": ["FDJVGXF02GMIRF" ] }, {"p": [[91, -3746.990000, 0.799291, 0.013473, 0.000006 ], [103, -3750.150000, 0.033957, 0.000007, 0.009896 ], [104, -3750.150000, 0.033956, 0.000005, 0.009896 ], [106, -3750.160000, 0.033429, 0.007986, 0.009899 ], [107, -3750.160000, 0.033428, 0.000008, 0.009899 ], [102, -3750.180000, 0.032970, 0.000005, 0.009909 ], [98, -3750.180000, 0.032969, 0.034683, 0.009899 ] ], "n": ["FDJVGXF02F7DBV", "FDJVGXF02HOLWU" ] }, {"p": [[95, -7947.020000, 0.293231, 0.005215, 0.051022 ], [96, -7947.380000, 0.204946, 0.027500, 0.051983 ], [97, -7947.380000, 0.204764, 0.000005, 0.051982 ], [91, -7947.700000, 0.148563, 0.020097, 0.053090 ], [94, -7947.700000, 0.148496, 0.039199, 0.053094 ] ], "n": ["FDJVGXF02IYHPQ_rvcmp", "FDJVGXF02FRA7S_rvcmp" ] }, {"p": [[95, -8655.990000, 0.282593, 0.000008, 0.045604 ], [91, -8655.990000, 0.282537, 0.020097, 0.045599 ], [94, -8655.990000, 0.282424, 0.039199, 0.045604 ], [96, -8657.300000, 0.076242, 0.027500, 0.047129 ], [97, -8657.300000, 0.076204, 0.000005, 0.047133 ] ], "n": ["FDJVGXF02JW1VN_rvcmp" ] }, {"p": [[97, -8417.050000, 0.701949, 0.013322, 0.018873 ], [98, -8418.850000, 0.115723, 0.000006, 0.020220 ], [90, -8418.850000, 0.115660, 0.040800, 0.020222 ], [95, -8420.090000, 0.033348, 0.008662, 0.022053 ], [96, -8420.090000, 0.033320, 0.027500, 0.022057 ] ], "n": ["FDJVGXF02IRF33_rvcmp", "FDJVGXF02H2CA8_rvcmp" ] }, {"p": [[98, -8243.740000, 0.939902, 0.010649, 0.050236 ], [91, -8246.780000, 0.044717, 0.000010, 0.057048 ], [97, -8247.850000, 0.015381, 0.012887, 0.054798 ] ], "n": ["FDJVGXF02JDJ3Y" ] }, {"p": [[98, -6473.070000, 0.296378, 0.010994, 0.010574 ], [99, -6473.080000, 0.293317, 0.016789, 0.010411 ], [97, -6473.960000, 0.121810, 0.021481, 0.011975 ], [90, -6473.960000, 0.121788, 0.040800, 0.011966 ], [101, -6474.730000, 0.056252, 0.018811, 0.011250 ], [102, -6474.730000, 0.056190, 0.000005, 0.011256 ], [100, -6474.770000, 0.054266, 0.040628, 0.011195 ] ], "n": ["FDJVGXF02JFCH8" ] }, {"p": [[98, -8174.820000, 0.372423, 0.009859, 0.051084 ], [91, -8175.240000, 0.243749, 0.004144, 0.053154 ], [96, -8175.650000, 0.162698, 0.022518, 0.048854 ], [95, -8175.960000, 0.118840, 0.006718, 0.050222 ], [97, -8176.110000, 0.102290, 0.000005, 0.051784 ] ], "n": ["FDJVGXF02GAGL4" ] }, {"p": [[99, -8255.900000, 1.000000, 0.016130, 0.024705 ] ], "n": ["FDJVGXF02JPZP3_rvcmp" ] }, {"p": [[101, -8561.070000, 0.404143, 0.003055, 0.103047 ], [100, -8561.380000, 0.298555, 0.040056, 0.106976 ], [99, -8561.380000, 0.297302, 0.047715, 0.107554 ] ], "n": ["FDJVGXF02F8JAM_rvcmp" ] }, {"p": [[101, -8581.620000, 0.375420, 0.002466, 0.063415 ], [99, -8581.810000, 0.312447, 0.047715, 0.065692 ], [100, -8581.810000, 0.312132, 0.040628, 0.065699 ] ], "n": ["FDJVGXF02IZ8HO_rvcmp" ] }, {"p": [[101, -7308.440000, 0.350744, 0.001727, 0.057249 ], [99, -7308.520000, 0.324792, 0.047715, 0.058865 ], [100, -7308.520000, 0.324463, 0.040628, 0.058871 ] ], "n": ["FDJVGXF02HMEKU" ] }, {"p": [[107, -5605.260000, 0.489634, 0.010331, 0.048208 ], [98, -5606.250000, 0.181153, 0.029751, 0.046539 ], [102, -5606.810000, 0.103951, 0.003018, 0.049365 ], [101, -5606.910000, 0.094418, 0.018811, 0.050367 ], [99, -5607.570000, 0.048836, 0.046062, 0.054384 ], [100, -5607.580000, 0.048297, 0.040628, 0.054565 ], [111, -5607.940000, 0.033710, 0.000007, 0.055951 ] ], "n": ["FDJVGXF02GV8P1_rvcmp" ] }, {"p": [[107, -5467.180000, 0.339528, 0.009435, 0.032819 ], [98, -5467.340000, 0.289782, 0.029024, 0.027280 ], [101, -5468.250000, 0.115754, 0.018811, 0.030809 ], [102, -5468.250000, 0.115751, 0.000005, 0.030809 ], [99, -5468.840000, 0.064380, 0.045718, 0.033474 ], [100, -5468.860000, 0.063261, 0.040628, 0.033599 ], [111, -5470.560000, 0.011543, 0.000007, 0.040102 ] ], "n": ["FDJVGXF02GLGLD_rvcmp" ] }, {"p": [[109, -2419.100000, 0.164695, 0.001310, 0.075243 ], [108, -2419.100000, 0.164691, 0.000001, 0.075246 ], [110, -2419.100000, 0.164653, 0.000008, 0.075238 ], [102, -2419.300000, 0.135787, 0.006517, 0.060552 ], [106, -2419.390000, 0.123556, 0.007986, 0.074774 ], [103, -2419.390000, 0.123556, 0.007523, 0.074784 ], [104, -2419.400000, 0.123062, 0.001437, 0.074940 ] ], "n": ["FDJVGXF02FDXJ6" ] }, {"p": [[126, -3861.970000, 0.216323, 0.092966, 0.254083 ], [125, -3862.040000, 0.201438, 0.057709, 0.266765 ], [127, -3862.040000, 0.201429, 0.000010, 0.266761 ], [29, -3862.510000, 0.126659, 0.028941, 0.283561 ], [27, -3862.670000, 0.107666, 0.010563, 0.308719 ], [32, -3862.970000, 0.079372, 0.014524, 0.290615 ], [149, -3863.140000, 0.067112, 0.004653, 0.292897 ] ], "n": ["FDJVGXF02JN8LI_rvcmp", "FDJVGXF02HZF54_rvcmp", "FDJVGXF02HIWQK_rvcmp" ] }, {"p": [[126, -3804.290000, 0.229009, 0.092161, 0.241375 ], [125, -3804.380000, 0.210217, 0.057709, 0.254518 ], [127, -3804.380000, 0.210190, 0.000010, 0.254521 ], [29, -3804.960000, 0.117731, 0.029334, 0.271793 ], [27, -3805.160000, 0.095777, 0.011833, 0.297476 ], [32, -3805.440000, 0.072876, 0.014203, 0.279233 ], [149, -3805.560000, 0.064199, 0.002802, 0.279914 ] ], "n": ["FDJVGXF02GW68B_rvcmp", "FDJVGXF02FQ974_rvcmp", "FDJVGXF02GRXS9_rvcmp" ] }, {"p": [[131, -4371.210000, 0.143902, 0.000001, 0.007463 ], [138, -4371.210000, 0.143899, 0.001320, 0.007463 ], [139, -4371.210000, 0.143807, 0.000005, 0.007463 ], [137, -4371.210000, 0.143746, 0.004966, 0.007463 ], [132, -4371.210000, 0.143682, 0.010863, 0.007463 ], [135, -4371.230000, 0.140550, 0.005910, 0.007466 ], [136, -4371.230000, 0.140414, 0.003788, 0.007466 ] ], "n": ["FDJVGXF02JNX31" ] }, {"p": [[131, -4400.960000, 0.300339, 0.000001, 0.000006 ], [139, -4400.960000, 0.300054, 0.000005, 0.000006 ], [138, -4400.960000, 0.299023, 0.001320, 0.000006 ], [130, -4402.300000, 0.078395, 0.010632, 0.000006 ], [137, -4403.730000, 0.018701, 0.004966, 0.000006 ], [136, -4406.090000, 0.001772, 0.000007, 0.007187 ], [135, -4406.120000, 0.001715, 0.005909, 0.006962 ] ], "n": ["FDJVGXF02G8JFN_rvcmp" ] }, {"p": [[131, -8922.160000, 0.145126, 0.000001, 0.000006 ], [138, -8922.160000, 0.145121, 0.001320, 0.000006 ], [139, -8922.160000, 0.144797, 0.000005, 0.000006 ], [137, -8922.160000, 0.144421, 0.004966, 0.000006 ], [132, -8922.160000, 0.144150, 0.010863, 0.000006 ], [135, -8922.200000, 0.138329, 0.005910, 0.000006 ], [136, -8922.210000, 0.138056, 0.003788, 0.000006 ] ], "n": ["FDJVGXF02FYPQO_rvcmp", "FDJVGXF02IZ3MU_rvcmp", "FDJVGXF02H2IL8_rvcmp", "FDJVGXF02H2IMB_rvcmp", "FDJVGXF02JCWU5", "FDJVGXF02F1HYV" ] }, {"p": [[132, -7670.120000, 0.971396, 0.005579, 0.000010 ], [139, -7674.260000, 0.015439, 0.004473, 0.004140 ], [138, -7674.900000, 0.008212, 0.000712, 0.005054 ], [131, -7675.400000, 0.004952, 0.000001, 0.008195 ] ], "n": ["FDJVGXF02GH6E4_rvcmp" ] }, {"p": [[133, -8117.300000, 0.298208, 0.001193, 0.024298 ], [134, -8117.300000, 0.298181, 0.000001, 0.024300 ], [135, -8117.310000, 0.297897, 0.000006, 0.024300 ], [132, -8119.070000, 0.051235, 0.007524, 0.024893 ], [137, -8120.080000, 0.018622, 0.000010, 0.028222 ], [138, -8120.110000, 0.018048, 0.000005, 0.028485 ], [131, -8120.120000, 0.017810, 0.000001, 0.028563 ] ], "n": ["FDJVGXF02HLFOX_rvcmp" ] }, {"p": [[133, -6746.060000, 0.201028, 0.001210, 0.009765 ], [134, -6746.060000, 0.201014, 0.000001, 0.009767 ], [135, -6746.060000, 0.201011, 0.000006, 0.009767 ], [136, -6746.060000, 0.201007, 0.000007, 0.009767 ], [137, -6746.090000, 0.195940, 0.000010, 0.009769 ] ], "n": ["FDJVGXF02F50AW_rvcmp" ] }, {"p": [[133, -5342.910000, 0.695538, 0.000009, 0.011527 ], [132, -5343.980000, 0.239751, 0.005044, 0.007929 ], [139, -5346.500000, 0.019171, 0.004375, 0.012719 ], [130, -5346.960000, 0.012127, 0.007486, 0.010366 ], [138, -5347.000000, 0.011688, 0.001000, 0.015716 ], [134, -5347.070000, 0.010912, 0.000001, 0.017539 ], [131, -5347.080000, 0.010813, 0.000001, 0.017461 ] ], "n": ["FDJVGXF02JZD9F_rvcmp" ] }, {"p": [[134, -7943.200000, 0.201009, 0.000001, 0.016634 ], [133, -7943.200000, 0.201008, 0.000009, 0.016634 ], [135, -7943.200000, 0.201005, 0.000006, 0.016630 ], [136, -7943.200000, 0.201001, 0.000007, 0.016634 ], [137, -7943.220000, 0.195977, 0.000010, 0.016637 ] ], "n": ["FDJVGXF02F9YM2_rvcmp" ] }, {"p": [[134, -8092.110000, 0.201172, 0.000001, 0.012124 ], [135, -8092.110000, 0.201167, 0.000006, 0.012119 ], [136, -8092.110000, 0.201165, 0.000007, 0.012119 ], [133, -8092.110000, 0.200396, 0.002392, 0.012119 ], [137, -8092.130000, 0.196100, 0.000010, 0.012121 ] ], "n": ["FDJVGXF02I2ISR_rvcmp" ] }, {"p": [[134, -6927.760000, 0.201181, 0.000001, 0.004644 ], [135, -6927.760000, 0.201176, 0.000009, 0.004639 ], [136, -6927.760000, 0.201176, 0.000007, 0.004639 ], [133, -6927.760000, 0.200400, 0.002392, 0.004639 ], [137, -6927.780000, 0.196066, 0.000010, 0.004640 ] ], "n": ["FDJVGXF02FFQFZ_rvcmp" ] }, {"p": [[134, -7670.520000, 0.326280, 0.000001, 0.004141 ], [135, -7670.520000, 0.325946, 0.000006, 0.004141 ], [133, -7670.530000, 0.325009, 0.002392, 0.004134 ], [136, -7673.190000, 0.022765, 0.003788, 0.004698 ] ], "n": ["FDJVGXF02H5AA1" ] }, {"p": [[134, -2761.040000, 0.200840, 0.000001, 0.127490 ], [133, -2761.040000, 0.200840, 0.000009, 0.127490 ], [135, -2761.040000, 0.200837, 0.000006, 0.127490 ], [136, -2761.040000, 0.200834, 0.000007, 0.127490 ], [137, -2761.060000, 0.196649, 0.000010, 0.127579 ] ], "n": ["FDJVGXF02F4ONT_rvcmp" ] }, {"p": [[135, -8554.060000, 0.330967, 0.003244, 0.003711 ], [139, -8554.370000, 0.241626, 0.002672, 0.003308 ], [132, -8554.700000, 0.173056, 0.009006, 0.003728 ], [137, -8555.100000, 0.116220, 0.004966, 0.003822 ], [136, -8555.110000, 0.115467, 0.003788, 0.003827 ], [133, -8557.430000, 0.011332, 0.001784, 0.007407 ], [134, -8557.430000, 0.011331, 0.000001, 0.007409 ] ], "n": ["FDJVGXF02JKFMS" ] }, {"p": [[135, -6739.460000, 0.541202, 0.002241, 0.013097 ], [136, -6741.150000, 0.100298, 0.001765, 0.014350 ], [138, -6741.210000, 0.094373, 0.000720, 0.014780 ], [134, -6741.380000, 0.079514, 0.000001, 0.018140 ], [133, -6741.390000, 0.078908, 0.002392, 0.018145 ], [139, -6741.680000, 0.058656, 0.003657, 0.014823 ], [131, -6741.900000, 0.047049, 0.000001, 0.018086 ] ], "n": ["FDJVGXF02INXEC" ] }, {"p": [[136, -7492.540000, 0.435593, 0.001695, 0.013745 ], [139, -7493.020000, 0.270933, 0.004725, 0.014156 ], [135, -7493.930000, 0.108495, 0.004531, 0.016227 ], [137, -7494.410000, 0.067077, 0.000010, 0.016379 ], [132, -7494.530000, 0.059891, 0.009679, 0.017306 ], [138, -7494.720000, 0.049195, 0.000005, 0.017600 ], [131, -7496.440000, 0.008815, 0.000001, 0.021269 ] ], "n": ["FDJVGXF02H5AR0" ] }, {"p": [[136, -3527.770000, 0.381143, 0.000007, 0.151558 ], [135, -3529.040000, 0.106201, 0.005910, 0.164675 ], [137, -3529.040000, 0.106196, 0.000010, 0.164670 ], [133, -3529.090000, 0.101617, 0.001203, 0.165521 ], [131, -3529.090000, 0.101615, 0.000001, 0.165517 ], [134, -3529.090000, 0.101615, 0.000001, 0.165523 ], [138, -3529.090000, 0.101614, 0.001320, 0.165523 ] ], "n": ["FDJVGXF02GOQ6V_rvcmp" ] }, {"p": [[136, -5596.200000, 0.350716, 0.000007, 0.005595 ], [135, -5596.280000, 0.323260, 0.005910, 0.005592 ], [137, -5596.290000, 0.321116, 0.000010, 0.005591 ], [134, -5600.470000, 0.004908, 0.000001, 0.011273 ] ], "n": ["FDJVGXF02GE3K8", "FDJVGXF02IE3VW", "FDJVGXF02F1PNG", "FDJVGXF02GC300" ] }, {"p": [[136, -7108.940000, 0.215617, 0.000007, 0.004382 ], [137, -7109.000000, 0.201138, 0.000010, 0.004384 ], [135, -7109.010000, 0.200772, 0.005910, 0.004384 ], [132, -7109.070000, 0.188985, 0.010863, 0.004386 ], [138, -7109.070000, 0.188660, 0.000005, 0.004387 ], [139, -7113.430000, 0.002415, 0.000005, 0.008801 ], [131, -7113.430000, 0.002413, 0.000001, 0.008809 ] ], "n": ["FDJVGXF02H6ETX_rvcmp" ] }, {"p": [[136, -7767.290000, 0.504201, 0.000007, 0.004094 ], [135, -7767.320000, 0.490648, 0.005909, 0.003867 ], [134, -7771.880000, 0.005151, 0.000001, 0.008219 ] ], "n": ["FDJVGXF02GOLCL" ] }, {"p": [[137, -6020.930000, 0.372440, 0.002578, 0.175789 ], [148, -6021.860000, 0.147041, 0.021756, 0.174258 ], [140, -6021.940000, 0.136566, 0.033626, 0.179127 ], [147, -6022.080000, 0.118044, 0.061400, 0.179586 ], [138, -6022.520000, 0.075840, 0.000005, 0.189862 ], [132, -6022.520000, 0.075819, 0.010863, 0.189867 ], [131, -6022.550000, 0.074250, 0.000001, 0.190179 ] ], "n": ["FDJVGXF02HDW5G" ] }, {"p": [[137, -6130.550000, 0.395932, 0.002575, 0.170351 ], [140, -6131.630000, 0.134159, 0.032648, 0.172398 ], [148, -6131.670000, 0.128346, 0.017524, 0.168068 ], [147, -6131.820000, 0.111152, 0.061465, 0.172279 ], [138, -6132.180000, 0.077375, 0.000005, 0.183917 ], [132, -6132.180000, 0.077353, 0.010863, 0.183917 ], [131, -6132.200000, 0.075683, 0.000001, 0.184224 ] ], "n": ["FDJVGXF02GB37W" ] }, {"p": [[137, -6261.790000, 0.330583, 0.002572, 0.165315 ], [148, -6262.290000, 0.201081, 0.026708, 0.159032 ], [140, -6262.560000, 0.153647, 0.033990, 0.166454 ], [147, -6262.730000, 0.129745, 0.061336, 0.167273 ], [138, -6263.460000, 0.062125, 0.000005, 0.178567 ], [132, -6263.460000, 0.062107, 0.010863, 0.178567 ], [131, -6263.490000, 0.060713, 0.000001, 0.178874 ] ], "n": ["FDJVGXF02IRBO4" ] }, {"p": [[138, -7222.620000, 0.589198, 0.000627, 0.000006 ], [132, -7223.890000, 0.166139, 0.009990, 0.000007 ], [137, -7224.050000, 0.141372, 0.004966, 0.000007 ], [139, -7225.320000, 0.039713, 0.000005, 0.004248 ], [131, -7225.320000, 0.039641, 0.000001, 0.004256 ], [135, -7226.260000, 0.015464, 0.004392, 0.004170 ], [136, -7226.860000, 0.008474, 0.003788, 0.004244 ] ], "n": ["FDJVGXF02FV3L9_rvcmp" ] }, {"p": [[139, -7633.560000, 0.550216, 0.005799, 0.010415 ], [130, -7634.170000, 0.298972, 0.010632, 0.009675 ], [135, -7635.530000, 0.076807, 0.003110, 0.012278 ], [138, -7636.360000, 0.033638, 0.000705, 0.013000 ], [131, -7637.140000, 0.015379, 0.000001, 0.016046 ], [132, -7637.160000, 0.015052, 0.008740, 0.013619 ], [137, -7637.580000, 0.009935, 0.004966, 0.013728 ] ], "n": ["FDJVGXF02HIFVX" ] }, {"p": [[139, -9156.840000, 1.000000, 0.005965, 0.004004 ] ], "n": ["FDJVGXF02INYGX" ] }, {"p": [[139, -2860.610000, 0.454324, 0.005847, 0.000006 ], [130, -2861.410000, 0.204952, 0.009957, 0.000006 ], [140, -2861.430000, 0.201808, 0.000006, 0.000006 ], [132, -2863.180000, 0.034769, 0.005444, 0.010738 ], [135, -2863.190000, 0.034722, 0.002984, 0.010781 ], [137, -2863.190000, 0.034716, 0.002478, 0.010786 ], [136, -2863.190000, 0.034710, 0.001944, 0.010792 ] ], "n": ["FDJVGXF02F4ONT" ] }, {"p": [[139, -7490.420000, 0.247330, 0.001165, 0.010955 ], [136, -7490.480000, 0.234057, 0.000007, 0.012284 ], [131, -7490.480000, 0.234017, 0.000001, 0.012285 ], [138, -7490.480000, 0.232938, 0.001320, 0.012281 ], [135, -7492.440000, 0.032907, 0.004668, 0.011420 ], [137, -7493.000000, 0.018751, 0.004966, 0.013538 ] ], "n": ["FDJVGXF02I63MJ" ] }, {"p": [[140, -7319.090000, 0.386193, 0.005330, 0.013167 ], [139, -7319.300000, 0.312129, 0.007215, 0.018337 ], [130, -7319.620000, 0.226661, 0.010091, 0.018305 ], [132, -7321.490000, 0.034796, 0.006529, 0.020275 ], [135, -7322.060000, 0.019796, 0.003219, 0.022410 ], [138, -7322.390000, 0.014118, 0.000535, 0.021327 ], [137, -7323.200000, 0.006308, 0.004966, 0.021957 ] ], "n": ["FDJVGXF02IZN0T" ] }, {"p": [[140, -7493.150000, 0.158825, 0.000006, 1.999990 ], [2, -7493.170000, 0.155326, 0.036220, 1.999990 ], [228, -7493.170000, 0.155279, 0.000005, 1.999990 ], [148, -7493.190000, 0.152842, 0.000009, 1.999990 ], [147, -7493.190000, 0.152840, 0.065313, 1.999990 ], [0, -7493.490000, 0.112444, 0.066512, 1.999990 ], [1, -7493.490000, 0.112443, 0.096269, 1.999990 ] ], "n": ["FDJVGXF02HX2JJ" ] }, {"p": [[140, -5202.620000, 0.165249, 0.000006, 1.966580 ], [139, -5202.620000, 0.165227, 0.010556, 1.966630 ], [148, -5202.660000, 0.158087, 0.000009, 1.993690 ], [147, -5202.660000, 0.158084, 0.065313, 1.993740 ], [212, -5202.810000, 0.136601, 0.000008, 1.752390 ], [137, -5202.940000, 0.119365, 0.000010, 1.999990 ], [225, -5203.150000, 0.097386, 0.036449, 1.828740 ] ], "n": ["FDJVGXF02JQX9N" ] }, {"p": [[141, -6805.560000, 0.822676, 0.002446, 0.004842 ], [143, -6807.550000, 0.111699, 0.003154, 0.005156 ], [142, -6808.080000, 0.065624, 0.000001, 0.009488 ] ], "n": ["FDJVGXF02HY0KO_rvcmp" ] }, {"p": [[141, -8114.430000, 0.333526, 0.001825, 0.003983 ], [142, -8114.430000, 0.333416, 0.000001, 0.003989 ], [143, -8114.430000, 0.333058, 0.000008, 0.003980 ] ], "n": ["FDJVGXF02GTQW8_rvcmp" ] }, {"p": [[142, -3860.720000, 0.333477, 0.000001, 0.000006 ], [141, -3860.720000, 0.333476, 0.000007, 0.000006 ], [143, -3860.720000, 0.333047, 0.000008, 0.000006 ] ], "n": ["FDJVGXF02H3FB2_rvcmp" ] }, {"p": [[142, -4529.960000, 0.333418, 0.000001, 0.007191 ], [141, -4529.960000, 0.333418, 0.000009, 0.007194 ], [143, -4529.960000, 0.333165, 0.000008, 0.007191 ] ], "n": ["FDJVGXF02GIO3F" ] }, {"p": [[143, -7455.870000, 0.801977, 0.012430, 0.000006 ], [142, -7457.960000, 0.099133, 0.000001, 0.008484 ], [141, -7457.970000, 0.098889, 0.003648, 0.008484 ] ], "n": ["FDJVGXF02GH82N_rvcmp" ] }, {"p": [[145, -7467.460000, 0.263505, 0.000007, 1.999990 ], [144, -7467.780000, 0.191735, 0.100657, 1.999990 ], [146, -7467.780000, 0.191726, 0.000007, 1.999990 ], [6, -7468.480000, 0.095604, 0.000010, 1.999990 ], [5, -7468.480000, 0.095148, 0.000001, 1.999990 ], [7, -7468.480000, 0.095134, 0.000008, 1.999990 ], [147, -7468.830000, 0.067149, 0.000008, 1.999990 ] ], "n": ["FDJVGXF02JJUZH_rvcmp" ] }, {"p": [[147, -4667.850000, 0.182087, 0.048322, 0.556995 ], [171, -4667.910000, 0.170908, 0.012211, 0.404929 ], [148, -4667.950000, 0.164002, 0.032825, 0.518166 ], [190, -4667.980000, 0.159128, 0.019049, 0.434099 ], [149, -4668.300000, 0.115833, 0.063739, 0.400832 ], [189, -4668.330000, 0.112667, 0.096145, 0.467071 ], [191, -4668.490000, 0.095374, 0.000008, 0.454074 ] ], "n": ["FDJVGXF02IOYZU_rvcmp" ] }, {"p": [[148, -7291.320000, 0.203145, 0.090065, 1.447830 ], [56, -7291.420000, 0.185259, 0.035869, 1.282520 ], [22, -7291.450000, 0.179734, 0.028187, 1.493340 ], [13, -7291.670000, 0.143648, 0.000009, 1.434270 ], [225, -7292.060000, 0.097347, 0.036449, 1.551660 ], [149, -7292.070000, 0.096643, 0.010930, 1.419510 ], [52, -7292.090000, 0.094225, 0.017039, 1.454120 ] ], "n": ["FDJVGXF02F2ZWQ" ] }, {"p": [[148, -6911.740000, 0.390936, 0.041908, 1.289100 ], [147, -6911.850000, 0.348873, 0.065313, 1.358800 ], [44, -6913.380000, 0.075662, 0.000005, 1.309500 ], [127, -6913.550000, 0.063982, 0.040911, 1.305380 ], [149, -6913.550000, 0.063982, 0.000008, 1.305370 ], [126, -6914.270000, 0.031164, 0.071899, 1.379690 ], [73, -6914.470000, 0.025401, 0.043072, 1.469550 ] ], "n": ["FDJVGXF02G04PC_rvcmp", "FDJVGXF02FE5TM_rvcmp" ] }, {"p": [[148, -5610.020000, 0.274889, 0.000009, 1.999990 ], [126, -5610.640000, 0.148148, 0.029043, 1.999990 ], [0, -5610.800000, 0.125377, 0.000008, 1.999990 ], [1, -5610.830000, 0.122352, 0.096269, 1.999990 ], [2, -5610.830000, 0.122351, 0.000009, 1.999990 ], [227, -5610.880000, 0.116394, 0.012980, 1.999990 ], [225, -5611.130000, 0.090488, 0.036449, 1.999990 ] ], "n": ["FDJVGXF02H8Z3Y" ] }, {"p": [[148, -5455.610000, 0.278381, 0.000009, 1.621200 ], [147, -5455.610000, 0.278367, 0.065313, 1.621240 ], [227, -5456.330000, 0.136013, 0.012980, 1.464450 ], [17, -5456.620000, 0.101226, 0.049256, 1.524040 ], [64, -5456.910000, 0.075555, 0.347492, 1.890920 ], [66, -5456.910000, 0.075554, 0.000007, 1.890910 ], [126, -5457.230000, 0.054905, 0.041676, 1.542730 ] ], "n": ["FDJVGXF02HFABX" ] }, {"p": [[148, -5534.980000, 0.251229, 0.000009, 1.614820 ], [147, -5534.980000, 0.251216, 0.065313, 1.614850 ], [227, -5535.690000, 0.123326, 0.012980, 1.456040 ], [228, -5535.690000, 0.123286, 0.000005, 1.456060 ], [17, -5535.980000, 0.091582, 0.049256, 1.516290 ], [226, -5535.980000, 0.091569, 0.032306, 1.516310 ], [64, -5536.280000, 0.067792, 0.347492, 1.885870 ] ], "n": ["FDJVGXF02IFGFX" ] }, {"p": [[148, -3686.610000, 0.332719, 0.000009, 1.357670 ], [65, -3687.190000, 0.186028, 0.058208, 1.309370 ], [0, -3687.710000, 0.110507, 0.000008, 1.000740 ], [11, -3687.880000, 0.093269, 0.000001, 1.078300 ], [12, -3687.880000, 0.093269, 0.000009, 1.078310 ], [13, -3687.880000, 0.093266, 0.000009, 1.078300 ], [1, -3687.910000, 0.090942, 0.096269, 1.124350 ] ], "n": ["FDJVGXF02JWBEE" ] }, {"p": [[149, -4472.350000, 0.166697, 0.063739, 0.250963 ], [170, -4472.350000, 0.166670, 0.018724, 0.250971 ], [171, -4472.350000, 0.166650, 0.000008, 0.250971 ], [153, -4472.500000, 0.143439, 0.025504, 0.238892 ], [154, -4472.510000, 0.141722, 0.001738, 0.240463 ], [150, -4472.510000, 0.141199, 0.016958, 0.240854 ], [169, -4473.170000, 0.073623, 0.023387, 0.255436 ] ], "n": ["FDJVGXF02ICB1C_rvcmp" ] }, {"p": [[149, -6812.840000, 0.237286, 0.051948, 0.063382 ], [170, -6812.850000, 0.236753, 0.003178, 0.086056 ], [154, -6812.880000, 0.228027, 0.030339, 0.088505 ], [169, -6812.890000, 0.227910, 0.023387, 0.088511 ], [171, -6814.070000, 0.070025, 0.003489, 0.078473 ] ], "n": ["FDJVGXF02HY7HA_rvcmp" ] }, {"p": [[149, -7119.850000, 0.510147, 0.049920, 0.055898 ], [171, -7120.580000, 0.247041, 0.010993, 0.070846 ], [170, -7120.960000, 0.167946, 0.011995, 0.077570 ], [154, -7122.360000, 0.041389, 0.024038, 0.088411 ], [169, -7122.580000, 0.033477, 0.023387, 0.090284 ] ], "n": ["FDJVGXF02HC2AW" ] }, {"p": [[149, -8202.410000, 0.918858, 0.028795, 0.068851 ], [171, -8204.830000, 0.081142, 0.009926, 0.104868 ] ], "n": ["FDJVGXF02GWFX3_rvcmp" ] }, {"p": [[149, -5339.640000, 0.338021, 0.015145, 0.133362 ], [127, -5339.870000, 0.268741, 0.034213, 0.131014 ], [148, -5339.960000, 0.246385, 0.148117, 0.135116 ], [126, -5341.670000, 0.044598, 0.081599, 0.128468 ], [170, -5341.740000, 0.041547, 0.018724, 0.171529 ], [171, -5341.740000, 0.041543, 0.000008, 0.171531 ], [40, -5342.510000, 0.019165, 0.067961, 0.183131 ] ], "n": ["FDJVGXF02HQW3R" ] }, {"p": [[149, -5337.070000, 0.305192, 0.014077, 0.134793 ], [127, -5337.220000, 0.261867, 0.032864, 0.131433 ], [148, -5337.350000, 0.231219, 0.148117, 0.136486 ], [126, -5338.560000, 0.068550, 0.078681, 0.126935 ], [40, -5338.730000, 0.057831, 0.067166, 0.173492 ], [191, -5339.090000, 0.040343, 0.012123, 0.180860 ], [171, -5339.230000, 0.034997, 0.000008, 0.174198 ] ], "n": ["FDJVGXF02FF32Z" ] }, {"p": [[152, -8203.620000, 0.529923, 0.023503, 0.081181 ], [153, -8204.300000, 0.268939, 0.003748, 0.078919 ], [151, -8204.590000, 0.201138, 0.014659, 0.083206 ] ], "n": ["FDJVGXF02GEQZL" ] }, {"p": [[152, -6880.900000, 0.697936, 0.021134, 0.049368 ], [199, -6883.070000, 0.079936, 0.013298, 0.061712 ], [200, -6883.070000, 0.079890, 0.000006, 0.061710 ], [198, -6883.780000, 0.039270, 0.009856, 0.065811 ], [153, -6883.830000, 0.037546, 0.000009, 0.057395 ], [151, -6883.830000, 0.037526, 0.014659, 0.057397 ], [197, -6884.120000, 0.027896, 0.024513, 0.067466 ] ], "n": ["FDJVGXF02FNMNX" ] }, {"p": [[152, -8264.190000, 0.499897, 0.019284, 0.106021 ], [151, -8264.540000, 0.353357, 0.008379, 0.103074 ], [153, -8265.420000, 0.146746, 0.000007, 0.107664 ] ], "n": ["FDJVGXF02IVHRC_rvcmp", "FDJVGXF02JG5WK_rvcmp", "FDJVGXF02FV8WG_rvcmp" ] }, {"p": [[153, -8768.770000, 0.823931, 0.011754, 0.089231 ], [171, -8771.310000, 0.064975, 0.010702, 0.089827 ], [149, -8771.430000, 0.057727, 0.052609, 0.080727 ], [170, -8772.200000, 0.026741, 0.015257, 0.097378 ], [152, -8772.490000, 0.020084, 0.029974, 0.109084 ], [154, -8773.610000, 0.006542, 0.012283, 0.107344 ] ], "n": ["FDJVGXF02JVOJ8_rvcmp" ] }, {"p": [[153, -8774.600000, 0.386245, 0.011928, 0.082379 ], [171, -8774.690000, 0.355695, 0.015771, 0.075613 ], [205, -8775.570000, 0.147548, 0.022721, 0.081027 ], [196, -8776.240000, 0.074866, 0.040193, 0.072842 ], [170, -8776.990000, 0.035648, 0.016492, 0.088296 ] ], "n": ["FDJVGXF02IHBYW_rvcmp" ] }, {"p": [[154, -4436.970000, 0.333512, 0.030340, 0.006730 ], [169, -4436.970000, 0.333443, 0.023387, 0.006733 ], [170, -4436.970000, 0.333045, 0.000009, 0.006733 ] ], "n": ["FDJVGXF02J2KBH_rvcmp" ] }, {"p": [[154, -7554.860000, 0.916462, 0.010609, 0.050665 ], [153, -7557.250000, 0.083538, 0.018471, 0.058602 ] ], "n": ["FDJVGXF02HTSH5_rvcmp" ] }, {"p": [[154, -7422.500000, 0.636661, 0.009417, 0.065404 ], [153, -7423.910000, 0.155422, 0.026996, 0.074065 ], [150, -7423.910000, 0.155342, 0.016957, 0.074067 ], [152, -7425.450000, 0.033166, 0.024368, 0.073108 ], [151, -7425.990000, 0.019409, 0.014374, 0.077441 ] ], "n": ["FDJVGXF02IWEET_rvcmp" ] }, {"p": [[155, -5037.690000, 0.881489, 0.010167, 0.000006 ], [156, -5040.410000, 0.058220, 0.040565, 0.000006 ], [157, -5040.500000, 0.052911, 0.000006, 0.000006 ], [161, -5042.470000, 0.007380, 0.008241, 0.006795 ] ], "n": ["FDJVGXF02IFR90" ] }, {"p": [[155, -7052.150000, 0.940168, 0.010164, 0.000006 ], [156, -7054.900000, 0.059832, 0.041438, 0.000006 ] ], "n": ["FDJVGXF02JFCPJ" ] }, {"p": [[155, -7185.160000, 0.750731, 0.008363, 0.000006 ], [156, -7186.920000, 0.128191, 0.041382, 0.000009 ], [157, -7186.980000, 0.121079, 0.000006, 0.000005 ] ], "n": ["FDJVGXF02G0X7P" ] }, {"p": [[155, -8180.560000, 0.525654, 0.000006, 0.011972 ], [156, -8181.030000, 0.329232, 0.038025, 0.008410 ], [157, -8181.950000, 0.131004, 0.000006, 0.011622 ], [169, -8184.180000, 0.014110, 0.000006, 0.012564 ] ], "n": ["FDJVGXF02F3DP1" ] }, {"p": [[155, -8374.440000, 0.910211, 0.000006, 0.007616 ], [156, -8376.990000, 0.070867, 0.038694, 0.001169 ], [157, -8378.310000, 0.018922, 0.000723, 0.005442 ] ], "n": ["FDJVGXF02JSI4C" ] }, {"p": [[156, -3996.180000, 0.291063, 0.039673, 0.000006 ], [155, -3996.320000, 0.254554, 0.012865, 0.000006 ], [157, -3996.320000, 0.254175, 0.000006, 0.000006 ], [161, -3996.560000, 0.200209, 0.009260, 0.000006 ] ], "n": ["FDJVGXF02G0X7M" ] }, {"p": [[156, -8015.780000, 0.701736, 0.029744, 0.013525 ], [160, -8017.420000, 0.136088, 0.004116, 0.029976 ], [159, -8017.890000, 0.084978, 0.009298, 0.032098 ], [169, -8017.990000, 0.077198, 0.011359, 0.023814 ] ], "n": ["FDJVGXF02FMRFO" ] }, {"p": [[156, -8553.580000, 0.973655, 0.029147, 0.022817 ], [160, -8557.190000, 0.026345, 0.003244, 0.030173 ] ], "n": ["FDJVGXF02F47JY_rvcmp" ] }, {"p": [[156, -8184.100000, 0.966541, 0.029080, 0.019126 ], [160, -8187.910000, 0.021393, 0.003186, 0.026930 ], [158, -8188.480000, 0.012066, 0.006699, 0.021392 ] ], "n": ["FDJVGXF02H8NDW_rvcmp" ] }, {"p": [[156, -7681.740000, 0.839215, 0.028066, 0.003239 ], [155, -7684.090000, 0.080427, 0.012865, 0.007261 ], [157, -7684.090000, 0.080358, 0.000006, 0.007261 ] ], "n": ["FDJVGXF02H8J1Q_rvcmp" ] }, {"p": [[156, -8691.610000, 1.000000, 0.027374, 0.024708 ] ], "n": ["FDJVGXF02J045Y" ] }, {"p": [[156, -8796.830000, 1.000000, 0.027485, 0.024395 ] ], "n": ["FDJVGXF02F1K58" ] }, {"p": [[156, -7036.230000, 0.502100, 0.027332, 0.015450 ], [160, -7036.660000, 0.326881, 0.004331, 0.038995 ], [161, -7038.290000, 0.063655, 0.023495, 0.030176 ], [158, -7038.580000, 0.048026, 0.016014, 0.042712 ], [159, -7038.740000, 0.040735, 0.011552, 0.044645 ], [165, -7040.100000, 0.010465, 0.000007, 0.036927 ], [157, -7040.350000, 0.008138, 0.001904, 0.037339 ] ], "n": ["FDJVGXF02IOE2L_rvcmp" ] }, {"p": [[156, -6200.340000, 1.000000, 0.025663, 0.000006 ] ], "n": ["FDJVGXF02HHGGV_rvcmp" ] }, {"p": [[156, -8211.830000, 1.000000, 0.022056, 0.009825 ] ], "n": ["FDJVGXF02IE1SZ_rvcmp" ] }, {"p": [[156, -7753.460000, 0.281307, 0.021236, 0.134237 ], [167, -7754.110000, 0.146481, 0.024812, 0.132936 ], [157, -7754.120000, 0.145774, 0.002299, 0.142620 ], [155, -7754.190000, 0.135290, 0.012865, 0.143537 ], [168, -7754.290000, 0.123027, 0.003242, 0.143914 ], [169, -7754.290000, 0.122196, 0.000006, 0.143957 ], [161, -7755.270000, 0.045925, 0.018135, 0.139948 ] ], "n": ["FDJVGXF02JR510_rvcmp" ] }, {"p": [[156, -4332.230000, 0.842808, 0.017513, 0.000006 ], [169, -4333.910000, 0.157192, 0.015160, 0.000006 ] ], "n": ["FDJVGXF02FX4DB" ] }, {"p": [[156, -6229.330000, 1.000000, 0.016462, 0.026898 ] ], "n": ["FDJVGXF02GYL8N_rvcmp" ] }, {"p": [[156, -8502.650000, 1.000000, 0.015354, 0.010861 ] ], "n": ["FDJVGXF02HDCI6_rvcmp" ] }, {"p": [[156, -5499.140000, 0.347063, 0.000005, 0.022906 ], [155, -5499.410000, 0.266057, 0.012865, 0.022971 ], [157, -5499.410000, 0.265846, 0.000006, 0.022971 ], [169, -5501.230000, 0.042968, 0.004097, 0.022456 ], [168, -5501.270000, 0.041153, 0.003612, 0.024291 ], [154, -5502.040000, 0.019161, 0.028618, 0.020239 ], [170, -5502.110000, 0.017752, 0.001250, 0.019833 ] ], "n": ["FDJVGXF02H3L1Z" ] }, {"p": [[157, -4540.720000, 0.251272, 0.005887, 0.014061 ], [169, -4540.720000, 0.251225, 0.000008, 0.014058 ], [168, -4540.720000, 0.250214, 0.003611, 0.014062 ], [156, -4541.760000, 0.088891, 0.043598, 0.014842 ], [155, -4541.760000, 0.088867, 0.012865, 0.014842 ], [170, -4542.080000, 0.064549, 0.010298, 0.000007 ], [161, -4544.640000, 0.004982, 0.021940, 0.019850 ] ], "n": ["FDJVGXF02FOWJ4" ] }, {"p": [[158, -4676.930000, 0.203510, 0.000009, 0.335675 ], [167, -4677.120000, 0.168715, 0.004124, 0.338129 ], [198, -4677.320000, 0.137291, 0.007471, 0.434431 ], [197, -4677.340000, 0.134763, 0.018393, 0.434152 ], [199, -4677.370000, 0.131532, 0.000006, 0.439414 ], [156, -4677.520000, 0.112425, 0.004498, 0.323395 ], [160, -4677.530000, 0.111765, 0.001734, 0.350230 ] ], "n": ["FDJVGXF02FX0XN" ] }, {"p": [[158, -6745.560000, 0.602591, 0.000009, 0.304863 ], [162, -6747.290000, 0.106771, 0.010708, 0.303268 ], [164, -6747.290000, 0.106760, 0.000005, 0.303268 ], [163, -6747.290000, 0.106709, 0.006754, 0.303271 ], [167, -6748.560000, 0.029808, 0.023309, 0.315070 ], [161, -6748.740000, 0.024988, 0.020039, 0.310010 ], [165, -6748.850000, 0.022372, 0.000007, 0.320871 ] ], "n": ["FDJVGXF02JAXFE_rvcmp" ] }, {"p": [[159, -3952.490000, 0.424336, 0.002594, 0.041117 ], [156, -3953.600000, 0.139356, 0.035431, 0.037174 ], [161, -3953.850000, 0.108802, 0.026496, 0.035266 ], [155, -3954.020000, 0.091718, 0.012865, 0.043855 ], [157, -3954.020000, 0.091712, 0.000006, 0.043860 ], [165, -3954.250000, 0.072659, 0.000951, 0.040370 ], [164, -3954.270000, 0.071417, 0.020699, 0.041268 ] ], "n": ["FDJVGXF02F5UCJ_rvcmp" ] }, {"p": [[159, -8709.370000, 0.717864, 0.000006, 0.178962 ], [161, -8711.080000, 0.129484, 0.020945, 0.174502 ], [164, -8711.780000, 0.064711, 0.020699, 0.185858 ], [165, -8711.780000, 0.064684, 0.000007, 0.185859 ], [158, -8713.660000, 0.009861, 0.012781, 0.189420 ], [160, -8713.930000, 0.007535, 0.000007, 0.193767 ], [166, -8714.180000, 0.005861, 0.000008, 0.194949 ] ], "n": ["FDJVGXF02FK3FS_rvcmp" ] }, {"p": [[159, -7000.530000, 0.872350, 0.000006, 0.056012 ], [156, -7003.690000, 0.036935, 0.037276, 0.051455 ], [169, -7003.810000, 0.032764, 0.009791, 0.050011 ], [155, -7004.380000, 0.018448, 0.011860, 0.059073 ], [157, -7004.400000, 0.018220, 0.000006, 0.059112 ], [168, -7004.490000, 0.016569, 0.003612, 0.059410 ], [165, -7005.750000, 0.004714, 0.004037, 0.058557 ] ], "n": ["FDJVGXF02HYEKW" ] }, {"p": [[159, -2597.770000, 1.000000, 0.000006, 0.000006 ] ], "n": ["FDJVGXF02HWZI1_rvcmp" ] }, {"p": [[160, -7141.590000, 0.246777, 0.006979, 0.004323 ], [165, -7141.600000, 0.245773, 0.007352, 0.004323 ], [166, -7141.600000, 0.245355, 0.000008, 0.004324 ], [167, -7142.660000, 0.084671, 0.033973, 0.004441 ], [168, -7142.660000, 0.084650, 0.000008, 0.004447 ], [169, -7143.260000, 0.046420, 0.000006, 0.004516 ], [157, -7143.260000, 0.046354, 0.005887, 0.004516 ] ], "n": ["FDJVGXF02FKGNY" ] }, {"p": [[160, -7806.370000, 0.680841, 0.002999, 0.025881 ], [158, -7807.620000, 0.194086, 0.015224, 0.027297 ], [159, -7808.060000, 0.125073, 0.011552, 0.029507 ] ], "n": ["FDJVGXF02JWVD9_rvcmp" ] }, {"p": [[160, -7876.690000, 0.372253, 0.002004, 0.187208 ], [158, -7876.870000, 0.312337, 0.016226, 0.191141 ], [159, -7876.880000, 0.309272, 0.011123, 0.192022 ], [169, -7880.800000, 0.006138, 0.011285, 0.181256 ] ], "n": ["FDJVGXF02GRBNP", "FDJVGXF02HAYK6" ] }, {"p": [[160, -8278.240000, 0.400374, 0.002349, 0.153489 ], [159, -8278.570000, 0.290519, 0.011552, 0.158584 ], [158, -8278.570000, 0.290484, 0.017418, 0.158579 ], [164, -8282.010000, 0.009314, 0.020699, 0.155000 ], [165, -8282.010000, 0.009310, 0.000007, 0.154998 ] ], "n": ["FDJVGXF02HRVXJ" ] }, {"p": [[161, -6219.930000, 0.521295, 0.027813, 0.008801 ], [164, -6220.830000, 0.212142, 0.020699, 0.012836 ], [165, -6220.830000, 0.212119, 0.000007, 0.012830 ], [168, -6222.900000, 0.026610, 0.002042, 0.016115 ], [169, -6223.550000, 0.013919, 0.000006, 0.016524 ], [157, -6223.550000, 0.013915, 0.005887, 0.016526 ] ], "n": ["FDJVGXF02F0IC5_rvcmp" ] }, {"p": [[161, -5413.260000, 0.743543, 0.025576, 0.010146 ], [165, -5415.020000, 0.128234, 0.000007, 0.017550 ], [164, -5415.020000, 0.128223, 0.020699, 0.017560 ] ], "n": ["FDJVGXF02I1NT2" ] }, {"p": [[161, -5963.600000, 0.860014, 0.026497, 0.000006 ], [165, -5966.040000, 0.075135, 0.001160, 0.004849 ], [164, -5966.190000, 0.064851, 0.020699, 0.006286 ] ], "n": ["FDJVGXF02H9W9G_rvcmp" ] }, {"p": [[161, -6424.560000, 0.209407, 0.024716, 0.208126 ], [169, -6424.680000, 0.187260, 0.014341, 0.197491 ], [164, -6425.020000, 0.132671, 0.020699, 0.212582 ], [165, -6425.020000, 0.132625, 0.000007, 0.212595 ], [170, -6425.080000, 0.124432, 0.012556, 0.185431 ], [171, -6425.140000, 0.117248, 0.007901, 0.188959 ], [190, -6425.340000, 0.096357, 0.017843, 0.185425 ] ], "n": ["FDJVGXF02GZLH0_rvcmp" ] }, {"p": [[161, -3866.160000, 0.614825, 0.025090, 0.000006 ], [159, -3866.810000, 0.323006, 0.000006, 0.008524 ], [165, -3869.140000, 0.031144, 0.000327, 0.007426 ], [164, -3869.150000, 0.031025, 0.020699, 0.007321 ] ], "n": ["FDJVGXF02H5SIY_rvcmp" ] }, {"p": [[161, -3453.730000, 0.214001, 0.023442, 0.028623 ], [156, -3453.780000, 0.204259, 0.035062, 0.031769 ], [155, -3454.280000, 0.124157, 0.012865, 0.039573 ], [157, -3454.280000, 0.124150, 0.000006, 0.039579 ], [169, -3454.360000, 0.115011, 0.000008, 0.039933 ], [168, -3454.360000, 0.114882, 0.003611, 0.039935 ], [165, -3454.460000, 0.103541, 0.001173, 0.035074 ] ], "n": ["FDJVGXF02G2ZGA" ] }, {"p": [[161, -6144.930000, 0.446643, 0.018291, 0.018020 ], [169, -6146.290000, 0.114166, 0.004877, 0.021623 ], [160, -6146.330000, 0.110043, 0.006315, 0.026606 ], [165, -6146.420000, 0.100037, 0.007352, 0.027796 ], [166, -6146.420000, 0.099932, 0.000008, 0.027802 ], [168, -6146.860000, 0.064621, 0.003612, 0.029158 ], [157, -6146.860000, 0.064558, 0.005887, 0.029158 ] ], "n": ["FDJVGXF02HLFPD" ] }, {"p": [[161, -6288.740000, 1.000000, 0.010850, 0.024929 ] ], "n": ["FDJVGXF02IVUU7" ] }, {"p": [[161, -6128.550000, 0.245886, 0.009861, 0.188364 ], [166, -6129.000000, 0.157290, 0.000008, 0.191029 ], [165, -6129.000000, 0.157219, 0.007352, 0.191025 ], [160, -6129.000000, 0.157109, 0.007380, 0.191033 ], [168, -6129.030000, 0.152103, 0.000007, 0.191292 ], [159, -6129.670000, 0.080412, 0.000006, 0.197855 ], [157, -6130.140000, 0.049980, 0.005887, 0.198179 ] ], "n": ["FDJVGXF02GYKZ6_rvcmp" ] }, {"p": [[161, -4645.640000, 0.941948, 0.008701, 0.075608 ], [169, -4649.380000, 0.022462, 0.011641, 0.086883 ], [165, -4649.560000, 0.018764, 0.000007, 0.099298 ], [156, -4649.670000, 0.016826, 0.000005, 0.075802 ] ], "n": ["FDJVGXF02I8WRF" ] }, {"p": [[161, -6926.100000, 1.000000, 0.008717, 0.014845 ] ], "n": ["FDJVGXF02FLYFT_rvcmp", "FDJVGXF02HI1P0_rvcmp", "FDJVGXF02JKJ3D_rvcmp" ] }, {"p": [[161, -3619.880000, 0.635596, 0.005588, 0.046791 ], [159, -3620.840000, 0.244866, 0.000006, 0.068988 ], [167, -3622.700000, 0.037884, 0.000008, 0.080104 ], [170, -3622.930000, 0.030056, 0.010035, 0.051534 ], [154, -3623.260000, 0.021678, 0.025721, 0.065383 ], [169, -3623.290000, 0.021021, 0.023387, 0.067014 ], [158, -3624.150000, 0.008899, 0.017418, 0.087760 ] ], "n": ["FDJVGXF02I3YOZ_rvcmp" ] }, {"p": [[161, -3766.490000, 0.656314, 0.005787, 0.044256 ], [159, -3767.530000, 0.230642, 0.000006, 0.065994 ], [167, -3769.440000, 0.034128, 0.000008, 0.076588 ], [170, -3769.560000, 0.030429, 0.010506, 0.047641 ], [154, -3769.940000, 0.020729, 0.025343, 0.061762 ], [169, -3769.980000, 0.019977, 0.023387, 0.063447 ], [158, -3770.920000, 0.007781, 0.017418, 0.083734 ] ], "n": ["FDJVGXF02JLTK9_rvcmp", "FDJVGXF02I9UQ7_rvcmp", "FDJVGXF02F036B_rvcmp" ] }, {"p": [[161, -5737.840000, 0.650471, 0.004647, 0.112127 ], [196, -5739.380000, 0.139053, 0.036335, 0.103791 ], [154, -5740.540000, 0.043797, 0.029354, 0.121802 ], [169, -5740.540000, 0.043571, 0.023387, 0.122325 ], [149, -5740.550000, 0.043370, 0.043092, 0.084161 ], [199, -5740.630000, 0.039870, 0.000006, 0.124046 ], [197, -5740.630000, 0.039867, 0.024513, 0.124038 ] ], "n": ["FDJVGXF02HTII5" ] }, {"p": [[164, -5150.580000, 0.420962, 0.016777, 0.028248 ], [165, -5151.500000, 0.167991, 0.000007, 0.032379 ], [161, -5151.500000, 0.167841, 0.032465, 0.032383 ], [169, -5151.570000, 0.156979, 0.007596, 0.026288 ], [155, -5153.160000, 0.032142, 0.007324, 0.036034 ], [168, -5153.210000, 0.030599, 0.003612, 0.039637 ], [166, -5153.470000, 0.023487, 0.001999, 0.040964 ] ], "n": ["FDJVGXF02FFCT2" ] }, {"p": [[165, -8005.550000, 0.207691, 0.004170, 0.007175 ], [156, -8005.770000, 0.166102, 0.041514, 0.009456 ], [169, -8005.860000, 0.152473, 0.002855, 0.009217 ], [155, -8005.870000, 0.150310, 0.008837, 0.012020 ], [157, -8006.100000, 0.119783, 0.000006, 0.012017 ], [168, -8006.180000, 0.110139, 0.003612, 0.012015 ], [158, -8006.350000, 0.093502, 0.007662, 0.010597 ] ], "n": ["FDJVGXF02JPOIP_rvcmp" ] }, {"p": [[167, -5767.250000, 0.269865, 0.026857, 0.055666 ], [168, -5767.920000, 0.136934, 0.000007, 0.062368 ], [166, -5767.920000, 0.136924, 0.001999, 0.062366 ], [160, -5767.990000, 0.128683, 0.006910, 0.061613 ], [165, -5768.010000, 0.125780, 0.007352, 0.062428 ], [157, -5768.100000, 0.114266, 0.005887, 0.064079 ], [155, -5768.370000, 0.087549, 0.007464, 0.062059 ] ], "n": ["FDJVGXF02IH15Z" ] }, {"p": [[168, -7448.880000, 0.479271, 0.002096, 0.000006 ], [169, -7449.600000, 0.233278, 0.000006, 0.000006 ], [157, -7449.600000, 0.233201, 0.005887, 0.000006 ], [166, -7451.270000, 0.043769, 0.001999, 0.000006 ], [156, -7452.700000, 0.010480, 0.043598, 0.000006 ] ], "n": ["FDJVGXF02I99VH_rvcmp", "FDJVGXF02JVAVQ_rvcmp", "FDJVGXF02F1QQL" ] }, {"p": [[169, -4691.150000, 0.280434, 0.023387, 0.013094 ], [154, -4691.150000, 0.280400, 0.030340, 0.013094 ], [170, -4691.150000, 0.280115, 0.000009, 0.013095 ], [157, -4693.020000, 0.043236, 0.000006, 0.019249 ], [156, -4693.020000, 0.043233, 0.043598, 0.019253 ], [155, -4693.020000, 0.043233, 0.012865, 0.019253 ], [168, -4693.400000, 0.029348, 0.003612, 0.019324 ] ], "n": ["FDJVGXF02IBQ2O" ] }, {"p": [[169, -4829.620000, 0.869378, 0.012846, 0.009776 ], [164, -4832.130000, 0.070968, 0.017400, 0.022686 ], [165, -4832.590000, 0.044455, 0.000007, 0.026688 ], [160, -4833.670000, 0.015199, 0.004809, 0.029031 ] ], "n": ["FDJVGXF02HVGWV" ] }, {"p": [[169, -8158.120000, 0.427070, 0.007854, 0.015535 ], [161, -8158.260000, 0.372116, 0.024220, 0.015895 ], [170, -8159.600000, 0.097440, 0.007353, 0.006866 ], [168, -8160.070000, 0.060917, 0.002572, 0.020565 ], [157, -8160.750000, 0.030880, 0.005887, 0.021449 ], [165, -8161.730000, 0.011577, 0.002038, 0.021971 ] ], "n": ["FDJVGXF02GQD9D_rvcmp" ] }, {"p": [[170, -8901.680000, 0.408155, 0.010058, 0.099148 ], [161, -8902.310000, 0.217361, 0.005360, 0.103179 ], [196, -8902.390000, 0.199481, 0.034406, 0.084643 ], [171, -8903.490000, 0.066756, 0.004831, 0.099888 ], [149, -8903.650000, 0.056657, 0.061201, 0.099840 ], [169, -8904.260000, 0.030781, 0.017424, 0.106264 ], [154, -8904.650000, 0.020809, 0.030342, 0.109432 ] ], "n": ["FDJVGXF02HKNTY_rvcmp" ] }, {"p": [[174, -8788.210000, 0.185197, 0.000006, 0.399529 ], [26, -8788.330000, 0.164750, 0.048859, 0.358105 ], [181, -8788.470000, 0.142972, 0.037176, 0.412286 ], [178, -8788.470000, 0.142964, 0.004073, 0.412285 ], [182, -8788.470000, 0.142925, 0.000007, 0.412285 ], [176, -8788.630000, 0.122106, 0.006160, 0.413440 ], [40, -8788.830000, 0.099085, 0.030383, 0.402802 ] ], "n": ["FDJVGXF02H2TBT" ] }, {"p": [[175, -4324.250000, 0.375812, 0.000005, 0.269026 ], [174, -4325.340000, 0.126879, 0.000005, 0.273036 ], [176, -4325.340000, 0.126492, 0.000006, 0.278228 ], [121, -4325.370000, 0.122809, 0.021311, 0.332987 ], [185, -4325.760000, 0.083236, 0.000001, 0.304791 ], [184, -4325.760000, 0.083235, 0.000001, 0.304783 ], [177, -4325.780000, 0.081537, 0.000007, 0.263412 ] ], "n": ["FDJVGXF02IRJEQ_rvcmp" ] }, {"p": [[177, -6292.140000, 0.676388, 0.000009, 0.810551 ], [175, -6293.900000, 0.116066, 0.000005, 0.804112 ], [188, -6294.580000, 0.059003, 0.026505, 0.881979 ], [218, -6294.760000, 0.049250, 0.000008, 0.806343 ], [148, -6295.080000, 0.035666, 0.077324, 0.533050 ], [171, -6295.180000, 0.032326, 0.034630, 0.912714 ], [40, -6295.210000, 0.031300, 0.086918, 0.919065 ] ], "n": ["FDJVGXF02GVNAG_rvcmp" ] }, {"p": [[183, -6697.560000, 0.496954, 0.009440, 0.108176 ], [187, -6698.390000, 0.215686, 0.003395, 0.119355 ], [186, -6699.170000, 0.098644, 0.007024, 0.121902 ], [173, -6699.660000, 0.060760, 0.019346, 0.119902 ], [182, -6699.710000, 0.057728, 0.007651, 0.120743 ], [188, -6699.840000, 0.050690, 0.018254, 0.113518 ], [172, -6700.790000, 0.019537, 0.008421, 0.130820 ] ], "n": ["FDJVGXF02H8YC8" ] }, {"p": [[185, -4809.320000, 0.236688, 0.000001, 0.216500 ], [184, -4809.320000, 0.236658, 0.000001, 0.216499 ], [186, -4809.320000, 0.236436, 0.000009, 0.216496 ], [172, -4810.370000, 0.082061, 0.000008, 0.203026 ], [188, -4810.460000, 0.075094, 0.000008, 0.210746 ], [187, -4810.460000, 0.075088, 0.011025, 0.210755 ], [175, -4810.720000, 0.057975, 0.000005, 0.236229 ] ], "n": ["FDJVGXF02GUQOV_rvcmp" ] }, {"p": [[186, -7918.770000, 0.315155, 0.000705, 0.213972 ], [184, -7918.780000, 0.310255, 0.000001, 0.215621 ], [185, -7918.780000, 0.310255, 0.000001, 0.215621 ], [190, -7921.020000, 0.033263, 0.016135, 0.217438 ], [179, -7922.130000, 0.010929, 0.006945, 0.212617 ], [183, -7922.170000, 0.010470, 0.017025, 0.223864 ], [188, -7922.250000, 0.009673, 0.031389, 0.212486 ] ], "n": ["FDJVGXF02GPTF2_rvcmp" ] }, {"p": [[188, -4387.080000, 0.458220, 0.027776, 0.182461 ], [148, -4387.650000, 0.259694, 0.115871, 0.151545 ], [26, -4388.250000, 0.142347, 0.024017, 0.189318 ], [190, -4388.600000, 0.100311, 0.000008, 0.208618 ], [149, -4390.330000, 0.017729, 0.020550, 0.213347 ], [173, -4390.820000, 0.010849, 0.022616, 0.207393 ], [183, -4390.820000, 0.010849, 0.000009, 0.207398 ] ], "n": ["FDJVGXF02FLSTT_rvcmp", "FDJVGXF02GAZVW_rvcmp" ] }, {"p": [[188, -7372.460000, 0.259570, 0.026169, 0.076980 ], [183, -7372.580000, 0.229762, 0.013559, 0.081266 ], [189, -7372.650000, 0.213831, 0.080377, 0.069819 ], [186, -7373.220000, 0.120485, 0.007776, 0.087438 ], [187, -7373.310000, 0.110186, 0.000005, 0.089122 ], [172, -7374.100000, 0.050030, 0.008421, 0.091391 ], [190, -7375.230000, 0.016136, 0.000008, 0.079773 ] ], "n": ["FDJVGXF02IQ0SO" ] }, {"p": [[189, -7885.800000, 0.254554, 0.087707, 0.238223 ], [190, -7885.960000, 0.216944, 0.005966, 0.244893 ], [188, -7885.980000, 0.211932, 0.052299, 0.246601 ], [40, -7886.050000, 0.199244, 0.054173, 0.229432 ], [192, -7887.400000, 0.051690, 0.008067, 0.243862 ], [191, -7887.530000, 0.045371, 0.008980, 0.248132 ], [38, -7888.330000, 0.020264, 0.052139, 0.213129 ] ], "n": ["FDJVGXF02HJ9TM" ] }, {"p": [[189, -7919.010000, 0.816972, 0.040592, 0.100344 ], [27, -7921.080000, 0.103455, 0.037873, 0.134848 ], [190, -7921.860000, 0.047432, 0.022936, 0.128908 ], [171, -7922.250000, 0.032140, 0.034630, 0.134695 ] ], "n": ["FDJVGXF02FI7RZ" ] }, {"p": [[189, -5300.130000, 0.577815, 0.000006, 0.311887 ], [190, -5301.730000, 0.116752, 0.005694, 0.354750 ], [188, -5301.760000, 0.113746, 0.052299, 0.357801 ], [191, -5302.410000, 0.059059, 0.000008, 0.363581 ], [171, -5302.410000, 0.059042, 0.034630, 0.363598 ], [27, -5302.800000, 0.039950, 0.011701, 0.391885 ], [39, -5302.970000, 0.033636, 0.000006, 0.349238 ] ], "n": ["FDJVGXF02FM417" ] }, {"p": [[190, -7760.450000, 0.278600, 0.034335, 0.111630 ], [171, -7760.450000, 0.278566, 0.034630, 0.111632 ], [191, -7760.450000, 0.278504, 0.000008, 0.111635 ], [192, -7761.860000, 0.067703, 0.000005, 0.116052 ], [40, -7761.860000, 0.067693, 0.086918, 0.116049 ], [39, -7762.940000, 0.023045, 0.020498, 0.118787 ], [127, -7764.300000, 0.005889, 0.023560, 0.087174 ] ], "n": ["FDJVGXF02GBTVY" ] }, {"p": [[190, -5790.870000, 0.303251, 0.023145, 0.166701 ], [171, -5791.140000, 0.230902, 0.034630, 0.172600 ], [191, -5791.140000, 0.230894, 0.000008, 0.172603 ], [189, -5792.200000, 0.080307, 0.069194, 0.161475 ], [27, -5792.240000, 0.076629, 0.021372, 0.194082 ], [188, -5792.560000, 0.055908, 0.044027, 0.175566 ], [184, -5793.490000, 0.022108, 0.000001, 0.205985 ] ], "n": ["FDJVGXF02H6FKQ_rvcmp" ] }, {"p": [[190, -6659.770000, 0.280672, 0.021113, 0.140354 ], [171, -6660.050000, 0.211938, 0.034630, 0.147806 ], [191, -6660.050000, 0.211934, 0.000008, 0.147810 ], [188, -6660.380000, 0.152103, 0.039650, 0.137680 ], [40, -6661.330000, 0.059289, 0.069872, 0.144657 ], [189, -6661.390000, 0.055614, 0.096145, 0.140748 ], [192, -6662.060000, 0.028450, 0.003064, 0.157671 ] ], "n": ["FDJVGXF02IRTQS" ] }, {"p": [[190, -5560.500000, 0.512081, 0.018954, 0.058462 ], [171, -5560.940000, 0.331602, 0.020125, 0.068004 ], [189, -5563.030000, 0.040804, 0.085391, 0.053645 ], [149, -5563.090000, 0.038504, 0.055525, 0.072390 ], [40, -5563.320000, 0.030603, 0.060141, 0.076431 ], [188, -5563.550000, 0.024374, 0.047113, 0.063448 ], [153, -5563.650000, 0.022032, 0.014643, 0.080210 ] ], "n": ["FDJVGXF02HW5K5_rvcmp" ] }, {"p": [[190, -7472.430000, 0.659552, 0.015072, 0.086698 ], [188, -7474.040000, 0.132465, 0.048372, 0.087250 ], [189, -7474.080000, 0.126011, 0.096144, 0.088590 ], [171, -7475.210000, 0.041000, 0.034630, 0.097468 ], [191, -7475.210000, 0.040971, 0.000008, 0.097469 ] ], "n": ["FDJVGXF02JDX99" ] }, {"p": [[190, -7075.940000, 0.599287, 0.014925, 0.062418 ], [189, -7076.790000, 0.255070, 0.081152, 0.055512 ], [188, -7077.760000, 0.096608, 0.052299, 0.064090 ], [171, -7079.130000, 0.024523, 0.034630, 0.074326 ], [191, -7079.130000, 0.024512, 0.000008, 0.074330 ] ], "n": ["FDJVGXF02JJHC3" ] }, {"p": [[190, -8574.590000, 0.536775, 0.014399, 0.057818 ], [189, -8575.380000, 0.242974, 0.087494, 0.052558 ], [188, -8576.320000, 0.094365, 0.052299, 0.059149 ], [39, -8576.620000, 0.070201, 0.020363, 0.067589 ], [191, -8577.910000, 0.019336, 0.000008, 0.067985 ], [171, -8577.910000, 0.019330, 0.034630, 0.067983 ], [192, -8578.040000, 0.017018, 0.022464, 0.070803 ] ], "n": ["FDJVGXF02FUTY4" ] }, {"p": [[190, -6606.100000, 0.289869, 0.012497, 0.275877 ], [189, -6606.340000, 0.226932, 0.096145, 0.280584 ], [188, -6606.340000, 0.226903, 0.052299, 0.280585 ], [191, -6607.450000, 0.074618, 0.000008, 0.298160 ], [171, -6607.450000, 0.074603, 0.034630, 0.298163 ], [192, -6607.730000, 0.056498, 0.004060, 0.304881 ], [40, -6607.840000, 0.050576, 0.086918, 0.304892 ] ], "n": ["FDJVGXF02FNUCN" ] }, {"p": [[190, -3165.260000, 0.210961, 0.010440, 0.069307 ], [204, -3165.330000, 0.196564, 0.010427, 0.077556 ], [189, -3165.590000, 0.151919, 0.088661, 0.066972 ], [188, -3165.650000, 0.143727, 0.050103, 0.069187 ], [198, -3165.800000, 0.123581, 0.000006, 0.095099 ], [26, -3166.040000, 0.096520, 0.059987, 0.076397 ], [25, -3166.270000, 0.076728, 0.011501, 0.090580 ] ], "n": ["FDJVGXF02GP2GU_rvcmp" ] }, {"p": [[191, -5414.880000, 0.284176, 0.000377, 0.163598 ], [171, -5414.880000, 0.283686, 0.034630, 0.163828 ], [190, -5414.880000, 0.283642, 0.034335, 0.163823 ], [27, -5415.820000, 0.110858, 0.000009, 0.188526 ], [192, -5417.770000, 0.015732, 0.001579, 0.177679 ], [40, -5417.790000, 0.015487, 0.086918, 0.178991 ], [189, -5418.670000, 0.006421, 0.039150, 0.171791 ] ], "n": ["FDJVGXF02HMFXK" ] }, {"p": [[192, -8922.270000, 0.186198, 0.022464, 0.218093 ], [39, -8922.270000, 0.186055, 0.025399, 0.218096 ], [190, -8922.400000, 0.163430, 0.034335, 0.215159 ], [171, -8922.400000, 0.163404, 0.034630, 0.215158 ], [191, -8922.400000, 0.163401, 0.000008, 0.215168 ], [27, -8923.120000, 0.079983, 0.027262, 0.225892 ], [40, -8923.450000, 0.057529, 0.083213, 0.220729 ] ], "n": ["FDJVGXF02F1D4W_rvcmp" ] }, {"p": [[193, -7391.120000, 0.186054, 0.000937, 0.198033 ], [192, -7391.120000, 0.184992, 0.022464, 0.199135 ], [29, -7391.290000, 0.155648, 0.031159, 0.176379 ], [40, -7391.320000, 0.152330, 0.073341, 0.194923 ], [33, -7391.610000, 0.113274, 0.012211, 0.185323 ], [191, -7391.670000, 0.106925, 0.012299, 0.203018 ], [28, -7391.730000, 0.100776, 0.048759, 0.187064 ] ], "n": ["FDJVGXF02ITXCI_rvcmp" ] }, {"p": [[195, -6093.600000, 0.421795, 0.007174, 0.058061 ], [196, -6093.760000, 0.357958, 0.008910, 0.055320 ], [35, -6095.470000, 0.065146, 0.013080, 0.067836 ], [194, -6095.470000, 0.065082, 0.006696, 0.067837 ], [22, -6095.590000, 0.057386, 0.006702, 0.047955 ], [20, -6096.610000, 0.020725, 0.000007, 0.056003 ], [21, -6097.170000, 0.011908, 0.017641, 0.054212 ] ], "n": ["FDJVGXF02HZ3TW" ] }, {"p": [[196, -7235.090000, 0.446537, 0.071550, 0.070452 ], [197, -7235.570000, 0.275443, 0.015203, 0.075380 ], [199, -7236.560000, 0.102527, 0.006987, 0.078966 ], [200, -7236.680000, 0.090317, 0.000006, 0.078111 ], [198, -7236.740000, 0.085176, 0.013117, 0.082302 ] ], "n": ["FDJVGXF02F484A" ] }, {"p": [[196, -7763.080000, 0.342670, 0.064950, 0.091551 ], [199, -7763.620000, 0.200481, 0.013298, 0.100991 ], [200, -7763.620000, 0.200378, 0.000006, 0.100988 ], [158, -7764.640000, 0.072420, 0.014651, 0.097618 ], [164, -7764.750000, 0.064598, 0.013180, 0.098270 ], [159, -7764.790000, 0.062405, 0.000006, 0.100204 ], [154, -7764.880000, 0.057047, 0.015820, 0.099669 ] ], "n": ["FDJVGXF02JGWV1_rvcmp", "FDJVGXF02HB03U_rvcmp" ] }, {"p": [[196, -8755.910000, 0.738720, 0.063985, 0.091237 ], [197, -8757.970000, 0.094179, 0.019097, 0.107466 ], [198, -8758.010000, 0.090475, 0.009866, 0.107950 ], [199, -8758.180000, 0.076626, 0.004034, 0.108207 ] ], "n": ["FDJVGXF02GWQF3" ] }, {"p": [[196, -7793.980000, 0.923067, 0.063042, 0.081199 ], [198, -7797.160000, 0.038656, 0.003789, 0.101114 ], [199, -7797.800000, 0.020262, 0.013298, 0.100778 ], [197, -7797.920000, 0.018015, 0.017018, 0.100569 ] ], "n": ["FDJVGXF02HLEEZ" ] }, {"p": [[196, -7688.790000, 0.871839, 0.058636, 0.046894 ], [198, -7691.660000, 0.049193, 0.000006, 0.070853 ], [204, -7691.840000, 0.041198, 0.007931, 0.061286 ], [200, -7692.790000, 0.016000, 0.007900, 0.065285 ], [203, -7693.100000, 0.011728, 0.009988, 0.067540 ], [199, -7693.250000, 0.010043, 0.013298, 0.067244 ] ], "n": ["FDJVGXF02HSVL8" ] }, {"p": [[196, -5744.200000, 0.826062, 0.056879, 0.114279 ], [199, -5746.860000, 0.057557, 0.013298, 0.138360 ], [200, -5746.860000, 0.057552, 0.000006, 0.138359 ], [198, -5747.340000, 0.035691, 0.003066, 0.145291 ], [197, -5747.770000, 0.023138, 0.013820, 0.144563 ] ], "n": ["FDJVGXF02H2YWV_rvcmp" ] }, {"p": [[196, -7700.920000, 1.000000, 0.057368, 0.081568 ] ], "n": ["FDJVGXF02I84EL" ] }, {"p": [[196, -7753.030000, 1.000000, 0.057354, 0.081151 ] ], "n": ["FDJVGXF02I8X2Z" ] }, {"p": [[196, -8028.220000, 0.968546, 0.055350, 0.049784 ], [198, -8032.020000, 0.021685, 0.000006, 0.076852 ], [204, -8032.810000, 0.009769, 0.004972, 0.068562 ] ], "n": ["FDJVGXF02I4V5F_rvcmp" ] }, {"p": [[196, -4233.620000, 0.441152, 0.055313, 0.033392 ], [204, -4234.290000, 0.225609, 0.004143, 0.041557 ], [200, -4234.880000, 0.125283, 0.012685, 0.048187 ], [203, -4234.880000, 0.125095, 0.009988, 0.048189 ], [199, -4235.750000, 0.052386, 0.013298, 0.051075 ], [197, -4236.980000, 0.015238, 0.024513, 0.062757 ], [198, -4236.990000, 0.015237, 0.013117, 0.062753 ] ], "n": ["FDJVGXF02JMUNU_rvcmp" ] }, {"p": [[196, -5914.230000, 0.276726, 0.053576, 0.070774 ], [204, -5914.500000, 0.209663, 0.009682, 0.078431 ], [20, -5914.540000, 0.202477, 0.000005, 0.067201 ], [205, -5915.220000, 0.102008, 0.019428, 0.062940 ], [21, -5915.600000, 0.069789, 0.000009, 0.068721 ], [19, -5915.610000, 0.069681, 0.012620, 0.068724 ], [22, -5915.610000, 0.069655, 0.004274, 0.065908 ] ], "n": ["FDJVGXF02H75N6_rvcmp" ] }, {"p": [[196, -7961.580000, 0.282986, 0.053940, 0.044954 ], [204, -7961.850000, 0.216619, 0.006170, 0.054211 ], [22, -7961.940000, 0.198175, 0.007165, 0.045084 ], [200, -7962.710000, 0.092066, 0.012685, 0.059667 ], [203, -7962.710000, 0.091879, 0.009988, 0.059681 ], [20, -7962.810000, 0.083131, 0.000005, 0.051403 ], [21, -7963.670000, 0.035144, 0.017641, 0.050053 ] ], "n": ["FDJVGXF02GTJG6_rvcmp" ] }, {"p": [[196, -5462.740000, 0.447923, 0.052941, 0.073386 ], [198, -5462.990000, 0.348375, 0.000006, 0.092817 ], [206, -5465.080000, 0.043133, 0.000001, 0.100301 ], [207, -5465.080000, 0.043133, 0.000001, 0.100301 ], [208, -5465.080000, 0.043129, 0.000006, 0.100297 ], [204, -5465.230000, 0.037246, 0.019138, 0.093986 ], [205, -5465.240000, 0.037059, 0.000009, 0.094134 ] ], "n": ["FDJVGXF02IT7U0" ] }, {"p": [[196, -7543.470000, 0.682801, 0.052770, 0.036897 ], [202, -7544.520000, 0.237966, 0.040906, 0.038409 ], [204, -7546.120000, 0.048265, 0.008112, 0.053051 ], [20, -7547.040000, 0.019216, 0.000007, 0.063159 ], [203, -7547.530000, 0.011752, 0.009992, 0.059308 ] ], "n": ["FDJVGXF02IW454" ] }, {"p": [[196, -5478.070000, 0.270880, 0.050535, 0.048190 ], [25, -5478.240000, 0.227170, 0.013270, 0.060948 ], [205, -5478.280000, 0.219259, 0.000007, 0.061625 ], [204, -5478.280000, 0.219202, 0.020144, 0.061626 ], [202, -5480.170000, 0.033097, 0.037692, 0.051426 ], [226, -5480.520000, 0.023311, 0.023104, 0.051055 ], [24, -5481.710000, 0.007082, 0.000009, 0.077917 ] ], "n": ["FDJVGXF02I9B7H_rvcmp" ] }, {"p": [[196, -7934.540000, 0.973773, 0.050315, 0.081416 ], [198, -7938.700000, 0.015198, 0.003151, 0.106421 ], [200, -7939.020000, 0.011029, 0.002747, 0.101774 ] ], "n": ["FDJVGXF02F3MP3_rvcmp" ] }, {"p": [[196, -7889.360000, 0.565839, 0.050336, 0.060226 ], [204, -7889.960000, 0.309812, 0.007864, 0.067671 ], [200, -7891.630000, 0.058692, 0.012685, 0.078665 ], [203, -7891.630000, 0.058657, 0.009988, 0.078674 ], [202, -7893.750000, 0.007001, 0.054444, 0.077269 ] ], "n": ["FDJVGXF02HOUCZ_rvcmp" ] }, {"p": [[196, -8313.020000, 0.931547, 0.046747, 0.062265 ], [204, -8315.830000, 0.056240, 0.007578, 0.073567 ], [20, -8317.350000, 0.012214, 0.000007, 0.074844 ] ], "n": ["FDJVGXF02F6EI8_rvcmp" ] }, {"p": [[196, -7737.460000, 1.000000, 0.041850, 0.068590 ] ], "n": ["FDJVGXF02G3LTF_rvcmp" ] }, {"p": [[196, -7915.300000, 1.000000, 0.041785, 0.033621 ] ], "n": ["FDJVGXF02GNBQJ" ] }, {"p": [[196, -6455.250000, 0.773997, 0.040929, 0.059852 ], [170, -6457.280000, 0.101472, 0.013957, 0.093153 ], [171, -6457.600000, 0.074256, 0.007423, 0.091332 ], [149, -6457.990000, 0.050274, 0.063741, 0.095190 ] ], "n": ["FDJVGXF02FD1KI" ] }, {"p": [[196, -6706.160000, 0.447936, 0.039504, 0.078514 ], [204, -6707.080000, 0.178594, 0.004670, 0.088343 ], [200, -6707.470000, 0.121342, 0.012685, 0.094204 ], [203, -6707.470000, 0.121139, 0.009988, 0.094209 ], [195, -6708.080000, 0.065750, 0.009446, 0.092317 ], [20, -6708.610000, 0.038690, 0.000007, 0.081718 ], [199, -6708.990000, 0.026549, 0.010371, 0.096663 ] ], "n": ["FDJVGXF02FDO26" ] }, {"p": [[196, -8809.850000, 0.654365, 0.034227, 0.062942 ], [20, -8810.640000, 0.297178, 0.002143, 0.068102 ], [21, -8813.190000, 0.023227, 0.008318, 0.069372 ], [22, -8813.780000, 0.012870, 0.000303, 0.071342 ], [19, -8813.820000, 0.012361, 0.012620, 0.072652 ] ], "n": ["FDJVGXF02HV8UI" ] }, {"p": [[196, -8829.800000, 0.537653, 0.031647, 0.064045 ], [20, -8830.100000, 0.398528, 0.002132, 0.068792 ], [21, -8832.670000, 0.030529, 0.008227, 0.070122 ], [22, -8833.270000, 0.016789, 0.000009, 0.072215 ], [19, -8833.290000, 0.016502, 0.012620, 0.073426 ] ], "n": ["FDJVGXF02H1V68_rvcmp" ] }, {"p": [[196, -8866.540000, 0.546881, 0.031580, 0.057658 ], [20, -8866.900000, 0.379951, 0.002125, 0.063395 ], [21, -8869.490000, 0.028443, 0.008249, 0.064409 ], [22, -8870.130000, 0.015098, 0.000008, 0.066482 ], [18, -8870.130000, 0.015088, 0.051699, 0.066486 ], [19, -8870.160000, 0.014538, 0.012620, 0.067712 ] ], "n": ["FDJVGXF02FK2T6" ] }, {"p": [[196, -8887.370000, 0.543554, 0.031610, 0.057491 ], [20, -8887.720000, 0.382836, 0.002118, 0.063242 ], [21, -8890.310000, 0.028636, 0.008249, 0.064241 ], [22, -8890.950000, 0.015185, 0.000008, 0.066311 ], [18, -8890.950000, 0.015175, 0.051699, 0.066314 ], [19, -8890.980000, 0.014614, 0.012620, 0.067540 ] ], "n": ["FDJVGXF02IHEZI", "FDJVGXF02IOV8S" ] }, {"p": [[196, -6933.800000, 0.326027, 0.030665, 0.327534 ], [202, -6934.590000, 0.148581, 0.030180, 0.339475 ], [26, -6934.810000, 0.119046, 0.097406, 0.362252 ], [18, -6934.900000, 0.108701, 0.000006, 0.349953 ], [204, -6934.990000, 0.099246, 0.000010, 0.365485 ], [203, -6934.990000, 0.099203, 0.009988, 0.365482 ], [200, -6934.990000, 0.099197, 0.012685, 0.365488 ] ], "n": ["FDJVGXF02F2Q2N_rvcmp" ] }, {"p": [[196, -8514.960000, 1.000000, 0.029846, 0.020268 ] ], "n": ["FDJVGXF02JFT42" ] }, {"p": [[196, -6640.670000, 1.000000, 0.029480, 0.027799 ] ], "n": ["FDJVGXF02JPXGS" ] }, {"p": [[196, -7321.920000, 1.000000, 0.029396, 0.026666 ] ], "n": ["FDJVGXF02GA8P7", "FDJVGXF02JQ95E_rvcmp" ] }, {"p": [[196, -7234.640000, 1.000000, 0.029362, 0.024484 ] ], "n": ["FDJVGXF02GFHVP_rvcmp" ] }, {"p": [[196, -8772.880000, 0.832318, 0.027572, 0.083408 ], [18, -8775.500000, 0.060836, 0.042487, 0.092237 ], [22, -8775.830000, 0.043650, 0.004342, 0.097125 ], [21, -8776.060000, 0.034459, 0.017640, 0.100748 ], [226, -8776.250000, 0.028737, 0.016901, 0.087665 ] ], "n": ["FDJVGXF02FSSZZ" ] }, {"p": [[196, -8001.590000, 0.976398, 0.027037, 0.023547 ], [205, -8005.310000, 0.023602, 0.018679, 0.040011 ] ], "n": ["FDJVGXF02JIC7T_rvcmp" ] }, {"p": [[196, -8482.890000, 1.000000, 0.026770, 0.023942 ] ], "n": ["FDJVGXF02GCGBC_rvcmp" ] }, {"p": [[196, -8338.640000, 0.979567, 0.027022, 0.022092 ], [205, -8342.510000, 0.020433, 0.018693, 0.038041 ] ], "n": ["FDJVGXF02GZ0E1_rvcmp" ] }, {"p": [[196, -5840.320000, 0.986358, 0.023177, 0.023516 ], [34, -5844.600000, 0.013642, 0.009832, 0.049461 ] ], "n": ["FDJVGXF02GFSBX_rvcmp" ] }, {"p": [[196, -9026.770000, 0.747175, 0.020137, 0.077925 ], [26, -9028.430000, 0.142979, 0.089633, 0.086683 ], [195, -9028.690000, 0.109846, 0.009446, 0.093528 ] ], "n": ["FDJVGXF02HK7IC" ] }, {"p": [[196, -6097.010000, 0.336301, 0.018745, 0.059336 ], [20, -6097.430000, 0.221249, 0.000005, 0.055913 ], [21, -6098.220000, 0.100175, 0.000009, 0.056766 ], [19, -6098.220000, 0.100057, 0.012620, 0.056768 ], [22, -6098.350000, 0.088027, 0.000009, 0.056061 ], [18, -6098.350000, 0.087988, 0.051699, 0.056063 ], [204, -6098.640000, 0.066203, 0.005515, 0.067399 ] ], "n": ["FDJVGXF02FUK1Z" ] }, {"p": [[196, -5548.500000, 0.833120, 0.019455, 0.029487 ], [38, -5550.970000, 0.070599, 0.035877, 0.054971 ], [35, -5551.470000, 0.042910, 0.004163, 0.056927 ], [194, -5551.900000, 0.027676, 0.000007, 0.057887 ], [195, -5551.980000, 0.025694, 0.004399, 0.052496 ] ], "n": ["FDJVGXF02FIP0W_rvcmp" ] }, {"p": [[196, -9070.680000, 0.548104, 0.016653, 0.087700 ], [26, -9071.190000, 0.328624, 0.082531, 0.087977 ], [195, -9072.170000, 0.123273, 0.009446, 0.101920 ] ], "n": ["FDJVGXF02H7LXG" ] }, {"p": [[196, -7903.390000, 0.555956, 0.015895, 0.091525 ], [26, -7904.160000, 0.257659, 0.087612, 0.095510 ], [195, -7904.490000, 0.186385, 0.009446, 0.104625 ] ], "n": ["FDJVGXF02I0OMG" ] }, {"p": [[196, -8980.700000, 0.506767, 0.015007, 0.104492 ], [26, -8981.340000, 0.265599, 0.088456, 0.108596 ], [195, -8981.650000, 0.195136, 0.009446, 0.117722 ], [28, -8983.440000, 0.032498, 0.011801, 0.118231 ] ], "n": ["FDJVGXF02IHO2F_rvcmp" ] }, {"p": [[196, -9128.930000, 0.516168, 0.015334, 0.101966 ], [26, -9129.890000, 0.197918, 0.093599, 0.111507 ], [195, -9129.950000, 0.187413, 0.009446, 0.115151 ], [28, -9130.750000, 0.083647, 0.020652, 0.109386 ], [34, -9132.910000, 0.009686, 0.007880, 0.121196 ], [35, -9133.540000, 0.005168, 0.002530, 0.124675 ] ], "n": ["FDJVGXF02GCAOE_rvcmp" ] }, {"p": [[196, -9227.910000, 0.548940, 0.015125, 0.095074 ], [26, -9228.640000, 0.264597, 0.088510, 0.099037 ], [195, -9228.990000, 0.186463, 0.009446, 0.108184 ] ], "n": ["FDJVGXF02H6FMM" ] }, {"p": [[196, -4419.970000, 0.333585, 0.005023, 0.074790 ], [195, -4419.980000, 0.329163, 0.009446, 0.076098 ], [18, -4421.130000, 0.103969, 0.039319, 0.057524 ], [20, -4421.490000, 0.072970, 0.000007, 0.070980 ], [204, -4421.610000, 0.064355, 0.003995, 0.085953 ], [200, -4421.910000, 0.048001, 0.012685, 0.092980 ], [203, -4421.910000, 0.047958, 0.009988, 0.092988 ] ], "n": ["FDJVGXF02J17MT" ] }, {"p": [[198, -5953.370000, 0.452245, 0.000006, 0.083857 ], [196, -5953.780000, 0.300285, 0.058633, 0.066647 ], [206, -5955.560000, 0.050746, 0.000001, 0.090518 ], [207, -5955.560000, 0.050746, 0.000001, 0.090518 ], [208, -5955.560000, 0.050743, 0.000006, 0.090514 ], [204, -5955.620000, 0.047780, 0.018999, 0.084302 ], [205, -5955.620000, 0.047455, 0.000009, 0.084460 ] ], "n": ["FDJVGXF02FN31U" ] }, {"p": [[198, -6288.700000, 0.435534, 0.000006, 0.078680 ], [196, -6288.960000, 0.335288, 0.058457, 0.061628 ], [206, -6290.940000, 0.045939, 0.000002, 0.084880 ], [207, -6290.940000, 0.045939, 0.000002, 0.084880 ], [208, -6290.940000, 0.045939, 0.000007, 0.084876 ], [204, -6290.950000, 0.045860, 0.018934, 0.078758 ], [205, -6290.950000, 0.045501, 0.000009, 0.078919 ] ], "n": ["FDJVGXF02IIFNQ_rvcmp" ] }, {"p": [[198, -1938.890000, 0.178250, 0.000006, 0.016166 ], [199, -1938.920000, 0.173173, 0.000006, 0.016181 ], [197, -1938.920000, 0.173155, 0.024513, 0.016186 ], [200, -1939.240000, 0.125946, 0.000006, 0.016350 ], [196, -1939.240000, 0.125850, 0.078185, 0.016350 ], [203, -1939.360000, 0.111833, 0.009988, 0.016430 ], [204, -1939.360000, 0.111794, 0.000010, 0.016431 ] ], "n": ["FDJVGXF02JKST7_rvcmp" ] }, {"p": [[199, -5332.050000, 0.361622, 0.008065, 0.109432 ], [196, -5332.570000, 0.214944, 0.077148, 0.110842 ], [200, -5332.570000, 0.213818, 0.000006, 0.112001 ], [197, -5333.260000, 0.107216, 0.022211, 0.119596 ], [198, -5333.310000, 0.102400, 0.013117, 0.121389 ] ], "n": ["FDJVGXF02FIS0U_rvcmp" ] }, {"p": [[200, -4677.410000, 0.287771, 0.011791, 0.007877 ], [203, -4677.420000, 0.283970, 0.009988, 0.008034 ], [204, -4677.420000, 0.283427, 0.000010, 0.008035 ], [202, -4678.970000, 0.060370, 0.061340, 0.008218 ], [201, -4678.970000, 0.060214, 0.019126, 0.008330 ], [199, -4680.570000, 0.012131, 0.013295, 0.009278 ], [196, -4680.570000, 0.012116, 0.078185, 0.009276 ] ], "n": ["FDJVGXF02GPP0F_rvcmp" ] }, {"p": [[202, -7125.700000, 0.255360, 0.038114, 0.040788 ], [204, -7125.720000, 0.250176, 0.015582, 0.051883 ], [205, -7125.850000, 0.217900, 0.000007, 0.052379 ], [25, -7125.850000, 0.217881, 0.014512, 0.052372 ], [226, -7127.910000, 0.028006, 0.015741, 0.040727 ], [203, -7128.170000, 0.021449, 0.009988, 0.059102 ], [22, -7129.020000, 0.009229, 0.023373, 0.058955 ] ], "n": ["FDJVGXF02IHFWX_rvcmp" ] }, {"p": [[203, -6626.680000, 0.302983, 0.008433, 0.034217 ], [204, -6626.720000, 0.290800, 0.001210, 0.035241 ], [200, -6626.750000, 0.283924, 0.012685, 0.035578 ], [199, -6628.190000, 0.067150, 0.013298, 0.038683 ], [201, -6628.510000, 0.048736, 0.018498, 0.034367 ], [197, -6630.540000, 0.006407, 0.019935, 0.042943 ] ], "n": ["FDJVGXF02HOBUR_rvcmp" ] }, {"p": [[203, -4827.150000, 0.252092, 0.002990, 0.074732 ], [202, -4827.280000, 0.221113, 0.061774, 0.076556 ], [201, -4827.280000, 0.221014, 0.019126, 0.076552 ], [204, -4827.880000, 0.121397, 0.003448, 0.071905 ], [200, -4828.180000, 0.089931, 0.012685, 0.078084 ], [197, -4828.520000, 0.064001, 0.005729, 0.086018 ], [196, -4829.260000, 0.030451, 0.073973, 0.080590 ] ], "n": ["FDJVGXF02IU8SX_rvcmp" ] }, {"p": [[204, -7717.260000, 0.792143, 0.014821, 0.105812 ], [24, -7719.880000, 0.057342, 0.000009, 0.116300 ], [25, -7719.890000, 0.056747, 0.001075, 0.115759 ], [23, -7719.900000, 0.056473, 0.003604, 0.116317 ], [205, -7720.310000, 0.037295, 0.007364, 0.108995 ] ], "n": ["FDJVGXF02FZVGF" ] }, {"p": [[204, -5924.510000, 0.194664, 0.013919, 1.175980 ], [23, -5924.740000, 0.154861, 0.000007, 1.228700 ], [24, -5924.740000, 0.154861, 0.000009, 1.228710 ], [25, -5924.740000, 0.154854, 0.000007, 1.228720 ], [205, -5924.780000, 0.148880, 0.000009, 1.240530 ], [227, -5925.130000, 0.104681, 0.012980, 1.266240 ], [10, -5925.310000, 0.087200, 0.133410, 1.180550 ] ], "n": ["FDJVGXF02GN1PE" ] }, {"p": [[204, -6480.150000, 0.455929, 0.012455, 0.123937 ], [22, -6480.650000, 0.274846, 0.017628, 0.116152 ], [205, -6481.290000, 0.145889, 0.019360, 0.116972 ], [208, -6482.580000, 0.039816, 0.009315, 0.122646 ], [206, -6482.820000, 0.031319, 0.000001, 0.126450 ], [207, -6482.820000, 0.031319, 0.000001, 0.126450 ], [209, -6483.230000, 0.020883, 0.000007, 0.125807 ] ], "n": ["FDJVGXF02JO714" ] }, {"p": [[204, -8054.200000, 0.362395, 0.010818, 0.046329 ], [20, -8054.410000, 0.293197, 0.000007, 0.048508 ], [22, -8055.140000, 0.140576, 0.004014, 0.044239 ], [21, -8055.400000, 0.108725, 0.017640, 0.047397 ], [19, -8055.530000, 0.095106, 0.012620, 0.049217 ] ], "n": ["FDJVGXF02GMDR6" ] }, {"p": [[204, -4785.640000, 0.282188, 0.009766, 0.069086 ], [20, -4786.020000, 0.193280, 0.000005, 0.057720 ], [196, -4786.100000, 0.178210, 0.034221, 0.066979 ], [21, -4786.790000, 0.089878, 0.000009, 0.058833 ], [19, -4786.790000, 0.089808, 0.012620, 0.058834 ], [22, -4786.810000, 0.088223, 0.003383, 0.055889 ], [200, -4786.920000, 0.078413, 0.012685, 0.080814 ] ], "n": ["FDJVGXF02GARPL_rvcmp" ] }, {"p": [[204, -7923.100000, 0.724229, 0.010238, 0.062679 ], [22, -7924.300000, 0.218076, 0.010963, 0.053646 ], [200, -7926.570000, 0.022482, 0.012685, 0.078517 ], [203, -7926.570000, 0.022451, 0.009988, 0.078520 ], [196, -7927.140000, 0.012762, 0.056194, 0.069040 ] ], "n": ["FDJVGXF02I9J86_rvcmp" ] }, {"p": [[204, -7948.440000, 0.469520, 0.009059, 0.046214 ], [205, -7949.530000, 0.156930, 0.023857, 0.045391 ], [22, -7950.130000, 0.086692, 0.023075, 0.048157 ], [200, -7950.250000, 0.076527, 0.011978, 0.051779 ], [203, -7950.280000, 0.074498, 0.009988, 0.052743 ], [208, -7950.370000, 0.067929, 0.024246, 0.051059 ], [209, -7950.370000, 0.067904, 0.000007, 0.051062 ] ], "n": ["FDJVGXF02HX53E_rvcmp" ] }, {"p": [[204, -7755.470000, 0.559303, 0.007860, 0.072168 ], [203, -7756.570000, 0.185713, 0.006227, 0.081643 ], [200, -7757.180000, 0.100835, 0.012685, 0.083133 ], [201, -7757.220000, 0.097132, 0.019126, 0.086013 ], [197, -7758.420000, 0.029379, 0.012025, 0.088107 ], [196, -7759.040000, 0.015807, 0.067864, 0.081295 ], [199, -7759.330000, 0.011831, 0.013298, 0.087235 ] ], "n": ["FDJVGXF02FMHGW" ] }, {"p": [[204, -6152.060000, 0.548636, 0.007802, 0.057802 ], [20, -6153.460000, 0.135859, 0.000007, 0.058940 ], [200, -6153.820000, 0.094270, 0.012685, 0.070591 ], [203, -6153.820000, 0.094210, 0.009988, 0.070593 ], [22, -6154.340000, 0.056290, 0.003016, 0.054921 ], [21, -6154.470000, 0.049635, 0.017640, 0.058086 ], [196, -6155.320000, 0.021100, 0.063329, 0.065114 ] ], "n": ["FDJVGXF02GDD4M" ] }, {"p": [[204, -8113.120000, 0.610007, 0.006987, 0.065609 ], [200, -8114.410000, 0.168827, 0.012685, 0.073850 ], [203, -8114.410000, 0.168661, 0.009988, 0.073844 ], [196, -8116.390000, 0.023341, 0.068707, 0.072268 ], [199, -8116.620000, 0.018375, 0.013298, 0.076766 ], [197, -8117.160000, 0.010789, 0.015763, 0.080893 ] ], "n": ["FDJVGXF02FPQ04_rvcmp" ] }, {"p": [[204, -7325.160000, 0.345211, 0.006469, 0.049170 ], [196, -7325.230000, 0.322111, 0.055618, 0.039187 ], [200, -7326.120000, 0.131748, 0.012685, 0.055437 ], [203, -7326.120000, 0.131449, 0.009988, 0.055439 ], [199, -7327.330000, 0.039401, 0.008706, 0.055726 ], [197, -7328.290000, 0.015057, 0.024290, 0.064587 ], [198, -7328.290000, 0.015023, 0.013117, 0.064838 ] ], "n": ["FDJVGXF02HAZSY_rvcmp" ] }, {"p": [[204, -7211.000000, 0.285408, 0.003200, 0.040357 ], [200, -7211.350000, 0.200787, 0.009823, 0.043702 ], [203, -7211.390000, 0.192652, 0.009988, 0.043565 ], [199, -7211.780000, 0.129920, 0.013298, 0.046131 ], [196, -7211.780000, 0.129811, 0.078188, 0.046130 ], [197, -7213.070000, 0.035854, 0.020188, 0.047458 ], [198, -7213.410000, 0.025568, 0.013117, 0.050200 ] ], "n": ["FDJVGXF02F8G87_rvcmp" ] }, {"p": [[205, -4873.990000, 0.222671, 0.034333, 0.093321 ], [208, -4874.100000, 0.199548, 0.024224, 0.100445 ], [209, -4874.100000, 0.199418, 0.000007, 0.100444 ], [206, -4874.820000, 0.097091, 0.000001, 0.111845 ], [207, -4874.820000, 0.097091, 0.000001, 0.111845 ], [22, -4874.840000, 0.095455, 0.024327, 0.100654 ], [210, -4874.910000, 0.088726, 0.000009, 0.102512 ] ], "n": ["FDJVGXF02G4OMM_rvcmp" ] }, {"p": [[205, -9019.740000, 1.000000, 0.022062, 0.030197 ] ], "n": ["FDJVGXF02IEMAK_rvcmp" ] }, {"p": [[205, -7611.670000, 0.240448, 0.011473, 0.070255 ], [25, -7611.790000, 0.213191, 0.010913, 0.073465 ], [204, -7611.890000, 0.193378, 0.016943, 0.072479 ], [208, -7612.240000, 0.135154, 0.006863, 0.077518 ], [206, -7612.590000, 0.095191, 0.000001, 0.082019 ], [207, -7612.590000, 0.095191, 0.000001, 0.082019 ], [209, -7613.840000, 0.027446, 0.000007, 0.079499 ] ], "n": ["FDJVGXF02JO6SN" ] }, {"p": [[206, -7523.930000, 0.159184, 0.000001, 1.866550 ], [207, -7523.930000, 0.159184, 0.000001, 1.866550 ], [208, -7523.930000, 0.159177, 0.000006, 1.866570 ], [209, -7524.120000, 0.130826, 0.000007, 1.893520 ], [205, -7524.120000, 0.130791, 0.038635, 1.893530 ], [210, -7524.120000, 0.130426, 0.000009, 1.893630 ], [22, -7524.120000, 0.130411, 0.028187, 1.893620 ] ], "n": ["FDJVGXF02IR6DU" ] }, {"p": [[206, -8262.110000, 0.156793, 0.000001, 1.795210 ], [207, -8262.110000, 0.156793, 0.000001, 1.795210 ], [208, -8262.110000, 0.156787, 0.000006, 1.795220 ], [209, -8262.280000, 0.132538, 0.000007, 1.806900 ], [205, -8262.280000, 0.132503, 0.038635, 1.806900 ], [210, -8262.280000, 0.132294, 0.000009, 1.806950 ], [22, -8262.280000, 0.132290, 0.028187, 1.806930 ] ], "n": ["FDJVGXF02H1AEE" ] }, {"p": [[208, -5856.200000, 0.325623, 0.017110, 0.079855 ], [210, -5856.790000, 0.181297, 0.009534, 0.083672 ], [205, -5857.210000, 0.119649, 0.031109, 0.081696 ], [209, -5857.290000, 0.110137, 0.003487, 0.087213 ], [225, -5857.410000, 0.097355, 0.036449, 0.088203 ], [226, -5857.410000, 0.097349, 0.000010, 0.088205 ], [22, -5857.760000, 0.068590, 0.025406, 0.086561 ] ], "n": ["FDJVGXF02FFCBJ" ] }, {"p": [[208, -5610.260000, 0.498922, 0.015839, 0.072657 ], [210, -5611.530000, 0.140356, 0.009928, 0.080290 ], [225, -5612.100000, 0.078799, 0.036449, 0.084755 ], [226, -5612.100000, 0.078779, 0.000008, 0.084755 ], [209, -5612.110000, 0.078069, 0.001895, 0.083133 ], [205, -5612.180000, 0.072861, 0.038635, 0.084588 ], [22, -5612.520000, 0.052214, 0.024471, 0.082434 ] ], "n": ["FDJVGXF02GQL06_rvcmp" ] }, {"p": [[208, -7108.930000, 0.575498, 0.015567, 0.063578 ], [209, -7110.110000, 0.175445, 0.003234, 0.071525 ], [210, -7110.750000, 0.093185, 0.000009, 0.075235 ], [22, -7110.750000, 0.093174, 0.028187, 0.075235 ], [205, -7111.140000, 0.062698, 0.038635, 0.072773 ] ], "n": ["FDJVGXF02FTU2D_rvcmp" ] }, {"p": [[208, -9487.900000, 0.692612, 0.011837, 0.085706 ], [22, -9489.000000, 0.230680, 0.013640, 0.090014 ], [205, -9491.330000, 0.022330, 0.036691, 0.095861 ], [209, -9491.370000, 0.021529, 0.000007, 0.097329 ], [18, -9491.640000, 0.016375, 0.047192, 0.099700 ], [206, -9492.330000, 0.008238, 0.000001, 0.104727 ], [207, -9492.330000, 0.008238, 0.000001, 0.104727 ] ], "n": ["FDJVGXF02GV4DK" ] }, {"p": [[208, -4850.630000, 0.304617, 0.011915, 0.064783 ], [210, -4850.840000, 0.246509, 0.010724, 0.070589 ], [226, -4851.370000, 0.146005, 0.000008, 0.074832 ], [225, -4851.370000, 0.145975, 0.036449, 0.074842 ], [22, -4851.900000, 0.085309, 0.023082, 0.071600 ], [209, -4852.160000, 0.065869, 0.006837, 0.077174 ], [206, -4854.610000, 0.005717, 0.000001, 0.094129 ] ], "n": ["FDJVGXF02JN35P_rvcmp" ] }, {"p": [[208, -7719.100000, 0.290524, 0.009037, 0.078841 ], [206, -7719.590000, 0.177871, 0.000001, 0.083816 ], [207, -7719.590000, 0.177871, 0.000001, 0.083816 ], [205, -7719.780000, 0.146548, 0.025989, 0.076197 ], [209, -7720.210000, 0.095342, 0.001674, 0.080442 ], [25, -7720.430000, 0.076662, 0.006514, 0.081984 ], [24, -7721.210000, 0.035182, 0.000009, 0.089140 ] ], "n": ["FDJVGXF02FE6FM" ] }, {"p": [[209, -5043.670000, 0.170866, 0.006837, 0.360517 ], [22, -5043.670000, 0.170837, 0.028185, 0.360512 ], [210, -5043.670000, 0.170778, 0.000009, 0.360522 ], [208, -5043.880000, 0.139537, 0.013382, 0.362265 ], [205, -5044.010000, 0.121508, 0.038635, 0.373292 ], [206, -5044.080000, 0.113237, 0.000001, 0.380884 ], [207, -5044.080000, 0.113237, 0.000001, 0.380884 ] ], "n": ["FDJVGXF02IPZCS" ] }, {"p": [[210, -6277.290000, 0.327278, 0.011153, 0.073292 ], [226, -6277.730000, 0.210815, 0.002805, 0.073959 ], [225, -6277.760000, 0.204394, 0.036449, 0.076326 ], [22, -6278.410000, 0.106937, 0.023199, 0.074501 ], [209, -6278.660000, 0.083563, 0.006837, 0.078594 ], [208, -6278.960000, 0.061842, 0.014785, 0.071767 ], [205, -6281.440000, 0.005171, 0.035818, 0.082190 ] ], "n": ["FDJVGXF02IVDO9_rvcmp" ] }, {"p": [[210, -3292.700000, 0.244359, 0.008897, 0.030335 ], [22, -3292.920000, 0.195699, 0.020016, 0.036181 ], [209, -3293.290000, 0.135252, 0.002826, 0.039519 ], [205, -3293.330000, 0.130743, 0.038635, 0.040468 ], [208, -3293.330000, 0.130712, 0.024246, 0.040477 ], [226, -3293.660000, 0.094026, 0.000008, 0.031633 ], [232, -3293.960000, 0.069210, 0.013988, 0.035063 ] ], "n": ["FDJVGXF02IIAX1_rvcmp" ] }, {"p": [[210, -9097.690000, 0.301069, 0.003823, 0.091486 ], [22, -9098.100000, 0.199102, 0.028187, 0.095962 ], [209, -9098.100000, 0.199067, 0.006837, 0.095963 ], [208, -9098.460000, 0.139362, 0.020699, 0.095384 ], [205, -9098.640000, 0.116469, 0.038635, 0.098168 ], [226, -9099.720000, 0.039396, 0.016348, 0.080820 ], [18, -9101.680000, 0.005535, 0.048078, 0.105049 ] ], "n": ["FDJVGXF02FOWVM_rvcmp" ] }, {"p": [[212, -6570.690000, 0.191652, 0.000008, 1.599450 ], [213, -6570.930000, 0.149994, 0.023979, 1.666710 ], [224, -6570.930000, 0.149991, 0.010740, 1.666680 ], [225, -6570.930000, 0.149987, 0.000009, 1.666700 ], [206, -6571.160000, 0.119460, 0.000001, 1.729820 ], [207, -6571.160000, 0.119460, 0.000001, 1.729820 ], [208, -6571.160000, 0.119455, 0.000006, 1.729820 ] ], "n": ["FDJVGXF02HJZAR" ] }, {"p": [[214, -8668.230000, 0.854738, 0.000008, 0.471808 ], [215, -8670.470000, 0.091543, 0.000010, 0.509642 ], [216, -8671.000000, 0.053719, 0.000009, 0.530734 ] ], "n": ["FDJVGXF02G0DM7_rvcmp" ] }, {"p": [[214, -7455.570000, 0.648919, 0.000008, 0.342334 ], [215, -7456.420000, 0.277386, 0.000010, 0.340786 ], [10, -7457.930000, 0.061178, 0.071087, 0.264395 ], [236, -7459.520000, 0.012517, 0.038667, 0.351053 ] ], "n": ["FDJVGXF02FIB3Y_rvcmp" ] }, {"p": [[219, -8098.800000, 0.145757, 0.000007, 1.952930 ], [220, -8098.800000, 0.145635, 0.000010, 1.953240 ], [223, -8098.810000, 0.145002, 0.016737, 1.951800 ], [216, -8098.810000, 0.144981, 0.038817, 1.951830 ], [217, -8098.810000, 0.144771, 0.000007, 1.958990 ], [221, -8098.820000, 0.143216, 0.000007, 1.962530 ], [22, -8098.910000, 0.130639, 0.010864, 1.891680 ] ], "n": ["FDJVGXF02I7JNP_rvcmp" ] }, {"p": [[225, -6552.070000, 0.198040, 0.036449, 0.287349 ], [210, -6552.070000, 0.198006, 0.018069, 0.287351 ], [226, -6552.070000, 0.197959, 0.000008, 0.287356 ], [21, -6552.600000, 0.117262, 0.011758, 0.301906 ], [206, -6552.790000, 0.096251, 0.000001, 0.267286 ], [207, -6552.790000, 0.096251, 0.000001, 0.267286 ], [208, -6552.790000, 0.096231, 0.000006, 0.267282 ] ], "n": ["FDJVGXF02F1KYJ" ] }, {"p": [[225, -7861.290000, 0.224647, 0.034311, 0.282015 ], [226, -7861.300000, 0.221459, 0.000008, 0.283964 ], [210, -7861.300000, 0.221319, 0.018069, 0.283974 ], [22, -7861.660000, 0.155623, 0.008005, 0.287305 ], [18, -7862.240000, 0.086873, 0.051699, 0.300100 ], [21, -7862.240000, 0.086803, 0.017640, 0.300105 ], [196, -7865.520000, 0.003276, 0.005421, 0.328594 ] ], "n": ["FDJVGXF02IBSRC_rvcmp" ] }, {"p": [[226, -9167.270000, 0.605224, 0.024043, 0.040757 ], [227, -9168.390000, 0.197792, 0.000425, 0.046122 ], [17, -9168.390000, 0.196983, 0.049256, 0.046178 ] ], "n": ["FDJVGXF02HVN6E_rvcmp" ] }, {"p": [[226, -9167.330000, 0.607474, 0.024016, 0.040499 ], [227, -9168.460000, 0.196702, 0.000440, 0.045857 ], [17, -9168.470000, 0.195825, 0.049256, 0.045914 ] ], "n": ["FDJVGXF02HWD2G_rvcmp" ] }, {"p": [[226, -8989.320000, 0.166932, 0.022732, 0.134312 ], [196, -8989.330000, 0.164801, 0.007097, 0.145407 ], [26, -8989.450000, 0.147027, 0.091982, 0.146807 ], [195, -8989.490000, 0.141112, 0.007722, 0.152005 ], [34, -8989.560000, 0.131663, 0.011565, 0.147611 ], [27, -8989.610000, 0.125216, 0.068162, 0.147837 ], [35, -8989.620000, 0.123248, 0.000006, 0.149644 ] ], "n": ["FDJVGXF02G2JAA" ] }, {"p": [[226, -7991.320000, 0.224476, 0.022024, 0.092722 ], [204, -7991.400000, 0.207545, 0.014906, 0.102860 ], [205, -7991.480000, 0.190721, 0.005627, 0.101996 ], [200, -7991.740000, 0.147911, 0.007770, 0.103180 ], [17, -7992.130000, 0.099648, 0.049256, 0.097744 ], [209, -7992.400000, 0.076516, 0.006837, 0.111128 ], [208, -7992.760000, 0.053182, 0.011125, 0.107566 ] ], "n": ["FDJVGXF02HRO57" ] }, {"p": [[226, -8998.330000, 0.587487, 0.022200, 0.048804 ], [227, -8999.510000, 0.180822, 0.000006, 0.052928 ], [204, -9000.440000, 0.071335, 0.012816, 0.061827 ], [205, -9000.460000, 0.070359, 0.012954, 0.060897 ], [209, -9001.220000, 0.032706, 0.004603, 0.065954 ], [210, -9001.300000, 0.030234, 0.003806, 0.064630 ], [22, -9001.410000, 0.027057, 0.025979, 0.066752 ] ], "n": ["FDJVGXF02F500V" ] }, {"p": [[226, -8763.710000, 0.651508, 0.022037, 0.035096 ], [227, -8765.080000, 0.165590, 0.000006, 0.039550 ], [17, -8765.080000, 0.165570, 0.049256, 0.039548 ], [210, -8767.990000, 0.009057, 0.005929, 0.052418 ], [22, -8768.080000, 0.008274, 0.021469, 0.055649 ] ], "n": ["FDJVGXF02HW32Z", "FDJVGXF02HX8G5", "FDJVGXF02IRIEX" ] }, {"p": [[226, -7810.580000, 0.769777, 0.020203, 0.093161 ], [17, -7812.470000, 0.116842, 0.045590, 0.096622 ], [227, -7812.500000, 0.113381, 0.000006, 0.099478 ] ], "n": ["FDJVGXF02GV2KR" ] }, {"p": [[226, -8475.520000, 0.757107, 0.020412, 0.087656 ], [17, -8477.330000, 0.123358, 0.045747, 0.089171 ], [227, -8477.360000, 0.119535, 0.000006, 0.091854 ] ], "n": ["FDJVGXF02IYV3U" ] }, {"p": [[226, -9057.100000, 0.704792, 0.019928, 0.084408 ], [17, -9059.200000, 0.086289, 0.048440, 0.089723 ], [227, -9059.200000, 0.086206, 0.001090, 0.090478 ], [2, -9059.540000, 0.061364, 0.036220, 0.094287 ], [228, -9059.540000, 0.061350, 0.000005, 0.094297 ] ], "n": ["FDJVGXF02IP0G5_rvcmp" ] }, {"p": [[226, -5211.560000, 0.584600, 0.020133, 0.033079 ], [202, -5212.310000, 0.276753, 0.033392, 0.041999 ], [204, -5214.290000, 0.038172, 0.009238, 0.058965 ], [25, -5214.650000, 0.026550, 0.014456, 0.059839 ], [205, -5214.650000, 0.026546, 0.000009, 0.059883 ], [203, -5214.650000, 0.026510, 0.008423, 0.060995 ], [210, -5214.890000, 0.020868, 0.006852, 0.054771 ] ], "n": ["FDJVGXF02GDGF1" ] }, {"p": [[226, -7908.720000, 0.615762, 0.017709, 0.042904 ], [210, -7910.630000, 0.091526, 0.004593, 0.059623 ], [22, -7910.770000, 0.079425, 0.025132, 0.062548 ], [209, -7910.860000, 0.072227, 0.006835, 0.063443 ], [205, -7911.210000, 0.050890, 0.014623, 0.059060 ], [227, -7911.220000, 0.050507, 0.000006, 0.050826 ], [204, -7911.460000, 0.039663, 0.014578, 0.061440 ] ], "n": ["FDJVGXF02IDDNS_rvcmp" ] }, {"p": [[226, -3723.790000, 0.213616, 0.012113, 0.114438 ], [210, -3723.920000, 0.187484, 0.018071, 0.121045 ], [225, -3723.920000, 0.187460, 0.036449, 0.121035 ], [22, -3724.510000, 0.103516, 0.028187, 0.124398 ], [209, -3724.520000, 0.103365, 0.006837, 0.124393 ], [17, -3724.520000, 0.103046, 0.045841, 0.108959 ], [227, -3724.530000, 0.101513, 0.000006, 0.112454 ] ], "n": ["FDJVGXF02FUQ8G" ] }, {"p": [[226, -5050.810000, 0.654156, 0.007162, 0.018239 ], [225, -5052.140000, 0.173021, 0.036449, 0.021992 ], [210, -5052.140000, 0.172823, 0.018069, 0.021995 ] ], "n": ["FDJVGXF02I3PQ2" ] }, {"p": [[229, -6936.830000, 0.170619, 0.047227, 1.679370 ], [231, -6936.830000, 0.170613, 0.000009, 1.679400 ], [230, -6936.830000, 0.170604, 0.047159, 1.679370 ], [240, -6937.130000, 0.126561, 0.009182, 1.762930 ], [239, -6937.180000, 0.120791, 0.000006, 1.797120 ], [232, -6937.180000, 0.120443, 0.005249, 1.790590 ], [228, -6937.180000, 0.120370, 0.021550, 1.788520 ] ], "n": ["FDJVGXF02GAGIC_rvcmp" ] }, {"p": [[229, -6730.440000, 0.174786, 0.047227, 1.466720 ], [231, -6730.440000, 0.174781, 0.000009, 1.466730 ], [230, -6730.440000, 0.174775, 0.047159, 1.466710 ], [239, -6730.810000, 0.120880, 0.000006, 1.561310 ], [238, -6730.810000, 0.120879, 0.027841, 1.561310 ], [232, -6730.840000, 0.117477, 0.018214, 1.580760 ], [228, -6730.850000, 0.116422, 0.021550, 1.578230 ] ], "n": ["FDJVGXF02IKPBB" ] }, {"p": [[232, -2413.120000, 0.309357, 0.009403, 0.055791 ], [228, -2413.880000, 0.145940, 0.021550, 0.076800 ], [231, -2413.880000, 0.145901, 0.017416, 0.076810 ], [239, -2414.120000, 0.114472, 0.011594, 0.052317 ], [240, -2414.140000, 0.111549, 0.000006, 0.053161 ], [17, -2414.370000, 0.088998, 0.028655, 0.066958 ], [1, -2414.430000, 0.083782, 0.000006, 0.085656 ] ], "n": ["FDJVGXF02H7I8C" ] }, {"p": [[232, -6164.290000, 0.243973, 0.000936, 0.081309 ], [228, -6164.290000, 0.243513, 0.021550, 0.081426 ], [227, -6164.960000, 0.125649, 0.012980, 0.081827 ], [236, -6165.170000, 0.101603, 0.058945, 0.086204 ], [237, -6165.220000, 0.096385, 0.000006, 0.088025 ], [239, -6165.220000, 0.096181, 0.008215, 0.085220 ], [240, -6165.260000, 0.092696, 0.004864, 0.081701 ] ], "n": ["FDJVGXF02JNDRR_rvcmp" ] }, {"p": [[235, -6815.770000, 0.150270, 0.045059, 1.713130 ], [236, -6815.770000, 0.150265, 0.061431, 1.713100 ], [237, -6815.770000, 0.150253, 0.000006, 1.713150 ], [229, -6815.820000, 0.142815, 0.047227, 1.767040 ], [231, -6815.820000, 0.142803, 0.000009, 1.767050 ], [230, -6815.820000, 0.142795, 0.047159, 1.767020 ], [233, -6815.990000, 0.120799, 0.062297, 1.850000 ] ], "n": ["FDJVGXF02FZF33_rvcmp" ] }, {"p": [[235, -9241.570000, 0.170651, 0.000006, 1.999990 ], [233, -9241.570000, 0.170646, 0.062297, 1.999990 ], [234, -9241.570000, 0.170637, 0.079656, 1.999990 ], [237, -9241.820000, 0.133791, 0.000006, 1.999990 ], [236, -9241.820000, 0.133784, 0.061431, 1.999990 ], [229, -9241.830000, 0.132680, 0.007274, 1.999990 ], [228, -9242.240000, 0.087812, 0.000005, 1.999990 ] ], "n": ["FDJVGXF02FRDNE" ] }, {"p": [[240, -7806.970000, 0.553233, 0.028569, 0.101861 ], [248, -7807.590000, 0.296729, 0.028534, 0.105895 ], [226, -7809.270000, 0.055525, 0.027424, 0.138972 ], [227, -7809.430000, 0.047257, 0.000006, 0.140544 ], [17, -7809.430000, 0.047256, 0.049256, 0.140541 ] ], "n": ["FDJVGXF02FYRR3_rvcmp" ] }, {"p": [[248, -3010.210000, 0.512993, 0.051200, 0.037859 ], [250, -3011.110000, 0.208924, 0.021035, 0.056520 ], [249, -3011.110000, 0.208923, 0.012515, 0.056520 ], [17, -3013.180000, 0.026366, 0.020241, 0.045227 ], [225, -3013.630000, 0.016906, 0.024317, 0.053746 ], [226, -3013.820000, 0.013984, 0.020923, 0.062222 ], [228, -3013.980000, 0.011904, 0.021550, 0.070677 ] ], "n": ["FDJVGXF02IPHPT", "FDJVGXF02IPHPQ" ] }, {"p": [[248, -8779.640000, 0.535936, 0.029631, 0.123606 ], [240, -8780.340000, 0.267712, 0.028019, 0.125973 ], [226, -8781.560000, 0.078597, 0.006819, 0.149631 ], [225, -8782.050000, 0.048244, 0.036449, 0.155032 ], [210, -8782.050000, 0.048226, 0.018069, 0.155038 ], [23, -8783.220000, 0.015067, 0.000007, 0.157500 ], [247, -8784.100000, 0.006219, 0.013494, 0.150256 ] ], "n": ["FDJVGXF02GW5EL" ] } ], "metadata": {"invocation": "guppy to_json" }, "version": 1, "fields": ["edge_num", "likelihood", "like_weight_ratio", "distal_length", "pendant_length" ] }pplacer-1.1.alpha19/tests/data/multi/000077500000000000000000000000001303154601500174425ustar00rootroot00000000000000pplacer-1.1.alpha19/tests/data/multi/multi_test1.jplace000066400000000000000000000007021303154601500230730ustar00rootroot00000000000000{"tree": "((A:2[0],B:9[1]):7[2],C:5[3],D:1[4]):0[5];", "placements": [{"p": [[0, -1309.830000, 1.000000, 1.000000, 10.000000 ] ], "n": [ "one_x1", "one_x2", "one_x3" ] }, {"p": [[1, -1309.830000, 1.000000, 2.000000, 10.000000 ] ], "n": [ "one_y1", "one_y2", "one_y3", "one_y4", "one_y5" ] } ], "metadata": {"invocation": "guppy to_json" }, "version": 1, "fields": ["edge_num", "likelihood", "like_weight_ratio", "distal_length", "pendant_length" ] } pplacer-1.1.alpha19/tests/data/multi/test1and3.jplace000066400000000000000000000007331303154601500224330ustar00rootroot00000000000000{"tree": "((A:2[0],B:9[1]):7[2],C:5[3],D:1[4]):0[5];", "placements": [{"p": [[0, -1309.830000, 1.000000, 1.000000, 10.000000]], "n": ["one_x"]}, {"p": [[1, -1309.830000, 1.000000, 2.000000, 10.000000]], "n": ["one_y"] }, {"p": [[2, -1309.830000, 1.000000, 2.000000, 10.000000]], "n": ["three"]} ], "metadata": {"invocation": "guppy merge"}, "version": 1, "fields": ["edge_num", "likelihood", "like_weight_ratio", "distal_length", "pendant_length" ] } pplacer-1.1.alpha19/tests/data/multi/test3.jplace000066400000000000000000000004621303154601500216660ustar00rootroot00000000000000{"tree": "((A:2[0],B:9[1]):7[2],C:5[3],D:1[4]):0[5];", "placements": [{"p": [[2, -1309.830000, 1.000000, 2.000000, 10.000000 ] ], "n": ["three" ] } ], "metadata": {"invocation": "guppy to_json" }, "version": 1, "fields": ["edge_num", "likelihood", "like_weight_ratio", "distal_length", "pendant_length" ] }pplacer-1.1.alpha19/tests/data/multi/test4.jplace000066400000000000000000000005601303154601500216660ustar00rootroot00000000000000{"tree": "((A:2[0],B:9[1]):7[2],C:5[3],D:1[4]):0[5];", "placements": [{"p": [[2, -1309.830000, 3.000000, 5.000000, 10.000000 ], [3, -1309.830000, 1.000000, 5.000000, 10.000000 ] ], "n": ["four_a", "four_b" ] } ], "metadata": {"invocation": "guppy to_json" }, "version": 1, "fields": ["edge_num", "likelihood", "like_weight_ratio", "distal_length", "pendant_length" ] }pplacer-1.1.alpha19/tests/data/multi/test4_demulti.jplace000066400000000000000000000007511303154601500234130ustar00rootroot00000000000000{"tree": "((A:2[0],B:9[1]):7[2],C:5[3],D:1[4]):0[5];", "placements": [{"p": [[2, -1309.830000, 3.000000, 5.000000, 10.000000 ], [3, -1309.830000, 1.000000, 5.000000, 10.000000 ] ], "n": ["four_a" ] }, {"p": [[2, -1309.830000, 3.000000, 5.000000, 10.000000 ], [3, -1309.830000, 1.000000, 5.000000, 10.000000 ] ], "n": ["four_b" ] } ], "metadata": {"invocation": "guppy to_json" }, "version": 1, "fields": ["edge_num", "likelihood", "like_weight_ratio", "distal_length", "pendant_length" ] }pplacer-1.1.alpha19/tests/data/psbA/000077500000000000000000000000001303154601500171755ustar00rootroot00000000000000pplacer-1.1.alpha19/tests/data/psbA/DCM.jplace000066400000000000000000002142361303154601500207700ustar00rootroot00000000000000{"tree": "((((chloroplast_Bangiopsis_subsimplex.AY119736_:0.0296744[0],((chloroplast_Erythrotrichia_carnea.AY119739_:0.0669714[1],chloroplast_Rhodochaete_parvula.AY119743_:0.0846451[2]):0.0473989[3],chloroplast_Rhodosorus_marinus.AY119744_:0.06578[4]):0.0135707[5]):0.0125774[6],((((chloroplast_Cyanidium_sp._Monte_Rotaro.AY391365_:0.14225[7],(chloroplast_Cyanidium_caldarium.AY541290_:0.229326[8],(chloroplast_Cyanidioschyzon_merolae_strain_DBV201.AY119729_:2.62716e-06[9],chloroplast_Cyanidioschyzon_merolae.AY119730_:0.00124934[10]):0.0764407[11]):0.0594726[12]):0.0411324[13],(((chloroplast_Vaucheria_litorea.AF227740_:0.0548633[14],(chloroplast_Bumilleriopsis_filiformis.X79223_:0.00713038[15],plastid_Tribonema_aequale.AY528860_:0.013462[16]):0.0188887[17]):0.0307213[18],((chloroplast_Heterosigma_carterae.HCU18090_:2.62716e-06[19],chloroplast_Heterosigma_akashiwo.AY119759_:2.62716e-06[20]):0.0264439[21],((((((((chloroplast_Pavlova_lutheri.AY119755_:0.0155337[22],chloroplast_Pavlova_gyrans.AY119754_:0.031921[23]):0.0284429[24],chloroplast_Pavlova_gyrans.AJ575575_:0.0184771[25]):0.0369803[26],(chloroplast_Phaeocystis_antarctica.AY119756_:0.032481[27],(((chloroplast_Emiliania_huxleyi.AJ575573_:0.00127856[28],(chloroplast_Emiliania_huxleyi.AY675521_:2.62716e-06[29],chloroplast_Emiliania_huxleyi.AY119752_:2.62716e-06[30]):2.62716e-06[31]):0.00987446[32],(chloroplast_Isochrysis_sp._SAG_927-2.AY119753_:0.00129238[33],chloroplast_Isochrysis_galbana.AJ575574_:0.00127939[34]):0.0180921[35]):0.00662445[36],((chloroplast_Prymnesium_parvum.AJ575576_:0.00781698[37],chloroplast_Prymnesium_parvum.AY119758_:0.0107643[38]):0.0264028[39],(chloroplast_Pleurochrysis_carterae.AY119757_:0.0355143[40],(chloroplast_Imantonia_rotunda.EU851963_:0.0471273[41],chloroplast_Chrysochromulina_polylepis.AJ575572_:0.0130868[42]):0.00866583[43]):0.00227491[44]):0.00414201[45]):0.00687632[46]):0.0219329[47]):0.0287832[48],(((chloroplast_Pycnococcus_provasolii.EU851957_:0.0991635[49],(chloroplast_Mantoniella_squamata.EU851964_:0.00735936[50],((chloroplast_Micromonas_pusilla.EU851965_:2.62716e-06[51],plastid_uncultured_Prasinophyceae.AY176639_:2.62716e-06[52]):0.00915325[53],(chloroplast_Ostreococcus_sp._RCC789.EU851970_:0.0155525[54],(((chloroplast_Bathycoccus_prasinos.EU851955_:0.0100228[55],(uncultured_Prasinophyceae.AY509538_:2.62716e-06[56],uncultured_Prasinophyceae.AY509537_:0.00127378[57]):0.018912[58]):0.0387387[59],plastid_uncultured_Prasinophyceae.AY176630_:0.0268697[60]):0.00352364[61],(plastid_uncultured_Prasinophyceae.AY176628_:0.0181777[62],((Ostreococcus_tauri_2_:2.62716e-06[63],Ostreococcus_tauri_:2.62716e-06[64]):0.010015[65],(plastid_uncultured_Prasinophyceae.AY176620_:2.62716e-06[66],chloroplast_Ostreococcus_sp._RCC344.EU851961_:2.62716e-06[67]):0.00559304[68]):0.00536261[69]):0.00155492[70]):0.0103018[71]):0.0195476[72]):0.0116489[73]):0.0572199[74]):0.0500432[75],(((chloroplast_Chlorella_pyrenoidosa.EU043049_:0.00246255[76],chloroplast_Chlorella_vulgaris.EU043044_:0.00128935[77]):0.0754025[78],(Bigelowiella_natans_:0.108317[79],(Chlamydomonas_reinhardtii_:0.0747763[80],(chloroplast_Picochlorum_sp._RCC289.EU851960_:0.0553565[81],(Chlorella_vulgaris_:0.0479649[82],(chloroplast_Chlorella_pyrenoidosa.EU043047_:0.00249514[83],(chloroplast_Chlorella_pyrenoidosa.EU043046_:0.00250654[84],chloroplast_Auxenochlorella_protothecoides.EU043045_:0.00125447[85]):2.62716e-06[86]):0.0170169[87]):0.0187545[88]):0.0162818[89]):0.0140918[90]):0.00695735[91]):0.0236101[92],plastid_Tetraselmis_marina.AY857618_:0.0274149[93]):0.0121743[94]):0.0144071[95],chloroplast_Pseudochlorella_sp._CCAP_211\/1A.EU043048_:0.0910399[96]):0.036916[97]):0.0178205[98],((((Microcystis_aerouginosa_gi166362741refNC_010296.1_:0.100689[99],((Cyanothece_sp._ATCC_51142.CAU39610_:0.0139443[100],Cyanothece_sp._CCY_0110___gi126657681refNZ_AAXW01000012.1_:0.0325757[101]):0.0368903[102],(Cyanothece_sp._PCC_7425_gi218437013refNC_011729.1_:0.0799602[103],Cyanothece_sp._PCC_8801_gi218244892refNC_011726.1_:0.06558[104]):0.017916[105]):0.0403653[106]):0.0316316[107],((Lyngbya_sp_PCC_8106___gi119483230refNZ_AAVU01000001.1_:0.174445[108],Mastigocladus_laminosus.AF170924_:0.292674[109]):0.0843939[110],((Nostock_punctiforme_gi186680550refNC_010628.1_:0.118661[111],((Nostoc_sp._PCC_7120_gi17227497refNC_003272.1_:0.00952002[112],Anabaena_variabilis_A_gi75906225refNC_007413.1_:0.0234306[113]):0.0386248[114],(Fremyella_diplosiphon.FDIPSBA_:0.0552418[115],Nodularia_spumige_gi119512239refNZ_AAVW01000065.1_:0.053628[116]):0.0204852[117]):0.0272273[118]):0.0361292[119],(Synechococcus_sp._PCC_7002___gi170076636refNC_010475.1_:0.0899374[120],((Microcoleus_chthonoplastes_PCC_7420___gi224400128refNW_002435220.1_:0.0921412[121],(((Gloeobacter_violaceus_gi37519569refNC_005125.1_:0.287597[122],(Synechococcus_sp._JA-3-3Ab__gi86604733refNC_007775.1_:0.0880842[123],Synechococcus_sp._JA-2-3Ba____gi86607503refNC_007776.1_:0.637056[124]):0.0999416[125]):0.153018[126],(Thermosynechococcus_gi22297544refNC_004113.1_:0.12404[127],((Acaryochloris_marina_MBIC11017.AB303650_2_:2.62716e-06[128],Acaryochloris_marina_MBIC11017.AB303650_:2.62716e-06[129]):0.240343[130],Cyanothece_sp._PCC_7425_gi220905643refNC_011884.1_:0.144677[131]):0.0173981[132]):0.0300352[133]):0.0359263[134],((Prochlorothrix_hollandica.X14308_:2.62716e-06[135],Prochlorothrix_hollandica.X14523_:0.00135654[136]):0.0865866[137],((Synechococcus_elongatus_PCC_7942___gi81298811refNC_007604.1_:0.0113412[138],Synechococcus_elongatus_PCC_6301___gi56750010refNC_006576.1_:0.00283364[139]):0.115006[140],((Synechococcus_sp._WH_5701__gi87303211refNZ_AANO01000010.1_:0.077507[141],((Synechococcus_sp._WH_5701___gi211606500refNZ_CH724159.1_:2.62716e-06[142],Synechococcus_sp._WH_5701_gi87303578refNZ_AANO01000013.1_:2.62716e-06[143]):2.62716e-06[144],(Synechococcus_sp._WH_5701__gi87301761refNZ_AANO01000004.1_:2.62716e-06[145],Synechococcus_sp._WH_5701__gi211606501refNZ_CH724160.1_:2.62716e-06[146]):2.62716e-06[147]):0.0116739[148]):0.0161385[149],((((((Synechococcus_sp.__WH_7805__gi88807077refNZ_AAOK01000001.1_:0.00282307[150],(Synechococcus_sp._WH_7805__gi88807768refNZ_AAOK01000002.1_:2.62716e-06[151],(Synechococcus_sp._WH_7805_gi211594037refNZ_CH724168.1_:2.62716e-06[152],Synechococcus_sp._WH_7805__gi88809542refNZ_AAOK01000006.1_:2.62716e-06[153]):0.00138873[154]):0.00276638[155]):0.00844882[156],Synechococcus_sp._WH_7803___gi148238336refNC_009481.1_:0.00801814[157]):0.0180692[158],(Synechococcus_sp._RS9917___gi87125174refNZ_AANP01000006.1_:2.62716e-06[159],(Synechococcus_sp._RS9917___gi87124875refNZ_AANP01000005.1_:2.62716e-06[160],Synechococcus_sp._RS9__gi211606499refNZ_CH724158.1_:2.62716e-06[161]):0.00278788[162]):0.00874388[163]):0.00421837[164],((Synechococcus_sp._RCC307_gi148241099refNC_009482.1_:0.0436787[165],(Synechococcus_sp._CC9605_gi78211558refNC_007516.1_:0.0292645[166],((Synechococcus_sp._CC9902_gi78183584refNC_007513.1_:0.00569178[167],(Synechococcus_sp.__BL107__gi116072546refNZ_AATZ01000004.1_:2.62716e-06[168],Synechococcus_sp._BL107_gi211594587refNZ_DS022298.1_:2.62716e-06[169]):0.00260315[170]):0.0417448[171],Synechococcus_sp._WH_8102_gi33864539refNC_005070.1_:0.0213766[172]):0.00906289[173]):0.0225313[174]):0.0359511[175],(Synechococcus_sp._gi87123618refNZ_AANP01000002.1_:0.0436975[176],(Prochlorococcus_marinus_str._MIT_9303___gi124021714refNC_008820.1_:0.213286[177],(Synechococcus_sp.__RS9916__gi116074999refNZ_AAUA01000003.1_:2.62716e-06[178],Synechococcus_sp._RS9__gi211594588refNZ_DS022299.1_:2.62716e-06[179]):0.0326556[180]):0.018698[181]):0.0201245[182]):0.0123275[183]):0.0171659[184],Synechococcus_sp._RS9917__gi87124182refNZ_AANP01000003.1_:0.206502[185]):0.0124936[186],Cyanobium_sp._PCC_70_gi223490194refNW_002243451.1_:0.0349915[187]):0.0244749[188]):0.0552727[189]):0.0484564[190]):0.0330387[191]):0.053081[192]):0.0322305[193],Synechocystis_sp_PCC_6803___gi16329170refNC_000911.1_:0.055271[194]):0.0342032[195]):0.0313[196]):0.003393[197]):0.0208115[198]):0.0544215[199],Trichodesmium_erythr_gi113473942refNC_008312.1_:0.115405[200]):0.0393095[201],(((Prochlorococcus_marinus_str._NATL1A___gi124024712refNC_008819.1_:2.62716e-06[202],Procholococcus_marinus_str._NATL2A___gi162958048refNC_007335.2_:0.00387272[203]):0.0652348[204],(Prochlorococcus_marinus_subsp._marinus_str._CCMP1375_gi33239452refNC_005042.1_:0.107069[205],Procholococcus_marinus_str._MIT_9211___gi159902540refNC_009976.1_:0.0648332[206]):0.0645389[207]):0.0732978[208],((Prochlorococcus_marinus_subsp._pastoris_str._CCMP1986_gi33860560refNC_005072.1_:0.00386442[209],Prochlorococcus_marinus_str._MIT_9515___gi123965234refNC_008817.1_:0.00513584[210]):0.0108901[211],(Prochlorococcus_marinus_str._AS9601_gi123967536refNC_008816.1_:2.62716e-06[212],(Prochlorococcus_marinus_str._MIT_9301__gi126695337refNC_009091.1_:0.0115344[213],(Prochlorococcus_marinus_str._MIT_9312_gi78778385refNC_007577.1_:0.00402475[214],(Procholococcus_marinus_str._MIT_9215___gi157412338refNC_009840.1_:2.62716e-06[215],Procholococcus_marinus_str._MIT_9202_gi225077649refNW_002467725.1_:0.00254717[216]):0.00627816[217]):0.005283[218]):0.00140083[219]):0.0116153[220]):0.0461325[221]):0.158153[222]):0.0598755[223]):0.0735348[224],(Fragilariopsis_psbA_:0.0261132[225],Pmultiseries_psbA_:0.0139712[226]):0.0137913[227]):0.0138551[228],(plastid_Ballia_callitricha.DQ787635_:0.0643769[229],Phaeodactylum_tricornutum_:0.0212228[230]):0.0108685[231]):0.0220385[232],(chloroplast_Skeletonema_costatum.AY119761_:0.0037475[233],(Thalassiosira_pseudonana_2_:2.62716e-06[234],Thalassiosira_pseudonana_:2.62716e-06[235]):0.00128936[236]):0.0148686[237]):0.0413777[238]):0.00677313[239]):0.0181954[240],(((chloroplast_Fucus_vesiculosus.DQ307679_:0.0363344[241],chloroplast_Ectocarpus_siliculosus.X56695_:0.0425758[242]):0.0409036[243],(chloroplast_Padina_crassa.AY422643_:0.00945597[244],(plastid_Padina_japonica.AY430360_:0.0151942[245],(plastid_Padina_arborescens.AY430357_:0.0172454[246],(plastid_Padina_crassa.AY430358_:2.62716e-06[247],(plastid_Padina_crassa.AY430359_:2.62716e-06[248],plastid_Padina_crassa.AY430361_:2.62716e-06[249]):2.62716e-06[250]):0.00738025[251]):0.00531298[252]):0.00363975[253]):0.0184925[254]):0.0115372[255],(chloroplast_Pachydictyon_coriaceum.AY422614_:0.0259434[256],((chloroplast_Dictyota_dichotoma.AY748320_:2.62716e-06[257],chloroplast_Dictyota_dichotoma.AY748319_:2.62716e-06[258]):0.00249624[259],((chloroplast_Dictyota_dichotoma_var._linearis.AY422632_:2.62716e-06[260],chloroplast_Dictyota_dichotoma.AY748321_:2.62716e-06[261]):2.62716e-06[262],chloroplast_Dictyota_dichotoma_var._linearis.AY422631_:2.62716e-06[263]):2.62716e-06[264]):0.00881923[265]):0.0248245[266]):0.0409737[267]):0.029059[268]):0.0193884[269],(((Synechococcus_sp._PCC_7335_gi225144522refNW_002475532.1_:0.432534[270],Cyanothece_sp._CC_gi126660325refNZ_AAXW01000053.1_:0.278199[271]):0.119517[272],(gi|5821419|dbj|AB025589.1|:0.454275[273],(chloroplast_Galdieria_sulphuraria.AY541295_:0.0610795[274],((chloroplast_Galdieria_sulphuraria.AY541294_:0.00123271[275],chloroplast_Galdieria_sulphuraria.AY541293_:2.62716e-06[276]):0.0217312[277],(chloroplast_Cyanidium_caldarium.X52758_:0.0207176[278],chloroplast_Galdieria_sulphuraria.AY119731_:4.5192e-05[279]):0.0300301[280]):0.0529495[281]):0.0732256[282]):0.0354697[283]):0.0691202[284],(Mesostigma_viride_:0.101394[285],Cyanophora_paradoxa_:0.0702149[286]):0.0248976[287]):0.014028[288]):0.0258734[289],(chloroplast_Flintiella_sanguinaria.AY119740_:0.0513641[290],chloroplast_Porphyridium_aerugineum.AY119741_:0.0495445[291]):0.0174643[292]):0.020752[293]):0.050369[294],(chloroplast_Palmaria_palmata.PPU28165_:0.104631[295],(plastid_Antithamnionella_sp._A31.DQ787640_:0.0202479[296],(chloroplast_Antithamnion_sp.X55364_:0.0292228[297],plastid_Carpoblepharis_flaccida.DQ787643_:0.112145[298]):0.00887985[299]):0.0324329[300]):0.0175603[301]):0.0769895[302],Porphyra_yezoensis_:0.0134362[303],Porphyra_purpurea_:0.022228[304]):0[305];", "placements": [{"p": [[7, -5451.970000, 0.053997, 0.135014, 1.347270 ], [12, -5451.990000, 0.052920, 0.052039, 1.340050 ], [13, -5452.030000, 0.050527, 0.005142, 1.355950 ] ], "n": ["FGQOF7X01D0L94" ] }, {"p": [[8, -8661.800000, 0.174148, 0.174359, 0.302958 ], [252, -8662.180000, 0.119458, 0.002656, 0.347542 ], [246, -8662.310000, 0.104105, 0.008623, 0.346696 ], [251, -8662.470000, 0.088687, 0.003690, 0.351373 ], [253, -8662.700000, 0.070430, 0.001820, 0.350387 ], [245, -8662.770000, 0.065739, 0.007597, 0.351374 ], [250, -8663.010000, 0.051737, 0.000001, 0.360393 ], [247, -8663.010000, 0.051737, 0.000001, 0.360393 ], [249, -8663.010000, 0.051737, 0.000001, 0.360393 ], [248, -8663.010000, 0.051737, 0.000001, 0.360393 ] ], "n": ["FGI73PY01DM1ZL" ] }, {"p": [[8, -9012.520000, 0.978830, 0.088064, 0.482848 ] ], "n": ["FGI73PY01EH87Q" ] }, {"p": [[8, -8749.650000, 0.404708, 0.143557, 0.435926 ], [273, -8749.780000, 0.357099, 0.336816, 0.365041 ], [9, -8751.360000, 0.073452, 0.000001, 0.476007 ], [10, -8751.360000, 0.073452, 0.000625, 0.476006 ], [11, -8751.410000, 0.069575, 0.009555, 0.471532 ] ], "n": ["FGI73PY01EZNF2" ] }, {"p": [[8, -7208.600000, 0.780213, 0.137408, 0.448333 ], [9, -7211.330000, 0.050891, 0.000001, 0.532635 ], [10, -7211.330000, 0.050891, 0.000625, 0.532635 ] ], "n": ["FGQOF7X01A7OY5" ] }, {"p": [[8, -5174.650000, 0.092122, 0.207524, 0.926996 ], [11, -5174.660000, 0.091395, 0.059025, 0.946960 ], [12, -5174.740000, 0.083807, 0.007434, 0.957649 ], [9, -5175.240000, 0.050868, 0.000001, 0.987423 ], [10, -5175.240000, 0.050868, 0.000625, 0.987424 ] ], "n": ["FGQOF7X01AO9U3" ] }, {"p": [[9, -7981.210000, 0.240081, 0.000001, 0.514892 ], [10, -7981.210000, 0.240081, 0.000625, 0.514892 ], [11, -7981.330000, 0.212407, 0.009555, 0.512404 ], [130, -7982.090000, 0.099731, 0.142014, 0.518863 ], [8, -7982.140000, 0.094754, 0.184820, 0.478075 ], [109, -7982.720000, 0.053089, 0.198238, 0.499014 ] ], "n": ["FGI73PY01C7DXG" ] }, {"p": [[12, -5952.840000, 0.083291, 0.052039, 1.263910 ], [7, -5952.840000, 0.083121, 0.133359, 1.276300 ], [13, -5952.880000, 0.079679, 0.005142, 1.277940 ], [269, -5952.970000, 0.072675, 0.009694, 1.289080 ] ], "n": ["FGI73PY01BYJES" ] }, {"p": [[14, -3927.190000, 0.886420, 0.013133, 0.076886 ] ], "n": ["FGI73PY01B7ZZA" ] }, {"p": [[60, -6587.600000, 0.320758, 0.012727, 0.402302 ], [59, -6588.460000, 0.135509, 0.028542, 0.422070 ], [58, -6588.600000, 0.117410, 0.009456, 0.424397 ], [56, -6588.680000, 0.108551, 0.000001, 0.430066 ], [57, -6588.680000, 0.108550, 0.000637, 0.430066 ], [55, -6588.840000, 0.092871, 0.005011, 0.425223 ] ], "n": ["FGI73PY01EQNQ6" ] }, {"p": [[60, -3622.440000, 0.901721, 0.003639, 0.131419 ] ], "n": ["FGI73PY01DFKUK" ] }, {"p": [[80, -3191.510000, 0.496963, 0.009347, 0.144335 ], [222, -3192.310000, 0.224872, 0.055767, 0.105924 ], [208, -3193.130000, 0.098482, 0.054234, 0.123790 ], [210, -3193.480000, 0.069544, 0.002568, 0.149727 ] ], "n": ["FGQOF7X01A3QKJ" ] }, {"p": [[93, -7314.640000, 0.057790, 0.006854, 1.994140 ] ], "n": ["FGI73PY01DVZF2" ] }, {"p": [[99, -6251.780000, 0.073408, 0.005369, 1.358640 ], [8, -6251.970000, 0.060424, 0.150418, 1.248990 ] ], "n": ["FGI73PY01CQQ7V" ] }, {"p": [[104, -6235.580000, 0.121943, 0.043077, 0.428608 ], [97, -6235.650000, 0.114092, 0.018571, 0.431689 ], [205, -6236.160000, 0.068725, 0.006692, 0.470139 ], [106, -6236.320000, 0.058158, 0.005046, 0.423479 ], [79, -6236.330000, 0.057965, 0.006770, 0.473561 ] ], "n": ["FGQOF7X01B17KD" ] }, {"p": [[105, -4835.580000, 0.194467, 0.008958, 0.181067 ], [222, -4835.620000, 0.187718, 0.075304, 0.154900 ], [103, -4835.940000, 0.136828, 0.069965, 0.191434 ], [106, -4836.070000, 0.119194, 0.007956, 0.183494 ], [208, -4836.320000, 0.093473, 0.058331, 0.173785 ], [99, -4836.830000, 0.055969, 0.092693, 0.188455 ], [201, -4836.840000, 0.055158, 0.020123, 0.179065 ] ], "n": ["FGQOF7X01CY21O" ] }, {"p": [[108, -8634.310000, 0.448474, 0.132459, 0.422385 ], [109, -8634.650000, 0.319338, 0.262569, 0.415158 ], [110, -8635.030000, 0.218873, 0.005275, 0.441747 ] ], "n": ["FGQOF7X01DIXN4" ] }, {"p": [[108, -7702.960000, 0.247234, 0.123346, 0.421192 ], [109, -7703.130000, 0.210286, 0.244860, 0.409685 ], [8, -7703.200000, 0.194599, 0.153704, 0.373024 ], [110, -7704.080000, 0.080943, 0.005275, 0.455923 ], [9, -7704.460000, 0.055436, 0.000001, 0.474008 ], [10, -7704.460000, 0.055436, 0.000625, 0.474008 ], [11, -7704.480000, 0.054059, 0.009555, 0.462909 ] ], "n": ["FGI73PY01BGDM1" ] }, {"p": [[108, -6364.790000, 0.506766, 0.087674, 0.372405 ], [222, -6366.610000, 0.081730, 0.060233, 0.363622 ], [9, -6366.690000, 0.076178, 0.000001, 0.482102 ], [10, -6366.690000, 0.076178, 0.000625, 0.482102 ], [8, -6366.780000, 0.069404, 0.164235, 0.419224 ], [11, -6366.790000, 0.068331, 0.009555, 0.479090 ] ], "n": ["FGI73PY01AU1OU" ] }, {"p": [[111, -6385.110000, 0.074355, 0.111245, 0.541593 ], [118, -6385.110000, 0.073784, 0.020421, 0.542750 ], [208, -6385.230000, 0.065822, 0.036091, 0.458761 ], [119, -6385.320000, 0.060071, 0.009032, 0.551540 ], [117, -6385.330000, 0.059513, 0.015364, 0.541808 ] ], "n": ["FGI73PY01APHX3" ] }, {"p": [[111, -5741.680000, 0.348225, 0.040566, 0.343035 ], [222, -5742.270000, 0.191640, 0.069052, 0.280635 ], [223, -5742.940000, 0.098416, 0.007871, 0.323135 ], [137, -5743.340000, 0.066039, 0.013340, 0.363605 ], [201, -5743.420000, 0.060652, 0.029482, 0.337596 ], [135, -5743.430000, 0.060226, 0.000001, 0.373771 ], [136, -5743.430000, 0.060226, 0.000678, 0.373771 ] ], "n": ["FGI73PY01A17NG" ] }, {"p": [[111, -5659.680000, 0.166910, 0.077866, 0.402629 ], [208, -5659.760000, 0.152850, 0.037132, 0.355930 ], [118, -5660.270000, 0.092425, 0.020421, 0.412469 ], [117, -5660.520000, 0.072072, 0.015364, 0.405416 ], [119, -5660.550000, 0.069632, 0.009032, 0.415207 ], [114, -5660.590000, 0.066747, 0.028969, 0.407727 ], [115, -5660.760000, 0.056287, 0.048337, 0.415434 ] ], "n": ["FGQOF7X01C1TQJ" ] }, {"p": [[122, -3230.780000, 0.698073, 0.084888, 0.613660 ], [206, -3231.970000, 0.211858, 0.008104, 0.303950 ] ], "n": ["FGI73PY01EG5KF" ] }, {"p": [[139, -3696.920000, 0.171704, 0.001417, 0.165083 ], [140, -3697.150000, 0.135718, 0.007188, 0.164334 ], [167, -3697.190000, 0.130882, 0.003261, 0.181154 ], [170, -3697.320000, 0.115526, 0.001302, 0.187731 ], [169, -3697.330000, 0.114263, 0.000001, 0.188248 ], [168, -3697.330000, 0.114263, 0.000001, 0.188248 ], [138, -3697.390000, 0.107148, 0.005671, 0.175949 ], [171, -3697.560000, 0.090215, 0.005218, 0.188810 ] ], "n": ["FGI73PY01BWA4W" ] }, {"p": [[177, -8142.630000, 0.198870, 0.074091, 0.916717 ], [108, -8142.690000, 0.187492, 0.028393, 0.662028 ], [222, -8143.360000, 0.096178, 0.082838, 0.749573 ], [111, -8143.590000, 0.075868, 0.007416, 0.891089 ] ], "n": ["FGQOF7X01EY7CO" ] }, {"p": [[177, -6494.380000, 0.777524, 0.006665, 0.518433 ], [222, -6495.640000, 0.221128, 0.062910, 0.355682 ] ], "n": ["FGQOF7X01A1P9I" ] }, {"p": [[202, -8899.470000, 0.384302, 0.000001, 0.281225 ], [204, -8899.680000, 0.311562, 0.008154, 0.271404 ], [203, -8899.700000, 0.304062, 0.001936, 0.284207 ] ], "n": ["FGI73PY01EF99S" ] }, {"p": [[202, -5481.280000, 0.425556, 0.000001, 0.006247 ], [203, -5481.280000, 0.423638, 0.002219, 0.005809 ], [204, -5482.320000, 0.150803, 0.008154, 0.002129 ] ], "n": ["FGQOF7X01DPJZ7" ] }, {"p": [[202, -6787.890000, 0.355491, 0.000001, 0.344156 ], [204, -6787.920000, 0.343325, 0.007950, 0.328043 ], [203, -6788.060000, 0.298259, 0.001936, 0.349005 ] ], "n": ["FGI73PY01DGPOV" ] }, {"p": [[202, -4553.110000, 0.448186, 0.000001, 0.007812 ], [203, -4553.120000, 0.447923, 0.001936, 0.007812 ], [204, -4554.580000, 0.103891, 0.008154, 0.007812 ] ], "n": ["FGI73PY01BU3F6" ] }, {"p": [[202, -4288.610000, 0.145987, 0.000001, 0.273675 ], [203, -4288.610000, 0.145971, 0.001936, 0.273674 ], [204, -4288.720000, 0.131007, 0.008154, 0.275427 ], [214, -4288.810000, 0.120224, 0.002012, 0.345875 ], [217, -4288.850000, 0.115759, 0.003139, 0.347161 ], [208, -4288.910000, 0.108431, 0.024185, 0.262326 ], [215, -4289.210000, 0.080324, 0.000001, 0.360596 ], [216, -4289.210000, 0.080323, 0.001274, 0.360595 ] ], "n": ["FGQOF7X01A8Y2Y" ] }, {"p": [[203, -8364.170000, 0.220642, 0.001936, 0.602479 ], [204, -8364.330000, 0.188111, 0.007540, 0.590358 ], [202, -8364.350000, 0.183974, 0.000001, 0.610258 ], [111, -8365.020000, 0.094053, 0.011228, 0.578355 ], [200, -8365.570000, 0.054060, 0.015187, 0.586479 ] ], "n": ["FGI73PY01DHING" ] }, {"p": [[203, -7883.920000, 0.352643, 0.001936, 0.525748 ], [204, -7884.120000, 0.288648, 0.010377, 0.515783 ], [202, -7884.150000, 0.279578, 0.000001, 0.535070 ] ], "n": ["FGQOF7X01DHCWM" ] }, {"p": [[203, -5495.940000, 0.050193, 0.001936, 1.994140 ] ], "n": ["FGQOF7X01CFL7A" ] }, {"p": [[203, -3247.140000, 0.378100, 0.002219, 0.171974 ], [202, -3247.140000, 0.378100, 0.000001, 0.171978 ], [204, -3247.580000, 0.243761, 0.008154, 0.166494 ] ], "n": ["FGI73PY01DMKC8" ] }, {"p": [[204, -7938.660000, 0.676168, 0.041637, 0.100544 ], [208, -7939.430000, 0.313415, 0.033897, 0.078934 ] ], "n": ["FGQOF7X01EZX68" ] }, {"p": [[204, -7736.590000, 0.319670, 0.026975, 0.197910 ], [208, -7736.780000, 0.264559, 0.049381, 0.174097 ], [222, -7736.900000, 0.235469, 0.031952, 0.179400 ], [221, -7738.050000, 0.074857, 0.037144, 0.204483 ], [203, -7738.320000, 0.057046, 0.002219, 0.226414 ] ], "n": ["FGI73PY01EOR6X" ] }, {"p": [[204, -7920.720000, 0.677329, 0.041619, 0.100769 ], [208, -7921.490000, 0.312135, 0.033894, 0.079117 ] ], "n": ["FGI73PY01E1RL0" ] }, {"p": [[204, -8294.140000, 0.653281, 0.027510, 0.211777 ], [202, -8295.200000, 0.225809, 0.000001, 0.242239 ], [203, -8295.860000, 0.116498, 0.001936, 0.246966 ] ], "n": ["FGI73PY01CZLL8" ] }, {"p": [[204, -8396.030000, 0.756316, 0.009794, 0.041668 ], [202, -8397.430000, 0.187379, 0.000001, 0.050440 ], [203, -8398.630000, 0.056306, 0.001936, 0.051308 ] ], "n": ["FGQOF7X01CP3PA" ] }, {"p": [[204, -7622.460000, 0.794099, 0.039853, 0.111997 ], [208, -7624.040000, 0.164369, 0.026215, 0.091775 ] ], "n": ["FGI73PY01C912Y" ] }, {"p": [[204, -7732.670000, 0.380379, 0.028134, 0.261494 ], [208, -7733.130000, 0.239915, 0.041371, 0.237786 ], [203, -7733.370000, 0.190192, 0.001936, 0.283678 ], [202, -7734.190000, 0.083887, 0.000001, 0.294593 ], [222, -7734.650000, 0.052510, 0.021555, 0.248784 ] ], "n": ["FGI73PY01ATHML" ] }, {"p": [[204, -8639.800000, 0.554193, 0.010795, 0.231408 ], [202, -8640.360000, 0.316653, 0.000001, 0.253263 ], [203, -8641.260000, 0.129066, 0.001936, 0.260339 ] ], "n": ["FGI73PY01DDKLD" ] }, {"p": [[204, -8202.890000, 0.426361, 0.019492, 0.275222 ], [203, -8202.990000, 0.384434, 0.001936, 0.279302 ], [202, -8203.820000, 0.167072, 0.000001, 0.290363 ] ], "n": ["FGQOF7X01B8L8K" ] }, {"p": [[204, -8099.990000, 0.855490, 0.041436, 0.121311 ], [208, -8101.930000, 0.123302, 0.021542, 0.111309 ] ], "n": ["FGI73PY01D3MMO" ] }, {"p": [[204, -6350.760000, 0.823068, 0.026581, 0.047782 ], [208, -6353.490000, 0.053603, 0.009162, 0.042185 ], [202, -6353.510000, 0.052798, 0.000001, 0.066320 ] ], "n": ["FGQOF7X01B0K5U" ] }, {"p": [[204, -7042.440000, 0.537048, 0.008524, 0.206898 ], [202, -7042.900000, 0.339328, 0.000001, 0.221039 ], [203, -7043.910000, 0.123616, 0.001936, 0.234353 ] ], "n": ["FGQOF7X01DEWVT" ] }, {"p": [[204, -7754.460000, 0.340057, 0.050786, 0.244815 ], [208, -7754.800000, 0.241989, 0.009162, 0.243038 ], [207, -7754.980000, 0.201149, 0.056472, 0.247482 ], [203, -7755.610000, 0.108119, 0.002219, 0.270046 ], [202, -7755.610000, 0.108112, 0.000001, 0.270050 ] ], "n": ["FGQOF7X01C37C9" ] }, {"p": [[204, -6217.810000, 0.847646, 0.034326, 0.162192 ] ], "n": ["FGQOF7X01D6ZYK" ] }, {"p": [[204, -5519.600000, 0.626322, 0.027648, 0.191857 ], [203, -5520.860000, 0.177749, 0.002219, 0.259525 ], [202, -5520.860000, 0.177733, 0.000001, 0.259529 ] ], "n": ["FGQOF7X01BVGKQ" ] }, {"p": [[204, -5184.680000, 0.535103, 0.045037, 0.078390 ], [208, -5185.130000, 0.342190, 0.057991, 0.059346 ], [221, -5186.240000, 0.113107, 0.040366, 0.072234 ] ], "n": ["FGQOF7X01DZGIE" ] }, {"p": [[204, -5310.530000, 0.358126, 0.034408, 0.363614 ], [207, -5311.290000, 0.167587, 0.056472, 0.394157 ], [208, -5311.310000, 0.164517, 0.009162, 0.389649 ], [202, -5311.430000, 0.145667, 0.000001, 0.380111 ], [203, -5311.650000, 0.117390, 0.001936, 0.386212 ] ], "n": ["FGQOF7X01A5PYC" ] }, {"p": [[204, -3226.580000, 0.505124, 0.054740, 0.080687 ], [208, -3227.240000, 0.259542, 0.045488, 0.074631 ], [221, -3228.110000, 0.108960, 0.040366, 0.090983 ], [207, -3228.240000, 0.095686, 0.059216, 0.081092 ] ], "n": ["FGI73PY01ESQDB" ] }, {"p": [[204, -2929.100000, 0.638885, 0.008727, 0.074106 ], [202, -2929.960000, 0.268788, 0.000001, 0.088566 ], [203, -2931.030000, 0.092326, 0.001936, 0.093768 ] ], "n": ["FGI73PY01BR6IX" ] }, {"p": [[205, -6802.180000, 0.263539, 0.069598, 0.213454 ], [206, -6802.380000, 0.214333, 0.051252, 0.224174 ], [207, -6802.570000, 0.178754, 0.024649, 0.230662 ], [204, -6802.820000, 0.138910, 0.037081, 0.250108 ], [203, -6803.470000, 0.072056, 0.002219, 0.269347 ], [202, -6803.470000, 0.072053, 0.000001, 0.269351 ], [208, -6803.680000, 0.058409, 0.009162, 0.253673 ] ], "n": ["FGQOF7X01D4NI6" ] }, {"p": [[205, -4971.270000, 0.349916, 0.067729, 0.232878 ], [207, -4971.580000, 0.257088, 0.037199, 0.233438 ], [208, -4971.820000, 0.202136, 0.021694, 0.216667 ], [204, -4972.560000, 0.096207, 0.057080, 0.242112 ], [206, -4972.650000, 0.088339, 0.056729, 0.256222 ] ], "n": ["FGI73PY01BW9OH" ] }, {"p": [[205, -5197.860000, 0.481854, 0.088829, 0.073764 ], [207, -5198.320000, 0.303982, 0.015750, 0.080487 ], [206, -5198.840000, 0.181546, 0.056729, 0.074828 ] ], "n": ["FGQOF7X01AX58H" ] }, {"p": [[205, -2170.530000, 0.843254, 0.053091, 0.134120 ], [206, -2173.070000, 0.066475, 0.052752, 0.176353 ] ], "n": ["FGI73PY01DSXQC" ] }, {"p": [[205, -3937.960000, 0.627256, 0.045332, 0.198363 ], [207, -3939.760000, 0.103606, 0.008067, 0.244755 ], [206, -3939.970000, 0.084101, 0.056729, 0.246736 ], [204, -3940.390000, 0.055205, 0.057080, 0.267367 ] ], "n": ["FGQOF7X01BQJ9Q" ] }, {"p": [[207, -7530.560000, 0.704435, 0.023282, 0.084058 ], [208, -7531.520000, 0.267963, 0.023180, 0.092963 ] ], "n": ["FGI73PY01DRTYB" ] }, {"p": [[207, -3635.940000, 0.319818, 0.056472, 0.195369 ], [204, -3635.960000, 0.311395, 0.057080, 0.206288 ], [208, -3636.170000, 0.252461, 0.009162, 0.207076 ] ], "n": ["FGI73PY01A2N5H" ] }, {"p": [[208, -8991.030000, 0.655712, 0.049078, 0.083685 ], [221, -8992.400000, 0.165646, 0.040366, 0.091283 ], [220, -8993.170000, 0.077054, 0.006655, 0.133714 ] ], "n": ["FGI73PY01A4E25" ] }, {"p": [[208, -7918.960000, 0.718430, 0.060000, 0.077091 ], [221, -7919.980000, 0.258828, 0.040900, 0.085622 ] ], "n": ["FGQOF7X01CI487" ] }, {"p": [[208, -9234.820000, 0.841661, 0.060107, 0.065058 ], [221, -9236.840000, 0.112515, 0.040366, 0.073490 ] ], "n": ["FGI73PY01ECK24" ] }, {"p": [[208, -8163.140000, 0.453340, 0.047841, 0.085009 ], [220, -8164.200000, 0.157863, 0.006655, 0.129002 ], [221, -8164.560000, 0.110224, 0.040366, 0.086199 ], [214, -8165.100000, 0.064409, 0.002306, 0.132644 ], [217, -8165.310000, 0.051844, 0.003597, 0.132434 ] ], "n": ["FGQOF7X01A7RKP" ] }, {"p": [[208, -7769.090000, 0.562033, 0.040603, 0.080506 ], [204, -7769.370000, 0.425197, 0.042683, 0.106135 ] ], "n": ["FGQOF7X01ED9O6" ] }, {"p": [[208, -8074.090000, 0.330780, 0.051849, 0.078632 ], [217, -8074.920000, 0.144618, 0.003597, 0.120865 ], [215, -8075.100000, 0.120697, 0.000001, 0.123654 ], [220, -8075.250000, 0.103605, 0.006655, 0.124250 ], [216, -8075.710000, 0.065741, 0.001274, 0.124120 ], [212, -8075.950000, 0.051877, 0.000001, 0.130163 ] ], "n": ["FGQOF7X01E2ALG" ] }, {"p": [[208, -7610.720000, 0.793979, 0.057735, 0.057021 ], [221, -7612.130000, 0.194158, 0.039899, 0.066786 ] ], "n": ["FGQOF7X01CLQVH" ] }, {"p": [[208, -7596.560000, 0.789607, 0.040749, 0.089596 ], [204, -7598.140000, 0.161422, 0.042079, 0.127115 ] ], "n": ["FGI73PY01B6B81" ] }, {"p": [[208, -7660.320000, 0.802072, 0.041692, 0.101116 ], [222, -7662.560000, 0.084840, 0.011700, 0.115483 ], [221, -7662.870000, 0.062574, 0.042616, 0.125401 ], [204, -7663.090000, 0.050086, 0.043338, 0.124218 ] ], "n": ["FGI73PY01DKS0F" ] }, {"p": [[208, -9675.320000, 0.695665, 0.039058, 0.159829 ], [222, -9676.400000, 0.235116, 0.029948, 0.161410 ], [221, -9677.790000, 0.058747, 0.040366, 0.179345 ] ], "n": ["FGI73PY01B2ADL" ] }, {"p": [[208, -8046.460000, 0.902541, 0.048659, 0.082408 ], [221, -8048.700000, 0.096025, 0.041057, 0.091826 ] ], "n": ["FGQOF7X01EA949" ] }, {"p": [[208, -8354.670000, 0.901885, 0.042838, 0.162985 ], [207, -8357.330000, 0.063419, 0.057060, 0.197610 ] ], "n": ["FGQOF7X01BV38F" ] }, {"p": [[208, -7923.100000, 0.979520, 0.037507, 0.094859 ] ], "n": ["FGQOF7X01C6JYD" ] }, {"p": [[208, -7458.510000, 0.730541, 0.048451, 0.092976 ], [210, -7460.330000, 0.119409, 0.002943, 0.126488 ], [221, -7460.630000, 0.088470, 0.037592, 0.107605 ] ], "n": ["FGI73PY01CHCQ4" ] }, {"p": [[208, -7533.230000, 0.817196, 0.031624, 0.079046 ], [204, -7535.250000, 0.108362, 0.061431, 0.090703 ], [207, -7535.770000, 0.063933, 0.056472, 0.095217 ] ], "n": ["FGI73PY01CCUU9" ] }, {"p": [[208, -7286.930000, 0.449850, 0.034439, 0.152130 ], [204, -7287.920000, 0.168095, 0.041530, 0.172935 ], [207, -7288.240000, 0.121623, 0.056472, 0.169886 ], [203, -7288.500000, 0.094429, 0.002219, 0.191470 ], [202, -7288.500000, 0.094424, 0.000001, 0.191474 ] ], "n": ["FGI73PY01E1UD4" ] }, {"p": [[208, -7471.470000, 0.965582, 0.043742, 0.075196 ] ], "n": ["FGI73PY01DXKOY" ] }, {"p": [[208, -7687.790000, 0.948576, 0.043757, 0.074318 ] ], "n": ["FGI73PY01DCXBW" ] }, {"p": [[208, -7492.870000, 0.806386, 0.051246, 0.121023 ], [221, -7495.000000, 0.096047, 0.033265, 0.134322 ] ], "n": ["FGQOF7X01C5WGN" ] }, {"p": [[208, -9038.360000, 0.722499, 0.022143, 0.188924 ], [204, -9040.200000, 0.114449, 0.046897, 0.209378 ], [207, -9040.720000, 0.068189, 0.056472, 0.199734 ] ], "n": ["FGI73PY01CXTJB" ] }, {"p": [[208, -7403.750000, 0.613130, 0.035373, 0.167624 ], [207, -7405.160000, 0.149443, 0.053216, 0.182036 ], [204, -7405.370000, 0.120677, 0.057080, 0.195965 ], [222, -7406.210000, 0.052321, 0.006466, 0.173120 ] ], "n": ["FGI73PY01BY1I2" ] }, {"p": [[208, -8898.750000, 0.671559, 0.038819, 0.195901 ], [222, -8900.050000, 0.182764, 0.015634, 0.212714 ], [221, -8900.620000, 0.103258, 0.040366, 0.218131 ] ], "n": ["FGI73PY01D2J3L" ] }, {"p": [[208, -8074.340000, 0.415971, 0.016486, 0.317603 ], [204, -8074.860000, 0.248372, 0.057080, 0.332446 ], [207, -8074.920000, 0.233787, 0.056472, 0.327387 ] ], "n": ["FGQOF7X01A0JR3" ] }, {"p": [[208, -6333.000000, 0.813723, 0.043391, 0.078479 ], [216, -6335.650000, 0.057468, 0.001274, 0.137039 ], [221, -6335.650000, 0.057183, 0.035798, 0.098316 ] ], "n": ["FGI73PY01CCPOC" ] }, {"p": [[208, -5387.190000, 0.511040, 0.051981, 0.074740 ], [222, -5387.700000, 0.309267, 0.018866, 0.079015 ], [221, -5388.240000, 0.179066, 0.039849, 0.094954 ] ], "n": ["FGI73PY01BQDWK" ] }, {"p": [[208, -6563.520000, 0.326650, 0.047837, 0.313444 ], [221, -6564.260000, 0.155343, 0.040895, 0.326819 ], [209, -6564.460000, 0.127238, 0.001932, 0.350135 ], [211, -6564.610000, 0.109531, 0.005445, 0.352105 ], [210, -6565.210000, 0.060339, 0.002568, 0.362683 ] ], "n": ["FGI73PY01DV2RT" ] }, {"p": [[208, -6912.630000, 0.470950, 0.051813, 0.151147 ], [222, -6913.510000, 0.195537, 0.009885, 0.157545 ], [221, -6913.560000, 0.185710, 0.040366, 0.162487 ] ], "n": ["FGQOF7X01C0WZ0" ] }, {"p": [[208, -7756.740000, 0.411131, 0.047076, 0.235922 ], [222, -7757.620000, 0.170513, 0.027747, 0.234517 ], [221, -7757.950000, 0.123036, 0.040366, 0.251445 ], [210, -7758.390000, 0.079153, 0.002568, 0.276310 ] ], "n": ["FGQOF7X01DXF04" ] }, {"p": [[208, -5616.950000, 0.518529, 0.050308, 0.120996 ], [222, -5617.820000, 0.215679, 0.027672, 0.124862 ], [221, -5618.200000, 0.148765, 0.040366, 0.139728 ] ], "n": ["FGI73PY01CUX7K" ] }, {"p": [[208, -5524.010000, 0.740943, 0.048181, 0.110041 ], [221, -5525.490000, 0.169462, 0.040366, 0.129520 ] ], "n": ["FGQOF7X01BXTK6" ] }, {"p": [[208, -4370.830000, 0.964320, 0.026995, 0.056702 ] ], "n": ["FGQOF7X01ECDAM" ] }, {"p": [[208, -5298.140000, 0.748926, 0.040772, 0.107585 ], [222, -5299.810000, 0.141417, 0.030980, 0.115366 ], [221, -5300.320000, 0.084422, 0.040366, 0.132771 ] ], "n": ["FGI73PY01EJJEZ" ] }, {"p": [[208, -6044.430000, 0.421502, 0.064964, 0.157389 ], [221, -6044.440000, 0.417391, 0.038998, 0.164157 ], [204, -6046.180000, 0.073342, 0.051765, 0.186490 ] ], "n": ["FGI73PY01ERU97" ] }, {"p": [[208, -7247.170000, 0.640422, 0.033247, 0.313918 ], [204, -7248.780000, 0.127830, 0.040057, 0.341589 ], [207, -7249.520000, 0.060950, 0.056472, 0.353147 ], [222, -7249.670000, 0.052756, 0.022241, 0.341872 ] ], "n": ["FGI73PY01EW90M" ] }, {"p": [[208, -5559.310000, 0.389715, 0.069499, 0.121791 ], [221, -5559.530000, 0.315103, 0.040366, 0.123612 ], [222, -5559.820000, 0.234904, 0.009885, 0.114585 ], [204, -5561.230000, 0.057349, 0.042613, 0.159091 ] ], "n": ["FGQOF7X01CSNE3" ] }, {"p": [[208, -4240.490000, 0.411170, 0.062128, 0.043545 ], [221, -4240.580000, 0.375304, 0.022723, 0.049317 ], [211, -4242.030000, 0.088401, 0.005445, 0.069829 ], [220, -4242.070000, 0.084876, 0.005808, 0.069007 ] ], "n": ["FGQOF7X01DB3AY" ] }, {"p": [[208, -5775.300000, 0.548671, 0.060916, 0.136421 ], [221, -5775.540000, 0.427712, 0.040366, 0.145095 ] ], "n": ["FGI73PY01CHR74" ] }, {"p": [[208, -4219.960000, 0.274966, 0.058887, 0.102228 ], [221, -4220.470000, 0.166177, 0.040366, 0.114489 ], [222, -4220.500000, 0.161006, 0.009885, 0.113044 ] ], "n": ["FGQOF7X01CI0VZ" ] }, {"p": [[208, -4413.180000, 0.507271, 0.064136, 0.077192 ], [221, -4413.230000, 0.481635, 0.040366, 0.083291 ] ], "n": ["FGQOF7X01D40VC" ] }, {"p": [[208, -4413.180000, 0.507271, 0.064136, 0.077192 ], [221, -4413.230000, 0.481635, 0.040366, 0.083291 ] ], "n": ["FGQOF7X01C76RZ" ] }, {"p": [[208, -3898.320000, 0.589686, 0.062249, 0.050324 ], [221, -3898.750000, 0.380698, 0.040366, 0.063318 ] ], "n": ["FGI73PY01BLM9K" ] }, {"p": [[208, -3717.180000, 0.704243, 0.048494, 0.025131 ], [221, -3718.520000, 0.185344, 0.040366, 0.045492 ], [204, -3719.120000, 0.102073, 0.053377, 0.039954 ] ], "n": ["FGI73PY01B2GBW" ] }, {"p": [[209, -7629.570000, 0.217633, 0.001932, 0.399357 ], [210, -7629.790000, 0.174048, 0.002568, 0.402840 ], [211, -7629.840000, 0.166841, 0.005445, 0.405536 ], [221, -7630.370000, 0.097570, 0.005767, 0.409079 ], [215, -7630.670000, 0.072664, 0.000001, 0.419103 ], [220, -7630.780000, 0.064730, 0.005808, 0.421900 ] ], "n": ["FGQOF7X01EPAD4" ] }, {"p": [[209, -3113.950000, 0.178802, 0.001932, 0.320235 ], [210, -3113.950000, 0.178793, 0.002568, 0.320235 ], [211, -3114.130000, 0.149434, 0.005445, 0.325836 ], [220, -3114.510000, 0.102385, 0.005808, 0.343219 ], [221, -3114.570000, 0.096297, 0.005767, 0.328444 ], [219, -3114.700000, 0.084861, 0.000700, 0.355520 ], [213, -3114.700000, 0.084820, 0.005767, 0.355519 ], [212, -3114.700000, 0.084770, 0.000001, 0.355697 ] ], "n": ["FGI73PY01AOKYY" ] }, {"p": [[210, -8007.890000, 0.593752, 0.002568, 0.007812 ], [209, -8008.590000, 0.296091, 0.001932, 0.007812 ], [211, -8009.580000, 0.109246, 0.005445, 0.007812 ] ], "n": ["FGI73PY01DSDTK" ] }, {"p": [[210, -7997.110000, 0.273950, 0.002568, 0.181497 ], [209, -7997.320000, 0.222511, 0.001932, 0.184674 ], [211, -7997.480000, 0.189239, 0.005445, 0.182961 ], [221, -7997.700000, 0.152083, 0.005767, 0.175886 ], [220, -7998.110000, 0.100948, 0.005808, 0.186122 ] ], "n": ["FGI73PY01DKOXT" ] }, {"p": [[210, -7696.400000, 0.370957, 0.002568, 0.284059 ], [209, -7696.940000, 0.217559, 0.001932, 0.292494 ], [211, -7697.290000, 0.152455, 0.005445, 0.295361 ], [221, -7697.800000, 0.091645, 0.006913, 0.292068 ] ], "n": ["FGI73PY01CRQ9B" ] }, {"p": [[210, -7210.820000, 0.431328, 0.002568, 0.185006 ], [209, -7211.570000, 0.203455, 0.001932, 0.193801 ], [211, -7212.320000, 0.096799, 0.005445, 0.195670 ], [221, -7212.730000, 0.064087, 0.004393, 0.192305 ], [220, -7212.910000, 0.053176, 0.005808, 0.199739 ] ], "n": ["FGQOF7X01EVPRL" ] }, {"p": [[210, -7717.190000, 0.197270, 0.002568, 0.261547 ], [212, -7717.480000, 0.146675, 0.000001, 0.266167 ], [209, -7717.630000, 0.126818, 0.001932, 0.270390 ], [213, -7717.650000, 0.124774, 0.006609, 0.265203 ], [219, -7717.690000, 0.118948, 0.000700, 0.268546 ], [220, -7717.760000, 0.111418, 0.005808, 0.268133 ], [211, -7718.060000, 0.082574, 0.006239, 0.272677 ], [221, -7718.530000, 0.051331, 0.005767, 0.272760 ] ], "n": ["FGI73PY01BDGDG" ] }, {"p": [[210, -7605.100000, 0.737246, 0.002568, 0.162641 ], [209, -7606.580000, 0.167752, 0.001932, 0.180796 ], [211, -7607.670000, 0.056874, 0.005445, 0.179235 ] ], "n": ["FGQOF7X01ALSE7" ] }, {"p": [[210, -7388.040000, 0.290948, 0.002568, 0.161762 ], [209, -7388.290000, 0.225872, 0.001932, 0.165380 ], [211, -7388.430000, 0.196671, 0.005445, 0.163212 ], [221, -7388.820000, 0.133832, 0.005767, 0.158111 ], [220, -7389.100000, 0.100629, 0.005808, 0.166181 ] ], "n": ["FGI73PY01A11ZH" ] }, {"p": [[210, -3116.280000, 0.406876, 0.002568, 0.124681 ], [221, -3116.350000, 0.381279, 0.040366, 0.089471 ], [209, -3118.140000, 0.063903, 0.001932, 0.149697 ], [211, -3118.220000, 0.058932, 0.005445, 0.149419 ] ], "n": ["FGI73PY01BF4J2" ] }, {"p": [[210, -4516.070000, 0.137726, 0.002568, 0.348583 ], [209, -4516.350000, 0.104914, 0.001932, 0.353463 ], [211, -4516.380000, 0.101493, 0.005445, 0.352956 ], [221, -4516.860000, 0.062542, 0.005767, 0.356369 ], [220, -4516.870000, 0.062369, 0.005808, 0.364671 ], [213, -4516.940000, 0.057893, 0.006609, 0.358817 ], [217, -4516.940000, 0.057884, 0.003597, 0.358844 ], [218, -4516.940000, 0.057883, 0.003027, 0.358847 ], [214, -4516.940000, 0.057882, 0.002306, 0.358851 ], [216, -4516.940000, 0.057881, 0.001459, 0.358854 ], [219, -4516.940000, 0.057880, 0.000803, 0.358855 ], [212, -4516.940000, 0.057880, 0.000001, 0.358855 ], [215, -4516.940000, 0.057880, 0.000001, 0.358855 ] ], "n": ["FGQOF7X01CO8NJ" ] }, {"p": [[212, -8885.830000, 0.270190, 0.000001, 0.168412 ], [219, -8885.840000, 0.268876, 0.000700, 0.168423 ], [213, -8886.390000, 0.155242, 0.005767, 0.169220 ], [220, -8886.400000, 0.153405, 0.005808, 0.169856 ], [221, -8887.250000, 0.065746, 0.001237, 0.170380 ] ], "n": ["FGQOF7X01D2A91" ] }, {"p": [[212, -8535.690000, 0.286113, 0.000001, 0.165771 ], [219, -8535.720000, 0.278679, 0.000700, 0.165830 ], [213, -8536.060000, 0.199115, 0.005767, 0.165478 ], [220, -8536.350000, 0.148577, 0.005808, 0.167304 ] ], "n": ["FGI73PY01EB6SM" ] }, {"p": [[213, -8591.450000, 0.515267, 0.005767, 0.148218 ], [220, -8593.040000, 0.104330, 0.006655, 0.151732 ], [219, -8593.080000, 0.100443, 0.000700, 0.153750 ], [212, -8593.090000, 0.100038, 0.000001, 0.153807 ], [211, -8593.690000, 0.054519, 0.005445, 0.154398 ] ], "n": ["FGI73PY01D5JEX" ] }, {"p": [[213, -7988.610000, 0.327428, 0.005767, 0.256616 ], [209, -7989.280000, 0.166601, 0.001932, 0.259328 ], [211, -7989.670000, 0.113205, 0.005445, 0.262707 ], [221, -7989.820000, 0.097361, 0.005767, 0.256541 ], [210, -7989.900000, 0.089807, 0.002943, 0.265492 ], [220, -7990.150000, 0.070015, 0.005808, 0.267369 ] ], "n": ["FGQOF7X01DGRSA" ] }, {"p": [[213, -7985.760000, 0.327363, 0.005767, 0.256733 ], [209, -7986.430000, 0.166588, 0.001932, 0.259445 ], [211, -7986.820000, 0.113213, 0.005445, 0.262827 ], [221, -7986.970000, 0.097338, 0.005767, 0.256660 ], [210, -7987.050000, 0.089822, 0.002943, 0.265614 ], [220, -7987.300000, 0.070034, 0.005808, 0.267494 ] ], "n": ["FGQOF7X01B2I89" ] }, {"p": [[213, -8389.630000, 0.334388, 0.006609, 0.207026 ], [212, -8390.100000, 0.208803, 0.000001, 0.203330 ], [219, -8390.110000, 0.205824, 0.000700, 0.203305 ], [220, -8390.710000, 0.113412, 0.005808, 0.205572 ], [218, -8391.030000, 0.082460, 0.002642, 0.200158 ] ], "n": ["FGI73PY01CMZNU" ] }, {"p": [[213, -4928.030000, 0.143507, 0.005767, 0.150160 ], [221, -4928.180000, 0.123470, 0.031412, 0.134562 ], [222, -4928.370000, 0.102581, 0.009885, 0.129468 ], [211, -4928.500000, 0.089681, 0.006239, 0.154686 ], [220, -4928.710000, 0.073321, 0.006655, 0.155389 ], [208, -4928.730000, 0.071376, 0.064136, 0.131756 ], [219, -4928.780000, 0.067750, 0.000700, 0.158508 ], [212, -4928.790000, 0.067683, 0.000001, 0.158525 ], [218, -4928.790000, 0.067221, 0.002642, 0.158542 ] ], "n": ["FGI73PY01DAU4H" ] }, {"p": [[214, -8917.600000, 0.183594, 0.002306, 0.150837 ], [217, -8917.840000, 0.145512, 0.003597, 0.151602 ], [218, -8918.080000, 0.113961, 0.002642, 0.154605 ], [212, -8918.100000, 0.111453, 0.000001, 0.154857 ], [219, -8918.100000, 0.111313, 0.000700, 0.154857 ], [220, -8918.150000, 0.106032, 0.005808, 0.148739 ], [216, -8918.370000, 0.085247, 0.001459, 0.154842 ], [215, -8918.370000, 0.085241, 0.000001, 0.154844 ] ], "n": ["FGI73PY01CRZCV" ] }, {"p": [[214, -9034.470000, 0.293445, 0.002012, 0.148920 ], [220, -9034.490000, 0.286613, 0.006655, 0.148892 ], [217, -9035.810000, 0.076782, 0.003597, 0.155028 ], [218, -9036.050000, 0.060652, 0.002642, 0.157863 ], [212, -9036.090000, 0.058241, 0.000001, 0.158233 ], [219, -9036.090000, 0.058196, 0.000700, 0.158232 ] ], "n": ["FGI73PY01CB8NI" ] }, {"p": [[214, -9314.750000, 0.291381, 0.002012, 0.143941 ], [216, -9315.090000, 0.207618, 0.001459, 0.146394 ], [215, -9315.090000, 0.207606, 0.000001, 0.146396 ], [220, -9315.770000, 0.105488, 0.006655, 0.149214 ], [217, -9315.850000, 0.096985, 0.003139, 0.148519 ] ], "n": ["FGQOF7X01AHPOG" ] }, {"p": [[214, -8688.660000, 0.194375, 0.002306, 0.123758 ], [222, -8688.940000, 0.147835, 0.023982, 0.075618 ], [220, -8689.180000, 0.115755, 0.006655, 0.120824 ], [218, -8689.260000, 0.107443, 0.002642, 0.127727 ], [212, -8689.280000, 0.104937, 0.000001, 0.127967 ], [219, -8689.280000, 0.104849, 0.000700, 0.127966 ], [217, -8689.760000, 0.065037, 0.003139, 0.128770 ], [208, -8689.910000, 0.055903, 0.067479, 0.084987 ] ], "n": ["FGI73PY01BPNE5" ] }, {"p": [[214, -8536.050000, 0.275631, 0.002306, 0.125082 ], [218, -8536.640000, 0.153326, 0.002642, 0.129018 ], [212, -8536.660000, 0.149814, 0.000001, 0.129253 ], [219, -8536.660000, 0.149684, 0.000700, 0.129252 ], [217, -8537.140000, 0.092968, 0.003139, 0.130056 ], [220, -8537.300000, 0.079082, 0.005808, 0.122186 ] ], "n": ["FGI73PY01AQ50Z" ] }, {"p": [[214, -8173.460000, 0.318017, 0.002012, 0.163424 ], [216, -8174.130000, 0.161334, 0.001459, 0.167414 ], [215, -8174.130000, 0.161329, 0.000001, 0.167416 ], [217, -8174.470000, 0.115280, 0.003139, 0.168791 ], [218, -8175.100000, 0.061750, 0.002642, 0.178416 ], [212, -8175.140000, 0.058834, 0.000001, 0.178944 ], [219, -8175.140000, 0.058810, 0.000700, 0.178942 ] ], "n": ["FGQOF7X01EBVXV" ] }, {"p": [[214, -6541.590000, 0.275281, 0.002306, 0.132093 ], [218, -6542.140000, 0.158653, 0.002642, 0.137268 ], [212, -6542.160000, 0.155375, 0.000001, 0.137552 ], [219, -6542.170000, 0.155244, 0.000700, 0.137551 ], [217, -6542.630000, 0.097248, 0.003139, 0.138461 ], [220, -6543.220000, 0.054055, 0.005808, 0.133585 ] ], "n": ["FGQOF7X01AS60E" ] }, {"p": [[215, -8852.850000, 0.412115, 0.000001, 0.110940 ], [216, -8853.470000, 0.222735, 0.001274, 0.111317 ], [217, -8853.820000, 0.156204, 0.003139, 0.112276 ], [220, -8854.110000, 0.117395, 0.006655, 0.112199 ] ], "n": ["FGQOF7X01A6JNK" ] }, {"p": [[215, -7690.050000, 0.475649, 0.000001, 0.138404 ], [216, -7690.650000, 0.261367, 0.001274, 0.138702 ], [217, -7691.380000, 0.125477, 0.003139, 0.141821 ] ], "n": ["FGQOF7X01AWPSS" ] }, {"p": [[215, -7721.820000, 0.302955, 0.000001, 0.141096 ], [208, -7722.110000, 0.225845, 0.040865, 0.098112 ], [216, -7722.410000, 0.166756, 0.001274, 0.141672 ], [205, -7722.820000, 0.110509, 0.075098, 0.100645 ], [217, -7723.160000, 0.079178, 0.003139, 0.144771 ] ], "n": ["FGI73PY01BF7L9" ] }, {"p": [[215, -7716.550000, 0.430012, 0.000001, 0.122179 ], [216, -7717.160000, 0.234017, 0.001274, 0.122546 ], [217, -7717.950000, 0.106843, 0.003139, 0.125215 ], [210, -7717.970000, 0.104683, 0.002943, 0.118204 ] ], "n": ["FGI73PY01EPW5J" ] }, {"p": [[215, -7096.890000, 0.239595, 0.000001, 0.162150 ], [216, -7096.890000, 0.239577, 0.001274, 0.162149 ], [214, -7096.900000, 0.237873, 0.002012, 0.162167 ], [217, -7096.900000, 0.237806, 0.003139, 0.162164 ] ], "n": ["FGQOF7X01EJI4Q" ] }, {"p": [[216, -8842.070000, 0.317895, 0.001459, 0.143324 ], [215, -8842.070000, 0.317893, 0.000001, 0.143326 ], [217, -8842.970000, 0.129286, 0.003139, 0.145241 ], [220, -8843.430000, 0.081490, 0.006655, 0.146853 ], [208, -8843.900000, 0.050979, 0.037110, 0.115656 ] ], "n": ["FGQOF7X01CH62F" ] }, {"p": [[216, -7607.180000, 0.311928, 0.001274, 0.217577 ], [217, -7607.410000, 0.248459, 0.003597, 0.217842 ], [214, -7607.470000, 0.233099, 0.002012, 0.221092 ], [215, -7607.770000, 0.173278, 0.000001, 0.221176 ] ], "n": ["FGI73PY01CS7NB" ] }, {"p": [[216, -8711.100000, 0.258648, 0.001459, 0.210802 ], [215, -8711.100000, 0.258642, 0.000001, 0.210803 ], [217, -8711.740000, 0.137326, 0.003139, 0.215214 ], [214, -8712.360000, 0.073739, 0.002306, 0.222308 ], [213, -8712.430000, 0.068741, 0.006609, 0.219701 ], [218, -8712.660000, 0.054611, 0.002642, 0.224907 ], [219, -8712.680000, 0.053680, 0.000700, 0.225146 ], [212, -8712.680000, 0.053635, 0.000001, 0.225159 ] ], "n": ["FGI73PY01CV42W" ] }, {"p": [[216, -8502.580000, 0.252563, 0.001459, 0.219437 ], [215, -8502.580000, 0.252557, 0.000001, 0.219438 ], [217, -8503.200000, 0.136937, 0.003139, 0.223957 ], [214, -8503.790000, 0.075982, 0.002306, 0.231305 ], [213, -8503.870000, 0.070137, 0.006609, 0.228663 ], [218, -8504.070000, 0.057069, 0.002642, 0.233913 ], [219, -8504.090000, 0.056158, 0.000700, 0.234154 ], [212, -8504.090000, 0.056114, 0.000001, 0.234168 ] ], "n": ["FGI73PY01DQMDQ" ] }, {"p": [[216, -8635.550000, 0.589868, 0.001274, 0.187685 ], [215, -8636.770000, 0.173129, 0.000001, 0.193010 ], [217, -8637.560000, 0.078564, 0.003139, 0.195326 ] ], "n": ["FGI73PY01DF7KB" ] }, {"p": [[216, -7434.010000, 0.336842, 0.001459, 0.137140 ], [215, -7434.010000, 0.336837, 0.000001, 0.137142 ], [217, -7434.850000, 0.146115, 0.003139, 0.140055 ], [214, -7435.840000, 0.054020, 0.002306, 0.148025 ] ], "n": ["FGQOF7X01CC9E0" ] }, {"p": [[216, -7564.010000, 0.323044, 0.001459, 0.152078 ], [215, -7564.010000, 0.323027, 0.000001, 0.152080 ], [217, -7564.890000, 0.133855, 0.003139, 0.154443 ], [220, -7565.320000, 0.087260, 0.006655, 0.156119 ] ], "n": ["FGI73PY01EWYNU" ] }, {"p": [[217, -7785.780000, 0.246916, 0.003597, 0.106559 ], [215, -7786.000000, 0.197994, 0.000001, 0.109606 ], [220, -7786.220000, 0.158484, 0.006655, 0.110285 ], [216, -7786.610000, 0.106908, 0.001274, 0.110026 ], [212, -7786.960000, 0.075441, 0.000001, 0.115840 ], [219, -7787.000000, 0.072438, 0.000700, 0.115884 ], [218, -7787.030000, 0.070241, 0.002642, 0.115798 ] ], "n": ["FGI73PY01DCWPT" ] }, {"p": [[217, -9078.420000, 0.164618, 0.003597, 0.157301 ], [220, -9078.600000, 0.136992, 0.006655, 0.154040 ], [212, -9078.630000, 0.133126, 0.000001, 0.160264 ], [219, -9078.630000, 0.132930, 0.000700, 0.160266 ], [218, -9078.640000, 0.131874, 0.002642, 0.160243 ], [216, -9078.900000, 0.101821, 0.001459, 0.160262 ], [215, -9078.900000, 0.101814, 0.000001, 0.160264 ], [214, -9079.410000, 0.060919, 0.002012, 0.162877 ] ], "n": ["FGQOF7X01ARUOC" ] }, {"p": [[219, -6271.560000, 0.227218, 0.000700, 0.187699 ], [213, -6271.570000, 0.227000, 0.005767, 0.187673 ], [212, -6271.570000, 0.225967, 0.000001, 0.187809 ], [220, -6272.130000, 0.129109, 0.005808, 0.190289 ], [218, -6272.420000, 0.096388, 0.002642, 0.183036 ], [221, -6273.060000, 0.050895, 0.005767, 0.190308 ] ], "n": ["FGI73PY01AY0CC" ] }, {"p": [[220, -8930.300000, 0.598200, 0.006655, 0.108185 ], [214, -8931.820000, 0.130713, 0.002306, 0.113386 ], [212, -8932.380000, 0.075127, 0.000001, 0.116669 ], [219, -8932.410000, 0.072185, 0.000700, 0.116707 ], [218, -8932.430000, 0.071217, 0.002642, 0.116518 ] ], "n": ["FGI73PY01DZQNN" ] }, {"p": [[220, -8837.570000, 0.591281, 0.006655, 0.109880 ], [214, -8839.070000, 0.131546, 0.002306, 0.115167 ], [212, -8839.610000, 0.076362, 0.000001, 0.118486 ], [219, -8839.650000, 0.073380, 0.000700, 0.118526 ], [218, -8839.670000, 0.072360, 0.002642, 0.118338 ] ], "n": ["FGQOF7X01ECU01" ] }, {"p": [[220, -8844.600000, 0.577863, 0.006655, 0.093991 ], [214, -8846.270000, 0.108746, 0.002306, 0.099033 ], [217, -8846.480000, 0.087763, 0.003597, 0.098828 ], [212, -8846.970000, 0.054018, 0.000001, 0.095734 ], [218, -8847.000000, 0.052043, 0.002642, 0.095474 ], [219, -8847.010000, 0.051864, 0.000700, 0.095768 ] ], "n": ["FGI73PY01CJ50V" ] }, {"p": [[220, -9062.070000, 0.250201, 0.006655, 0.134508 ], [214, -9062.220000, 0.216057, 0.002012, 0.134776 ], [216, -9062.790000, 0.121833, 0.001459, 0.138180 ], [215, -9062.790000, 0.121829, 0.000001, 0.138182 ], [217, -9063.170000, 0.082873, 0.003139, 0.138884 ], [208, -9063.410000, 0.065432, 0.051394, 0.106167 ] ], "n": ["FGQOF7X01DHRSP" ] }, {"p": [[220, -7732.650000, 0.344454, 0.006655, 0.125207 ], [217, -7733.320000, 0.176185, 0.003597, 0.125452 ], [215, -7733.490000, 0.148612, 0.000001, 0.128378 ], [216, -7734.100000, 0.081173, 0.001274, 0.128897 ], [212, -7734.300000, 0.066340, 0.000001, 0.135263 ], [219, -7734.340000, 0.063800, 0.000700, 0.135318 ], [218, -7734.370000, 0.061767, 0.002642, 0.135254 ] ], "n": ["FGQOF7X01A0C88" ] }, {"p": [[220, -7628.390000, 0.352909, 0.006655, 0.120498 ], [217, -7629.070000, 0.177692, 0.003597, 0.120702 ], [215, -7629.250000, 0.148289, 0.000001, 0.123510 ], [216, -7629.860000, 0.080770, 0.001274, 0.124136 ], [212, -7630.100000, 0.063822, 0.000001, 0.130515 ], [219, -7630.130000, 0.061361, 0.000700, 0.130569 ], [218, -7630.170000, 0.059424, 0.002642, 0.130498 ] ], "n": ["FGQOF7X01D832I" ] }, {"p": [[220, -8779.950000, 0.307295, 0.006655, 0.120317 ], [216, -8780.590000, 0.163125, 0.001459, 0.123778 ], [215, -8780.590000, 0.163122, 0.000001, 0.123780 ], [217, -8781.050000, 0.102451, 0.003139, 0.125008 ], [208, -8781.210000, 0.087366, 0.053045, 0.091390 ] ], "n": ["FGI73PY01EP1DS" ] }, {"p": [[220, -9236.120000, 0.400920, 0.006655, 0.147164 ], [214, -9236.960000, 0.173953, 0.002012, 0.150304 ], [217, -9237.910000, 0.067522, 0.003597, 0.155550 ], [222, -9237.970000, 0.063430, 0.026622, 0.106498 ], [218, -9238.140000, 0.053450, 0.002642, 0.158381 ], [212, -9238.170000, 0.051646, 0.000001, 0.158738 ], [219, -9238.180000, 0.051585, 0.000700, 0.158738 ] ], "n": ["FGQOF7X01DYOHI" ] }, {"p": [[220, -8064.100000, 0.395522, 0.006655, 0.164619 ], [214, -8065.130000, 0.141032, 0.002306, 0.171863 ], [212, -8065.330000, 0.115532, 0.000001, 0.179140 ], [219, -8065.360000, 0.111463, 0.000700, 0.179207 ], [218, -8065.400000, 0.107685, 0.002642, 0.179182 ] ], "n": ["FGQOF7X01AVIUL" ] }, {"p": [[220, -8832.280000, 0.193059, 0.006655, 0.156284 ], [214, -8832.320000, 0.185653, 0.002012, 0.155019 ], [208, -8832.390000, 0.171685, 0.045505, 0.125121 ], [216, -8832.810000, 0.113264, 0.001459, 0.158571 ], [215, -8832.810000, 0.113261, 0.000001, 0.158572 ], [217, -8833.170000, 0.078947, 0.003139, 0.159816 ] ], "n": ["FGI73PY01CAIZI" ] }, {"p": [[220, -8291.220000, 0.402269, 0.006655, 0.154628 ], [214, -8292.330000, 0.133217, 0.002306, 0.161546 ], [212, -8292.550000, 0.107234, 0.000001, 0.164298 ], [219, -8292.580000, 0.103449, 0.000700, 0.164352 ], [218, -8292.620000, 0.099961, 0.002642, 0.164319 ] ], "n": ["FGQOF7X01DKTBR" ] }, {"p": [[220, -8467.680000, 0.234233, 0.006655, 0.150035 ], [214, -8467.720000, 0.224785, 0.002012, 0.148658 ], [216, -8468.240000, 0.134143, 0.001459, 0.152382 ], [215, -8468.240000, 0.134139, 0.000001, 0.152384 ], [217, -8468.610000, 0.092819, 0.003139, 0.153604 ] ], "n": ["FGI73PY01DNT8O" ] }, {"p": [[220, -8852.630000, 0.311941, 0.006655, 0.198035 ], [208, -8853.120000, 0.190745, 0.045268, 0.157554 ], [214, -8853.730000, 0.103829, 0.002306, 0.201264 ], [212, -8853.860000, 0.090813, 0.000001, 0.203712 ], [219, -8853.890000, 0.087775, 0.000700, 0.203786 ], [218, -8853.930000, 0.084800, 0.002642, 0.203796 ] ], "n": ["FGQOF7X01A6GH4" ] }, {"p": [[220, -8852.630000, 0.311941, 0.006655, 0.198035 ], [208, -8853.120000, 0.190745, 0.045268, 0.157554 ], [214, -8853.730000, 0.103829, 0.002306, 0.201264 ], [212, -8853.860000, 0.090813, 0.000001, 0.203712 ], [219, -8853.890000, 0.087775, 0.000700, 0.203786 ], [218, -8853.930000, 0.084800, 0.002642, 0.203796 ] ], "n": ["FGQOF7X01C7J7H" ] }, {"p": [[220, -8746.470000, 0.167321, 0.006655, 0.282730 ], [216, -8746.650000, 0.140792, 0.001459, 0.287801 ], [215, -8746.650000, 0.140788, 0.000001, 0.287803 ], [217, -8746.880000, 0.110973, 0.003139, 0.289705 ], [214, -8747.120000, 0.087760, 0.002306, 0.292941 ], [218, -8747.190000, 0.081391, 0.002642, 0.294417 ], [212, -8747.200000, 0.081144, 0.000001, 0.294510 ], [219, -8747.200000, 0.081138, 0.000700, 0.294505 ], [213, -8747.670000, 0.050587, 0.005767, 0.294041 ] ], "n": ["FGI73PY01EU3QH" ] }, {"p": [[220, -8592.800000, 0.175074, 0.006655, 0.280377 ], [216, -8592.980000, 0.145623, 0.001459, 0.279825 ], [215, -8592.980000, 0.145618, 0.000001, 0.279827 ], [217, -8593.220000, 0.114001, 0.003139, 0.283230 ], [214, -8593.470000, 0.089475, 0.002306, 0.286447 ], [218, -8593.550000, 0.082600, 0.002642, 0.288050 ], [212, -8593.550000, 0.082332, 0.000001, 0.288149 ], [219, -8593.550000, 0.082326, 0.000700, 0.288144 ], [213, -8594.020000, 0.051390, 0.005767, 0.287544 ] ], "n": ["FGQOF7X01EZ1O9" ] }, {"p": [[220, -8007.270000, 0.195324, 0.006655, 0.177283 ], [214, -8007.280000, 0.193713, 0.002012, 0.182277 ], [216, -8007.700000, 0.127549, 0.001459, 0.181478 ], [215, -8007.700000, 0.127543, 0.000001, 0.181480 ], [217, -8008.030000, 0.091321, 0.003139, 0.183109 ], [208, -8008.510000, 0.056613, 0.053300, 0.144422 ], [218, -8008.610000, 0.051532, 0.002642, 0.188242 ] ], "n": ["FGI73PY01A3057" ] }, {"p": [[220, -7202.330000, 0.381780, 0.006655, 0.176018 ], [212, -7203.670000, 0.099679, 0.000001, 0.183615 ], [219, -7203.670000, 0.099575, 0.000700, 0.183619 ], [218, -7203.680000, 0.098844, 0.002642, 0.183649 ], [214, -7204.040000, 0.069218, 0.002012, 0.186085 ], [217, -7204.120000, 0.063968, 0.003139, 0.185556 ], [208, -7204.210000, 0.058060, 0.046751, 0.138316 ] ], "n": ["FGI73PY01DQY1B" ] }, {"p": [[220, -5975.970000, 0.133745, 0.006655, 0.119540 ], [216, -5976.060000, 0.122850, 0.001459, 0.128705 ], [212, -5976.060000, 0.122850, 0.000001, 0.128706 ], [215, -5976.060000, 0.122850, 0.000001, 0.128706 ], [219, -5976.060000, 0.122707, 0.000700, 0.128709 ], [217, -5976.060000, 0.122117, 0.003139, 0.128707 ], [218, -5976.070000, 0.121973, 0.002642, 0.128713 ], [214, -5976.480000, 0.080931, 0.002012, 0.129809 ] ], "n": ["FGI73PY01ESIHT" ] }, {"p": [[220, -7262.390000, 0.165077, 0.006655, 0.161969 ], [212, -7262.420000, 0.159216, 0.000001, 0.164497 ], [213, -7262.430000, 0.158535, 0.005767, 0.164467 ], [219, -7262.430000, 0.158472, 0.000700, 0.164509 ], [209, -7262.700000, 0.120742, 0.001932, 0.165320 ], [211, -7262.940000, 0.094959, 0.005445, 0.164658 ], [221, -7263.170000, 0.075362, 0.005767, 0.158524 ] ], "n": ["FGI73PY01AJDTN" ] }, {"p": [[221, -7742.560000, 0.474123, 0.022229, 0.104206 ], [210, -7743.860000, 0.128859, 0.002568, 0.136372 ], [220, -7744.010000, 0.111854, 0.005808, 0.136574 ], [211, -7744.500000, 0.067945, 0.005445, 0.138409 ], [212, -7744.590000, 0.062149, 0.000001, 0.141045 ] ], "n": ["FGQOF7X01CM6VV" ] }, {"p": [[221, -8701.330000, 0.501941, 0.023277, 0.212983 ], [211, -8703.130000, 0.082828, 0.005445, 0.250892 ], [209, -8703.250000, 0.073524, 0.001932, 0.253145 ], [213, -8703.350000, 0.066837, 0.005767, 0.246240 ] ], "n": ["FGQOF7X01DSNLZ" ] }, {"p": [[221, -8698.390000, 0.501582, 0.023271, 0.213071 ], [211, -8700.190000, 0.082909, 0.005445, 0.250977 ], [209, -8700.310000, 0.073604, 0.001932, 0.253230 ], [213, -8700.410000, 0.066890, 0.005767, 0.246324 ] ], "n": ["FGQOF7X01CEUJL" ] }, {"p": [[221, -7772.310000, 0.594891, 0.024026, 0.111961 ], [209, -7774.130000, 0.096500, 0.001932, 0.152614 ], [211, -7774.220000, 0.088206, 0.005445, 0.150205 ], [210, -7774.570000, 0.062234, 0.002943, 0.152257 ] ], "n": ["FGQOF7X01AIWWP" ] }, {"p": [[221, -7732.440000, 0.472754, 0.022206, 0.104359 ], [210, -7733.730000, 0.129136, 0.002568, 0.136514 ], [220, -7733.870000, 0.112098, 0.005808, 0.136718 ], [211, -7734.370000, 0.068117, 0.005445, 0.138563 ], [212, -7734.460000, 0.062331, 0.000001, 0.141199 ] ], "n": ["FGQOF7X01BE43T" ] }, {"p": [[221, -7845.560000, 0.154185, 0.009520, 0.142553 ], [210, -7845.820000, 0.118627, 0.002568, 0.166216 ], [220, -7845.950000, 0.104491, 0.005808, 0.166617 ], [215, -7845.990000, 0.100003, 0.000001, 0.176004 ], [217, -7845.990000, 0.099951, 0.003139, 0.168726 ], [216, -7846.060000, 0.092849, 0.000787, 0.169728 ], [211, -7846.390000, 0.067150, 0.005445, 0.173578 ], [212, -7846.420000, 0.064892, 0.000001, 0.175632 ], [219, -7846.600000, 0.054497, 0.000700, 0.175954 ] ], "n": ["FGI73PY01DCHLZ" ] }, {"p": [[221, -8388.400000, 0.216487, 0.007942, 0.173725 ], [220, -8388.710000, 0.157539, 0.005808, 0.186270 ], [209, -8388.730000, 0.154381, 0.001932, 0.185903 ], [212, -8389.110000, 0.106334, 0.000001, 0.190819 ], [219, -8389.110000, 0.105901, 0.000700, 0.190829 ], [211, -8389.140000, 0.103109, 0.005445, 0.187032 ], [213, -8389.150000, 0.102160, 0.003564, 0.189134 ] ], "n": ["FGQOF7X01AZ4SI" ] }, {"p": [[221, -7267.740000, 0.385982, 0.023215, 0.128149 ], [210, -7268.860000, 0.125879, 0.002568, 0.162216 ], [220, -7268.990000, 0.110598, 0.005808, 0.162759 ], [211, -7269.430000, 0.071055, 0.005445, 0.165526 ], [212, -7269.470000, 0.068360, 0.000001, 0.167576 ], [209, -7269.750000, 0.051658, 0.001932, 0.175524 ] ], "n": ["FGQOF7X01AYRXE" ] }, {"p": [[221, -8588.540000, 0.935222, 0.023279, 0.194833 ] ], "n": ["FGQOF7X01DFEBK" ] }, {"p": [[221, -8355.810000, 0.887565, 0.024367, 0.190790 ] ], "n": ["FGI73PY01CSJ7L" ] }, {"p": [[221, -8263.160000, 0.776380, 0.015313, 0.120213 ], [213, -8265.590000, 0.068487, 0.006609, 0.138683 ], [212, -8265.790000, 0.055693, 0.000001, 0.139848 ], [219, -8265.800000, 0.055446, 0.000700, 0.139853 ] ], "n": ["FGI73PY01BLZBJ" ] }, {"p": [[221, -8271.000000, 0.796648, 0.016276, 0.193803 ] ], "n": ["FGQOF7X01C0SY0" ] }, {"p": [[221, -7425.370000, 0.153921, 0.008618, 0.191327 ], [210, -7425.410000, 0.148206, 0.002568, 0.200060 ], [220, -7425.520000, 0.132302, 0.005808, 0.200792 ], [212, -7425.890000, 0.091585, 0.000001, 0.205422 ], [211, -7425.900000, 0.090499, 0.005445, 0.208404 ], [209, -7426.090000, 0.075354, 0.001932, 0.208471 ], [219, -7426.220000, 0.066172, 0.000700, 0.207601 ], [213, -7426.260000, 0.063515, 0.006609, 0.212497 ] ], "n": ["FGI73PY01BNRC0" ] }, {"p": [[221, -7855.640000, 0.740755, 0.024789, 0.212400 ], [213, -7857.160000, 0.161288, 0.005767, 0.225817 ] ], "n": ["FGI73PY01DZNGZ" ] }, {"p": [[221, -8241.190000, 0.886901, 0.037017, 0.243147 ], [208, -8244.020000, 0.052348, 0.057824, 0.225815 ] ], "n": ["FGQOF7X01BOSJP" ] }, {"p": [[221, -7950.380000, 0.735773, 0.024551, 0.208358 ], [213, -7951.880000, 0.165596, 0.005767, 0.221740 ] ], "n": ["FGI73PY01E2S7U" ] }, {"p": [[221, -7751.580000, 0.973913, 0.023640, 0.183582 ] ], "n": ["FGI73PY01EVWEC" ] }, {"p": [[221, -8680.660000, 0.996058, 0.036113, 0.189967 ] ], "n": ["FGQOF7X01CPOVG" ] }, {"p": [[221, -6856.550000, 0.811212, 0.032711, 0.082915 ], [220, -6858.880000, 0.078908, 0.005808, 0.119985 ] ], "n": ["FGI73PY01EBCG2" ] }, {"p": [[221, -7974.520000, 0.938927, 0.019001, 0.186921 ] ], "n": ["FGI73PY01CS43D" ] }, {"p": [[221, -7749.540000, 0.182841, 0.017922, 0.153011 ], [210, -7750.060000, 0.109106, 0.002568, 0.181600 ], [215, -7750.160000, 0.098327, 0.000001, 0.187037 ], [220, -7750.180000, 0.096745, 0.005808, 0.182123 ], [217, -7750.200000, 0.094698, 0.003139, 0.184401 ], [216, -7750.260000, 0.088805, 0.000787, 0.184955 ], [211, -7750.580000, 0.064451, 0.005445, 0.184803 ], [212, -7750.600000, 0.063539, 0.000001, 0.186644 ], [219, -7750.770000, 0.053605, 0.000700, 0.187171 ], [209, -7750.830000, 0.050437, 0.001932, 0.189768 ] ], "n": ["FGI73PY01DGA5D" ] }, {"p": [[221, -7458.450000, 0.146573, 0.009953, 0.153361 ], [210, -7458.750000, 0.108914, 0.002568, 0.182195 ], [215, -7458.860000, 0.097472, 0.000001, 0.183213 ], [220, -7458.860000, 0.097113, 0.005808, 0.178013 ], [217, -7458.890000, 0.094532, 0.003139, 0.180340 ], [216, -7458.960000, 0.088472, 0.000787, 0.181092 ], [213, -7459.190000, 0.070233, 0.006609, 0.191113 ], [211, -7459.280000, 0.064229, 0.005445, 0.180861 ], [212, -7459.300000, 0.063051, 0.000001, 0.182812 ], [219, -7459.470000, 0.053134, 0.000700, 0.183304 ] ], "n": ["FGI73PY01AIYNN" ] }, {"p": [[221, -7341.900000, 0.138049, 0.009234, 0.156102 ], [210, -7342.120000, 0.110273, 0.002568, 0.179093 ], [215, -7342.230000, 0.098538, 0.000001, 0.184857 ], [220, -7342.240000, 0.097615, 0.005808, 0.179628 ], [217, -7342.270000, 0.095280, 0.003139, 0.182087 ], [216, -7342.330000, 0.089250, 0.000787, 0.182706 ], [213, -7342.560000, 0.071071, 0.006609, 0.192816 ], [211, -7342.650000, 0.064754, 0.005445, 0.182509 ], [212, -7342.670000, 0.063712, 0.000001, 0.184451 ], [219, -7342.840000, 0.053721, 0.000700, 0.184969 ], [209, -7342.910000, 0.050348, 0.001932, 0.187710 ] ], "n": ["FGI73PY01ATPRT" ] }, {"p": [[221, -8382.530000, 0.943303, 0.030585, 0.224499 ] ], "n": ["FGQOF7X01CG2HQ" ] }, {"p": [[221, -7895.340000, 0.470901, 0.018044, 0.160740 ], [219, -7896.540000, 0.141382, 0.000700, 0.179631 ], [212, -7896.550000, 0.140572, 0.000001, 0.179720 ], [213, -7897.080000, 0.082180, 0.005767, 0.180670 ], [220, -7897.110000, 0.080143, 0.005808, 0.181594 ], [218, -7897.390000, 0.060639, 0.002642, 0.180464 ] ], "n": ["FGI73PY01DU9WO" ] }, {"p": [[221, -8322.480000, 0.603542, 0.024733, 0.158703 ], [213, -8323.450000, 0.228526, 0.005767, 0.183925 ], [219, -8324.920000, 0.052911, 0.000700, 0.190296 ], [212, -8324.920000, 0.052534, 0.000001, 0.190395 ] ], "n": ["FGI73PY01EKUAE" ] }, {"p": [[221, -8134.170000, 0.857523, 0.029513, 0.244101 ], [208, -8136.540000, 0.079647, 0.061502, 0.235755 ], [222, -8136.820000, 0.060622, 0.009885, 0.246563 ] ], "n": ["FGI73PY01CBWJW" ] }, {"p": [[221, -7835.080000, 0.352045, 0.011239, 0.244471 ], [202, -7835.290000, 0.286762, 0.000001, 0.264016 ], [203, -7835.400000, 0.256847, 0.001936, 0.264570 ] ], "n": ["FGI73PY01CWUW0" ] }, {"p": [[221, -7942.960000, 0.932799, 0.013263, 0.173380 ] ], "n": ["FGI73PY01CVZR9" ] }, {"p": [[221, -6310.160000, 0.853211, 0.012134, 0.114782 ] ], "n": ["FGQOF7X01EHSTA" ] }, {"p": [[221, -7662.250000, 0.806914, 0.037000, 0.244196 ], [204, -7664.730000, 0.067525, 0.017724, 0.246147 ] ], "n": ["FGQOF7X01CUBHD" ] }, {"p": [[221, -7889.680000, 0.534793, 0.016789, 0.271874 ], [213, -7891.060000, 0.134384, 0.006609, 0.286070 ], [219, -7891.390000, 0.096561, 0.000700, 0.294369 ], [212, -7891.410000, 0.094118, 0.000001, 0.294903 ], [220, -7891.930000, 0.056123, 0.005808, 0.298874 ] ], "n": ["FGQOF7X01A7TAR" ] }, {"p": [[221, -7975.770000, 0.998311, 0.035970, 0.135763 ] ], "n": ["FGQOF7X01DXDL5" ] }, {"p": [[221, -7468.420000, 0.471752, 0.016350, 0.364484 ], [209, -7470.070000, 0.090876, 0.001932, 0.397200 ], [213, -7470.160000, 0.082334, 0.006609, 0.380083 ], [219, -7470.310000, 0.071111, 0.000700, 0.397031 ], [212, -7470.330000, 0.070117, 0.000001, 0.397480 ], [210, -7470.410000, 0.064573, 0.002568, 0.403498 ], [220, -7470.490000, 0.059723, 0.005808, 0.400268 ], [211, -7470.540000, 0.056497, 0.005445, 0.404109 ] ], "n": ["FGI73PY01EWPXZ" ] }, {"p": [[221, -8116.560000, 0.995210, 0.029199, 0.177911 ] ], "n": ["FGI73PY01BHWBN" ] }, {"p": [[221, -6836.930000, 0.943625, 0.024623, 0.241284 ] ], "n": ["FGQOF7X01DP790" ] }, {"p": [[221, -8059.220000, 0.988798, 0.025573, 0.142074 ] ], "n": ["FGI73PY01CEHYH" ] }, {"p": [[221, -8096.680000, 0.351561, 0.011389, 0.244129 ], [212, -8097.510000, 0.154625, 0.000001, 0.258530 ], [219, -8097.510000, 0.154028, 0.000700, 0.258552 ], [213, -8097.510000, 0.153936, 0.005767, 0.258525 ], [220, -8097.970000, 0.097682, 0.005808, 0.261419 ] ], "n": ["FGI73PY01CR0US" ] }, {"p": [[221, -7088.930000, 0.488409, 0.011874, 0.222808 ], [213, -7089.380000, 0.310686, 0.005767, 0.235557 ], [219, -7091.200000, 0.050360, 0.000700, 0.247545 ] ], "n": ["FGQOF7X01A5AMR" ] }, {"p": [[221, -7694.870000, 0.992766, 0.026972, 0.208707 ] ], "n": ["FGQOF7X01AOY6C" ] }, {"p": [[221, -7143.700000, 0.998664, 0.036109, 0.150885 ] ], "n": ["FGQOF7X01BOY6E" ] }, {"p": [[221, -6938.820000, 0.999794, 0.036639, 0.100333 ] ], "n": ["FGI73PY01BPAL7" ] }, {"p": [[221, -6554.300000, 0.991814, 0.034015, 0.112635 ] ], "n": ["FGI73PY01AOJBH" ] }, {"p": [[221, -5202.710000, 0.421163, 0.040366, 0.183720 ], [208, -5202.720000, 0.416394, 0.064136, 0.179474 ], [204, -5203.830000, 0.136594, 0.050711, 0.215711 ] ], "n": ["FGQOF7X01APRK4" ] }, {"p": [[221, -4645.370000, 0.515037, 0.028696, 0.066895 ], [208, -4646.710000, 0.134828, 0.064136, 0.055114 ] ], "n": ["FGQOF7X01DWH9A" ] }, {"p": [[221, -4778.700000, 0.398241, 0.040366, 0.183815 ], [208, -4778.700000, 0.397475, 0.064136, 0.179187 ], [204, -4779.710000, 0.144099, 0.047762, 0.232791 ] ], "n": ["FGI73PY01EHHMR" ] }, {"p": [[221, -4404.560000, 0.475848, 0.016760, 0.081836 ] ], "n": ["FGI73PY01BL6F2" ] }, {"p": [[221, -3810.080000, 0.509255, 0.040366, 0.082388 ], [208, -3810.180000, 0.459232, 0.064136, 0.076112 ] ], "n": ["FGI73PY01C315N" ] }, {"p": [[221, -3786.560000, 0.509628, 0.040366, 0.083254 ], [208, -3786.670000, 0.457797, 0.064136, 0.076753 ] ], "n": ["FGI73PY01DDMML" ] }, {"p": [[221, -3374.040000, 0.861444, 0.023303, 0.119618 ] ], "n": ["FGQOF7X01ES524" ] }, {"p": [[221, -2455.430000, 0.163192, 0.040366, 0.106630 ], [208, -2455.520000, 0.149197, 0.064136, 0.098174 ], [222, -2455.740000, 0.119974, 0.009885, 0.102765 ], [220, -2456.490000, 0.056802, 0.006655, 0.146559 ], [213, -2456.550000, 0.053481, 0.006609, 0.153261 ], [217, -2456.550000, 0.053456, 0.003597, 0.153295 ], [218, -2456.550000, 0.053453, 0.003027, 0.153298 ], [214, -2456.550000, 0.053450, 0.002306, 0.153303 ], [216, -2456.550000, 0.053447, 0.001459, 0.153306 ], [219, -2456.550000, 0.053446, 0.000803, 0.153308 ], [212, -2456.550000, 0.053445, 0.000001, 0.153309 ], [215, -2456.550000, 0.053445, 0.000001, 0.153309 ] ], "n": ["FGI73PY01CEMI0" ] }, {"p": [[222, -9212.990000, 0.409223, 0.029914, 0.079364 ], [208, -9214.330000, 0.107394, 0.067138, 0.091800 ], [217, -9214.650000, 0.078234, 0.003597, 0.136378 ], [221, -9214.920000, 0.059628, 0.040366, 0.098103 ], [212, -9214.930000, 0.058714, 0.000001, 0.139340 ], [219, -9214.940000, 0.058626, 0.000700, 0.139342 ], [218, -9214.940000, 0.058196, 0.002642, 0.139308 ] ], "n": ["FGI73PY01D418Q" ] }, {"p": [[222, -9326.500000, 0.190954, 0.046922, 0.094376 ], [214, -9326.680000, 0.160439, 0.002306, 0.153435 ], [220, -9326.800000, 0.142221, 0.006655, 0.149312 ], [218, -9327.140000, 0.100746, 0.002642, 0.157018 ], [219, -9327.160000, 0.099004, 0.000700, 0.157206 ], [212, -9327.160000, 0.098991, 0.000001, 0.157215 ], [217, -9327.610000, 0.063263, 0.003139, 0.158220 ] ], "n": ["FGQOF7X01A6FS5" ] }, {"p": [[222, -7698.000000, 0.890937, 0.075315, 0.085087 ], [221, -7700.860000, 0.050794, 0.040366, 0.124981 ] ], "n": ["FGQOF7X01BRDFP" ] }, {"p": [[222, -6859.810000, 0.412137, 0.009885, 0.172857 ], [221, -6860.130000, 0.298778, 0.040366, 0.180223 ], [208, -6860.170000, 0.288843, 0.064136, 0.179201 ] ], "n": ["FGI73PY01CISVO" ] }, {"p": [[222, -4993.710000, 0.278859, 0.048262, 0.210878 ], [208, -4993.980000, 0.212108, 0.067701, 0.216069 ], [221, -4994.220000, 0.167819, 0.040366, 0.232181 ] ], "n": ["FGI73PY01BSX3R" ] }, {"p": [[222, -5718.700000, 0.138696, 0.051342, 0.231678 ], [58, -5718.840000, 0.120495, 0.010955, 0.274300 ], [60, -5719.110000, 0.092139, 0.011981, 0.253841 ], [221, -5719.110000, 0.091631, 0.040366, 0.256584 ], [57, -5719.170000, 0.086188, 0.000730, 0.290898 ], [56, -5719.170000, 0.086188, 0.000001, 0.290898 ], [59, -5719.260000, 0.078876, 0.009685, 0.275767 ], [55, -5719.530000, 0.060438, 0.005011, 0.273458 ] ], "n": ["FGI73PY01EM07G" ] }, {"p": [[222, -5834.880000, 0.860846, 0.067500, 0.337296 ], [177, -5836.750000, 0.132784, 0.006665, 0.565268 ] ], "n": ["FGI73PY01A08DR" ] }, {"p": [[222, -4250.700000, 0.263975, 0.042548, 0.098238 ], [221, -4251.130000, 0.172085, 0.040366, 0.122012 ], [208, -4251.320000, 0.141990, 0.064136, 0.118732 ], [213, -4251.830000, 0.085007, 0.005767, 0.146100 ] ], "n": ["FGI73PY01BP7RI" ] }, {"p": [[222, -6487.800000, 0.619943, 0.084637, 0.254857 ], [223, -6489.070000, 0.172782, 0.007484, 0.289415 ], [201, -6489.150000, 0.159936, 0.029482, 0.291685 ] ], "n": ["FGI73PY01BF076" ] }, {"p": [[222, -5650.850000, 0.856933, 0.058399, 0.393255 ], [177, -5652.870000, 0.113941, 0.040882, 0.620850 ] ], "n": ["FGI73PY01CZB1P" ] }, {"p": [[222, -4329.330000, 0.341903, 0.018721, 0.188866 ], [221, -4330.990000, 0.065170, 0.033556, 0.216933 ], [215, -4331.080000, 0.059309, 0.000001, 0.251870 ], [212, -4331.080000, 0.059309, 0.000001, 0.251870 ], [219, -4331.080000, 0.059308, 0.000700, 0.251870 ], [216, -4331.080000, 0.059308, 0.001274, 0.251869 ], [214, -4331.080000, 0.059307, 0.002012, 0.251867 ], [218, -4331.080000, 0.059306, 0.002642, 0.251864 ], [217, -4331.080000, 0.059305, 0.003139, 0.251862 ], [213, -4331.090000, 0.059296, 0.005767, 0.251841 ], [208, -4331.220000, 0.052056, 0.064136, 0.212467 ] ], "n": ["FGI73PY01CVJ4O" ] }, {"p": [[222, -3217.610000, 0.960247, 0.048417, 0.209470 ] ], "n": ["FGI73PY01BNYQE" ] }, {"p": [[222, -3408.040000, 0.769369, 0.027449, 0.194821 ], [221, -3410.500000, 0.065898, 0.040366, 0.246185 ], [208, -3410.690000, 0.054649, 0.064136, 0.247180 ] ], "n": ["FGQOF7X01D463O" ] }, {"p": [[222, -3408.040000, 0.769369, 0.027449, 0.194821 ], [221, -3410.500000, 0.065898, 0.040366, 0.246185 ], [208, -3410.690000, 0.054649, 0.064136, 0.247180 ] ], "n": ["FGI73PY01ASQ03" ] }, {"p": [[241, -6878.390000, 0.064319, 0.021921, 1.509570 ], [243, -6878.440000, 0.060943, 0.005113, 1.521720 ], [242, -6878.610000, 0.051285, 0.037254, 1.525160 ] ], "n": ["FGI73PY01EYV53" ] }, {"p": [[241, -6627.850000, 0.074428, 0.009084, 1.455840 ] ], "n": ["FGI73PY01BPXTQ" ] }, {"p": [[246, -6363.840000, 0.056053, 0.008623, 1.220050 ], [245, -6363.870000, 0.054366, 0.007597, 1.229400 ], [254, -6363.880000, 0.054244, 0.009246, 1.226130 ], [244, -6363.880000, 0.054025, 0.004728, 1.235810 ], [253, -6363.890000, 0.053605, 0.001820, 1.237850 ], [252, -6363.890000, 0.053570, 0.002656, 1.232010 ], [251, -6363.900000, 0.053194, 0.003690, 1.234070 ], [250, -6363.900000, 0.052839, 0.000001, 1.236060 ], [247, -6363.900000, 0.052839, 0.000001, 1.236060 ], [249, -6363.900000, 0.052839, 0.000001, 1.236060 ], [248, -6363.900000, 0.052839, 0.000001, 1.236060 ], [243, -6363.920000, 0.051719, 0.035791, 1.232890 ] ], "n": ["FGQOF7X01D32S7" ] }, {"p": [[270, -5864.240000, 0.365322, 0.008059, 1.990320 ], [129, -5865.920000, 0.067905, 0.000001, 1.994140 ], [128, -5865.920000, 0.067905, 0.000001, 1.994140 ], [130, -5865.940000, 0.066790, 0.007511, 1.994140 ] ], "n": ["FGQOF7X01EEJU7" ] }, {"p": [[270, -5969.090000, 0.085465, 0.300548, 1.521240 ], [7, -5969.310000, 0.068736, 0.133359, 1.468810 ], [12, -5969.320000, 0.068333, 0.052039, 1.463170 ], [13, -5969.340000, 0.066535, 0.005142, 1.480110 ], [269, -5969.430000, 0.061269, 0.009694, 1.484030 ], [272, -5969.610000, 0.050913, 0.007470, 1.616120 ] ], "n": ["FGI73PY01B8T3T" ] }, {"p": [[272, -2506.760000, 0.425271, 0.042471, 0.036592 ], [283, -2508.550000, 0.070923, 0.008867, 0.111408 ], [282, -2508.680000, 0.062179, 0.064072, 0.116140 ] ], "n": ["FGI73PY01BNAPM" ] }, {"p": [[273, -4182.390000, 0.105544, 0.296090, 1.845760 ] ], "n": ["FGI73PY01C3NMX" ] }, {"p": [[286, -2529.730000, 0.133413, 0.008777, 0.465019 ], [287, -2530.410000, 0.067952, 0.018673, 0.523156 ], [284, -2530.440000, 0.065841, 0.060480, 0.530081 ], [288, -2530.450000, 0.064929, 0.007014, 0.536661 ], [285, -2530.480000, 0.063178, 0.095057, 0.532214 ], [283, -2530.590000, 0.056870, 0.014211, 0.527778 ], [270, -2530.660000, 0.053076, 0.025561, 0.804675 ], [273, -2530.700000, 0.050883, 0.447177, 0.532700 ] ], "n": ["FGQOF7X01CWPHI" ] } ], "metadata": {"invocation": "guppy to_json" }, "version": 1, "fields": ["edge_num", "likelihood", "like_weight_ratio", "distal_length", "pendant_length" ] }pplacer-1.1.alpha19/tests/data/psbA/coastal.jplace000066400000000000000000000363201303154601500220070ustar00rootroot00000000000000{"tree": "((((chloroplast_Bangiopsis_subsimplex.AY119736_:0.0296744[0],((chloroplast_Erythrotrichia_carnea.AY119739_:0.0669714[1],chloroplast_Rhodochaete_parvula.AY119743_:0.0846451[2]):0.0473989[3],chloroplast_Rhodosorus_marinus.AY119744_:0.06578[4]):0.0135707[5]):0.0125774[6],((((chloroplast_Cyanidium_sp._Monte_Rotaro.AY391365_:0.14225[7],(chloroplast_Cyanidium_caldarium.AY541290_:0.229326[8],(chloroplast_Cyanidioschyzon_merolae_strain_DBV201.AY119729_:2.62716e-06[9],chloroplast_Cyanidioschyzon_merolae.AY119730_:0.00124934[10]):0.0764407[11]):0.0594726[12]):0.0411324[13],(((chloroplast_Vaucheria_litorea.AF227740_:0.0548633[14],(chloroplast_Bumilleriopsis_filiformis.X79223_:0.00713038[15],plastid_Tribonema_aequale.AY528860_:0.013462[16]):0.0188887[17]):0.0307213[18],((chloroplast_Heterosigma_carterae.HCU18090_:2.62716e-06[19],chloroplast_Heterosigma_akashiwo.AY119759_:2.62716e-06[20]):0.0264439[21],((((((((chloroplast_Pavlova_lutheri.AY119755_:0.0155337[22],chloroplast_Pavlova_gyrans.AY119754_:0.031921[23]):0.0284429[24],chloroplast_Pavlova_gyrans.AJ575575_:0.0184771[25]):0.0369803[26],(chloroplast_Phaeocystis_antarctica.AY119756_:0.032481[27],(((chloroplast_Emiliania_huxleyi.AJ575573_:0.00127856[28],(chloroplast_Emiliania_huxleyi.AY675521_:2.62716e-06[29],chloroplast_Emiliania_huxleyi.AY119752_:2.62716e-06[30]):2.62716e-06[31]):0.00987446[32],(chloroplast_Isochrysis_sp._SAG_927-2.AY119753_:0.00129238[33],chloroplast_Isochrysis_galbana.AJ575574_:0.00127939[34]):0.0180921[35]):0.00662445[36],((chloroplast_Prymnesium_parvum.AJ575576_:0.00781698[37],chloroplast_Prymnesium_parvum.AY119758_:0.0107643[38]):0.0264028[39],(chloroplast_Pleurochrysis_carterae.AY119757_:0.0355143[40],(chloroplast_Imantonia_rotunda.EU851963_:0.0471273[41],chloroplast_Chrysochromulina_polylepis.AJ575572_:0.0130868[42]):0.00866583[43]):0.00227491[44]):0.00414201[45]):0.00687632[46]):0.0219329[47]):0.0287832[48],(((chloroplast_Pycnococcus_provasolii.EU851957_:0.0991635[49],(chloroplast_Mantoniella_squamata.EU851964_:0.00735936[50],((chloroplast_Micromonas_pusilla.EU851965_:2.62716e-06[51],plastid_uncultured_Prasinophyceae.AY176639_:2.62716e-06[52]):0.00915325[53],(chloroplast_Ostreococcus_sp._RCC789.EU851970_:0.0155525[54],(((chloroplast_Bathycoccus_prasinos.EU851955_:0.0100228[55],(uncultured_Prasinophyceae.AY509538_:2.62716e-06[56],uncultured_Prasinophyceae.AY509537_:0.00127378[57]):0.018912[58]):0.0387387[59],plastid_uncultured_Prasinophyceae.AY176630_:0.0268697[60]):0.00352364[61],(plastid_uncultured_Prasinophyceae.AY176628_:0.0181777[62],((Ostreococcus_tauri_2_:2.62716e-06[63],Ostreococcus_tauri_:2.62716e-06[64]):0.010015[65],(plastid_uncultured_Prasinophyceae.AY176620_:2.62716e-06[66],chloroplast_Ostreococcus_sp._RCC344.EU851961_:2.62716e-06[67]):0.00559304[68]):0.00536261[69]):0.00155492[70]):0.0103018[71]):0.0195476[72]):0.0116489[73]):0.0572199[74]):0.0500432[75],(((chloroplast_Chlorella_pyrenoidosa.EU043049_:0.00246255[76],chloroplast_Chlorella_vulgaris.EU043044_:0.00128935[77]):0.0754025[78],(Bigelowiella_natans_:0.108317[79],(Chlamydomonas_reinhardtii_:0.0747763[80],(chloroplast_Picochlorum_sp._RCC289.EU851960_:0.0553565[81],(Chlorella_vulgaris_:0.0479649[82],(chloroplast_Chlorella_pyrenoidosa.EU043047_:0.00249514[83],(chloroplast_Chlorella_pyrenoidosa.EU043046_:0.00250654[84],chloroplast_Auxenochlorella_protothecoides.EU043045_:0.00125447[85]):2.62716e-06[86]):0.0170169[87]):0.0187545[88]):0.0162818[89]):0.0140918[90]):0.00695735[91]):0.0236101[92],plastid_Tetraselmis_marina.AY857618_:0.0274149[93]):0.0121743[94]):0.0144071[95],chloroplast_Pseudochlorella_sp._CCAP_211\/1A.EU043048_:0.0910399[96]):0.036916[97]):0.0178205[98],((((Microcystis_aerouginosa_gi166362741refNC_010296.1_:0.100689[99],((Cyanothece_sp._ATCC_51142.CAU39610_:0.0139443[100],Cyanothece_sp._CCY_0110___gi126657681refNZ_AAXW01000012.1_:0.0325757[101]):0.0368903[102],(Cyanothece_sp._PCC_7425_gi218437013refNC_011729.1_:0.0799602[103],Cyanothece_sp._PCC_8801_gi218244892refNC_011726.1_:0.06558[104]):0.017916[105]):0.0403653[106]):0.0316316[107],((Lyngbya_sp_PCC_8106___gi119483230refNZ_AAVU01000001.1_:0.174445[108],Mastigocladus_laminosus.AF170924_:0.292674[109]):0.0843939[110],((Nostock_punctiforme_gi186680550refNC_010628.1_:0.118661[111],((Nostoc_sp._PCC_7120_gi17227497refNC_003272.1_:0.00952002[112],Anabaena_variabilis_A_gi75906225refNC_007413.1_:0.0234306[113]):0.0386248[114],(Fremyella_diplosiphon.FDIPSBA_:0.0552418[115],Nodularia_spumige_gi119512239refNZ_AAVW01000065.1_:0.053628[116]):0.0204852[117]):0.0272273[118]):0.0361292[119],(Synechococcus_sp._PCC_7002___gi170076636refNC_010475.1_:0.0899374[120],((Microcoleus_chthonoplastes_PCC_7420___gi224400128refNW_002435220.1_:0.0921412[121],(((Gloeobacter_violaceus_gi37519569refNC_005125.1_:0.287597[122],(Synechococcus_sp._JA-3-3Ab__gi86604733refNC_007775.1_:0.0880842[123],Synechococcus_sp._JA-2-3Ba____gi86607503refNC_007776.1_:0.637056[124]):0.0999416[125]):0.153018[126],(Thermosynechococcus_gi22297544refNC_004113.1_:0.12404[127],((Acaryochloris_marina_MBIC11017.AB303650_2_:2.62716e-06[128],Acaryochloris_marina_MBIC11017.AB303650_:2.62716e-06[129]):0.240343[130],Cyanothece_sp._PCC_7425_gi220905643refNC_011884.1_:0.144677[131]):0.0173981[132]):0.0300352[133]):0.0359263[134],((Prochlorothrix_hollandica.X14308_:2.62716e-06[135],Prochlorothrix_hollandica.X14523_:0.00135654[136]):0.0865866[137],((Synechococcus_elongatus_PCC_7942___gi81298811refNC_007604.1_:0.0113412[138],Synechococcus_elongatus_PCC_6301___gi56750010refNC_006576.1_:0.00283364[139]):0.115006[140],((Synechococcus_sp._WH_5701__gi87303211refNZ_AANO01000010.1_:0.077507[141],((Synechococcus_sp._WH_5701___gi211606500refNZ_CH724159.1_:2.62716e-06[142],Synechococcus_sp._WH_5701_gi87303578refNZ_AANO01000013.1_:2.62716e-06[143]):2.62716e-06[144],(Synechococcus_sp._WH_5701__gi87301761refNZ_AANO01000004.1_:2.62716e-06[145],Synechococcus_sp._WH_5701__gi211606501refNZ_CH724160.1_:2.62716e-06[146]):2.62716e-06[147]):0.0116739[148]):0.0161385[149],((((((Synechococcus_sp.__WH_7805__gi88807077refNZ_AAOK01000001.1_:0.00282307[150],(Synechococcus_sp._WH_7805__gi88807768refNZ_AAOK01000002.1_:2.62716e-06[151],(Synechococcus_sp._WH_7805_gi211594037refNZ_CH724168.1_:2.62716e-06[152],Synechococcus_sp._WH_7805__gi88809542refNZ_AAOK01000006.1_:2.62716e-06[153]):0.00138873[154]):0.00276638[155]):0.00844882[156],Synechococcus_sp._WH_7803___gi148238336refNC_009481.1_:0.00801814[157]):0.0180692[158],(Synechococcus_sp._RS9917___gi87125174refNZ_AANP01000006.1_:2.62716e-06[159],(Synechococcus_sp._RS9917___gi87124875refNZ_AANP01000005.1_:2.62716e-06[160],Synechococcus_sp._RS9__gi211606499refNZ_CH724158.1_:2.62716e-06[161]):0.00278788[162]):0.00874388[163]):0.00421837[164],((Synechococcus_sp._RCC307_gi148241099refNC_009482.1_:0.0436787[165],(Synechococcus_sp._CC9605_gi78211558refNC_007516.1_:0.0292645[166],((Synechococcus_sp._CC9902_gi78183584refNC_007513.1_:0.00569178[167],(Synechococcus_sp.__BL107__gi116072546refNZ_AATZ01000004.1_:2.62716e-06[168],Synechococcus_sp._BL107_gi211594587refNZ_DS022298.1_:2.62716e-06[169]):0.00260315[170]):0.0417448[171],Synechococcus_sp._WH_8102_gi33864539refNC_005070.1_:0.0213766[172]):0.00906289[173]):0.0225313[174]):0.0359511[175],(Synechococcus_sp._gi87123618refNZ_AANP01000002.1_:0.0436975[176],(Prochlorococcus_marinus_str._MIT_9303___gi124021714refNC_008820.1_:0.213286[177],(Synechococcus_sp.__RS9916__gi116074999refNZ_AAUA01000003.1_:2.62716e-06[178],Synechococcus_sp._RS9__gi211594588refNZ_DS022299.1_:2.62716e-06[179]):0.0326556[180]):0.018698[181]):0.0201245[182]):0.0123275[183]):0.0171659[184],Synechococcus_sp._RS9917__gi87124182refNZ_AANP01000003.1_:0.206502[185]):0.0124936[186],Cyanobium_sp._PCC_70_gi223490194refNW_002243451.1_:0.0349915[187]):0.0244749[188]):0.0552727[189]):0.0484564[190]):0.0330387[191]):0.053081[192]):0.0322305[193],Synechocystis_sp_PCC_6803___gi16329170refNC_000911.1_:0.055271[194]):0.0342032[195]):0.0313[196]):0.003393[197]):0.0208115[198]):0.0544215[199],Trichodesmium_erythr_gi113473942refNC_008312.1_:0.115405[200]):0.0393095[201],(((Prochlorococcus_marinus_str._NATL1A___gi124024712refNC_008819.1_:2.62716e-06[202],Procholococcus_marinus_str._NATL2A___gi162958048refNC_007335.2_:0.00387272[203]):0.0652348[204],(Prochlorococcus_marinus_subsp._marinus_str._CCMP1375_gi33239452refNC_005042.1_:0.107069[205],Procholococcus_marinus_str._MIT_9211___gi159902540refNC_009976.1_:0.0648332[206]):0.0645389[207]):0.0732978[208],((Prochlorococcus_marinus_subsp._pastoris_str._CCMP1986_gi33860560refNC_005072.1_:0.00386442[209],Prochlorococcus_marinus_str._MIT_9515___gi123965234refNC_008817.1_:0.00513584[210]):0.0108901[211],(Prochlorococcus_marinus_str._AS9601_gi123967536refNC_008816.1_:2.62716e-06[212],(Prochlorococcus_marinus_str._MIT_9301__gi126695337refNC_009091.1_:0.0115344[213],(Prochlorococcus_marinus_str._MIT_9312_gi78778385refNC_007577.1_:0.00402475[214],(Procholococcus_marinus_str._MIT_9215___gi157412338refNC_009840.1_:2.62716e-06[215],Procholococcus_marinus_str._MIT_9202_gi225077649refNW_002467725.1_:0.00254717[216]):0.00627816[217]):0.005283[218]):0.00140083[219]):0.0116153[220]):0.0461325[221]):0.158153[222]):0.0598755[223]):0.0735348[224],(Fragilariopsis_psbA_:0.0261132[225],Pmultiseries_psbA_:0.0139712[226]):0.0137913[227]):0.0138551[228],(plastid_Ballia_callitricha.DQ787635_:0.0643769[229],Phaeodactylum_tricornutum_:0.0212228[230]):0.0108685[231]):0.0220385[232],(chloroplast_Skeletonema_costatum.AY119761_:0.0037475[233],(Thalassiosira_pseudonana_2_:2.62716e-06[234],Thalassiosira_pseudonana_:2.62716e-06[235]):0.00128936[236]):0.0148686[237]):0.0413777[238]):0.00677313[239]):0.0181954[240],(((chloroplast_Fucus_vesiculosus.DQ307679_:0.0363344[241],chloroplast_Ectocarpus_siliculosus.X56695_:0.0425758[242]):0.0409036[243],(chloroplast_Padina_crassa.AY422643_:0.00945597[244],(plastid_Padina_japonica.AY430360_:0.0151942[245],(plastid_Padina_arborescens.AY430357_:0.0172454[246],(plastid_Padina_crassa.AY430358_:2.62716e-06[247],(plastid_Padina_crassa.AY430359_:2.62716e-06[248],plastid_Padina_crassa.AY430361_:2.62716e-06[249]):2.62716e-06[250]):0.00738025[251]):0.00531298[252]):0.00363975[253]):0.0184925[254]):0.0115372[255],(chloroplast_Pachydictyon_coriaceum.AY422614_:0.0259434[256],((chloroplast_Dictyota_dichotoma.AY748320_:2.62716e-06[257],chloroplast_Dictyota_dichotoma.AY748319_:2.62716e-06[258]):0.00249624[259],((chloroplast_Dictyota_dichotoma_var._linearis.AY422632_:2.62716e-06[260],chloroplast_Dictyota_dichotoma.AY748321_:2.62716e-06[261]):2.62716e-06[262],chloroplast_Dictyota_dichotoma_var._linearis.AY422631_:2.62716e-06[263]):2.62716e-06[264]):0.00881923[265]):0.0248245[266]):0.0409737[267]):0.029059[268]):0.0193884[269],(((Synechococcus_sp._PCC_7335_gi225144522refNW_002475532.1_:0.432534[270],Cyanothece_sp._CC_gi126660325refNZ_AAXW01000053.1_:0.278199[271]):0.119517[272],(gi|5821419|dbj|AB025589.1|:0.454275[273],(chloroplast_Galdieria_sulphuraria.AY541295_:0.0610795[274],((chloroplast_Galdieria_sulphuraria.AY541294_:0.00123271[275],chloroplast_Galdieria_sulphuraria.AY541293_:2.62716e-06[276]):0.0217312[277],(chloroplast_Cyanidium_caldarium.X52758_:0.0207176[278],chloroplast_Galdieria_sulphuraria.AY119731_:4.5192e-05[279]):0.0300301[280]):0.0529495[281]):0.0732256[282]):0.0354697[283]):0.0691202[284],(Mesostigma_viride_:0.101394[285],Cyanophora_paradoxa_:0.0702149[286]):0.0248976[287]):0.014028[288]):0.0258734[289],(chloroplast_Flintiella_sanguinaria.AY119740_:0.0513641[290],chloroplast_Porphyridium_aerugineum.AY119741_:0.0495445[291]):0.0174643[292]):0.020752[293]):0.050369[294],(chloroplast_Palmaria_palmata.PPU28165_:0.104631[295],(plastid_Antithamnionella_sp._A31.DQ787640_:0.0202479[296],(chloroplast_Antithamnion_sp.X55364_:0.0292228[297],plastid_Carpoblepharis_flaccida.DQ787643_:0.112145[298]):0.00887985[299]):0.0324329[300]):0.0175603[301]):0.0769895[302],Porphyra_yezoensis_:0.0134362[303],Porphyra_purpurea_:0.022228[304]):0[305];", "placements": [{"p": [[20, -9213.340000, 0.467421, 0.000001, 0.007812 ], [19, -9213.340000, 0.467421, 0.000001, 0.007812 ], [21, -9215.310000, 0.065159, 0.006611, 0.007812 ] ], "n": ["FHJ4PNA01DFTO8" ] }, {"p": [[49, -7845.150000, 0.396054, 0.015403, 0.395364 ], [137, -7845.560000, 0.262816, 0.055634, 0.288597 ], [174, -7846.870000, 0.071115, 0.006330, 0.325729 ], [166, -7847.160000, 0.052930, 0.007316, 0.343653 ] ], "n": ["FHJ4PNA01BUFHI" ] }, {"p": [[75, -8548.230000, 0.670643, 0.037973, 0.077296 ], [95, -8550.060000, 0.107705, 0.008255, 0.087073 ], [96, -8550.310000, 0.083648, 0.083384, 0.080788 ], [97, -8550.360000, 0.079794, 0.010273, 0.081578 ] ], "n": ["FHIB15V01D9510" ] }, {"p": [[76, -7312.470000, 0.222457, 0.001231, 1.777750 ], [78, -7312.720000, 0.172155, 0.009425, 1.789970 ], [77, -7312.940000, 0.138469, 0.000645, 1.803240 ] ], "n": ["FHJ4PNA01BPZOG" ] }, {"p": [[81, -8905.430000, 0.989747, 0.026648, 0.085366 ] ], "n": ["FHIB15V01BC3XW" ] }, {"p": [[97, -6829.370000, 0.727702, 0.022938, 0.161319 ], [20, -6831.470000, 0.088991, 0.000001, 0.185330 ], [19, -6831.470000, 0.088991, 0.000001, 0.185330 ] ], "n": ["FHIB15V01DFGS6" ] }, {"p": [[171, -8539.150000, 0.250026, 0.014717, 0.246088 ], [169, -8539.210000, 0.236641, 0.000001, 0.247343 ], [168, -8539.210000, 0.236641, 0.000001, 0.247343 ], [170, -8539.690000, 0.145983, 0.001302, 0.248884 ], [167, -8540.630000, 0.057078, 0.002846, 0.254918 ] ], "n": ["FHJ4PNA01EYNCO" ] }, {"p": [[172, -7422.140000, 0.605380, 0.004825, 0.307461 ], [175, -7423.910000, 0.103152, 0.007167, 0.301013 ], [171, -7424.070000, 0.087532, 0.033481, 0.294996 ] ], "n": ["FHJ4PNA01ECZZQ" ] }, {"p": [[222, -8076.710000, 0.085853, 0.067993, 1.994140 ], [208, -8076.840000, 0.075358, 0.008898, 1.994140 ], [204, -8076.870000, 0.073253, 0.057080, 1.994140 ] ], "n": ["FHJ4PNA01BDC5W" ] }, {"p": [[229, -8031.110000, 0.279067, 0.005374, 0.369432 ], [232, -8032.320000, 0.083438, 0.012901, 0.369681 ], [238, -8032.440000, 0.074099, 0.005172, 0.370024 ], [237, -8032.460000, 0.072783, 0.007434, 0.365936 ] ], "n": ["FHIB15V01DDJT9" ] }, {"p": [[233, -5240.700000, 0.467437, 0.001874, 0.030620 ], [237, -5241.570000, 0.196229, 0.009760, 0.031603 ], [236, -5242.540000, 0.074390, 0.000645, 0.043500 ], [228, -5242.650000, 0.066201, 0.006928, 0.025759 ], [235, -5242.800000, 0.056885, 0.000001, 0.045524 ], [234, -5242.800000, 0.056885, 0.000001, 0.045524 ] ], "n": ["FHIB15V01BJCOW" ] }, {"p": [[235, -9075.210000, 0.371742, 0.000001, 0.008001 ], [234, -9075.210000, 0.371742, 0.000001, 0.008001 ], [236, -9075.870000, 0.192615, 0.000645, 0.008334 ] ], "n": ["FHIB15V01DR2UP" ] }, {"p": [[236, -9251.680000, 0.222444, 0.000645, 0.012081 ], [235, -9251.680000, 0.222296, 0.000002, 0.012109 ], [234, -9251.680000, 0.222296, 0.000002, 0.012109 ], [233, -9251.770000, 0.203512, 0.001158, 0.008669 ], [237, -9252.240000, 0.126927, 0.007434, 0.006141 ] ], "n": ["FHIB15V01ADP0B" ] }, {"p": [[238, -7270.580000, 0.634635, 0.012819, 0.080563 ], [237, -7272.380000, 0.104892, 0.005347, 0.084339 ], [233, -7272.540000, 0.089279, 0.001874, 0.088543 ], [232, -7272.940000, 0.060138, 0.016529, 0.091106 ] ], "n": ["FHIB15V01BU0MP" ] }, {"p": [[285, -7919.480000, 0.149426, 0.095057, 1.442080 ], [286, -7919.520000, 0.144613, 0.061438, 1.444170 ], [287, -7919.630000, 0.128727, 0.006224, 1.446280 ], [288, -7920.280000, 0.067093, 0.007014, 1.491780 ], [284, -7920.580000, 0.050085, 0.060480, 1.524700 ] ], "n": ["FHJ4PNA01EP28U" ] } ], "metadata": {"invocation": "guppy to_json" }, "version": 1, "fields": ["edge_num", "likelihood", "like_weight_ratio", "distal_length", "pendant_length" ] }pplacer-1.1.alpha19/tests/data/psbA/surface.jplace000066400000000000000000001026511303154601500220120ustar00rootroot00000000000000{"tree": "((((chloroplast_Bangiopsis_subsimplex.AY119736_:0.0296744[0],((chloroplast_Erythrotrichia_carnea.AY119739_:0.0669714[1],chloroplast_Rhodochaete_parvula.AY119743_:0.0846451[2]):0.0473989[3],chloroplast_Rhodosorus_marinus.AY119744_:0.06578[4]):0.0135707[5]):0.0125774[6],((((chloroplast_Cyanidium_sp._Monte_Rotaro.AY391365_:0.14225[7],(chloroplast_Cyanidium_caldarium.AY541290_:0.229326[8],(chloroplast_Cyanidioschyzon_merolae_strain_DBV201.AY119729_:2.62716e-06[9],chloroplast_Cyanidioschyzon_merolae.AY119730_:0.00124934[10]):0.0764407[11]):0.0594726[12]):0.0411324[13],(((chloroplast_Vaucheria_litorea.AF227740_:0.0548633[14],(chloroplast_Bumilleriopsis_filiformis.X79223_:0.00713038[15],plastid_Tribonema_aequale.AY528860_:0.013462[16]):0.0188887[17]):0.0307213[18],((chloroplast_Heterosigma_carterae.HCU18090_:2.62716e-06[19],chloroplast_Heterosigma_akashiwo.AY119759_:2.62716e-06[20]):0.0264439[21],((((((((chloroplast_Pavlova_lutheri.AY119755_:0.0155337[22],chloroplast_Pavlova_gyrans.AY119754_:0.031921[23]):0.0284429[24],chloroplast_Pavlova_gyrans.AJ575575_:0.0184771[25]):0.0369803[26],(chloroplast_Phaeocystis_antarctica.AY119756_:0.032481[27],(((chloroplast_Emiliania_huxleyi.AJ575573_:0.00127856[28],(chloroplast_Emiliania_huxleyi.AY675521_:2.62716e-06[29],chloroplast_Emiliania_huxleyi.AY119752_:2.62716e-06[30]):2.62716e-06[31]):0.00987446[32],(chloroplast_Isochrysis_sp._SAG_927-2.AY119753_:0.00129238[33],chloroplast_Isochrysis_galbana.AJ575574_:0.00127939[34]):0.0180921[35]):0.00662445[36],((chloroplast_Prymnesium_parvum.AJ575576_:0.00781698[37],chloroplast_Prymnesium_parvum.AY119758_:0.0107643[38]):0.0264028[39],(chloroplast_Pleurochrysis_carterae.AY119757_:0.0355143[40],(chloroplast_Imantonia_rotunda.EU851963_:0.0471273[41],chloroplast_Chrysochromulina_polylepis.AJ575572_:0.0130868[42]):0.00866583[43]):0.00227491[44]):0.00414201[45]):0.00687632[46]):0.0219329[47]):0.0287832[48],(((chloroplast_Pycnococcus_provasolii.EU851957_:0.0991635[49],(chloroplast_Mantoniella_squamata.EU851964_:0.00735936[50],((chloroplast_Micromonas_pusilla.EU851965_:2.62716e-06[51],plastid_uncultured_Prasinophyceae.AY176639_:2.62716e-06[52]):0.00915325[53],(chloroplast_Ostreococcus_sp._RCC789.EU851970_:0.0155525[54],(((chloroplast_Bathycoccus_prasinos.EU851955_:0.0100228[55],(uncultured_Prasinophyceae.AY509538_:2.62716e-06[56],uncultured_Prasinophyceae.AY509537_:0.00127378[57]):0.018912[58]):0.0387387[59],plastid_uncultured_Prasinophyceae.AY176630_:0.0268697[60]):0.00352364[61],(plastid_uncultured_Prasinophyceae.AY176628_:0.0181777[62],((Ostreococcus_tauri_2_:2.62716e-06[63],Ostreococcus_tauri_:2.62716e-06[64]):0.010015[65],(plastid_uncultured_Prasinophyceae.AY176620_:2.62716e-06[66],chloroplast_Ostreococcus_sp._RCC344.EU851961_:2.62716e-06[67]):0.00559304[68]):0.00536261[69]):0.00155492[70]):0.0103018[71]):0.0195476[72]):0.0116489[73]):0.0572199[74]):0.0500432[75],(((chloroplast_Chlorella_pyrenoidosa.EU043049_:0.00246255[76],chloroplast_Chlorella_vulgaris.EU043044_:0.00128935[77]):0.0754025[78],(Bigelowiella_natans_:0.108317[79],(Chlamydomonas_reinhardtii_:0.0747763[80],(chloroplast_Picochlorum_sp._RCC289.EU851960_:0.0553565[81],(Chlorella_vulgaris_:0.0479649[82],(chloroplast_Chlorella_pyrenoidosa.EU043047_:0.00249514[83],(chloroplast_Chlorella_pyrenoidosa.EU043046_:0.00250654[84],chloroplast_Auxenochlorella_protothecoides.EU043045_:0.00125447[85]):2.62716e-06[86]):0.0170169[87]):0.0187545[88]):0.0162818[89]):0.0140918[90]):0.00695735[91]):0.0236101[92],plastid_Tetraselmis_marina.AY857618_:0.0274149[93]):0.0121743[94]):0.0144071[95],chloroplast_Pseudochlorella_sp._CCAP_211\/1A.EU043048_:0.0910399[96]):0.036916[97]):0.0178205[98],((((Microcystis_aerouginosa_gi166362741refNC_010296.1_:0.100689[99],((Cyanothece_sp._ATCC_51142.CAU39610_:0.0139443[100],Cyanothece_sp._CCY_0110___gi126657681refNZ_AAXW01000012.1_:0.0325757[101]):0.0368903[102],(Cyanothece_sp._PCC_7425_gi218437013refNC_011729.1_:0.0799602[103],Cyanothece_sp._PCC_8801_gi218244892refNC_011726.1_:0.06558[104]):0.017916[105]):0.0403653[106]):0.0316316[107],((Lyngbya_sp_PCC_8106___gi119483230refNZ_AAVU01000001.1_:0.174445[108],Mastigocladus_laminosus.AF170924_:0.292674[109]):0.0843939[110],((Nostock_punctiforme_gi186680550refNC_010628.1_:0.118661[111],((Nostoc_sp._PCC_7120_gi17227497refNC_003272.1_:0.00952002[112],Anabaena_variabilis_A_gi75906225refNC_007413.1_:0.0234306[113]):0.0386248[114],(Fremyella_diplosiphon.FDIPSBA_:0.0552418[115],Nodularia_spumige_gi119512239refNZ_AAVW01000065.1_:0.053628[116]):0.0204852[117]):0.0272273[118]):0.0361292[119],(Synechococcus_sp._PCC_7002___gi170076636refNC_010475.1_:0.0899374[120],((Microcoleus_chthonoplastes_PCC_7420___gi224400128refNW_002435220.1_:0.0921412[121],(((Gloeobacter_violaceus_gi37519569refNC_005125.1_:0.287597[122],(Synechococcus_sp._JA-3-3Ab__gi86604733refNC_007775.1_:0.0880842[123],Synechococcus_sp._JA-2-3Ba____gi86607503refNC_007776.1_:0.637056[124]):0.0999416[125]):0.153018[126],(Thermosynechococcus_gi22297544refNC_004113.1_:0.12404[127],((Acaryochloris_marina_MBIC11017.AB303650_2_:2.62716e-06[128],Acaryochloris_marina_MBIC11017.AB303650_:2.62716e-06[129]):0.240343[130],Cyanothece_sp._PCC_7425_gi220905643refNC_011884.1_:0.144677[131]):0.0173981[132]):0.0300352[133]):0.0359263[134],((Prochlorothrix_hollandica.X14308_:2.62716e-06[135],Prochlorothrix_hollandica.X14523_:0.00135654[136]):0.0865866[137],((Synechococcus_elongatus_PCC_7942___gi81298811refNC_007604.1_:0.0113412[138],Synechococcus_elongatus_PCC_6301___gi56750010refNC_006576.1_:0.00283364[139]):0.115006[140],((Synechococcus_sp._WH_5701__gi87303211refNZ_AANO01000010.1_:0.077507[141],((Synechococcus_sp._WH_5701___gi211606500refNZ_CH724159.1_:2.62716e-06[142],Synechococcus_sp._WH_5701_gi87303578refNZ_AANO01000013.1_:2.62716e-06[143]):2.62716e-06[144],(Synechococcus_sp._WH_5701__gi87301761refNZ_AANO01000004.1_:2.62716e-06[145],Synechococcus_sp._WH_5701__gi211606501refNZ_CH724160.1_:2.62716e-06[146]):2.62716e-06[147]):0.0116739[148]):0.0161385[149],((((((Synechococcus_sp.__WH_7805__gi88807077refNZ_AAOK01000001.1_:0.00282307[150],(Synechococcus_sp._WH_7805__gi88807768refNZ_AAOK01000002.1_:2.62716e-06[151],(Synechococcus_sp._WH_7805_gi211594037refNZ_CH724168.1_:2.62716e-06[152],Synechococcus_sp._WH_7805__gi88809542refNZ_AAOK01000006.1_:2.62716e-06[153]):0.00138873[154]):0.00276638[155]):0.00844882[156],Synechococcus_sp._WH_7803___gi148238336refNC_009481.1_:0.00801814[157]):0.0180692[158],(Synechococcus_sp._RS9917___gi87125174refNZ_AANP01000006.1_:2.62716e-06[159],(Synechococcus_sp._RS9917___gi87124875refNZ_AANP01000005.1_:2.62716e-06[160],Synechococcus_sp._RS9__gi211606499refNZ_CH724158.1_:2.62716e-06[161]):0.00278788[162]):0.00874388[163]):0.00421837[164],((Synechococcus_sp._RCC307_gi148241099refNC_009482.1_:0.0436787[165],(Synechococcus_sp._CC9605_gi78211558refNC_007516.1_:0.0292645[166],((Synechococcus_sp._CC9902_gi78183584refNC_007513.1_:0.00569178[167],(Synechococcus_sp.__BL107__gi116072546refNZ_AATZ01000004.1_:2.62716e-06[168],Synechococcus_sp._BL107_gi211594587refNZ_DS022298.1_:2.62716e-06[169]):0.00260315[170]):0.0417448[171],Synechococcus_sp._WH_8102_gi33864539refNC_005070.1_:0.0213766[172]):0.00906289[173]):0.0225313[174]):0.0359511[175],(Synechococcus_sp._gi87123618refNZ_AANP01000002.1_:0.0436975[176],(Prochlorococcus_marinus_str._MIT_9303___gi124021714refNC_008820.1_:0.213286[177],(Synechococcus_sp.__RS9916__gi116074999refNZ_AAUA01000003.1_:2.62716e-06[178],Synechococcus_sp._RS9__gi211594588refNZ_DS022299.1_:2.62716e-06[179]):0.0326556[180]):0.018698[181]):0.0201245[182]):0.0123275[183]):0.0171659[184],Synechococcus_sp._RS9917__gi87124182refNZ_AANP01000003.1_:0.206502[185]):0.0124936[186],Cyanobium_sp._PCC_70_gi223490194refNW_002243451.1_:0.0349915[187]):0.0244749[188]):0.0552727[189]):0.0484564[190]):0.0330387[191]):0.053081[192]):0.0322305[193],Synechocystis_sp_PCC_6803___gi16329170refNC_000911.1_:0.055271[194]):0.0342032[195]):0.0313[196]):0.003393[197]):0.0208115[198]):0.0544215[199],Trichodesmium_erythr_gi113473942refNC_008312.1_:0.115405[200]):0.0393095[201],(((Prochlorococcus_marinus_str._NATL1A___gi124024712refNC_008819.1_:2.62716e-06[202],Procholococcus_marinus_str._NATL2A___gi162958048refNC_007335.2_:0.00387272[203]):0.0652348[204],(Prochlorococcus_marinus_subsp._marinus_str._CCMP1375_gi33239452refNC_005042.1_:0.107069[205],Procholococcus_marinus_str._MIT_9211___gi159902540refNC_009976.1_:0.0648332[206]):0.0645389[207]):0.0732978[208],((Prochlorococcus_marinus_subsp._pastoris_str._CCMP1986_gi33860560refNC_005072.1_:0.00386442[209],Prochlorococcus_marinus_str._MIT_9515___gi123965234refNC_008817.1_:0.00513584[210]):0.0108901[211],(Prochlorococcus_marinus_str._AS9601_gi123967536refNC_008816.1_:2.62716e-06[212],(Prochlorococcus_marinus_str._MIT_9301__gi126695337refNC_009091.1_:0.0115344[213],(Prochlorococcus_marinus_str._MIT_9312_gi78778385refNC_007577.1_:0.00402475[214],(Procholococcus_marinus_str._MIT_9215___gi157412338refNC_009840.1_:2.62716e-06[215],Procholococcus_marinus_str._MIT_9202_gi225077649refNW_002467725.1_:0.00254717[216]):0.00627816[217]):0.005283[218]):0.00140083[219]):0.0116153[220]):0.0461325[221]):0.158153[222]):0.0598755[223]):0.0735348[224],(Fragilariopsis_psbA_:0.0261132[225],Pmultiseries_psbA_:0.0139712[226]):0.0137913[227]):0.0138551[228],(plastid_Ballia_callitricha.DQ787635_:0.0643769[229],Phaeodactylum_tricornutum_:0.0212228[230]):0.0108685[231]):0.0220385[232],(chloroplast_Skeletonema_costatum.AY119761_:0.0037475[233],(Thalassiosira_pseudonana_2_:2.62716e-06[234],Thalassiosira_pseudonana_:2.62716e-06[235]):0.00128936[236]):0.0148686[237]):0.0413777[238]):0.00677313[239]):0.0181954[240],(((chloroplast_Fucus_vesiculosus.DQ307679_:0.0363344[241],chloroplast_Ectocarpus_siliculosus.X56695_:0.0425758[242]):0.0409036[243],(chloroplast_Padina_crassa.AY422643_:0.00945597[244],(plastid_Padina_japonica.AY430360_:0.0151942[245],(plastid_Padina_arborescens.AY430357_:0.0172454[246],(plastid_Padina_crassa.AY430358_:2.62716e-06[247],(plastid_Padina_crassa.AY430359_:2.62716e-06[248],plastid_Padina_crassa.AY430361_:2.62716e-06[249]):2.62716e-06[250]):0.00738025[251]):0.00531298[252]):0.00363975[253]):0.0184925[254]):0.0115372[255],(chloroplast_Pachydictyon_coriaceum.AY422614_:0.0259434[256],((chloroplast_Dictyota_dichotoma.AY748320_:2.62716e-06[257],chloroplast_Dictyota_dichotoma.AY748319_:2.62716e-06[258]):0.00249624[259],((chloroplast_Dictyota_dichotoma_var._linearis.AY422632_:2.62716e-06[260],chloroplast_Dictyota_dichotoma.AY748321_:2.62716e-06[261]):2.62716e-06[262],chloroplast_Dictyota_dichotoma_var._linearis.AY422631_:2.62716e-06[263]):2.62716e-06[264]):0.00881923[265]):0.0248245[266]):0.0409737[267]):0.029059[268]):0.0193884[269],(((Synechococcus_sp._PCC_7335_gi225144522refNW_002475532.1_:0.432534[270],Cyanothece_sp._CC_gi126660325refNZ_AAXW01000053.1_:0.278199[271]):0.119517[272],(gi|5821419|dbj|AB025589.1|:0.454275[273],(chloroplast_Galdieria_sulphuraria.AY541295_:0.0610795[274],((chloroplast_Galdieria_sulphuraria.AY541294_:0.00123271[275],chloroplast_Galdieria_sulphuraria.AY541293_:2.62716e-06[276]):0.0217312[277],(chloroplast_Cyanidium_caldarium.X52758_:0.0207176[278],chloroplast_Galdieria_sulphuraria.AY119731_:4.5192e-05[279]):0.0300301[280]):0.0529495[281]):0.0732256[282]):0.0354697[283]):0.0691202[284],(Mesostigma_viride_:0.101394[285],Cyanophora_paradoxa_:0.0702149[286]):0.0248976[287]):0.014028[288]):0.0258734[289],(chloroplast_Flintiella_sanguinaria.AY119740_:0.0513641[290],chloroplast_Porphyridium_aerugineum.AY119741_:0.0495445[291]):0.0174643[292]):0.020752[293]):0.050369[294],(chloroplast_Palmaria_palmata.PPU28165_:0.104631[295],(plastid_Antithamnionella_sp._A31.DQ787640_:0.0202479[296],(chloroplast_Antithamnion_sp.X55364_:0.0292228[297],plastid_Carpoblepharis_flaccida.DQ787643_:0.112145[298]):0.00887985[299]):0.0324329[300]):0.0175603[301]):0.0769895[302],Porphyra_yezoensis_:0.0134362[303],Porphyra_purpurea_:0.022228[304]):0[305];", "placements": [{"p": [[13, -8312.790000, 0.260660, 0.007153, 0.310027 ], [12, -8313.220000, 0.170210, 0.052039, 0.305360 ], [232, -8313.420000, 0.138579, 0.016529, 0.330152 ], [238, -8313.730000, 0.102289, 0.005172, 0.330270 ], [237, -8314.080000, 0.072039, 0.007434, 0.328182 ], [228, -8314.080000, 0.071817, 0.006928, 0.322664 ] ], "n": ["FHJ7DRN02F8H36" ] }, {"p": [[23, -6379.420000, 0.907378, 0.019050, 0.047452 ], [22, -6382.080000, 0.063856, 0.007767, 0.060801 ] ], "n": ["FHJ7DRN02I9LBN" ] }, {"p": [[47, -8161.960000, 0.578760, 0.010845, 0.042136 ], [39, -8163.370000, 0.141047, 0.018081, 0.039245 ], [45, -8163.430000, 0.133106, 0.002373, 0.042799 ] ], "n": ["FHJ7DRN01ECDPN" ] }, {"p": [[79, -6947.660000, 0.203784, 0.006770, 1.485100 ], [273, -6948.400000, 0.097219, 0.345197, 1.189100 ], [288, -6948.740000, 0.068923, 0.007014, 1.403540 ], [284, -6948.840000, 0.062219, 0.060480, 1.401210 ], [287, -6948.920000, 0.057709, 0.018673, 1.427080 ] ], "n": ["FHJ7DRN02FHP7V" ] }, {"p": [[93, -7234.170000, 0.059578, 0.006854, 1.994140 ], [99, -7234.330000, 0.050630, 0.008034, 1.994140 ] ], "n": ["FHJ7DRN02GZSGW" ] }, {"p": [[108, -5980.800000, 0.708306, 0.118416, 0.358819 ], [109, -5982.500000, 0.129883, 0.283528, 0.411780 ], [110, -5982.590000, 0.117860, 0.005275, 0.414339 ] ], "n": ["FHJ7DRN02IIEJE" ] }, {"p": [[108, -5426.500000, 0.418084, 0.137341, 0.384138 ], [109, -5426.880000, 0.286254, 0.255666, 0.381346 ], [229, -5428.310000, 0.068486, 0.018485, 0.378467 ] ], "n": ["FHJ7DRN01CIAZP" ] }, {"p": [[110, -4050.500000, 0.284858, 0.005275, 0.083982 ], [60, -4051.900000, 0.069700, 0.006154, 0.139180 ], [212, -4052.090000, 0.058090, 0.000001, 0.154858 ], [219, -4052.090000, 0.057957, 0.000700, 0.154868 ], [222, -4052.100000, 0.057148, 0.046214, 0.113577 ] ], "n": ["FHJ7DRN01A0258" ] }, {"p": [[122, -2570.510000, 0.760745, 0.008987, 0.735470 ], [296, -2572.730000, 0.082041, 0.005062, 0.373671 ] ], "n": ["FHJ7DRN02HCCS8" ] }, {"p": [[199, -3254.030000, 0.454910, 0.042715, 0.110513 ], [222, -3254.870000, 0.196378, 0.082329, 0.104236 ], [201, -3254.990000, 0.174102, 0.009827, 0.121344 ], [205, -3255.610000, 0.093298, 0.074635, 0.132236 ] ], "n": ["FHJ7DRN02IMMPT" ] }, {"p": [[200, -5440.090000, 0.943524, 0.069173, 0.153493 ] ], "n": ["FHJ7DRN01EOLYB" ] }, {"p": [[200, -4661.580000, 0.603914, 0.052226, 0.210417 ], [60, -4662.190000, 0.327979, 0.008357, 0.198035 ] ], "n": ["FHJ7DRN01DAHOZ" ] }, {"p": [[205, -7426.230000, 0.999997, 0.025355, 0.166760 ] ], "n": ["FHJ7DRN01ARF2E" ] }, {"p": [[205, -4171.960000, 0.995505, 0.038351, 0.148559 ] ], "n": ["FHJ7DRN02IT7RE" ] }, {"p": [[205, -2825.760000, 0.558167, 0.050831, 0.194020 ], [209, -2827.910000, 0.064853, 0.001932, 0.204974 ], [207, -2828.140000, 0.051688, 0.008067, 0.230571 ] ], "n": ["FHJ7DRN02F00Y6" ] }, {"p": [[208, -7767.470000, 0.705774, 0.056425, 0.112566 ], [221, -7768.470000, 0.260021, 0.035450, 0.124846 ] ], "n": ["FHJ7DRN01E2G0Q" ] }, {"p": [[209, -6269.310000, 0.332818, 0.001932, 0.154110 ], [211, -6269.330000, 0.323796, 0.005445, 0.154997 ], [210, -6269.650000, 0.235921, 0.002568, 0.156811 ], [220, -6271.070000, 0.056978, 0.005808, 0.164913 ] ], "n": ["FHJ7DRN01DKJSQ" ] }, {"p": [[209, -5014.560000, 0.328664, 0.001932, 0.178522 ], [211, -5015.020000, 0.209052, 0.005445, 0.181435 ], [221, -5015.330000, 0.152430, 0.018408, 0.169134 ], [208, -5015.380000, 0.145234, 0.060676, 0.153820 ], [210, -5015.840000, 0.091442, 0.002568, 0.181796 ] ], "n": ["FHJ7DRN02FL5ND" ] }, {"p": [[209, -6426.080000, 0.921506, 0.001932, 0.003196 ], [210, -6428.900000, 0.055086, 0.002568, 0.007304 ] ], "n": ["FHJ7DRN02HL572" ] }, {"p": [[209, -2497.580000, 0.465998, 0.001932, 0.007812 ], [216, -2497.600000, 0.455603, 0.001274, 0.007812 ] ], "n": ["FHJ7DRN01CFE0B" ] }, {"p": [[209, -3253.630000, 0.195224, 0.001932, 0.120300 ], [221, -3254.230000, 0.107619, 0.018654, 0.102075 ], [211, -3254.730000, 0.065235, 0.005445, 0.132574 ], [210, -3254.750000, 0.063859, 0.002568, 0.133107 ], [220, -3254.800000, 0.060718, 0.005808, 0.134006 ], [213, -3254.820000, 0.059424, 0.006609, 0.134547 ], [217, -3254.820000, 0.059383, 0.003597, 0.134584 ], [218, -3254.820000, 0.059378, 0.003027, 0.134588 ], [214, -3254.820000, 0.059373, 0.002306, 0.134593 ], [216, -3254.820000, 0.059368, 0.001459, 0.134596 ], [219, -3254.820000, 0.059366, 0.000803, 0.134598 ], [212, -3254.820000, 0.059365, 0.000001, 0.134599 ], [215, -3254.820000, 0.059365, 0.000001, 0.134599 ] ], "n": ["FHJ7DRN01CIUX4" ] }, {"p": [[210, -4434.530000, 0.327579, 0.002568, 0.007812 ], [209, -4434.540000, 0.324806, 0.001932, 0.007812 ], [211, -4434.550000, 0.321501, 0.005445, 0.007812 ] ], "n": ["FHJ7DRN02I684B" ] }, {"p": [[211, -7008.580000, 0.869005, 0.006239, 0.006926 ], [209, -7011.130000, 0.067765, 0.001932, 0.009123 ], [220, -7011.340000, 0.054572, 0.005808, 0.002986 ] ], "n": ["FHJ7DRN02HNZMS" ] }, {"p": [[212, -8479.090000, 0.307862, 0.000001, 0.162065 ], [219, -8479.090000, 0.306256, 0.000700, 0.162077 ], [220, -8479.690000, 0.168641, 0.005808, 0.163902 ], [213, -8480.190000, 0.101883, 0.005767, 0.163991 ] ], "n": ["FHJ7DRN02GCQC7" ] }, {"p": [[212, -5396.230000, 0.258543, 0.000001, 0.143261 ], [213, -5396.240000, 0.257386, 0.005767, 0.143230 ], [219, -5396.240000, 0.257285, 0.000700, 0.143273 ], [220, -5396.850000, 0.139111, 0.005808, 0.145105 ] ], "n": ["FHJ7DRN02HUV98" ] }, {"p": [[212, -5668.730000, 0.249887, 0.000001, 0.120435 ], [213, -5668.730000, 0.248782, 0.005767, 0.120400 ], [219, -5668.730000, 0.248618, 0.000700, 0.120445 ], [220, -5669.350000, 0.134696, 0.005808, 0.121616 ], [221, -5670.140000, 0.060582, 0.008308, 0.112873 ] ], "n": ["FHJ7DRN01AZRID" ] }, {"p": [[212, -3534.890000, 0.123835, 0.000001, 0.020123 ], [220, -3534.910000, 0.121329, 0.005808, 0.020497 ], [209, -3534.920000, 0.120435, 0.001932, 0.020601 ], [211, -3534.940000, 0.118394, 0.005445, 0.020515 ], [219, -3534.940000, 0.117751, 0.000700, 0.020649 ], [214, -3534.950000, 0.117363, 0.002012, 0.020608 ], [218, -3534.990000, 0.111862, 0.002642, 0.020616 ], [221, -3535.380000, 0.076319, 0.005767, 0.017977 ] ], "n": ["FHJ7DRN01CJVK6" ] }, {"p": [[213, -8550.280000, 0.644492, 0.005767, 0.200086 ], [212, -8552.580000, 0.064583, 0.000001, 0.213039 ], [219, -8552.580000, 0.064470, 0.000700, 0.213028 ], [220, -8552.590000, 0.063829, 0.005808, 0.210948 ], [209, -8552.700000, 0.057297, 0.001932, 0.212929 ] ], "n": ["FHJ7DRN02GPOLC" ] }, {"p": [[213, -8574.860000, 0.187488, 0.006609, 0.210328 ], [221, -8574.910000, 0.177646, 0.003002, 0.196624 ], [220, -8574.950000, 0.171318, 0.003589, 0.206722 ], [211, -8575.320000, 0.118594, 0.005445, 0.202988 ], [212, -8575.320000, 0.118405, 0.000001, 0.206461 ], [219, -8575.340000, 0.116222, 0.000700, 0.206482 ] ], "n": ["FHJ7DRN01BH98I" ] }, {"p": [[213, -9107.330000, 0.198459, 0.005767, 0.304845 ], [219, -9107.440000, 0.178708, 0.000700, 0.310916 ], [220, -9107.640000, 0.146296, 0.003589, 0.315011 ], [212, -9107.840000, 0.119816, 0.000001, 0.317011 ], [221, -9107.880000, 0.114253, 0.005767, 0.302779 ], [218, -9108.240000, 0.080197, 0.002642, 0.309058 ], [211, -9108.270000, 0.077656, 0.005445, 0.316251 ], [209, -9108.660000, 0.052510, 0.001932, 0.322051 ] ], "n": ["FHJ7DRN01AR34M" ] }, {"p": [[213, -7065.060000, 0.573092, 0.005767, 0.182464 ], [212, -7066.520000, 0.132242, 0.000001, 0.189560 ], [219, -7066.520000, 0.131890, 0.000700, 0.189556 ], [220, -7067.060000, 0.077081, 0.005808, 0.191463 ] ], "n": ["FHJ7DRN01DHXID" ] }, {"p": [[213, -8196.110000, 0.581679, 0.005767, 0.180411 ], [212, -8197.590000, 0.131184, 0.000001, 0.181950 ], [219, -8197.600000, 0.130838, 0.000700, 0.181946 ], [220, -8198.140000, 0.075771, 0.005808, 0.183697 ] ], "n": ["FHJ7DRN02IW7D7" ] }, {"p": [[213, -6015.770000, 0.115474, 0.006609, 0.088658 ], [217, -6015.770000, 0.115324, 0.003597, 0.088692 ], [218, -6015.770000, 0.115305, 0.003027, 0.088696 ], [214, -6015.770000, 0.115286, 0.002306, 0.088701 ], [216, -6015.770000, 0.115269, 0.001459, 0.088704 ], [219, -6015.770000, 0.115262, 0.000803, 0.088706 ], [215, -6015.770000, 0.115259, 0.000001, 0.088707 ], [212, -6015.770000, 0.115259, 0.000001, 0.088707 ], [220, -6016.470000, 0.057355, 0.005808, 0.089898 ] ], "n": ["FHJ7DRN01CHTDI" ] }, {"p": [[213, -5922.450000, 0.113121, 0.006609, 0.119227 ], [217, -5922.460000, 0.112971, 0.003597, 0.119261 ], [218, -5922.460000, 0.112953, 0.003027, 0.119265 ], [214, -5922.460000, 0.112934, 0.002306, 0.119270 ], [216, -5922.460000, 0.112917, 0.001459, 0.119274 ], [219, -5922.460000, 0.112910, 0.000803, 0.119275 ], [215, -5922.460000, 0.112906, 0.000001, 0.119276 ], [212, -5922.460000, 0.112906, 0.000001, 0.119276 ], [220, -5923.080000, 0.060515, 0.005808, 0.120280 ] ], "n": ["FHJ7DRN02F6PS1" ] }, {"p": [[213, -4484.790000, 0.092269, 0.006609, 0.119534 ], [217, -4484.790000, 0.092207, 0.003597, 0.119564 ], [218, -4484.790000, 0.092200, 0.003027, 0.119568 ], [214, -4484.790000, 0.092192, 0.002306, 0.119572 ], [216, -4484.790000, 0.092185, 0.001459, 0.119575 ], [219, -4484.790000, 0.092182, 0.000803, 0.119576 ], [215, -4484.790000, 0.092181, 0.000001, 0.119577 ], [212, -4484.790000, 0.092181, 0.000001, 0.119577 ], [221, -4484.830000, 0.088771, 0.009081, 0.103948 ], [220, -4484.840000, 0.087728, 0.005808, 0.119610 ], [211, -4485.390000, 0.050669, 0.005445, 0.122104 ] ], "n": ["FHJ7DRN01D5J9Y" ] }, {"p": [[213, -4217.980000, 0.094099, 0.006609, 0.083187 ], [217, -4217.980000, 0.093995, 0.003597, 0.083223 ], [218, -4217.980000, 0.093982, 0.003027, 0.083227 ], [214, -4217.980000, 0.093969, 0.002306, 0.083232 ], [216, -4217.980000, 0.093957, 0.001459, 0.083236 ], [219, -4217.980000, 0.093953, 0.000803, 0.083237 ], [215, -4217.980000, 0.093950, 0.000001, 0.083238 ], [212, -4217.980000, 0.093950, 0.000001, 0.083238 ], [220, -4218.040000, 0.088821, 0.005808, 0.083256 ], [221, -4218.100000, 0.083030, 0.003483, 0.086919 ], [211, -4218.610000, 0.050136, 0.005445, 0.092789 ] ], "n": ["FHJ7DRN02IKL7T" ] }, {"p": [[214, -8817.390000, 0.229408, 0.002306, 0.155416 ], [218, -8817.850000, 0.145136, 0.002642, 0.159173 ], [219, -8817.860000, 0.142682, 0.000700, 0.159369 ], [212, -8817.860000, 0.142666, 0.000001, 0.159378 ], [217, -8818.310000, 0.091382, 0.003139, 0.160454 ], [213, -8818.570000, 0.070410, 0.005767, 0.157864 ], [220, -8818.680000, 0.063217, 0.005808, 0.153097 ] ], "n": ["FHJ7DRN01BCIH7" ] }, {"p": [[214, -8633.220000, 0.267253, 0.002306, 0.138882 ], [218, -8633.740000, 0.158397, 0.002642, 0.142700 ], [212, -8633.760000, 0.155317, 0.000001, 0.142912 ], [219, -8633.760000, 0.155182, 0.000700, 0.142912 ], [217, -8634.230000, 0.097791, 0.003139, 0.143832 ], [220, -8634.840000, 0.053128, 0.005808, 0.139402 ] ], "n": ["FHJ7DRN01D7NW4" ] }, {"p": [[214, -8866.290000, 0.214943, 0.002306, 0.216755 ], [218, -8866.580000, 0.160642, 0.002642, 0.220468 ], [212, -8866.580000, 0.159358, 0.000001, 0.220623 ], [219, -8866.590000, 0.159169, 0.000700, 0.220626 ], [217, -8866.970000, 0.108646, 0.003139, 0.222309 ], [216, -8867.620000, 0.056755, 0.001459, 0.227628 ], [215, -8867.620000, 0.056753, 0.000001, 0.227630 ] ], "n": ["FHJ7DRN01A4MT0" ] }, {"p": [[214, -8198.100000, 0.191582, 0.002306, 0.155011 ], [217, -8198.330000, 0.152121, 0.003597, 0.155843 ], [218, -8198.560000, 0.121118, 0.002642, 0.158949 ], [219, -8198.580000, 0.118415, 0.000700, 0.159210 ], [212, -8198.580000, 0.118258, 0.000001, 0.159229 ], [216, -8198.850000, 0.090451, 0.001459, 0.159224 ], [215, -8198.850000, 0.090443, 0.000001, 0.159226 ], [213, -8199.000000, 0.077836, 0.005767, 0.156699 ] ], "n": ["FHJ7DRN01EINVF" ] }, {"p": [[214, -6771.840000, 0.103749, 0.002012, 0.553488 ], [218, -6771.850000, 0.101774, 0.002642, 0.554308 ], [219, -6772.000000, 0.088147, 0.000700, 0.561662 ], [212, -6772.150000, 0.075410, 0.000001, 0.571034 ], [217, -6772.180000, 0.073820, 0.003139, 0.568389 ], [213, -6772.250000, 0.068220, 0.005767, 0.559728 ], [220, -6772.310000, 0.064390, 0.005808, 0.580201 ], [216, -6772.350000, 0.061736, 0.001274, 0.574822 ], [215, -6772.550000, 0.050842, 0.000001, 0.589614 ] ], "n": ["FHJ7DRN02HEZX8" ] }, {"p": [[215, -7972.280000, 0.325248, 0.000001, 0.222101 ], [216, -7972.830000, 0.187220, 0.001274, 0.223052 ], [217, -7973.010000, 0.155489, 0.003139, 0.225299 ], [213, -7973.180000, 0.131421, 0.006609, 0.221590 ] ], "n": ["FHJ7DRN01DYDKA" ] }, {"p": [[215, -7296.370000, 0.427665, 0.000001, 0.223097 ], [216, -7296.920000, 0.246302, 0.001274, 0.224199 ], [217, -7297.430000, 0.147397, 0.003139, 0.234249 ], [213, -7298.390000, 0.056588, 0.006609, 0.237396 ] ], "n": ["FHJ7DRN02JASSN" ] }, {"p": [[216, -6664.460000, 0.244961, 0.001459, 0.141594 ], [215, -6664.460000, 0.244949, 0.000001, 0.141596 ], [217, -6664.890000, 0.159332, 0.003139, 0.143385 ], [212, -6665.620000, 0.076398, 0.000001, 0.149600 ], [218, -6665.620000, 0.076321, 0.002642, 0.149546 ], [219, -6665.620000, 0.076317, 0.000700, 0.149602 ], [220, -6665.990000, 0.052982, 0.005808, 0.145656 ], [214, -6666.030000, 0.050724, 0.002012, 0.151643 ] ], "n": ["FHJ7DRN01BMD5A" ] }, {"p": [[216, -5194.940000, 0.289154, 0.001274, 0.207036 ], [210, -5195.920000, 0.107950, 0.002568, 0.207706 ], [213, -5195.920000, 0.107872, 0.005767, 0.211236 ], [221, -5195.970000, 0.102796, 0.020944, 0.188292 ], [215, -5196.080000, 0.091960, 0.000001, 0.216089 ], [217, -5196.160000, 0.084863, 0.003139, 0.212926 ] ], "n": ["FHJ7DRN01A1AH6" ] }, {"p": [[219, -4786.800000, 0.129373, 0.000700, 0.285348 ], [215, -4786.800000, 0.129370, 0.000001, 0.285354 ], [212, -4786.800000, 0.129370, 0.000001, 0.285354 ], [216, -4786.800000, 0.129370, 0.001274, 0.285353 ], [218, -4786.800000, 0.128807, 0.002642, 0.285394 ], [217, -4786.800000, 0.128803, 0.003139, 0.285397 ], [214, -4787.080000, 0.097394, 0.002012, 0.288506 ], [213, -4787.180000, 0.088379, 0.005767, 0.285906 ] ], "n": ["FHJ7DRN02HGOB1" ] }, {"p": [[220, -6060.210000, 0.103093, 0.006655, 0.113052 ], [221, -6060.390000, 0.086353, 0.009188, 0.100653 ], [213, -6060.410000, 0.084580, 0.006609, 0.116442 ], [217, -6060.410000, 0.084508, 0.003597, 0.116473 ], [218, -6060.410000, 0.084499, 0.003027, 0.116476 ], [214, -6060.410000, 0.084490, 0.002306, 0.116480 ], [216, -6060.410000, 0.084482, 0.001459, 0.116484 ], [219, -6060.410000, 0.084478, 0.000803, 0.116485 ], [212, -6060.410000, 0.084477, 0.000001, 0.116486 ], [215, -6060.410000, 0.084476, 0.000001, 0.116486 ], [209, -6060.720000, 0.062028, 0.001932, 0.117189 ], [211, -6060.900000, 0.051718, 0.005445, 0.115126 ] ], "n": ["FHJ7DRN01EJ2EZ" ] }, {"p": [[221, -7844.810000, 0.335944, 0.016113, 0.151938 ], [211, -7845.510000, 0.167041, 0.005445, 0.179201 ], [220, -7846.100000, 0.091770, 0.005808, 0.182029 ], [210, -7846.240000, 0.079818, 0.002568, 0.177874 ], [216, -7846.250000, 0.079462, 0.001459, 0.183470 ], [209, -7846.550000, 0.059007, 0.001932, 0.180340 ] ], "n": ["FHJ7DRN01DTPVI" ] }, {"p": [[221, -7880.420000, 0.619453, 0.036083, 0.121325 ], [211, -7881.930000, 0.136149, 0.003365, 0.149560 ], [209, -7882.430000, 0.082999, 0.001932, 0.154301 ], [220, -7882.550000, 0.073643, 0.005808, 0.150490 ], [210, -7882.630000, 0.067604, 0.002568, 0.152473 ] ], "n": ["FHJ7DRN01BJY6L" ] }, {"p": [[221, -7699.450000, 0.476169, 0.040366, 0.115188 ], [211, -7700.260000, 0.212331, 0.006239, 0.137436 ], [210, -7700.460000, 0.173501, 0.002568, 0.142008 ] ], "n": ["FHJ7DRN02IWRPO" ] }, {"p": [[221, -5103.070000, 0.776457, 0.040366, 0.097279 ], [211, -5105.610000, 0.061047, 0.006239, 0.145669 ], [210, -5105.790000, 0.051188, 0.002568, 0.153445 ], [209, -5105.790000, 0.051182, 0.001932, 0.153450 ] ], "n": ["FHJ7DRN02HWHK8" ] }, {"p": [[221, -5185.100000, 0.788555, 0.040366, 0.093971 ], [211, -5187.700000, 0.058903, 0.006239, 0.142097 ] ], "n": ["FHJ7DRN02HBABT" ] }, {"p": [[221, -5185.120000, 0.789539, 0.040366, 0.093815 ], [211, -5187.720000, 0.058691, 0.006239, 0.141913 ] ], "n": ["FHJ7DRN02F3JUK" ] }, {"p": [[221, -3991.020000, 0.284711, 0.040366, 0.072059 ], [222, -3991.130000, 0.254429, 0.009885, 0.067828 ], [208, -3991.160000, 0.248061, 0.064136, 0.067047 ] ], "n": ["FHJ7DRN02FBAL4" ] }, {"p": [[221, -3759.150000, 0.480798, 0.017508, 0.070034 ], [211, -3760.270000, 0.157112, 0.005445, 0.099630 ], [220, -3760.330000, 0.147563, 0.005808, 0.100031 ], [212, -3761.290000, 0.056801, 0.000001, 0.110695 ] ], "n": ["FHJ7DRN02I08J9" ] }, {"p": [[221, -4555.490000, 0.147418, 0.017898, 0.105488 ], [213, -4556.110000, 0.079216, 0.006609, 0.130836 ], [217, -4556.110000, 0.079136, 0.003597, 0.130871 ], [218, -4556.110000, 0.079126, 0.003027, 0.130875 ], [214, -4556.110000, 0.079116, 0.002306, 0.130880 ], [216, -4556.110000, 0.079107, 0.001459, 0.130884 ], [219, -4556.110000, 0.079104, 0.000803, 0.130885 ], [215, -4556.110000, 0.079102, 0.000001, 0.130886 ], [212, -4556.110000, 0.079102, 0.000001, 0.130886 ], [220, -4556.140000, 0.077150, 0.005808, 0.130613 ], [209, -4556.410000, 0.058673, 0.001932, 0.132257 ] ], "n": ["FHJ7DRN02IFS4N" ] }, {"p": [[221, -4553.990000, 0.112101, 0.013461, 0.098938 ], [213, -4554.280000, 0.083442, 0.006609, 0.119264 ], [217, -4554.290000, 0.083357, 0.003597, 0.119299 ], [218, -4554.290000, 0.083347, 0.003027, 0.119303 ], [214, -4554.290000, 0.083336, 0.002306, 0.119308 ], [216, -4554.290000, 0.083327, 0.001459, 0.119311 ], [219, -4554.290000, 0.083323, 0.000803, 0.119313 ], [215, -4554.290000, 0.083321, 0.000001, 0.119314 ], [212, -4554.290000, 0.083321, 0.000001, 0.119314 ], [220, -4554.310000, 0.081014, 0.005808, 0.119051 ], [209, -4554.590000, 0.061285, 0.001932, 0.120285 ], [211, -4554.770000, 0.051357, 0.005445, 0.120197 ] ], "n": ["FHJ7DRN01CQML3" ] }, {"p": [[222, -4169.070000, 0.230880, 0.015658, 0.083591 ], [221, -4169.210000, 0.200407, 0.040366, 0.094601 ], [212, -4170.000000, 0.090528, 0.000001, 0.122555 ], [219, -4170.000000, 0.090489, 0.000700, 0.122556 ], [218, -4170.010000, 0.089710, 0.002642, 0.122582 ], [220, -4170.390000, 0.061691, 0.005808, 0.122081 ], [214, -4170.460000, 0.056984, 0.002012, 0.125364 ], [217, -4170.520000, 0.053959, 0.003139, 0.124723 ], [213, -4170.530000, 0.053336, 0.005767, 0.124507 ] ], "n": ["FHJ7DRN02HOND8" ] }, {"p": [[222, -3229.990000, 0.240231, 0.012421, 0.082871 ], [208, -3230.060000, 0.223974, 0.064136, 0.088118 ], [221, -3230.130000, 0.210033, 0.040366, 0.093021 ] ], "n": ["FHJ7DRN01DOYR4" ] }, {"p": [[222, -3637.380000, 0.084583, 0.094545, 0.237827 ], [200, -3637.500000, 0.075011, 0.089284, 0.243851 ], [201, -3637.760000, 0.058232, 0.029482, 0.258838 ], [221, -3637.760000, 0.058147, 0.005767, 0.267962 ], [211, -3637.800000, 0.055917, 0.003365, 0.266146 ], [216, -3637.850000, 0.053224, 0.001459, 0.272111 ], [215, -3637.850000, 0.053223, 0.000001, 0.272113 ], [223, -3637.900000, 0.050674, 0.007484, 0.260573 ] ], "n": ["FHJ7DRN01BSACD" ] }, {"p": [[222, -5689.500000, 0.070844, 0.110522, 1.012320 ], [7, -5689.580000, 0.065399, 0.090479, 1.086170 ], [13, -5689.760000, 0.054304, 0.005142, 1.126650 ] ], "n": ["FHJ7DRN01ESJ5E" ] }, {"p": [[232, -6238.690000, 0.100600, 0.013087, 0.901100 ], [235, -6239.340000, 0.052170, 0.000001, 0.999505 ], [234, -6239.340000, 0.052170, 0.000001, 0.999505 ], [236, -6239.340000, 0.052169, 0.000645, 0.999510 ], [233, -6239.340000, 0.052168, 0.001874, 0.999514 ], [237, -6239.360000, 0.050999, 0.007434, 1.007660 ] ], "n": ["FHJ7DRN02FV3QN" ] }, {"p": [[232, -6173.150000, 0.052418, 0.015618, 1.374480 ] ], "n": ["FHJ7DRN01COHIZ" ] }, {"p": [[270, -5491.990000, 0.355302, 0.006758, 1.994140 ] ], "n": ["FHJ7DRN02GI8LI" ] }, {"p": [[270, -5148.460000, 0.490857, 0.006758, 1.882320 ] ], "n": ["FHJ7DRN02GZBQ0" ] }, {"p": [[273, -8186.010000, 1.000000, 0.044278, 0.093947 ] ], "n": ["FHJ7DRN02HJBWK" ] }, {"p": [[273, -3134.090000, 0.259524, 0.447177, 0.395014 ], [282, -3134.140000, 0.247001, 0.064072, 0.394768 ], [283, -3134.430000, 0.183742, 0.008867, 0.409348 ] ], "n": ["FHJ7DRN01BH6Z6" ] }, {"p": [[273, -3090.000000, 0.224075, 0.447177, 0.387822 ], [282, -3090.030000, 0.218093, 0.064072, 0.384061 ], [283, -3090.240000, 0.177636, 0.008867, 0.402059 ], [272, -3091.420000, 0.054395, 0.112047, 0.481469 ], [284, -3091.480000, 0.051021, 0.008640, 0.497661 ] ], "n": ["FHJ7DRN02F3GT4" ] }, {"p": [[273, -4216.950000, 0.164213, 0.296391, 1.080230 ] ], "n": ["FHJ7DRN02FTYVE" ] }, {"p": [[274, -7104.010000, 0.062242, 0.053445, 1.114080 ], [281, -7104.030000, 0.061429, 0.046331, 1.131120 ], [273, -7104.040000, 0.060862, 0.367278, 1.249580 ], [282, -7104.120000, 0.055947, 0.009153, 1.136740 ], [277, -7104.190000, 0.052034, 0.016298, 1.198860 ], [280, -7104.190000, 0.051979, 0.022523, 1.190730 ] ], "n": ["FHJ7DRN01AZOXY" ] }, {"p": [[276, -3319.340000, 0.069842, 0.000001, 1.333000 ], [275, -3319.340000, 0.069841, 0.000616, 1.333000 ], [277, -3319.410000, 0.065175, 0.005433, 1.349850 ], [281, -3319.640000, 0.052014, 0.006619, 1.413470 ] ], "n": ["FHJ7DRN01EGCWS" ] }, {"p": [[284, -5064.410000, 0.356052, 0.023864, 0.251755 ], [272, -5064.610000, 0.291826, 0.070721, 0.202113 ], [283, -5065.590000, 0.108915, 0.026602, 0.245722 ], [7, -5066.160000, 0.061975, 0.083173, 0.274328 ], [11, -5066.330000, 0.052093, 0.065672, 0.329926 ] ], "n": ["FHJ7DRN01D0ZA3" ] }, {"p": [[286, -3526.720000, 0.116194, 0.008777, 0.731135 ], [285, -3527.230000, 0.069963, 0.095057, 0.795845 ], [287, -3527.240000, 0.068935, 0.006224, 0.797293 ], [273, -3527.340000, 0.062578, 0.440790, 0.752190 ], [283, -3527.520000, 0.051976, 0.008867, 0.775631 ], [282, -3527.540000, 0.050927, 0.064072, 0.762638 ], [288, -3527.550000, 0.050582, 0.007014, 0.836120 ] ], "n": ["FHJ7DRN02IEDVN" ] }, {"p": [[286, -2837.410000, 0.096066, 0.008777, 0.693107 ], [273, -2837.950000, 0.056079, 0.447177, 0.757678 ], [285, -2837.950000, 0.055719, 0.095057, 0.797239 ], [287, -2837.960000, 0.055640, 0.006224, 0.797846 ], [282, -2837.980000, 0.054567, 0.064072, 0.748816 ] ], "n": ["FHJ7DRN02JLGND" ] }, {"p": [[288, -7466.130000, 0.085087, 0.007014, 1.255620 ], [287, -7466.230000, 0.077233, 0.018673, 1.256630 ], [284, -7466.250000, 0.076141, 0.060480, 1.253940 ], [275, -7466.430000, 0.063086, 0.000616, 1.144680 ], [276, -7466.430000, 0.063073, 0.000001, 1.151630 ], [273, -7466.460000, 0.061597, 0.393292, 1.176000 ], [277, -7466.510000, 0.058304, 0.005433, 1.152840 ] ], "n": ["FHJ7DRN02F6TMY" ] } ], "metadata": {"invocation": "guppy to_json" }, "version": 1, "fields": ["edge_num", "likelihood", "like_weight_ratio", "distal_length", "pendant_length" ] }pplacer-1.1.alpha19/tests/data/psbA/upwelling.jplace000066400000000000000000000376521303154601500224000ustar00rootroot00000000000000{"tree": "((((chloroplast_Bangiopsis_subsimplex.AY119736_:0.0296744[0],((chloroplast_Erythrotrichia_carnea.AY119739_:0.0669714[1],chloroplast_Rhodochaete_parvula.AY119743_:0.0846451[2]):0.0473989[3],chloroplast_Rhodosorus_marinus.AY119744_:0.06578[4]):0.0135707[5]):0.0125774[6],((((chloroplast_Cyanidium_sp._Monte_Rotaro.AY391365_:0.14225[7],(chloroplast_Cyanidium_caldarium.AY541290_:0.229326[8],(chloroplast_Cyanidioschyzon_merolae_strain_DBV201.AY119729_:2.62716e-06[9],chloroplast_Cyanidioschyzon_merolae.AY119730_:0.00124934[10]):0.0764407[11]):0.0594726[12]):0.0411324[13],(((chloroplast_Vaucheria_litorea.AF227740_:0.0548633[14],(chloroplast_Bumilleriopsis_filiformis.X79223_:0.00713038[15],plastid_Tribonema_aequale.AY528860_:0.013462[16]):0.0188887[17]):0.0307213[18],((chloroplast_Heterosigma_carterae.HCU18090_:2.62716e-06[19],chloroplast_Heterosigma_akashiwo.AY119759_:2.62716e-06[20]):0.0264439[21],((((((((chloroplast_Pavlova_lutheri.AY119755_:0.0155337[22],chloroplast_Pavlova_gyrans.AY119754_:0.031921[23]):0.0284429[24],chloroplast_Pavlova_gyrans.AJ575575_:0.0184771[25]):0.0369803[26],(chloroplast_Phaeocystis_antarctica.AY119756_:0.032481[27],(((chloroplast_Emiliania_huxleyi.AJ575573_:0.00127856[28],(chloroplast_Emiliania_huxleyi.AY675521_:2.62716e-06[29],chloroplast_Emiliania_huxleyi.AY119752_:2.62716e-06[30]):2.62716e-06[31]):0.00987446[32],(chloroplast_Isochrysis_sp._SAG_927-2.AY119753_:0.00129238[33],chloroplast_Isochrysis_galbana.AJ575574_:0.00127939[34]):0.0180921[35]):0.00662445[36],((chloroplast_Prymnesium_parvum.AJ575576_:0.00781698[37],chloroplast_Prymnesium_parvum.AY119758_:0.0107643[38]):0.0264028[39],(chloroplast_Pleurochrysis_carterae.AY119757_:0.0355143[40],(chloroplast_Imantonia_rotunda.EU851963_:0.0471273[41],chloroplast_Chrysochromulina_polylepis.AJ575572_:0.0130868[42]):0.00866583[43]):0.00227491[44]):0.00414201[45]):0.00687632[46]):0.0219329[47]):0.0287832[48],(((chloroplast_Pycnococcus_provasolii.EU851957_:0.0991635[49],(chloroplast_Mantoniella_squamata.EU851964_:0.00735936[50],((chloroplast_Micromonas_pusilla.EU851965_:2.62716e-06[51],plastid_uncultured_Prasinophyceae.AY176639_:2.62716e-06[52]):0.00915325[53],(chloroplast_Ostreococcus_sp._RCC789.EU851970_:0.0155525[54],(((chloroplast_Bathycoccus_prasinos.EU851955_:0.0100228[55],(uncultured_Prasinophyceae.AY509538_:2.62716e-06[56],uncultured_Prasinophyceae.AY509537_:0.00127378[57]):0.018912[58]):0.0387387[59],plastid_uncultured_Prasinophyceae.AY176630_:0.0268697[60]):0.00352364[61],(plastid_uncultured_Prasinophyceae.AY176628_:0.0181777[62],((Ostreococcus_tauri_2_:2.62716e-06[63],Ostreococcus_tauri_:2.62716e-06[64]):0.010015[65],(plastid_uncultured_Prasinophyceae.AY176620_:2.62716e-06[66],chloroplast_Ostreococcus_sp._RCC344.EU851961_:2.62716e-06[67]):0.00559304[68]):0.00536261[69]):0.00155492[70]):0.0103018[71]):0.0195476[72]):0.0116489[73]):0.0572199[74]):0.0500432[75],(((chloroplast_Chlorella_pyrenoidosa.EU043049_:0.00246255[76],chloroplast_Chlorella_vulgaris.EU043044_:0.00128935[77]):0.0754025[78],(Bigelowiella_natans_:0.108317[79],(Chlamydomonas_reinhardtii_:0.0747763[80],(chloroplast_Picochlorum_sp._RCC289.EU851960_:0.0553565[81],(Chlorella_vulgaris_:0.0479649[82],(chloroplast_Chlorella_pyrenoidosa.EU043047_:0.00249514[83],(chloroplast_Chlorella_pyrenoidosa.EU043046_:0.00250654[84],chloroplast_Auxenochlorella_protothecoides.EU043045_:0.00125447[85]):2.62716e-06[86]):0.0170169[87]):0.0187545[88]):0.0162818[89]):0.0140918[90]):0.00695735[91]):0.0236101[92],plastid_Tetraselmis_marina.AY857618_:0.0274149[93]):0.0121743[94]):0.0144071[95],chloroplast_Pseudochlorella_sp._CCAP_211\/1A.EU043048_:0.0910399[96]):0.036916[97]):0.0178205[98],((((Microcystis_aerouginosa_gi166362741refNC_010296.1_:0.100689[99],((Cyanothece_sp._ATCC_51142.CAU39610_:0.0139443[100],Cyanothece_sp._CCY_0110___gi126657681refNZ_AAXW01000012.1_:0.0325757[101]):0.0368903[102],(Cyanothece_sp._PCC_7425_gi218437013refNC_011729.1_:0.0799602[103],Cyanothece_sp._PCC_8801_gi218244892refNC_011726.1_:0.06558[104]):0.017916[105]):0.0403653[106]):0.0316316[107],((Lyngbya_sp_PCC_8106___gi119483230refNZ_AAVU01000001.1_:0.174445[108],Mastigocladus_laminosus.AF170924_:0.292674[109]):0.0843939[110],((Nostock_punctiforme_gi186680550refNC_010628.1_:0.118661[111],((Nostoc_sp._PCC_7120_gi17227497refNC_003272.1_:0.00952002[112],Anabaena_variabilis_A_gi75906225refNC_007413.1_:0.0234306[113]):0.0386248[114],(Fremyella_diplosiphon.FDIPSBA_:0.0552418[115],Nodularia_spumige_gi119512239refNZ_AAVW01000065.1_:0.053628[116]):0.0204852[117]):0.0272273[118]):0.0361292[119],(Synechococcus_sp._PCC_7002___gi170076636refNC_010475.1_:0.0899374[120],((Microcoleus_chthonoplastes_PCC_7420___gi224400128refNW_002435220.1_:0.0921412[121],(((Gloeobacter_violaceus_gi37519569refNC_005125.1_:0.287597[122],(Synechococcus_sp._JA-3-3Ab__gi86604733refNC_007775.1_:0.0880842[123],Synechococcus_sp._JA-2-3Ba____gi86607503refNC_007776.1_:0.637056[124]):0.0999416[125]):0.153018[126],(Thermosynechococcus_gi22297544refNC_004113.1_:0.12404[127],((Acaryochloris_marina_MBIC11017.AB303650_2_:2.62716e-06[128],Acaryochloris_marina_MBIC11017.AB303650_:2.62716e-06[129]):0.240343[130],Cyanothece_sp._PCC_7425_gi220905643refNC_011884.1_:0.144677[131]):0.0173981[132]):0.0300352[133]):0.0359263[134],((Prochlorothrix_hollandica.X14308_:2.62716e-06[135],Prochlorothrix_hollandica.X14523_:0.00135654[136]):0.0865866[137],((Synechococcus_elongatus_PCC_7942___gi81298811refNC_007604.1_:0.0113412[138],Synechococcus_elongatus_PCC_6301___gi56750010refNC_006576.1_:0.00283364[139]):0.115006[140],((Synechococcus_sp._WH_5701__gi87303211refNZ_AANO01000010.1_:0.077507[141],((Synechococcus_sp._WH_5701___gi211606500refNZ_CH724159.1_:2.62716e-06[142],Synechococcus_sp._WH_5701_gi87303578refNZ_AANO01000013.1_:2.62716e-06[143]):2.62716e-06[144],(Synechococcus_sp._WH_5701__gi87301761refNZ_AANO01000004.1_:2.62716e-06[145],Synechococcus_sp._WH_5701__gi211606501refNZ_CH724160.1_:2.62716e-06[146]):2.62716e-06[147]):0.0116739[148]):0.0161385[149],((((((Synechococcus_sp.__WH_7805__gi88807077refNZ_AAOK01000001.1_:0.00282307[150],(Synechococcus_sp._WH_7805__gi88807768refNZ_AAOK01000002.1_:2.62716e-06[151],(Synechococcus_sp._WH_7805_gi211594037refNZ_CH724168.1_:2.62716e-06[152],Synechococcus_sp._WH_7805__gi88809542refNZ_AAOK01000006.1_:2.62716e-06[153]):0.00138873[154]):0.00276638[155]):0.00844882[156],Synechococcus_sp._WH_7803___gi148238336refNC_009481.1_:0.00801814[157]):0.0180692[158],(Synechococcus_sp._RS9917___gi87125174refNZ_AANP01000006.1_:2.62716e-06[159],(Synechococcus_sp._RS9917___gi87124875refNZ_AANP01000005.1_:2.62716e-06[160],Synechococcus_sp._RS9__gi211606499refNZ_CH724158.1_:2.62716e-06[161]):0.00278788[162]):0.00874388[163]):0.00421837[164],((Synechococcus_sp._RCC307_gi148241099refNC_009482.1_:0.0436787[165],(Synechococcus_sp._CC9605_gi78211558refNC_007516.1_:0.0292645[166],((Synechococcus_sp._CC9902_gi78183584refNC_007513.1_:0.00569178[167],(Synechococcus_sp.__BL107__gi116072546refNZ_AATZ01000004.1_:2.62716e-06[168],Synechococcus_sp._BL107_gi211594587refNZ_DS022298.1_:2.62716e-06[169]):0.00260315[170]):0.0417448[171],Synechococcus_sp._WH_8102_gi33864539refNC_005070.1_:0.0213766[172]):0.00906289[173]):0.0225313[174]):0.0359511[175],(Synechococcus_sp._gi87123618refNZ_AANP01000002.1_:0.0436975[176],(Prochlorococcus_marinus_str._MIT_9303___gi124021714refNC_008820.1_:0.213286[177],(Synechococcus_sp.__RS9916__gi116074999refNZ_AAUA01000003.1_:2.62716e-06[178],Synechococcus_sp._RS9__gi211594588refNZ_DS022299.1_:2.62716e-06[179]):0.0326556[180]):0.018698[181]):0.0201245[182]):0.0123275[183]):0.0171659[184],Synechococcus_sp._RS9917__gi87124182refNZ_AANP01000003.1_:0.206502[185]):0.0124936[186],Cyanobium_sp._PCC_70_gi223490194refNW_002243451.1_:0.0349915[187]):0.0244749[188]):0.0552727[189]):0.0484564[190]):0.0330387[191]):0.053081[192]):0.0322305[193],Synechocystis_sp_PCC_6803___gi16329170refNC_000911.1_:0.055271[194]):0.0342032[195]):0.0313[196]):0.003393[197]):0.0208115[198]):0.0544215[199],Trichodesmium_erythr_gi113473942refNC_008312.1_:0.115405[200]):0.0393095[201],(((Prochlorococcus_marinus_str._NATL1A___gi124024712refNC_008819.1_:2.62716e-06[202],Procholococcus_marinus_str._NATL2A___gi162958048refNC_007335.2_:0.00387272[203]):0.0652348[204],(Prochlorococcus_marinus_subsp._marinus_str._CCMP1375_gi33239452refNC_005042.1_:0.107069[205],Procholococcus_marinus_str._MIT_9211___gi159902540refNC_009976.1_:0.0648332[206]):0.0645389[207]):0.0732978[208],((Prochlorococcus_marinus_subsp._pastoris_str._CCMP1986_gi33860560refNC_005072.1_:0.00386442[209],Prochlorococcus_marinus_str._MIT_9515___gi123965234refNC_008817.1_:0.00513584[210]):0.0108901[211],(Prochlorococcus_marinus_str._AS9601_gi123967536refNC_008816.1_:2.62716e-06[212],(Prochlorococcus_marinus_str._MIT_9301__gi126695337refNC_009091.1_:0.0115344[213],(Prochlorococcus_marinus_str._MIT_9312_gi78778385refNC_007577.1_:0.00402475[214],(Procholococcus_marinus_str._MIT_9215___gi157412338refNC_009840.1_:2.62716e-06[215],Procholococcus_marinus_str._MIT_9202_gi225077649refNW_002467725.1_:0.00254717[216]):0.00627816[217]):0.005283[218]):0.00140083[219]):0.0116153[220]):0.0461325[221]):0.158153[222]):0.0598755[223]):0.0735348[224],(Fragilariopsis_psbA_:0.0261132[225],Pmultiseries_psbA_:0.0139712[226]):0.0137913[227]):0.0138551[228],(plastid_Ballia_callitricha.DQ787635_:0.0643769[229],Phaeodactylum_tricornutum_:0.0212228[230]):0.0108685[231]):0.0220385[232],(chloroplast_Skeletonema_costatum.AY119761_:0.0037475[233],(Thalassiosira_pseudonana_2_:2.62716e-06[234],Thalassiosira_pseudonana_:2.62716e-06[235]):0.00128936[236]):0.0148686[237]):0.0413777[238]):0.00677313[239]):0.0181954[240],(((chloroplast_Fucus_vesiculosus.DQ307679_:0.0363344[241],chloroplast_Ectocarpus_siliculosus.X56695_:0.0425758[242]):0.0409036[243],(chloroplast_Padina_crassa.AY422643_:0.00945597[244],(plastid_Padina_japonica.AY430360_:0.0151942[245],(plastid_Padina_arborescens.AY430357_:0.0172454[246],(plastid_Padina_crassa.AY430358_:2.62716e-06[247],(plastid_Padina_crassa.AY430359_:2.62716e-06[248],plastid_Padina_crassa.AY430361_:2.62716e-06[249]):2.62716e-06[250]):0.00738025[251]):0.00531298[252]):0.00363975[253]):0.0184925[254]):0.0115372[255],(chloroplast_Pachydictyon_coriaceum.AY422614_:0.0259434[256],((chloroplast_Dictyota_dichotoma.AY748320_:2.62716e-06[257],chloroplast_Dictyota_dichotoma.AY748319_:2.62716e-06[258]):0.00249624[259],((chloroplast_Dictyota_dichotoma_var._linearis.AY422632_:2.62716e-06[260],chloroplast_Dictyota_dichotoma.AY748321_:2.62716e-06[261]):2.62716e-06[262],chloroplast_Dictyota_dichotoma_var._linearis.AY422631_:2.62716e-06[263]):2.62716e-06[264]):0.00881923[265]):0.0248245[266]):0.0409737[267]):0.029059[268]):0.0193884[269],(((Synechococcus_sp._PCC_7335_gi225144522refNW_002475532.1_:0.432534[270],Cyanothece_sp._CC_gi126660325refNZ_AAXW01000053.1_:0.278199[271]):0.119517[272],(gi|5821419|dbj|AB025589.1|:0.454275[273],(chloroplast_Galdieria_sulphuraria.AY541295_:0.0610795[274],((chloroplast_Galdieria_sulphuraria.AY541294_:0.00123271[275],chloroplast_Galdieria_sulphuraria.AY541293_:2.62716e-06[276]):0.0217312[277],(chloroplast_Cyanidium_caldarium.X52758_:0.0207176[278],chloroplast_Galdieria_sulphuraria.AY119731_:4.5192e-05[279]):0.0300301[280]):0.0529495[281]):0.0732256[282]):0.0354697[283]):0.0691202[284],(Mesostigma_viride_:0.101394[285],Cyanophora_paradoxa_:0.0702149[286]):0.0248976[287]):0.014028[288]):0.0258734[289],(chloroplast_Flintiella_sanguinaria.AY119740_:0.0513641[290],chloroplast_Porphyridium_aerugineum.AY119741_:0.0495445[291]):0.0174643[292]):0.020752[293]):0.050369[294],(chloroplast_Palmaria_palmata.PPU28165_:0.104631[295],(plastid_Antithamnionella_sp._A31.DQ787640_:0.0202479[296],(chloroplast_Antithamnion_sp.X55364_:0.0292228[297],plastid_Carpoblepharis_flaccida.DQ787643_:0.112145[298]):0.00887985[299]):0.0324329[300]):0.0175603[301]):0.0769895[302],Porphyra_yezoensis_:0.0134362[303],Porphyra_purpurea_:0.022228[304]):0[305];", "placements": [{"p": [[30, -4087.160000, 0.227521, 0.000001, 0.007812 ], [29, -4087.160000, 0.227521, 0.000001, 0.007812 ], [31, -4087.160000, 0.227520, 0.000001, 0.007812 ], [28, -4087.160000, 0.227508, 0.000639, 0.007812 ], [32, -4088.170000, 0.082641, 0.004937, 0.007812 ] ], "n": ["FHIAZI402GNPT4" ] }, {"p": [[40, -6219.400000, 0.373060, 0.033540, 0.005685 ], [44, -6220.130000, 0.180306, 0.001137, 0.008794 ], [43, -6220.590000, 0.114185, 0.004333, 0.013392 ], [45, -6220.590000, 0.113614, 0.002071, 0.012608 ], [39, -6220.720000, 0.100267, 0.019802, 0.012436 ] ], "n": ["FHIAZI402IOF3W" ] }, {"p": [[47, -3332.880000, 0.977137, 0.014618, 0.007812 ] ], "n": ["FHIAZI402FWJBV" ] }, {"p": [[80, -8693.540000, 0.966718, 0.048821, 0.142258 ] ], "n": ["FHA154I02HLRMG" ] }, {"p": [[89, -3421.700000, 0.234950, 0.008141, 0.080100 ], [88, -3421.890000, 0.193620, 0.009377, 0.088770 ], [82, -3422.250000, 0.135853, 0.041969, 0.091638 ], [93, -3422.630000, 0.092332, 0.012708, 0.079129 ], [87, -3422.850000, 0.074626, 0.008508, 0.098666 ] ], "n": ["FHIAZI402GEQWP" ] }, {"p": [[169, -4260.680000, 0.298785, 0.000001, 0.141886 ], [168, -4260.680000, 0.298785, 0.000001, 0.141886 ], [170, -4261.240000, 0.170336, 0.001302, 0.143215 ], [174, -4261.710000, 0.106920, 0.010703, 0.133384 ] ], "n": ["FHA154I02IVFC6" ] }, {"p": [[171, -5175.550000, 0.260925, 0.013774, 0.061513 ], [173, -5175.640000, 0.237425, 0.005193, 0.058533 ], [167, -5176.160000, 0.141492, 0.002846, 0.066221 ], [170, -5176.270000, 0.126829, 0.001302, 0.065268 ], [172, -5176.610000, 0.090660, 0.016033, 0.053268 ], [166, -5176.720000, 0.081204, 0.021948, 0.062934 ] ], "n": ["FHA154I02I3C68" ] }, {"p": [[202, -3783.610000, 0.294760, 0.000001, 0.094218 ], [203, -3783.610000, 0.294758, 0.001197, 0.094213 ], [204, -3783.710000, 0.267413, 0.008154, 0.098995 ], [207, -3785.130000, 0.064520, 0.056472, 0.091830 ], [208, -3785.170000, 0.061935, 0.009162, 0.090678 ] ], "n": ["FHIAZI402FYWCG" ] }, {"p": [[208, -5503.610000, 0.768816, 0.059254, 0.104811 ], [221, -5504.940000, 0.202813, 0.040366, 0.114295 ] ], "n": ["FHA154I02FUZ47" ] }, {"p": [[222, -6667.040000, 0.738776, 0.078037, 0.127451 ], [213, -6669.500000, 0.062849, 0.005767, 0.220668 ] ], "n": ["FHA154I02F6NK1" ] }, {"p": [[223, -1926.320000, 0.335913, 0.052391, 0.007812 ], [224, -1926.350000, 0.325388, 0.009192, 0.007812 ], [98, -1926.960000, 0.177641, 0.008910, 0.007812 ], [201, -1927.180000, 0.142021, 0.029482, 0.007812 ] ], "n": ["FHIAZI402G0W2R" ] }, {"p": [[225, -9327.720000, 0.443745, 0.020285, 0.036614 ], [226, -9327.920000, 0.364351, 0.008005, 0.045423 ], [224, -9328.720000, 0.163584, 0.051861, 0.036981 ] ], "n": ["FHIAZI402HI4TL" ] }, {"p": [[226, -5705.820000, 0.984323, 0.006986, 0.013624 ] ], "n": ["FHIAZI402H6AZC" ] }, {"p": [[231, -2237.320000, 0.203561, 0.005434, 0.015545 ], [228, -2237.340000, 0.200200, 0.006928, 0.015423 ], [232, -2237.440000, 0.181933, 0.005510, 0.015438 ], [230, -2237.540000, 0.164031, 0.015917, 0.015554 ], [227, -2238.000000, 0.103719, 0.006896, 0.015968 ], [237, -2238.580000, 0.057942, 0.007434, 0.016237 ] ], "n": ["FHIAZI402F7DC8" ] }, {"p": [[235, -7154.940000, 0.370079, 0.000001, 0.042185 ], [234, -7154.940000, 0.370079, 0.000001, 0.042185 ], [236, -7155.540000, 0.204347, 0.000645, 0.041642 ] ], "n": ["FHIAZI402GKM6S" ] }, {"p": [[235, -4318.800000, 0.196503, 0.000001, 0.107395 ], [234, -4318.800000, 0.196503, 0.000001, 0.107395 ], [236, -4318.800000, 0.196385, 0.000645, 0.107396 ], [233, -4318.810000, 0.196367, 0.001874, 0.107393 ], [284, -4319.170000, 0.136578, 0.007354, 0.079230 ], [237, -4319.790000, 0.073372, 0.007434, 0.110554 ] ], "n": ["FHA154I02IRVDA" ] }, {"p": [[238, -8209.410000, 0.494355, 0.029994, 0.040050 ], [21, -8210.040000, 0.264204, 0.020643, 0.037054 ], [239, -8210.730000, 0.132319, 0.003387, 0.042868 ], [232, -8211.410000, 0.066963, 0.015375, 0.040550 ] ], "n": ["FHIAZI402GPY6I" ] }, {"p": [[285, -7037.800000, 0.167545, 0.006337, 1.994140 ], [291, -7037.920000, 0.148367, 0.006193, 1.994140 ], [289, -7038.020000, 0.134613, 0.006468, 1.994140 ], [292, -7038.060000, 0.128703, 0.008732, 1.994140 ], [49, -7038.190000, 0.112784, 0.006198, 1.994140 ] ], "n": ["FHA154I02FV90J" ] } ], "metadata": {"invocation": "guppy to_json" }, "version": 1, "fields": ["edge_num", "likelihood", "like_weight_ratio", "distal_length", "pendant_length" ] }pplacer-1.1.alpha19/tests/data/simple.refpkg/000077500000000000000000000000001303154601500210565ustar00rootroot00000000000000pplacer-1.1.alpha19/tests/data/simple.refpkg/CONTENTS.json000066400000000000000000000004771303154601500232160ustar00rootroot00000000000000{ "files": { "taxonomy": "taxonomy.csv", "tree": "x.tre", "seq_info": "seqinfo.csv" }, "metadata": { "format_version": "1.1" }, "md5": { "taxonomy": "5c9feb6f3aa5561c7dd6bb6e1e873dee", "tree": "ea3d72ce471c9912d4d3e36203f2adee", "seq_info": "a8f9ec422abb9d2598d98b95623a7e0a" } }pplacer-1.1.alpha19/tests/data/simple.refpkg/seqinfo.csv000066400000000000000000000001711303154601500232360ustar00rootroot00000000000000seqname,accession,tax_id C_1,C,C D_1,D,D F_1,F,F G_1,G,G C_2,C,C D_2,D,D F_2,F,F G_2,G,G C_3,C,C D_3,D,D F_3,F,F G_3,G,G pplacer-1.1.alpha19/tests/data/simple.refpkg/taxonomy.csv000066400000000000000000000002671303154601500234560ustar00rootroot00000000000000tax_id,parent_id,rank,tax_name,family,genus,species A,A,family,A,A,, B,A,genus,B,A,B, C,B,species,C,A,B,C D,B,species,D,A,B,D E,A,genus,E,A,E, F,E,species,F,A,E,F G,E,species,G,A,E,G pplacer-1.1.alpha19/tests/data/simple.refpkg/x.tre000066400000000000000000000000171303154601500220370ustar00rootroot00000000000000((C,D),(F,G)); pplacer-1.1.alpha19/tests/data/simple/000077500000000000000000000000001303154601500176015ustar00rootroot00000000000000pplacer-1.1.alpha19/tests/data/simple/test1.jplace000066400000000000000000000006011303154601500220160ustar00rootroot00000000000000{"tree": "((A:2[0],B:9[1]):7[2],C:5[3],D:1[4]):0[5];", "placements": [{"p": [[0, -1309.830000, 1.000000, 1.000000, 10.000000 ] ], "n": ["one_x" ] }, {"p": [[1, -1309.830000, 1.000000, 2.000000, 10.000000 ] ], "n": ["one_y" ] } ], "metadata": {"invocation": "guppy to_json" }, "version": 1, "fields": ["edge_num", "likelihood", "like_weight_ratio", "distal_length", "pendant_length" ] }pplacer-1.1.alpha19/tests/data/simple/test2.jplace000066400000000000000000000006011303154601500220170ustar00rootroot00000000000000{"tree": "((A:2[0],B:9[1]):7[2],C:5[3],D:1[4]):0[5];", "placements": [{"p": [[3, -1309.830000, 1.000000, 4.000000, 10.000000 ] ], "n": ["two_x" ] }, {"p": [[3, -1309.830000, 1.000000, 0.000000, 10.000000 ] ], "n": ["two_y" ] } ], "metadata": {"invocation": "guppy to_json" }, "version": 1, "fields": ["edge_num", "likelihood", "like_weight_ratio", "distal_length", "pendant_length" ] }pplacer-1.1.alpha19/tests/data/simple/test3.jplace000066400000000000000000000004621303154601500220250ustar00rootroot00000000000000{"tree": "((A:2[0],B:9[1]):7[2],C:5[3],D:1[4]):0[5];", "placements": [{"p": [[2, -1309.830000, 1.000000, 2.000000, 10.000000 ] ], "n": ["three" ] } ], "metadata": {"invocation": "guppy to_json" }, "version": 1, "fields": ["edge_num", "likelihood", "like_weight_ratio", "distal_length", "pendant_length" ] }pplacer-1.1.alpha19/tests/data/tiny.refpkg/000077500000000000000000000000001303154601500205505ustar00rootroot00000000000000pplacer-1.1.alpha19/tests/data/tiny.refpkg/CONTENTS.json000066400000000000000000000002311303154601500226740ustar00rootroot00000000000000{ "files": { "tree": "x.tre" }, "metadata": { "format_version": "1.1" }, "md5": { "tree": "ea3d72ce471c9912d4d3e36203f2adee" } } pplacer-1.1.alpha19/tests/data/tiny.refpkg/x.tre000066400000000000000000000000171303154601500215310ustar00rootroot00000000000000((C,D),(F,G)); pplacer-1.1.alpha19/tests/data/trim/000077500000000000000000000000001303154601500172635ustar00rootroot00000000000000pplacer-1.1.alpha19/tests/data/trim/trim_in.jplace000066400000000000000000000007001303154601500221010ustar00rootroot00000000000000{"tree": "(((:1,:1):1,:1):1,(:1,(:1,:1):1):1);", "placements": [ {"p": [ [6, -1309.83, 0.95, 0.5, 0.9], [1, -1309.83, 0.05, 0.5, 0.9] ], "n": ["A"]}, {"p": [ [5, -1309.83, 0.1, 0.5, 0.9], [7, -1309.83, 2, 0.5, 0.9], [3, -1309.83, 2, 0.5, 0.9] ], "n": ["preserve"]} ], "metadata": {"invocation": "by hand"}, "version": 2, "fields": ["edge_num", "likelihood", "like_weight_ratio", "distal_length", "pendant_length"] } pplacer-1.1.alpha19/tests/data/trim/trim_out.jplace000066400000000000000000000014111303154601500223020ustar00rootroot00000000000000{"tree": "(:2{0},(:1{1},:1{2}):2{3}):0{4};", "placements": [ {"p": [[1, -1309.83, 0.710949502625, 0.5, 0.9], [0, -1309.83, 0.289050497375, 1, 2.4] ], "nm": [["A", 1]] }, {"p": [[2, -1309.83, 0.465209619762, 0.5, 0.9], [0, -1309.83, 0.465209619762, 0.5, 0.9], [3, -1309.83, 0.0695807604768, 1, 1.4] ], "nm": [["preserve", 1]] } ], "metadata": {"invocation": "bin\/guppy trim --min-path-mass .1 tests\/data\/trim\/trim_in.jplace -o trimmed.jplace --rewrite-discarded-mass", "transm": [[3, 0, 0], [4, 0, 1], [6, 1, 0], [7, 2, 0], [8, 3, 0], [9, 3, 1], [10, 4, 0] ] }, "version": 3, "fields": ["edge_num", "likelihood", "like_weight_ratio", "distal_length", "pendant_length" ] } pplacer-1.1.alpha19/tests/guppy/000077500000000000000000000000001303154601500165435ustar00rootroot00000000000000pplacer-1.1.alpha19/tests/guppy/external_check/000077500000000000000000000000001303154601500215225ustar00rootroot00000000000000pplacer-1.1.alpha19/tests/guppy/external_check/R-verification.kr.R000066400000000000000000000017611303154601500251460ustar00rootroot00000000000000 # outside does the final finishing outer_exp = function (p) { min(1,1/p) } outside = function (p, inside) { (inside / tree_len) ** (outer_exp(p)) } exponents = c(0.5, 1, 2) tree_len = 24 # for the "usual" setup of no multiplicity f = function (p) { m = 0.5^p c( outside(p, m * (1+7) + 7 + 1 + m * (0+4)), outside(p, m * (1+7) + 2), outside(p, m * (0+4) + 1 + 5) ) } answers = rbind(sapply(exponents,f)) rownames(answers) = exponents answers # now say we have multiplicity 3 on one_x and multiplicity 5 on one_y no_trans = function (x) = x f = function (p) { g = function (mx,my) { outside(p, (mx^p)*1 + (my^p)*7 + 2) } asx = asinh(3) asy = asinh(5) as_tot = asx + asy c( # here we have the multiplicity interpreted literally g(3/8,5/8), # hear each pquery gets one vote g(1/2,1/2), # and here is the asinh g(asx/as_tot, asy/as_tot) ) } answers = rbind(sapply(exponents,f)) rownames(answers) = c("no_trans", "unit_trans", "asinh_trans") answers pplacer-1.1.alpha19/tests/guppy/external_check/euler_angles.math000066400000000000000000000032331303154601500250430ustar00rootroot00000000000000 toMatrix[transf_] := TransformationMatrix[transf][[1 ;; 3, 1 ;; 3]] ofEulerAngles[phi_,theta_,psi_] := RotationTransform[psi, {0, 0, -1}]. RotationTransform[theta, {-1, 0, 0}]. RotationTransform[phi, {0, 0, -1}] In[93]:= MatrixForm[Flatten[Table[{i,j},{i,0,2},{j,0,2}],1]] Out[93]//MatrixForm= 0 0 0 1 0 2 1 0 1 1 1 2 2 0 2 1 2 2 In[94]:= MatrixForm[Flatten[toMatrix[ofEulerAngles[phi,theta,psi]],1]] Out[94]//MatrixForm= Cos[phi] Cos[psi] - Cos[theta] Sin[phi] Sin[psi] Cos[psi] Sin[phi] + Cos[phi] Cos[theta] Sin[psi] Sin[psi] Sin[theta] -(Cos[psi] Cos[theta] Sin[phi]) - Cos[phi] Sin[psi] Cos[phi] Cos[psi] Cos[theta] - Sin[phi] Sin[psi] Cos[psi] Sin[theta] Sin[phi] Sin[theta] -(Cos[phi] Sin[theta]) Cos[theta] In[100]:= InputForm[Flatten[toMatrix[ofEulerAngles[phi,theta,psi]],1]] Out[100]//InputForm= {Cos[phi]*Cos[psi] - Cos[theta]*Sin[phi]*Sin[psi], Cos[psi]*Sin[phi] + Cos[phi]*Cos[theta]*Sin[psi], Sin[psi]*Sin[theta], -(Cos[psi]*Cos[theta]*Sin[phi]) - Cos[phi]*Sin[psi], Cos[phi]*Cos[psi]*Cos[theta] - Sin[phi]*Sin[psi], Cos[psi]*Sin[theta], Sin[phi]*Sin[theta], -(Cos[phi]*Sin[theta]), Cos[theta]} In[104]:= toMatrix[ofEulerAngles[0.1,0.2,0.3]] Out[104]= {{0.921649, 0.383557, 0.0587108}, {-0.387517, 0.902113, 0.189796}, {0.0198338, -0.197677, 0.980067}} pplacer-1.1.alpha19/tests/guppy/test_all_guppy.ml000066400000000000000000000015101303154601500221250ustar00rootroot00000000000000open OUnit let suite = [ "kr_distance" >::: Test_kr_distance.suite; "power_iteration" >::: Test_power_iteration.suite; "pca" >::: Test_pca.suite; "lpca" >::: Test_lpca.suite; "som" >::: Test_som.suite; "heat" >::: Test_heat.suite; "edge_rdist" >::: Test_edge_rdist.suite; "edpl" >::: Test_edpl.suite; "gaussian" >::: Test_gaussian.suite; "pd" >::: Test_pd.suite; "fpd" >::: Test_fpd.suite; "rarefact" >::: Test_rarefact.suite; "islands" >::: Test_islands.suite; "compress" >::: Test_compress.suite; "error" >::: Test_error.suite; "overlap" >::: Test_overlap.suite; "trim" >::: Test_trim.suite; "newick_bark" >::: Test_newick_bark.suite; "splitify" >::: Test_splitify.suite; "unifrac" >::: Test_unifrac.suite; "rarefy" >::: Test_rarefy.suite; "indep_contrasts" >::: Test_indep_contrasts.suite; ] pplacer-1.1.alpha19/tests/guppy/test_compress.ml000066400000000000000000000006571303154601500217770ustar00rootroot00000000000000open Ppatteries open OUnit open Test_util let suite = [ "test_compress" >:: begin fun () -> placerun_of_dir "misc" "test_compress" |> Mass_compress.of_placerun Mass_islands.of_pql ~c:1.75 Mass_map.Spread Placement.ml_ratio |> List.for_all2 pquery_equal (placerun_of_dir "misc" "compressed" |> Placerun.get_pqueries) |> (@?) "not equal" end; ] pplacer-1.1.alpha19/tests/guppy/test_edge_rdist.ml000066400000000000000000000011361303154601500222460ustar00rootroot00000000000000open OUnit open Edge_rdist let test_rt = Newick_gtree.of_string "((A:2,B:9):7,C:5,D:1):0;" let dm = build_pairwise_dist test_rt let test_pairwise correct e1 d1 e2 d2 = (Printf.sprintf "%f <> d (%d,%f) (%d,%f)" correct e1 d1 e2 d2) @? (correct = find_pairwise_dist dm e1 d1 e2 d2) let suite = [ "pairwise_dist" >::: [ "same edge" >:: (fun _ -> test_pairwise 5. 1 2. 1 7.); "serial edge above first" >:: (fun _ -> test_pairwise 4. 2 2. 1 7.); "serial edge below first" >:: (fun _ -> test_pairwise 4. 1 7. 2 2.); "parallel edges" >:: (fun _ -> test_pairwise 4.5 0 0.5 1 6.); ] ] pplacer-1.1.alpha19/tests/guppy/test_edpl.ml000066400000000000000000000010241303154601500210550ustar00rootroot00000000000000open OUnit open Test_util open Placerun (* > 2 * ( 3 * .5 *.3 + 4 * .5 * .2 + 5 * .3 * .2) [1] 2.3 *) (* We just take the first pq of the placerun. *) let test_edpl correct fname = let pr = Placerun_io.of_any_file fname in let dm = Edge_rdist.build_pairwise_dist pr.ref_tree in (Printf.sprintf "%f <> edpl %s" correct pr.name) @? (correct = Edpl.of_pquery Placement.ml_ratio dm (List.hd pr.pqueries)) let suite = [ "edpl" >::: [ "test4" >:: (fun _ -> test_edpl 2.3 (tests_dir ^ "data/misc/test4.jplace")); ] ] pplacer-1.1.alpha19/tests/guppy/test_error.ml000066400000000000000000000021121303154601500212610ustar00rootroot00000000000000open Ppatteries open OUnit open Test_util let suite = [ "test_error" >:: begin fun () -> let exper = placerun_of_dir "misc" "test_error_experimental" and exper_scaled = placerun_of_dir "misc" "test_scaled_error_experimental" and expec = placerun_of_dir "misc" "test_error_expected" in Guppy_error.pr_error Placement.ml_ratio false false exper expec |> StringMap.enum |> check_map_approx_equal "unequal (%s(%g) and %s(%g))" (List.enum [ "one", 0.34; "three", 1.; "two", 0.94; ]); Guppy_error.pr_error Placement.ml_ratio true false exper expec |> StringMap.enum |> check_map_approx_equal "unequal (%s(%g) and %s(%g))" (List.enum [ "one", 18.34; "three", 16.; "two", 17.94; ]); Guppy_error.pr_error Placement.ml_ratio false true exper_scaled expec |> StringMap.enum |> check_map_approx_equal "unequal (%s(%g) and %s(%g))" (List.enum [ "one", 0.34; "three", 1.; "two", 0.94; ]); end; ] pplacer-1.1.alpha19/tests/guppy/test_fpd.ml000066400000000000000000000015661303154601500207150ustar00rootroot00000000000000open Ppatteries open OUnit open Test_util let test ?include_pendant exponent results () = placeruns_of_dir "simple" |> List.cons (placerun_of_dir "multi" "test1and3") |> List.map (Placerun.get_name &&& Guppy_fpd.bwpd_of_placerun ?include_pendant Placement.ml_ratio exponent) |> List.sort compare |> List.enum |> check_map_approx_equal "unequal (%s(%g) and %s(%g))" (List.enum results) let suite = [ "test_simple_1" >:: test 1. [ "test1", 8.; "test1and3", 6.66667; "test2", 4.; "test3", 0.; ]; "test_pendant_1" >:: test ~include_pendant:true 1. [ "test1", 28.; "test1and3", 26.66667; "test2", 24.; "test3", 0.; ]; "test_simple_0.5" >:: test 0.5 [ "test1", 8.; "test1and3", 10. *. (sqrt (2./.3.)); "test2", 4.; "test3", 0.; ]; ] pplacer-1.1.alpha19/tests/guppy/test_gaussian.ml000066400000000000000000000020271303154601500217470ustar00rootroot00000000000000open OUnit open Test_util let rng = make_rng 1 let n_samples = 1000 let criterion = Placement.ml_ratio let weighting = Mass_map.Spread let p = 1. (* Just a little regression test. *) let test_gaussian correct fname1 fname2 = let pr1 = Placerun_io.of_any_file (tests_dir^fname1) and pr2 = Placerun_io.of_any_file (tests_dir^fname2) in let t = Placerun.get_same_tree pr1 pr2 in let prepare pr = Mass_map.Pre.unitize_mass (Mass_map.Pre.of_placerun weighting criterion pr) in let f pr1 pr2 = let null_dists = Gaussian_approx.pair_approx rng n_samples p t pr1 pr2 in let original_dist = Kr_distance.scaled_dist_of_pres p t pr1 pr2 in Guppy_kr.list_onesided_pvalue null_dists original_dist in (Printf.sprintf "%f <> gaussian %s %s" correct pr1.Placerun.name pr2.Placerun.name) @? (correct = f (prepare pr1) (prepare pr2)) let suite = [ "gaussian" >::: [ "coastal.v.upwelling" >:: (fun _ -> test_gaussian 0.715 "data/psbA/coastal.jplace" "data/psbA/upwelling.jplace"); ] ] pplacer-1.1.alpha19/tests/guppy/test_heat.ml000066400000000000000000000016571303154601500210660ustar00rootroot00000000000000open Ppatteries open OUnit open Test_util class heat_test rp = object (self) inherit Guppy_heat.cmd () method private get_rp = rp method named_trees_of_csv = self#csv_to_named_trees self#get_decor_ref_tree end let expected = [ []; [Decor.brew_orange; Decor.Width 90.]; []; []; [Decor.brew_green; Decor.Width 180.]; [Decor.brew_orange; Decor.Width 30.]; ] let simple () = let rp = Refpkg.of_path (tests_dir ^ "data/heat/my.simple.refpkg") in let test_obj = new heat_test rp in let trees = test_obj#named_trees_of_csv (tests_dir ^ "data/heat/heat_test.csv") in let gt = snd (List.hd trees) in let decor = Enum.map (fun x -> x#get_decor) (IntMap.values (gt.Gtree.bark_map)) in let _ = Enum.fold2 (fun got expected n -> (Printf.sprintf "#%d" n) @? (got = expected); n + 1) 0 decor (List.enum expected) in () let suite = [ "simple" >:: simple; ] pplacer-1.1.alpha19/tests/guppy/test_indep_contrasts.ml000066400000000000000000000041001303154601500233260ustar00rootroot00000000000000open Ppatteries open OUnit open Test_util let leaf_values = StringMap.of_pairlist ["A", 1.; "B", 2.; "C", 3.; "D", 4.] let holed_leaf_values = StringMap.of_pairlist ["A", 3.; "D", 1.] let test_of_values_and_expected ?(placefile = "test_indep_contrasts") values expected () = placerun_of_dir "misc" placefile |> Indep_contrasts.of_criterion_map Placement.ml_ratio values |> List.map (fun (pq, x) -> List.map (curry identity x) (Pquery.namel pq)) |> List.flatten |> List.iter2 (fun (en, ex) (gx, gn) -> assert_equal ~cmp:approx_equal ex gx; assert_equal en gn) expected let suite = [ "test_of_criterion_map" >:: begin test_of_values_and_expected leaf_values [ "A", 1.32; "B", 1.92; "C", 3.48; "D", 3.; "E", 1.64; "F", 2.2; "G", 2.2; "H", 2.2; "I", 2.06; "J", 1.857; ] end; "test_of_criterion_map_with_holes" >:: begin test_of_values_and_expected holed_leaf_values [ "A", 2.8; "B", 2.6; "C", 1.2; "D", 1.2; "E", 2.6; "F", 2.2; "G", 2.2; "H", 2.2; "I", 2.3; "J", 2.445; ] end; "test_of_larger_criterion_map_with_holes" >:: begin test_of_values_and_expected ~placefile:"test_indep_contrasts_holed_subtree" holed_leaf_values [ "A", 2.8; "B", 2.6; "C", 1.2; "D", 1.2; "E", 2.6; "F", 2.2; "G", 2.2; "H", 2.2; "I", 2.3; "J", 2.445; ] end; "test_scale_placerun" >:: begin fun () -> let printer pq = let fields, thunk = Pquery_io.to_json pq in StringSet.elements fields |> thunk |> Json.to_string in placerun_of_dir "misc" "test_indep_contrasts" |> Indep_contrasts.scale_placerun Placement.ml_ratio leaf_values |> Placerun.get_pqueries |> List.iter2 (assert_equal ~cmp:pquery_equal ~printer) (placerun_of_dir "misc" "indep_scaled" |> Placerun.get_pqueries) end; ] pplacer-1.1.alpha19/tests/guppy/test_islands.ml000066400000000000000000000021031303154601500215650ustar00rootroot00000000000000open Ppatteries open OUnit open Test_util let reduce_and_check expected = List.sort (on fst IntSet.compare) |- List.map (Tuple.Tuple2.map2 (List.map Pquery.namel |- List.flatten |- StringSet.of_list)) |- List.iter2 (fun (is_e, ss_e) (is_a, ss_a) -> "not equal" @? (IntSet.equal is_e is_a && StringSet.equal ss_e ss_a)) (List.map (Tuple2.map IntSet.of_list StringSet.of_list) expected) let suite = [ "test_islands" >:: begin fun () -> placerun_of_dir "misc" "test_islands" |> Placerun.get_pqueries |> Mass_islands.of_pql (const 0.) |> reduce_and_check [ [0; 1; 2], ["one"; "two"; "three"]; [3; 4], ["four"; "five"]; ] end; "test_discard_below" >:: begin fun () -> placerun_of_dir "misc" "test_islands" |> Placerun.get_pqueries |> Mass_islands.of_pql ~discard_below:0.25 Placement.ml_ratio |> reduce_and_check [ [0; 2], ["one"; "three"]; [3], ["four"]; [4], ["five"]; ] end; ] pplacer-1.1.alpha19/tests/guppy/test_kr_distance.ml000066400000000000000000000146171303154601500224330ustar00rootroot00000000000000(* Unit testing for guppy kr. * * The testing has two components. First, there are the "predefined" tests where * we have a fixed value we are aiming for. These are a combination of "simple" * which have been computed by hand (actually calculated in * R-verification.kr.R), and then "psbA" and "moran" which are pre-computed and * we want to make sure they stay the same. All of those are with weighted * placements, no multiplicity transformation, and use varying ps. Also within * the predefined tests are some by hand values for various transformations of * multiplicity. * * The second check are matrix tests which use an alternate method for computing * KR. This is just for the unweighted case with no multiplicity and p=2. * *) open Ppatteries open OUnit open Test_util (* *** Predefined: tests where we have a fixed value we are aiming for *** *) let criterion = Placement.ml_ratio let predefined_tests which expected = let data = pres_of_dir Mass_map.Spread criterion which in ("predefined_"^which) >::: List.map (fun (p, pairs) -> (Printf.sprintf "exp %f" p) >::: List.map (fun (pr_name1, pr_name2, expected) -> let (pr1, pre1) = Hashtbl.find data pr_name1 and (pr2, pre2) = Hashtbl.find data pr_name2 in let tree = Placerun.get_same_tree pr1 pr2 in let normalization = Gtree.tree_length tree in let calculated = Kr_distance.scaled_dist_of_pres ~normalization p tree pre1 pre2 in (Printf.sprintf "%s x %s" pr_name1 pr_name2) >:: fun _ -> (Printf.sprintf "%f !~= %f" calculated expected) @? approx_equal expected calculated ) pairs; ) expected; ;; (* * from R-verification.kr.R * * [,1] [,2] [,3] * 0.5 0.6868867 0.5833333 0.6770032 * 1 0.3190356 0.2500000 0.4082483 * 2 0.3678511 0.3333333 0.5400617 *) let simple_expected = [ (0.5, [ ("test1", "test2", 0.686887); ("test1", "test3", 0.319036); ("test2", "test3", 0.367851); ]); (* note that total tree length is 24 *) (1.0, [ ("test1", "test2", 0.583333); ("test1", "test3", 0.25); ("test2", "test3", 0.333333); ]); (2.0, [ ("test1", "test2", 0.677003); ("test1", "test3", 0.408248); ("test2", "test3", 0.540062); ]); ] (* uptri versions of the previous data *) let multi_dist_expected = [ 0.5, [|0.686887; 0.319036; 0.367851|]; 1.0, [|0.583333; 0.25; 0.333333|]; 2.0, [|0.677003; 0.408248; 0.540062|]; ] let psbA_expected = [ (0.5, [ ("DCM", "coastal", 0.085899); ("DCM", "surface", 0.0679409); ("DCM", "upwelling", 0.0777173); ("coastal", "surface", 0.0910193); ("coastal", "upwelling", 0.0400257); ("surface", "upwelling", 0.0850928); ]); (1.0, [ ("DCM", "coastal", 0.0341428); ("DCM", "surface", 0.014255); ("DCM", "upwelling", 0.0278099); ("coastal", "surface", 0.032223); ("coastal", "upwelling", 0.00951196); ("surface", "upwelling", 0.0270792); ]); (2.0, [ ("DCM", "coastal", 0.120893); ("DCM", "surface", 0.0396716); ("DCM", "upwelling", 0.104636); ("coastal", "surface", 0.0971287); ("coastal", "upwelling", 0.0277832); ("surface", "upwelling", 0.0827712); ]); ] let moran_expected = [ (1.0, [ ("control","de_rounded_control",5.29902e-07); ("control","de_rounded_dmsp",0.00660102); ("control","dmsp",0.00660101); ("control","rounded_control",5.29902e-07); ("control","rounded_dmsp",0.00660102); ("de_rounded_control","de_rounded_dmsp",0.00660069); ("de_rounded_control","dmsp",0.00660068); ("de_rounded_control","rounded_control",2.00699e-17); ("de_rounded_control","rounded_dmsp",0.00660069); ("de_rounded_dmsp","dmsp",3.09241e-08); ("de_rounded_dmsp","rounded_control",0.00660069); ("de_rounded_dmsp","rounded_dmsp",1.15665e-17); ("dmsp","rounded_control",0.00660068); ("dmsp","rounded_dmsp",3.09241e-08); ("rounded_control","rounded_dmsp",0.00660069); ]); ] (* * from R-verification.kr.R: [,1] [,2] [,3] no_trans 0.3394316 0.2812500 0.4506939 unit_trans 0.3190356 0.2500000 0.4082483 asinh_trans 0.3292013 0.2649481 0.4275588 *) let multi_expected = [ 0.5, [ "multi_test1", "test3", 0.3394316; ]; 1.0, [ "multi_test1", "test3", 0.2812500; "test4", "test4_demulti", 0.; ]; 2.0, [ "multi_test1", "test3", 0.4506939; ]; ] let predefined_suite = List.map (fun (n, pd) -> predefined_tests n pd) [ "simple", simple_expected; "psbA", psbA_expected; "moran", moran_expected; "multi", multi_expected; ] (* *** Matrix tests: comparing to alternative formulation using matrices. *** *) let hashtbl_keys h = Hashtbl.fold (fun k _ l -> k::l) h [] let get_pairs l = let rec aux = function | x::l -> (List.map (fun y -> (x,y)) l)::(aux l) | [] -> [] in List.flatten (aux l) let point_spread = Mass_map.Point let matrix_tests which = let data = pres_of_dir point_spread criterion which in let names = hashtbl_keys data in ("matrix_"^which) >::: List.map (fun (pr_name1, pr_name2) -> let (pr1, pre1) = Hashtbl.find data pr_name1 and (pr2, pre2) = Hashtbl.find data pr_name2 in let t = Placerun.get_same_tree pr1 pr2 in let normalization = Gtree.tree_length t in let kr = Kr_distance.dist_of_pres ~x1:1. ~x2:1. ~normalization 2. t ~pre1 ~pre2 and matrix = Matrix_sig.matrix_distance point_spread criterion pr1 pr2 in (Printf.sprintf "%s x %s" pr_name1 pr_name2) >:: fun _ -> (Printf.sprintf "%f !~= %f" kr matrix) @? approx_equal kr matrix) (get_pairs names) let matrix_suite = List.map matrix_tests [ "simple"; "psbA" ] (* *** the final suite *** *) let suite = predefined_suite @ matrix_suite @ [ "multi_dist_test" >:: begin fun () -> let prl = placeruns_of_dir "simple" in let gt = Mokaphy_common.list_get_same_tree prl in let prel = List.map (Mass_map.Pre.of_placerun Mass_map.Spread Placement.ml_ratio) prl and normalization = Gtree.tree_length gt in List.iter (fun (p, expected) -> (Printf.sprintf "exponent %g doesn't match" p) @? (Array.for_all2 approx_equal (Kr_distance.scaled_multi_dist_of_pres ~normalization p gt prel |> Uptri.to_array) expected)) multi_dist_expected end; ] pplacer-1.1.alpha19/tests/guppy/test_lpca.ml000066400000000000000000000004711303154601500210550ustar00rootroot00000000000000open Test_util open Lpca open OUnit let x = mat_of_string "9 3 2 7 0 4 8 2 0 0 5 3 0 0 0 1" let r_x = mat_of_string "9 3 2 7 3 4 8 2 2 8 5 3 7 2 3 1" let test_rep_uptri _ = mat_rep_uptri x; "r_x <> mat_rep_uptri x" @? mat_approx_equal r_x x let suite = [ "rep_uptri" >:: (fun _ -> test_rep_uptri ()); ] pplacer-1.1.alpha19/tests/guppy/test_newick_bark.ml000066400000000000000000000037101303154601500224140ustar00rootroot00000000000000open Ppatteries open OUnit open Test_util let suite = [ "test_get_confidence_name_opt" >:: begin fun () -> let cmp = Tuple2.compare ~cmp1:(Option.compare ~cmp:approx_compare) ~cmp2:(Option.compare ~cmp:String.compare) |-- (=) 0 and printer x = IO.output_string () |> tap (flip (Tuple2.print (Option.print Float.print) (Option.print String.print)) x) |> IO.close_out and make_bark ?n ?e () = new Newick_bark.newick_bark (`Of_bl_node_edge_label (None, n, e)) in let (^=) = assert_equal ~cmp ~printer in let bark = make_bark () in bark#get_confidence_name_opt false ^= (None, None); bark#get_confidence_name_opt true ^= (None, None); let bark = make_bark ~n:"A" () in bark#get_confidence_name_opt false ^= (None, Some "A"); bark#get_confidence_name_opt true ^= (None, Some "A"); let bark = make_bark ~e:"A" () in bark#get_confidence_name_opt false ^= (None, None); bark#get_confidence_name_opt true ^= (None, None); let bark = make_bark ~n:"1" () in bark#get_confidence_name_opt false ^= (Some 1., None); bark#get_confidence_name_opt true ^= (None, Some "1"); let bark = make_bark ~e:"1" () in bark#get_confidence_name_opt false ^= (Some 1., None); bark#get_confidence_name_opt true ^= (Some 1., None); let bark = make_bark ~n:"A" ~e:"B" () in bark#get_confidence_name_opt false ^= (None, Some "A"); bark#get_confidence_name_opt true ^= (None, Some "A"); let bark = make_bark ~n:"A" ~e:"1" () in bark#get_confidence_name_opt false ^= (Some 1., Some "A"); bark#get_confidence_name_opt true ^= (Some 1., Some "A"); let bark = make_bark ~n:"1" ~e:"A" () in bark#get_confidence_name_opt false ^= (Some 1., None); bark#get_confidence_name_opt true ^= (None, Some "1"); let bark = make_bark ~n:"2" ~e:"1" () in bark#get_confidence_name_opt false ^= (Some 1., Some "2"); bark#get_confidence_name_opt true ^= (Some 1., Some "2"); end; ] pplacer-1.1.alpha19/tests/guppy/test_overlap.ml000066400000000000000000000010251303154601500216020ustar00rootroot00000000000000open Ppatteries open OUnit open Test_util let suite = [ "test_overlap" >:: begin fun () -> placerun_of_dir "misc" "test_islands" |> Placerun.get_pqueries |> Mass_overlap.of_pql Placement.ml_ratio |> List.of_enum |> List.sort compare |> List.iter2 (fun (s1a, s1b, v1) (s2a, s2b, v2) -> "not equal" @? (s1a = s2a && s1b = s2b && v1 =~ v2)) [ "four", "five", 0.12; "three", "one", 0.09; "two", "three", 0.04; ] end; ] pplacer-1.1.alpha19/tests/guppy/test_pca.ml000066400000000000000000000046131303154601500207030ustar00rootroot00000000000000open Test_util open Pca open OUnit (* a <- c(9,3,5,0) b <- c(3,4,1,4) c <- c(2,9,4,8) m <- cbind(a, b, c) m # a b c # [1,] 9 3 2 # [2,] 3 4 9 # [3,] 5 1 4 # [4,] 0 4 8 *) let x = farrarr_of_string "9 3 2 3 4 9 5 1 4 0 4 8" (* cov(m) # a b c # a 14.250000 -2.333333 -10.91667 # b -2.333333 2.000000 3.00000 # c -10.916667 3.000000 10.91667 *) let cov = covariance_matrix x let r_cov = mat_of_string "14.250000 -2.333333 -10.91667 -2.333333 2.000000 3.00000 -10.916667 3.000000 10.91667" let test_covariance _ = "r_cov <> cov" @? mat_approx_equal r_cov cov (* show(prcomp(m)) # Standard deviations: # [1] 4.9245017 1.4857642 0.8416972 # # Rotation: # PC1 PC2 PC3 # a -0.7445646 -0.5718874 -0.3443375 # b 0.1652807 -0.6576928 0.7349302 # c 0.6467657 -0.4902907 -0.5842167 *) let prcomp_stddevs = farr_of_string "4.9245017 1.4857642 0.8416972" (* note flipped sign of PC2 *) let prcomp_vects = mat_of_string "-0.7445646 0.5718874 0.3443375 0.1652807 0.6576928 -0.7349302 0.6467657 0.4902907 0.5842167" (* we have the vectors be rows in matrix, so we can get at them *) let () = Gsl_matrix.transpose_in_place prcomp_vects let (variances, pv) = gen_pca ~use_raw_eval:true 3 x;; let vects = Gsl_matrix.of_arrays pv;; let stddevs = Array.map sqrt variances;; (* show(prcomp(m, scale=TRUE)) # Standard deviations: # [1] 1.5230503 0.7690720 0.2980708 # # Rotation: # PC1 PC2 PC3 # a -0.5872014 -0.5314280 -0.6105561 # b 0.5030103 -0.8305398 0.2391325 # c 0.6341729 0.1666971 -0.7550079 *) let sprcomp_stddevs = farr_of_string "1.5230503 0.7690720 0.2980708" (* note sign of PC3 flipped *) let sprcomp_vects = mat_of_string "-0.5872014 0.5314280 0.6105561 0.5030103 0.8305398 -0.2391325 0.6341729 -0.1666971 0.7550079" (* we have the vectors be rows in matrix, so we can get at them *) let () = Gsl_matrix.transpose_in_place sprcomp_vects let (svariances, spv) = gen_pca ~scale:true ~use_raw_eval:true 3 x;; let svects = Gsl_matrix.of_arrays spv;; let sstddevs = Array.map sqrt svariances;; let test_pca stddev1 stddev2 vect1 vect2 = "stddevs not equal" @? farr_approx_equal stddev1 stddev2; "vects not equal" @? mat_approx_equal vect1 vect2; () let suite = [ "unscaled" >:: (fun _ -> test_pca prcomp_stddevs stddevs prcomp_vects vects); "scaled" >:: (fun _ -> test_pca sprcomp_stddevs sstddevs sprcomp_vects svects); ] pplacer-1.1.alpha19/tests/guppy/test_pd.ml000066400000000000000000000012751303154601500205440ustar00rootroot00000000000000open Ppatteries open OUnit open Test_util let test ?include_pendant results () = placeruns_of_dir "simple" |> List.cons (placerun_of_dir "multi" "test1and3") |> List.map (Placerun.get_name &&& Guppy_fpd.pd_of_placerun ?include_pendant Placement.ml_ratio) |> List.sort compare |> List.enum |> check_map_approx_equal "unequal (%s(%g) and %s(%g))" (List.enum results) let suite = [ "test_simple" >:: test [ "test1", 8.; "test1and3", 10.; "test2", 4.; "test3", 0.; ]; "test_pendant" >:: test ~include_pendant:true [ "test1", 28.; "test1and3", 40.; "test2", 24.; "test3", 0.; ]; ] pplacer-1.1.alpha19/tests/guppy/test_power_iteration.ml000066400000000000000000000011611303154601500233450ustar00rootroot00000000000000open OUnit open Test_util open Pca open Linear_utils open Power_iteration let () = Random.init 1;; let m = rand_symmetric 5;; let power_l, power_v = power_eigen 5 m;; let symmv_l, symmv_v = symmv_eigen 5 m;; let first_coord_pos_vec v = if v.{0} < 0. then Gsl_vector.scale v (-.1.) let first_coord_pos_arr_vec aa = Array.iter first_coord_pos_vec aa let test_eigen l1 l2 v1 v2 = first_coord_pos_arr_vec v1; first_coord_pos_arr_vec v2; "eigenvalues not equal" @? (l1 =@ l2); "eigenvectors not equal" @? (v1 =|@ v2); () let suite = [ "random 5x5" >:: (fun _ -> test_eigen symmv_l power_l symmv_v power_v) ] pplacer-1.1.alpha19/tests/guppy/test_rarefact.ml000066400000000000000000000030061303154601500217220ustar00rootroot00000000000000open Ppatteries open OUnit open Test_util let check_triples = Enum.iter2 (fun (a1, b1, c1) (a2, b2, c2) -> (Printf.sprintf "unequal (%d(%g, %g) and %d(%g, %g))" a1 b1 c1 a2 b2 c2) @? (a1 = a2 && b1 =~ b2 && c1 =~ c2)) let check_quipples = Enum.iter2 (fun (a1, b1, c1, d1) (a2, b2, c2, d2) -> (Printf.sprintf "unequal (%d(%g, %g, %g) and %d(%g, %g, %g))" a1 b1 c1 d1 a2 b2 c2 d2) @? (a1 = a2 && b1 =~ b2 && c1 =~ c2 && d1 =~ d2)) let suite = [ "test_simple" >:: begin fun () -> placerun_of_dir "simple" "test1" |> Rarefaction.of_placerun Placement.ml_ratio |> check_quipples (List.enum [ 2, 8., 15., 2.; ]) end; "test_multi" >:: begin fun () -> placerun_of_dir "multi" "test1and3" |> Rarefaction.of_placerun Placement.ml_ratio |> check_quipples (List.enum [ 2, 6.66667, 12.33333, 1.66667; 3, 10., 15., 2.22222; ]) end; "test_hand_mean" >:: begin fun () -> placerun_of_dir "misc" "test_rarefaction" |> Rarefaction.of_placerun Placement.ml_ratio |> check_quipples (List.enum [ 2, 4.66667, 5., 1.16667; 3, 7., 7., 1.55556; ]) end; "test_hand_variance" >:: begin fun () -> placerun_of_dir "misc" "test_rarefaction" |> Rarefaction.variance_of_placerun Placement.ml_ratio |> check_triples (List.enum [ 2, 1.55556, 0.66667; 3, 0., 0.; ]) end; ] pplacer-1.1.alpha19/tests/guppy/test_rarefy.ml000066400000000000000000000010341303154601500214220ustar00rootroot00000000000000open Ppatteries open OUnit open Test_util let suite = [ "test_rarefy" >:: begin fun () -> let sample ~p = assert_equal p [|1.; 1.; 2.; 3.; 0.5; 0.25; 1.; 1.; 1.|]; [|1; 0; 0; 0; 1; 0; 2; 1; 0|] in placerun_of_dir "misc" "test_rarefy" |> Placerun.get_pqueries |> Array.of_list |> Guppy_rarefy.rarefy sample |> List.map (Pquery.namlom |- List.sort (comparing fst)) |> List.sort (List.compare (comparing fst)) |> assert_equal [["A", 1.]; ["E", 1.]; ["G", 2.; "H", 1.]] end; ] pplacer-1.1.alpha19/tests/guppy/test_som.ml000066400000000000000000000057361303154601500207450ustar00rootroot00000000000000open Test_util open Som open OUnit let test_rot_mat mat angles () = "rotation matrix does not agree with mathematica" @? mat_approx_equal mat (rot_mat angles) let is_inverse mat1 mat2 = let id = mat_of_string "1.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0" and res = Gsl_matrix.copy mat1 in Gsl_blas.gemm ~ta:Gsl_blas.NoTrans ~tb:Gsl_blas.NoTrans ~alpha:1.0 ~beta:0.0 ~a:mat1 ~b:mat2 ~c:res; mat_approx_equal res id let test_rot_mat_orth angles () = let orig = rot_mat angles in let dim = fst (Gsl_matrix.dims orig) in let trans = Gsl_matrix.create dim dim in Gsl_matrix.transpose trans orig; "non orthogonality in rotation matrix" @? is_inverse orig trans let to_rotate = mat_of_string "1.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0" let extra_row = farr_of_string "1.0 4.0 3.0 2.0 -8.0" let we_would_like_this_back = Array.append (Gsl_matrix.to_arrays to_rotate) [| extra_row |] let mat_for_som_test angles = let c = Gsl_matrix.copy to_rotate in Som.trans_a_mat_mul ~a:(rot_mat angles) ~b:to_rotate ~c; Array.append (Gsl_matrix.to_arrays c) [| extra_row |] let dummy_vars = farr_of_string "0.5 0.25 0.15 0.1" let test_som_2d angle () = let _, vects = som_rotation (mat_for_som_test [|angle; 0.; 0.|]) 2 dummy_vars in (* Ppr.print_float_array_array vects; *) "2d som incorrect" @? farrarr_approx_equal ~epsilon:1e-2 we_would_like_this_back vects let test_som_3d angles () = let _, vects = som_rotation (mat_for_som_test angles) 3 dummy_vars in (* Ppr.print_float_array_array vects; *) "3d som incorrect" @? farrarr_approx_equal ~epsilon:5e-2 we_would_like_this_back vects let test_som_3d_var_order orig_vars angles () = let vars, _ = som_rotation (mat_for_som_test angles) 3 orig_vars in let var_copy = Array.copy vars in Array.sort (fun x y -> compare y x) var_copy; "var order changed but shouldn't" @? (vars = var_copy) let suite = [ "rot_mat test 1" >:: test_rot_mat (mat_of_string "0.921649 0.383557 0.0587108 -0.387517 0.902113 0.189796 0.0198338 -0.197677 0.980067") [|0.1; 0.2; 0.3|]; "rot_mat test 2" >:: test_rot_mat (mat_of_string "0.802033 -0.485969 -0.347242 0.589636 0.736924 0.330563 0.0952472 -0.469869 0.877583") [|0.2; 0.5; -0.81|]; "orth test 1" >:: test_rot_mat_orth [| 1.2; -0.3; 3.56 |]; "orth test 2" >:: test_rot_mat_orth [| 0.; 2.1; -1.1 |]; "2d som test 1" >:: test_som_2d 0.1; "2d som test 2" >:: test_som_2d (-0.4); "3d som test 1" >:: test_som_3d [|0.1; 0.2; 0.3|]; "3d som test 2" >:: test_som_3d [|0.2; 0.5; -0.81|]; "3d som test 3" >:: test_som_3d [|0.2;-0.9; 0.5|]; "var order preservation" >:: test_som_3d_var_order dummy_vars [|0.1; 0.2; 0.3|]; ] pplacer-1.1.alpha19/tests/guppy/test_splitify.ml000066400000000000000000000024361303154601500220040ustar00rootroot00000000000000open Ppatteries open OUnit open Test_util let fal = [ [| -1.; -1.; -1.; -1.; -1.; -1.; -1.; -1.; -0.777777777; -0.333333333; -1.; -1.; 0.333333333; 1. |]; [| -1.; -1.; -1.; -1.; -1.; -1.; -1.; -1.; -0.777777777; -0.555555555; -0.777777777; -0.777777777; -0.111111111; 1. |]; [| -1.; -1.; -1.; -1.; -1.; -1.; -1.; -1.; -0.75; -1.; 0.; -1.; 0.5; 1. |]; ] let gt = Newick_gtree.of_string "(((C:2{2},D:2{3}):2{9},(E:2{4},F:2{5}):2{10}):2{12},(A:2{0},B:2{1}):2{8},(G:2{6},H:2{7}):2{11}):0{13};" let suite = [ "test_rep_edges" >:: begin fun () -> let printer s = IO.output_string () |> tap (flip (IntSet.print Int.print) s) |> IO.close_out in List.fold_left (fun prev_edges (max_edge_d, edge_changes) -> let expected_edges = IntSet.of_list edge_changes |> IntSet.sym_diff prev_edges and got_edges = Guppy_cmdobjs.find_rep_edges max_edge_d fal gt in assert_equal ~printer ~cmp:IntSet.equal expected_edges got_edges; expected_edges) (0 -- 13 |> IntSet.of_enum) (* the second value represents the edges added or removed at each step *) [ 0.1, []; 0.3, [11]; 0.5, [8]; 0.9, [9]; 1.5, [10; 13]; 3.0, [12; 13]; 4.0, [13]; ] |> ignore end; ] pplacer-1.1.alpha19/tests/guppy/test_trim.ml000066400000000000000000000007511303154601500211120ustar00rootroot00000000000000open Ppatteries open OUnit open Test_util let suite = [ "test_compress" >:: begin fun () -> let pr = placerun_of_dir "trim" "trim_in" in let pr', discarded = Guppy_trim.trim 0.1 true (Mass_map.Spread) (Placement.ml_ratio) (Placerun.get_ref_tree pr) (Placerun.get_pqueries pr) and expected = placerun_of_dir "trim" "trim_out" in "not equal" @? (placerun_equal pr' expected); "not empty" @? (RefList.is_empty discarded); end; ] pplacer-1.1.alpha19/tests/guppy/test_unifrac.ml000066400000000000000000000020201303154601500215550ustar00rootroot00000000000000open Ppatteries open OUnit open Test_util let simple_expected = [ "test1", "test2", 1.; "test1", "test3", 0.666667; "test2", "test3", 1.; ] let suite = [ "test_unifrac" >:: begin fun () -> let names, (prl, prel) = pres_of_dir Mass_map.Spread Placement.ml_ratio "simple" |> Hashtbl.enum (* Sort by name: Hashtbl does not guarantee order *) |> (List.of_enum %> (List.sort compare) %> List.enum) |> Enum.uncombine |> (Tuple2.map Array.of_enum (List.of_enum %> List.split)) in let gt = Mokaphy_common.list_get_same_tree prl |> Newick_gtree.add_zero_root_bl and res = Hashtbl.create 8 in Guppy_unifrac.unifrac gt (List.map Mass_map.Indiv.of_pre prel) |> Uptri.iterij (fun i j x -> Hashtbl.add res (names.(i), names.(j)) x); flip List.iter simple_expected (fun (name1, name2, expected) -> let calculated = Hashtbl.find res (name1, name2) in (Printf.sprintf "%f !~= %f" calculated expected) @? approx_equal expected calculated) end; ] pplacer-1.1.alpha19/tests/json/000077500000000000000000000000001303154601500163505ustar00rootroot00000000000000pplacer-1.1.alpha19/tests/json/test_json.ml000066400000000000000000000013371303154601500207160ustar00rootroot00000000000000open Ppatteries open OUnit open Test_util let suite = List.map (fun fname -> let name = Filename.basename fname in name >:: match String.sub name 0 4 with | "pass" -> fun () -> let parsed = Json.of_file fname in let roundtrip = Json.of_string (Json.to_string parsed) in json_equal parsed roundtrip | "fail" -> fun () -> "parsing didn't fail" @? begin try let _ = Json.of_file fname in false with | Sparse.Parse_error _ -> true end | _ -> failwith (Printf.sprintf "unexpected json file %s" fname) ) (get_dir_contents ~pred:(flip MaybeZipped.check_suffix "jtest") (tests_dir ^ "data/json") |> List.of_enum) pplacer-1.1.alpha19/tests/pplacer/000077500000000000000000000000001303154601500170255ustar00rootroot00000000000000pplacer-1.1.alpha19/tests/pplacer/R-verification.test_diagd/000077500000000000000000000000001303154601500240145ustar00rootroot00000000000000pplacer-1.1.alpha19/tests/pplacer/R-verification.test_diagd/b_matrix.tab000066400000000000000000000000241303154601500263050ustar00rootroot00000000000000-1 0.15 0.15 -2 pplacer-1.1.alpha19/tests/pplacer/R-verification.test_diagd/d_matrix.tab000066400000000000000000000000231303154601500263060ustar00rootroot000000000000000.25 0 0 0.75 pplacer-1.1.alpha19/tests/pplacer/R-verification.test_diagd/matrix.R000066400000000000000000000002361303154601500254440ustar00rootroot00000000000000 library(Matrix) b = as.matrix(read.table("b_matrix.tab")) d = as.matrix(read.table("d_matrix.tab")) a = d %*% b expm(a) expm(4*a) eigen(b,symmetric=TRUE) pplacer-1.1.alpha19/tests/pplacer/test_all_pplacer.ml000066400000000000000000000010271303154601500226740ustar00rootroot00000000000000open OUnit let suite = [ "edge_labels" >::: Test_edge_labels.suite; "matrix" >::: Test_matrix.suite; "linear" >::: Test_linear.suite; (* "diagd" >::: Test_diagd.suite; *) "placefile" >::: Test_placefile.suite; "convex" >::: Test_convex.suite; "like" >::: Test_like.suite; "rerooting" >::: Test_rerooting.suite; "exp_priors" >::: Test_exp_priors.suite; "painting" >::: Test_painting.suite; "newick_parser" >::: Test_newick_parser.suite; "ppatteries" >::: Test_ppatteries.suite; "misc" >::: Test_misc.suite; ] pplacer-1.1.alpha19/tests/pplacer/test_convex.ml000066400000000000000000000102501303154601500217160ustar00rootroot00000000000000open OUnit open Test_util open Convex open Ppatteries let convex_suite = List.map (fun (s, omega) -> let gt = Newick_gtree.of_string s in let st = gt.Gtree.stree and bm = gt.Gtree.bark_map in let colors = IntMap.filter_map (fun _ value -> value#get_node_label_opt |> Option.map Tax_id.of_string) bm in let extra, st' = prune_tree (colors, st) in let naive_nodes = Naive.solve (colors, st) in let _, early_omega = solve ~nu_f:apart_nu (colors, st') and _, not_early_omega = solve ?nu_f:None (colors, st') and naive_omega = IntSet.cardinal naive_nodes and extra_omega = IntSet.cardinal extra in let early_omega = extra_omega + early_omega and not_early_omega = extra_omega + not_early_omega in let testfunc () = (Printf.sprintf "%d expected; got %d with early termination" omega early_omega) @? (omega = early_omega); (Printf.sprintf "%d expected; got %d without early termination" omega not_early_omega) @? (omega = not_early_omega); (* just testing naive with bifurcation for now *) if Stree.outdegree st' <= 2 then (Printf.sprintf "%d expected; got %d naively" omega naive_omega) @? (omega = naive_omega); in s >:: testfunc) [ "((A,A),(B,B))", 4; "((A,B),(A,B))", 3; "(((A,B),(A,B)),(C,C))", 5; "(((A,B),B),(A,A))", 4; "(A,(A,(B,C)))", 4; "(A,((A,(B,A)),B))", 4; "(A,((A,B),(A,B)));", 4; "(A,(B,(A,(B,A))));", 4; "(A,(A,(B,(C,(C,(A,C))))));", 6; "(A,(A,(B,(C,((A,C),(B,C))))));", 6; "((((((((A,B),B),C),),(,)),(,((D,C),),)),((A,A),)),E);", 15; "(A,A,B,B);", 4; "(A,A,A,B,B);", 5; "((A,B),A,B,(A,B));", 4; "(A,((A,B),A,B,(A,B)));", 5; ] let strict_suite = List.map (fun (s, omega) -> let gt = Newick_gtree.of_string s in let st = gt.Gtree.stree and bm = gt.Gtree.bark_map in let colors = IntMap.filter_map (fun _ value -> value#get_node_label_opt |> Option.map Tax_id.of_string) bm in let _, early_omega = solve ~strict:true ~nu_f:apart_nu (colors, st) and _, not_early_omega = solve ~strict:true ?nu_f:None (colors, st) in let testfunc () = (Printf.sprintf "%d expected; got %d with early termination" omega early_omega) @? (omega = early_omega); (Printf.sprintf "%d expected; got %d without early termination" omega not_early_omega) @? (omega = not_early_omega); in s >:: testfunc) [ "((A,A),(B,B))", 4; "((A,B),(A,B))", 2; "((A,(A,B)),(B,(B,A)))", 4; "(((A,B),(A,B)),(C,C))", 4; "(A,(A,(B,C)))", 3; "(A,A,B)", 3; "(A,A,B,B)", 4; "(A,A,A,B,B)", 5; "(A,A,(A,B),B)", 4; "((A,B),(A,B),(A,B))", 3; ] let suite = [ "alternate_colors" >:: begin fun () -> let gt = Newick_gtree.of_string "(A,(A,(X,(B,(X,B)))))" in let st = gt.Gtree.stree and bm = gt.Gtree.bark_map in let colors = IntMap.filter_map (fun _ value -> value#get_node_label_opt |> (flip Option.bind (function "X" -> None | x -> Some (Tax_id.of_string x)))) bm in let alt_colors = alternate_colors (colors, st) in assert_equal (IntMap.cardinal alt_colors) 2; "first color sets not equal" @? (ColorSet.equal (IntMap.find 2 alt_colors) (colorset_of_strings ["A"; "B"])); "second color sets not equal" @? (ColorSet.equal (IntMap.find 4 alt_colors) (colorset_of_strings ["B"])) end; "building_cutsets" >:: begin fun () -> let gt = Newick_gtree.of_string "(A,(A,(B,(C,C))))" in let st = gt.Gtree.stree and bm = gt.Gtree.bark_map in let colors = IntMap.filter_map (fun _ value -> value#get_node_label_opt |> Option.map Tax_id.of_string) bm in let _, cutset = build_sizemim_and_cutsetim (colors, st) in let expected = IntMap.map colorset_of_strings (IntMap.of_pairlist [ 0, ["A"]; 1, ["A"]; 2, []; 3, ["C"]; 4, ["C"]; 5, []; 6, []; 7, ["A"]; 8, ["A"; "B"; "C"]; ]) in assert_equal (IntMap.compare ColorSet.compare cutset expected) 0 end; "convexify" >::: convex_suite; "strict_convexify" >::: strict_suite; ] pplacer-1.1.alpha19/tests/pplacer/test_diagd.ml000066400000000000000000000031621303154601500214700ustar00rootroot00000000000000open OUnit open Test_util open Diagd;; open Linear_utils;; let b = Gsl_matrix.of_arrays [|[|-. 1.; 0.15|];[|0.15; -.2.|]|];; let d = Gsl_vector.of_array [|0.25; 0.75|];; let diagd = of_d_b d b;; let noep = normed_of_exchangeable_pair b d;; let test_dediag _ = let a = mm (diagOfVec d) b and a_alt = to_matrix diagd in "dediag not remaking the matrix" @? (a ^=^ a_alt) let exp1 = Gsl_matrix.of_arrays [| [|0.77992929; 0.01668155|]; [|0.05004464; 0.22387769|]; |] let exp4 = Gsl_matrix.of_arrays [| [|0.37187386; 0.011053085|]; [|0.03315925; 0.003437709|]; |] let test_to_exp _ = "to_exp" @? ((to_exp diagd 1.) ^=^ exp1); "to_exp" @? ((to_exp diagd 4.) ^=^ exp4); () let test_multi_exp _ = let t = Tensor.create 2 2 2 in (* multiply to 1.; 4. *) multi_exp t diagd [|2.;8.|] 0.5; "exponentiating matrices" @? ((exp1 ^=^ (Tensor.BA3.slice_left_2 t 0)) && (exp4 ^=^ (Tensor.BA3.slice_left_2 t 1))); () let column_sums_one m = try let (rows,cols) = Gsl_matrix.dims m in for j=0 to cols-1 do let sum = ref 0. in for i=0 to rows-1 do sum := !sum +. m.{i,j} done; if not (approximately_equal 1. !sum) then raise Exit done; true with | Exit -> false let test_normed_of_exchangeable_pair _ = "column_sums_one" @? column_sums_one (to_exp noep 1.) let test_stationary _ = "stationary_distribution" @? d *=* (allocMatVecMul (to_exp noep 1.) d) let suite = [ "dediag" >:: test_dediag; "to_exp" >:: test_to_exp; "multi_exp" >:: test_multi_exp; "not_transpose" >:: test_normed_of_exchangeable_pair; "stationary" >:: test_stationary; ] pplacer-1.1.alpha19/tests/pplacer/test_edge_labels.ml000066400000000000000000000015131303154601500226440ustar00rootroot00000000000000open OUnit open Test_util let unlabeled = "((A:2,B:9):7,C:5,D:1):0;" let labeled = "((A:2{0},B:9{1}):7{2},C:5{3},D:1{4}):0{5};" let higher_labeled = "((A:2{20},B:9{21}):7{22},C:5{23},D:1{24}):0{25};" let test_parsed_equality _ = let p1, p2 = Newick_gtree.of_string unlabeled, Newick_gtree.of_string labeled in "labeled != unlabled" @? gtree_equal p1 p2 let test_string_representation _ = let p1 = Newick_gtree.of_string higher_labeled in let s1 = Newick_gtree.to_string ~with_node_numbers:true p1 in let p2 = Newick_gtree.of_string s1 in let s2 = Newick_gtree.to_string ~with_node_numbers:true p2 in "first-parsed != second-parsed" @? gtree_equal p1 p2; "first-string != second-string" @? (s1 = s2) let suite = [ "parsed_equality" >:: test_parsed_equality; "string_representation" >:: test_string_representation; ] pplacer-1.1.alpha19/tests/pplacer/test_exp_priors.ml000066400000000000000000000011621303154601500226100ustar00rootroot00000000000000open Ppatteries open OUnit open Test_util open Convex (* Testing Core.prior_mean_map. Here we test it adding on one half of the top * edge onto the average. *) let suite = [ "test_exp_prior_map" >:: begin fun () -> let prior_map = Test_util.placeruns_of_dir "simple" |> List.find (Placerun.get_name %> (=) "test1") |> Placerun.get_ref_tree |> Core.prior_mean_map (fun x -> x /. 2.) in check_map_approx_equal "unequal (%d(%g) and %d(%g))" (IntMap.enum prior_map) (List.enum [ 0, 1.; 1, 4.5; 2, 9.; 3, 2.5; 4, 0.5; ]) end; ] pplacer-1.1.alpha19/tests/pplacer/test_like.ml000066400000000000000000000051541303154601500213470ustar00rootroot00000000000000open Ppatteries open OUnit open Test_util open Gmix_model let add_zero_root_bl = Newick_gtree.add_zero_root_bl module Glv = Model.Glv module Like_stree = Like_stree.Make(Model) type like_test_info = { dir_name: string; fasta_fname: string; tree_fname: string; correct_like: float; } let like_test info () = let d str = (info.dir_name^str) in let aln = Alignment.upper_aln_of_any_file (d info.fasta_fname) and tree = d info.tree_fname |> Newick_gtree.of_file |> add_zero_root_bl in let model = d "phylo_model.jplace" |> Json.of_file |> Jsontype.obj |> flip init_of_json aln |> Model.build aln and n_sites = Alignment.length aln in let check our_like = (Printf.sprintf "likelihood error: %g" our_like) @? (cmp_float ~epsilon:1e-7 info.correct_like our_like) in (* Copied from pplacer_run.ml *) let like_aln_map = Like_stree.like_aln_map_of_data (Model.seq_type model) aln tree in let darr = Like_stree.glv_arr_for model tree n_sites in let parr = Glv_arr.mimic darr and snodes = Glv_arr.mimic darr in let util_glv = Glv.mimic (Glv_arr.get_one snodes) in Like_stree.calc_distal_and_proximal model tree like_aln_map util_glv ~distal_glv_arr:darr ~proximal_glv_arr:parr ~util_glv_arr:snodes; List.iter (Glv_arr.iter (Glv.perhaps_pull_exponent (-10))) [darr; parr;]; let half_bl_fun loc = (Gtree.get_bl tree loc) /. 2. in Glv_arr.prep_supernodes model ~dst:snodes darr parr half_bl_fun; let utilv_nsites = Gsl_vector.create n_sites and util_d = Glv.mimic darr.(0) and util_p = Glv.mimic parr.(0) and util_one = Glv.mimic darr.(0) in Glv.set_unit util_one; for i=0 to (Array.length darr)-1 do let d = darr.(i) and p = parr.(i) and sn = snodes.(i) in Model.evolve_into model ~src:d ~dst:util_d (half_bl_fun i); Model.evolve_into model ~src:p ~dst:util_p (half_bl_fun i); check (Model.slow_log_like3 model util_d util_p util_one); check (Glv.logdot utilv_nsites sn util_one); done let like_tests_dir = tests_dir^"data/like/" let jtt_info = { dir_name = like_tests_dir^"jtt/"; fasta_fname = "actin.fasta"; tree_fname = "actin.phy_phyml_tree.txt"; correct_like = -2326.22075; } let wag_info = { dir_name = like_tests_dir^"wag/"; fasta_fname = "actin.fasta"; tree_fname = "actin.phy_phyml_tree.txt"; correct_like = -2334.79151; } let gtr_info = { dir_name = like_tests_dir^"gtr/"; fasta_fname = "hiv.fasta"; tree_fname = "hiv.phy_phyml_tree.txt"; correct_like = -1752.42340; } let suite = [ "jtt" >:: (like_test jtt_info); "wag" >:: (like_test wag_info); "gtr" >:: (like_test gtr_info); ] pplacer-1.1.alpha19/tests/pplacer/test_linear.ml000066400000000000000000000022271303154601500216730ustar00rootroot00000000000000open OUnit open Test_util open Linear_utils open Ppatteries let test_logdot _ = let mask_vec = Bigarray.Array1.of_array Bigarray.int16_unsigned Bigarray.c_layout [|1; 0; 1;|] in (* Mat! *) let m1 = Gsl_matrix.of_arrays [|[|-. 1.; 0.; 1.|]; [|1000.; 1.; 3.|]; [|0.; 0.; 2.|];|] and m2 = Gsl_matrix.of_arrays [|[|-. 1.; 1.; 2.|]; [|1.; 3.; 0.|]; [|0.; 1.; 2.|];|] in "mat_masked_logdot" @? (log 3. +. log 4. =~ Linear.mat_masked_logdot m1 m2 mask_vec); (* Ten! *) let t1 = Tensor.of_arrays [| [|[|-. 1.; 0.; 1.|]; [|1000.; 1.; 3.|]; [|0.; 0.; 2.|];|]; [|[|-. 1.; 0.; 1.|]; [|1000.; 1.; 3.|]; [|0.; 0.; 2.|];|]; |] and t2 = Tensor.of_arrays [| [|[|-. 1.; 1.; 0.|]; [|1.; 3.; 0.|]; [|0.; 1.; 2.|];|]; [|[|-. 1.; 1.; 2.|]; [|1.; 3.; 0.|]; [|0.; 1.; 3.|];|]; |] in let ten_expected = (log (1. +. 3.) +. log (4. +. 6.)) -. 2. *. log 2. in let ten_util = Gsl_vector.create 3 in "ten_masked_logdot" @? (ten_expected =~ Linear.ten_masked_logdot t1 t2 mask_vec ten_util); () let suite = [ "test_logdot" >:: test_logdot; ] pplacer-1.1.alpha19/tests/pplacer/test_matrix.ml000066400000000000000000000007641303154601500217310ustar00rootroot00000000000000open OUnit open Test_util open Linear_utils let mm = alloc_mat_mat_mul;; (* this checks to make sure that symmv is giving us the eigenvectors as * column vectors. *) let check_symmv m = let (l,v) = Gsl_eigen.symmv (`M(m)) in let m' = mm v (mm (diag l) (alloc_transpose v)) in "symmEigs not giving column vectors" @? mat_approx_equal m m' let test_symmv _ = let b = Gsl_matrix.of_arrays [|[|-. 1.; 0.15|];[|0.15; -.2.|]|] in check_symmv b let suite = [ "test_symmv" >:: test_symmv; ] pplacer-1.1.alpha19/tests/pplacer/test_misc.ml000066400000000000000000000004441303154601500213530ustar00rootroot00000000000000open OUnit open Test_util let test_mask_reindex _ = "mask_index_empty" @? ([||] = Core.mask_reindex [|false; false;|]); "mask_index_6" @? ([|0; 3; 5|] = Core.mask_reindex [|true; false; false; true; false; true;|]) let suite = [ "mask_index_reindex" >:: test_mask_reindex; ] pplacer-1.1.alpha19/tests/pplacer/test_newick_parser.ml000066400000000000000000000030371303154601500232550ustar00rootroot00000000000000open Ppatteries open OUnit open Test_util let suite = List.map (fun (s, test_without_labels) -> s >:: begin fun () -> let gt = Newick_gtree.of_string s in let gt' = gt |> Newick_gtree.to_string ~with_node_numbers:true |> Newick_gtree.of_string in let gt'' = gt' |> Newick_gtree.to_string ~with_node_numbers:true |> Newick_gtree.of_string in "roundtrip failed" @? (gtree_equal gt gt'); "second roundtrip failed" @? (gtree_equal gt gt'' && gtree_equal gt' gt''); if test_without_labels then begin let gt' = gt |> Newick_gtree.to_string |> Newick_gtree.of_string in let gt'' = gt' |> Newick_gtree.to_string |> Newick_gtree.of_string in "roundtrip failed" @? (gtree_equal gt gt'); "second roundtrip failed" @? (gtree_equal gt gt'' && gtree_equal gt' gt''); end end) [ "((A,A),(B,B));", true; "(:1,:2):3;", true; "((,),);", true; "((,)1,)two;", true; "((,)[one],)[two];", true; "(A:1[1],B:2[2]):3[3];", true; "((A[1],B[2])[3],(A[4],B[5])[6])[7];", true; "(A[2],B[1])[0];", true; "([2],[1])[0];", true; "(A:1{1},B:2{2}):3{3};", false; "((A{1},B{2}){3},(A{4},B{5}){6}){7};", false; "(A{2},B{1}){0};", false; "({2},{1}){0};", false; "(A:1{2}[3],)x:4{5}[6];", false; ] let suite = suite @ [ "test_legacy_format" >:: begin fun () -> let gt = Newick_gtree.of_string ~legacy_format:true "(A,B)[10];" in "top_id didn't match" @? (Gtree.top_id gt = 10) end; ] pplacer-1.1.alpha19/tests/pplacer/test_painting.ml000066400000000000000000000020021303154601500222210ustar00rootroot00000000000000open OUnit open Test_util open Ppatteries let suite = [ "edge_painting" >:: begin fun () -> let rp = simple_refpkg "((C_1,D_1),(F_1,F_2));" in let painted = Edge_painting.of_refpkg rp in "painted doesn't match" @? (List.enum [ 0, "B"; 1, "B"; 2, "A"; 3, "F"; 4, "F"; 5, "A"; 6, "A"; ] |> Enum.map (Tuple.Tuple2.map2 Tax_id.of_string) |> IntMap.of_enum |> IntMap.equal (=) painted) end; "unrooted_edge_painting" >:: begin fun () -> let rp = simple_refpkg "(C_1,(D_1,(F_1,F_2)));" in let painted = Edge_painting.of_refpkg rp in "painted doesn't match" @? (List.enum [ 0, "B"; 1, "B"; 2, "F"; 3, "F"; 4, "A"; 5, "B"; 6, "A"; ] |> Enum.map (Tuple.Tuple2.map2 Tax_id.of_string) |> IntMap.of_enum |> IntMap.equal (=) painted) end; ] pplacer-1.1.alpha19/tests/pplacer/test_placefile.ml000066400000000000000000000013111303154601500223360ustar00rootroot00000000000000open OUnit open Test_util let suite_of_prl name = Printf.sprintf "roundtrip_%s" name >::: List.map (fun pr -> (pr.Placerun.name) >:: fun () -> "not equal to self" @? placerun_equal pr pr; let fname = Filename.temp_file "pr" ".jplace" in let finish () = Unix.unlink fname in begin try Placerun_io.to_json_file fname pr; let roundtripped = Placerun_io.of_json_file fname in "not equal to roundtrip" @? placerun_equal pr roundtripped with | exn -> finish (); raise exn; end; finish ()) (placeruns_of_dir name) let suite = [ suite_of_prl "simple"; suite_of_prl "psbA"; suite_of_prl "moran"; ] pplacer-1.1.alpha19/tests/pplacer/test_ppatteries.ml000066400000000000000000000027471303154601500226100ustar00rootroot00000000000000 open Ppatteries open OUnit open Test_util let maybe_zipped_suite = let assert_false x = assert_equal x false and assert_true x = assert_equal x true in ["test_maybezipped_is_gzipped" >:: begin fun() -> assert_false (MaybeZipped.is_gzipped "test.ml"); assert_true (MaybeZipped.is_gzipped "test.ml.gz"); end; "test_maybezipped_drop_gz" >:: begin fun() -> assert_equal (MaybeZipped.drop_gz "test.ml") "test.ml"; assert_equal (MaybeZipped.drop_gz "test.ml.gz") "test.ml"; end; "test_maybezipped_check_suffix" >:: begin fun() -> assert_true (MaybeZipped.check_suffix "test.ml.gz" ".ml"); assert_true (MaybeZipped.check_suffix "test.ml" ".ml"); end; "test_maybezipped_chop_suffix" >:: begin fun() -> assert_equal (MaybeZipped.chop_suffix "test.ml.gz" ".ml") "test"; assert_equal (MaybeZipped.chop_suffix "test.ml" ".ml") "test"; end; "test_maybezipped_fasta" >:: begin fun() -> let fname = "tests/data/compress/hiv.fasta" in let a_text = Alignment.list_of_any_file fname and a_gz = Alignment.list_of_any_file (fname ^ ".gz") in List.iter2 assert_equal a_text a_gz; end;] let suite = [ "test_median" >:: begin fun () -> List.iter (Tuple.Tuple2.map1 median %> uncurry assert_equal) [ [0], 0; [0; 1], 0; [0; 1; 2], 1; [0; 1; 2; 3], 1; [0; 1; 2; 3; 4], 2; ]; assert_raises (Invalid_argument "median") (fun () -> median []); end; ] @ maybe_zipped_suite pplacer-1.1.alpha19/tests/pplacer/test_rerooting.ml000066400000000000000000000015111303154601500224240ustar00rootroot00000000000000open Ppatteries open OUnit open Test_util open Convex let suite = List.map (fun (before, reroot_at, after) -> let before' = Newick_gtree.of_string before and after' = Newick_gtree.of_string after in Printf.sprintf "%s@%d" before reroot_at >:: fun () -> before' |> Gtree.get_stree |> flip Stree.reroot reroot_at |> Gtree.set_stree before' |> (fun got -> "failed to verify stree rerooting" @? (Gtree.get_stree got = Gtree.get_stree after')); let got = Gtree.reroot before' reroot_at in "failed to verify gtree rerooting" @? (gtree_equal got after')) [ "((A,B):2,(C,D):3,E):0", 2, "(((C{3},D{4}):3{5},E{6}):2{7},A{0},B{1}):0{2}"; "((A,B),(C,D):2,E)", 5, "(((A{0},B{1}){2},E{6}):2{7},C{3},D{4}){5}"; "((A,B),(C,D),E)", 7, "((A,B),(C,D),E)"; ] pplacer-1.1.alpha19/tests/rppr/000077500000000000000000000000001303154601500163625ustar00rootroot00000000000000pplacer-1.1.alpha19/tests/rppr/test_all_rppr.ml000066400000000000000000000001621303154601500215650ustar00rootroot00000000000000open OUnit let suite = [ "voronoi" >::: Test_voronoi.suite; "convex_taxids" >::: Test_convex_taxids.suite; ] pplacer-1.1.alpha19/tests/rppr/test_convex_taxids.ml000066400000000000000000000022511303154601500226310ustar00rootroot00000000000000open OUnit open Test_util open Ppatteries let printer sll = let ch = IO.output_string () in Printf.fprintf ch "%a" (List.print (Tuple3.print String.print String.print Int.print)) sll; IO.close_out ch let make_test tree expected () = simple_refpkg tree |> Rppr_convex_taxids.of_refpkg |> Enum.map (Tuple3.map2 Tax_id.to_string) |> List.of_enum |> List.sort (comparing Tuple3.first) |> assert_equal ~printer expected let suite = [ "convex_tree" >:: make_test "((C_1,D_1),(F_1,G_1));" [ "family", "A", 4; "genus", "B", 2; "genus", "E", 2; "species", "C", 1; "species", "D", 1; "species", "F", 1; "species", "G", 1; ]; "nonconvex_species_tree" >:: make_test "((C_1,D_1),(C_2,D_2));" [ "family", "A", 4; "genus", "B", 4; ]; "one_convex_species_tree" >:: make_test "((C_1,(F_1,D_1)),(C_2,D_2));" [ "family", "A", 5; "genus", "B", 4; "genus", "E", 1; "species", "F", 1; ]; "one_convex_species_with_more_discordance_tree" >:: make_test "((C_1,(F_1,G_1)),(C_2,G_2));" [ "family", "A", 5; "species", "F", 1; ]; ] pplacer-1.1.alpha19/tests/rppr/test_voronoi.ml000066400000000000000000000107531303154601500214540ustar00rootroot00000000000000open Batteries open OUnit open Test_util open Voronoi open Ppatteries module I = Mass_map.Indiv let test_suite_of_gtree_and_expected (gt_string, distr) = let gt = Newick_gtree.of_string gt_string in let v = of_gtree gt in let ldistm' = IntMap.filter (fun k _ -> not (IntSet.mem k v.all_leaves)) v.ldistm in let ldistl = List.map (fun (leaf, ld) -> leaf, ld.leaf, ld.distance) (IntMap.to_pairs ldistm') in gt_string >::: List.map2 (fun got expected -> let node, _, _ = expected in (Printf.sprintf "internal node %d" node) >:: fun () -> "distance or node not equal" @? match got, expected with | (n1, lf1, d1), (n2, Some lf2, d2) -> n1 = n2 && lf1 = lf2 && approx_equal d1 d2 | (n1, _, d1), (n2, None, d2) -> n1 = n2 && approx_equal d1 d2) ldistl distr let test_gt = Newick_gtree.of_string "(x:.3,(x:.1,(x:.4,x:.5):.1):.4):0." let test_v = of_gtree test_gt let test_indiv = IntMap.map (List.map I.of_pair) (IntMap.of_pairlist [ 3, [0.0, 1.0; 0.25, 2.0; 0.35, 3.0; 0.4, 4.0]; 5, [0.0, 5.0; 0.3, 6.0; 0.35, 7.0]; 4, [0.0, 8.0; 0.05, 9.0]; 2, [0.0, 10.0; 0.3, 11.0; 0.35, 12.0]; ]) let snipl_equal l1 l2 = List.for_all2 (fun {distal_edge = l1; start = s1; finish = f1} (l2, s2, f2) -> l1 = l2 && approx_equal s1 s2 && approx_equal f1 f2) l1 l2 let solutions_equal sol1 sol2 = let open Voronoi in IntSet.equal sol1.leaves sol2.leaves && sol1.work =~ sol2.work let suite = [ "test_uncoloring" >:: begin fun () -> List.iter (fun l -> (Printf.sprintf "uncoloring with _leaves and _leaf didn't match (leaf %d)" l) @? ((uncolor_leaves test_v (IntSet.singleton l)) = (uncolor_leaf test_v l))) [0; 1; 2; 3]; List.iter (fun (leaves, expected_updated) -> let _, got_updated = uncolor_leaves test_v (IntSet.of_list leaves) in "unexpected updated leaves when uncoloring" @? (IntSet.equal got_updated (IntSet.of_list expected_updated))) [ [0], [1]; [1], [0; 2]; [2], [1]; [3], [1]; [2; 3], [1]; [0; 1], [2]; ] end; "test_snips" >:: begin fun () -> let expected = [ 0, [ 0, 0.3, 0.0; 5, 0.4, 0.3; ]; 1, [ 1, 0.1, 0.0; 2, 0.4, 0.3; 3, 0.5, 0.35; 4, 0.1, 0.0; 5, 0.3, 0.0; ]; 2, [ 2, 0.3, 0.0; ]; 3, [ 3, 0.35, 0.0; ]; 4, []; ] in List.iter (fun (leaf, expected_snips) -> let got_snips = List.sort compare (get_edge_snipl test_v leaf) in (Printf.sprintf "unexpected snipl for leaf %d" leaf) @? (snipl_equal got_snips expected_snips)) expected end; "test_mass_distribution" >:: begin fun () -> assert_raises Not_found (fun () -> distribute_mass test_v (IntMap.singleton 4 [{I.distal_bl = 0.5; I.mass = 0.0}])); let got_massdist = distribute_mass test_v test_indiv in List.iter (fun (leaf, masslist) -> (Printf.sprintf "unexpected mass distribution for leaf %d" leaf) @? (List.for_all2 approx_equal masslist (List.sort compare (IntMap.find leaf got_massdist)))) [ 0, [7.]; 1, [4.; 5.; 6.; 8.; 9.; 12.]; 2, [10.; 11.]; 3, [1.; 2.; 3.]; ] end; "test_full_wins_on_local_minima" >:: begin fun () -> let pr = placerun_of_dir "misc" "test_voronoi" in let mass = Mass_map.Indiv.of_placerun Mass_map.Point Placement.ml_ratio pr and gt = Placerun.get_ref_tree pr in let get_sols = IntMap.find 2 in Gsl_rng.set_default_seed 0n; (* yes, I know. the alternative is worse. I dare you to try it. *) let full_sols = Voronoi.Full.solve ~n_leaves:2 gt mass |> get_sols and pam_sols = Voronoi.PAM.solve ~n_leaves:2 gt mass |> get_sols and forced_sols = Voronoi.Forced.solve ~n_leaves:2 gt mass |> get_sols in assert_equal ~cmp:solutions_equal full_sols forced_sols; assert_equal ~cmp:(solutions_equal |-- not) pam_sols forced_sols end; ] let suite = suite @ List.map test_suite_of_gtree_and_expected [ "(x:.3,(x:.1,(x:.4,x:.5):.1):.4)", [ 4, Some 1, 0.2; 5, Some 1, 0.1; 6, Some 0, 0.3; ]; "((x:.25,x:.25):.25,(x:.25,x:.25):.25)", [ 2, None, 0.25; 5, None, 0.25; 6, None, 0.5; ]; ] pplacer-1.1.alpha19/tests/test_util.ml000066400000000000000000000125021303154601500177450ustar00rootroot00000000000000open Mass_map open Ppatteries open OUnit (* Assume the test runner is running in the project root. We can't do much better than this. *) let tests_dir = "./tests/" (* *** convenience funs for getting things *** *) let placeruns_of_dir which = get_dir_contents ~pred:(flip Filename.check_suffix "jplace") (tests_dir ^ "data/" ^ which) |> List.of_enum |> List.sort compare |> List.map Placerun_io.of_any_file let placerun_of_dir dir which = placeruns_of_dir dir |> List.find (Placerun.get_name |- (=) which) let pres_of_dir weighting criterion which = let tbl = Hashtbl.create 10 in List.iter (fun pr -> let pre = Pre.normalize_mass (Pre.of_placerun weighting criterion pr) in Hashtbl.add tbl pr.Placerun.name (pr, pre)) (placeruns_of_dir which); tbl (* For white space separated vectors and matrices. * These aren't very smart-- leading and trailing whitespace will annoy them. * *) let farr_of_string s = Array.of_list (List.map float_of_string (Str.split (Str.regexp "[ ]+") s)) let farrarr_of_string s = Array.of_list (List.map farr_of_string (Str.split (Str.regexp "\n") s)) let vec_of_string s = Gsl_vector.of_array (farr_of_string s) let mat_of_string s = Gsl_matrix.of_arrays (farrarr_of_string s) (* *** equalities *** *) let gtree_equal g1 g2 = g1.Gtree.stree = g2.Gtree.stree && IntMap.equal (fun b1 b2 -> (Newick_bark.compare b1 b2) = 0) g1.Gtree.bark_map g2.Gtree.bark_map let placement_equal p1 p2 = let open Placement in p1.location = p2.location && (p1.ml_ratio =~ p2.ml_ratio) && (p1.log_like =~ p2.log_like) && Option.eq ~eq:(=~) p1.post_prob p2.post_prob && Option.eq ~eq:(=~) p1.marginal_prob p2.marginal_prob && (p1.distal_bl =~ p2.distal_bl) && (p1.pendant_bl =~ p2.pendant_bl) && (p1.classif = p2.classif) && Option.eq ~eq:(fun (a1, b1) (a2, b2) -> a1 =~ a2 && b1 = b2) p1.map_identity p2.map_identity let pquery_equal pq1 pq2 = let open Pquery in List.for_all2 (fun (n1, m1) (n2, m2) -> n1 = n2 && m1 =~ m2) pq1.namlom pq2.namlom && List.for_all2 placement_equal pq1.place_list pq2.place_list let placerun_equal pr1 pr2 = let open Placerun in gtree_equal pr1.ref_tree pr2.ref_tree && Option.eq ~eq:(IntMap.equal (=)) pr1.transm pr2.transm && List.for_all2 pquery_equal pr1.pqueries pr2.pqueries (* *** approximate equalities *** *) let vec_approx_equal ?(epsilon = 1e-5) v1 v2 = let dim = Gsl_vector.length v1 in try assert(dim = Gsl_vector.length v2); for i=0 to dim-1 do if not (approx_equal ~epsilon v1.{i} v2.{i}) then raise Exit done; true with | Exit -> false let mat_approx_equal ?(epsilon = 1e-5) m1 m2 = let (rows,cols) as dim1 = Gsl_matrix.dims m1 in try assert(dim1 = Gsl_matrix.dims m2); for i=0 to rows-1 do for j=0 to cols-1 do if not (approx_equal ~epsilon m1.{i,j} m2.{i,j}) then raise Exit done done; true with | Exit -> false let array_f_equal f a1 a2 = try ArrayFuns.iter2 (fun x y -> if not (f x y) then raise Exit) a1 a2; true with Exit -> false let farr_approx_equal ?(epsilon = 1e-5) fa1 fa2 = array_f_equal (approx_equal ~epsilon) fa1 fa2 let farrarr_approx_equal ?(epsilon = 1e-5) faa1 faa2 = array_f_equal (farr_approx_equal ~epsilon) faa1 faa2 let vecarr_approx_equal ?(epsilon = 1e-5) va1 va2 = array_f_equal (vec_approx_equal ~epsilon) va1 va2 exception Unequal of Jsontype.jsontype * Jsontype.jsontype let rec json_equal ?(epsilon = 1e-5) j1 j2 = if begin match j1, j2 with | Jsontype.Bool b1, Jsontype.Bool b2 -> b1 = b2 | Jsontype.String s1, Jsontype.String s2 -> s1 = s2 | Jsontype.Int i1, Jsontype.Int i2 -> i1 = i2 | Jsontype.Float f1, Jsontype.Float f2 -> approx_equal ~epsilon f1 f2 | Jsontype.Int i, Jsontype.Float f | Jsontype.Float f, Jsontype.Int i -> approx_equal ~epsilon f (float_of_int i) | Jsontype.Object o1, Jsontype.Object o2 -> (Hashtbl.length o1) = (Hashtbl.length o2) && begin Hashtbl.iter (fun k v -> if not (Hashtbl.mem o2 k) then raise (Unequal (j1, j2)); json_equal ~epsilon v (Hashtbl.find o2 k)) o1; true end | Jsontype.Array a1, Jsontype.Array a2 -> (List.length a1) = (List.length a2) && begin List.iter2 (json_equal ~epsilon) a1 a2; true end | Jsontype.Null, Jsontype.Null -> true | _, _ -> false end then () else raise (Unequal (j1, j2)) (* *** infixes for equalities *** *) let ( =| ) = vec_approx_equal let ( =|| ) = mat_approx_equal let ( =@ ) = farr_approx_equal let ( =@@ ) = farrarr_approx_equal let ( =|@ ) = vecarr_approx_equal let check_map_approx_equal message = Enum.iter2 (fun (k1, v1) (k2, v2) -> (Printf.sprintf message k1 v1 k2 v2) @? (k1 = k2 && approx_equal v1 v2)) (* *** random stuff *** *) let rand_symmetric n = let m = Gsl_matrix.create n n in for i=0 to n-1 do for j=i to n-1 do m.{i,j} <- 1. -. Random.float 2.; m.{j,i} <- m.{i,j}; done; done; m;; let make_rng seed = let rng = Gsl_rng.make Gsl_rng.KNUTHRAN2002 in Gsl_rng.set rng (Nativeint.of_int seed); rng let colorset_of_strings = List.map Tax_id.of_string |- Convex.ColorSet.of_list let simple_refpkg tree_string = Refpkg.of_path ~ref_tree:(Newick_gtree.of_string tree_string) (tests_dir ^ "data/simple.refpkg") pplacer-1.1.alpha19/tests/tests.ml000066400000000000000000000004021303154601500170670ustar00rootroot00000000000000open Ppatteries open OUnit let suite = "all tests" >::: [ "guppy" >::: Test_all_guppy.suite; "pplacer" >::: Test_all_pplacer.suite; "rppr" >::: Test_all_rppr.suite; "json" >::: Test_json.suite; ] let _ = verbosity := 0; run_test_tt_main suite pplacer-1.1.alpha19/wercker.yml000066400000000000000000000012631303154601500164240ustar00rootroot00000000000000box: matsen/pplacer-build-env build: steps: - script: name: build pplacer code: make zip && make test && make docs after-steps: - slack-notifier: url: $SLACK_URL channel: microbiome username: pplacer build deploy: steps: - ematsen/gh-pages: token: $GITHUB_TOKEN repo: matsen/pplacer path: docs/_build/html - script: name: upload pplacer code: SLACK_URL=$SLACK_URL make upload after-steps: - slack-notifier: url: $SLACK_URL channel: microbiome username: pplacer docs deploy