diff --git a/pom.xml b/pom.xml index 838eff3ab..df04392b2 100644 --- a/pom.xml +++ b/pom.xml @@ -403,6 +403,12 @@ junit test + + org.assertj + assertj-core + 3.27.7 + test + diff --git a/src/main/java/fiji/plugin/trackmate/FeatureModel.java b/src/main/java/fiji/plugin/trackmate/FeatureModel.java index f9bfe2b85..19ab9847f 100644 --- a/src/main/java/fiji/plugin/trackmate/FeatureModel.java +++ b/src/main/java/fiji/plugin/trackmate/FeatureModel.java @@ -8,12 +8,12 @@ * 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 * . @@ -61,12 +61,12 @@ public class FeatureModel * track to its feature map. The feature map maps each feature to the double * value for the specified feature. */ - Map< Integer, Map< String, Double > > trackFeatureValues = new ConcurrentHashMap<>(); + transient Map< Integer, Map< String, Double > > trackFeatureValues = new ConcurrentHashMap<>(); /** * Feature storage for edges. */ - private final ConcurrentHashMap< DefaultWeightedEdge, ConcurrentHashMap< String, Double > > edgeFeatureValues = new ConcurrentHashMap<>(); + private final transient ConcurrentHashMap< DefaultWeightedEdge, ConcurrentHashMap< String, Double > > edgeFeatureValues = new ConcurrentHashMap<>(); private final Collection< String > edgeFeatures = new LinkedHashSet<>(); @@ -88,7 +88,7 @@ public class FeatureModel private final Map< String, Boolean > spotFeatureIsInt = new HashMap<>(); - private final Model model; + private transient final Model model; /* * CONSTRUCTOR @@ -165,7 +165,7 @@ public Double getEdgeFeature( final DefaultWeightedEdge edge, final String featu /** * Remove the value of the designated feature for the specified edge. - * + * * @param edge * the edge * @param feature @@ -284,7 +284,7 @@ public Map< String, Boolean > getEdgeFeatureIsInt() /** * Returns the track features that are dealt with in this model. - * + * * @return the collection of track features managed in this model. */ public Collection< String > getTrackFeatures() @@ -341,7 +341,7 @@ public void declareTrackFeatures( final Collection< String > features, final Map /** * Returns the name mapping of the track features that are dealt with in * this model. - * + * * @return the feature name. */ public Map< String, String > getTrackFeatureNames() @@ -363,7 +363,7 @@ public Map< String, String > getTrackFeatureShortNames() /** * Returns the dimension mapping of the track features that are dealt with * in this model. - * + * * @return the feature dimension. */ public Map< String, Dimension > getTrackFeatureDimensions() @@ -410,7 +410,7 @@ public synchronized void putTrackFeature( final Integer trackID, final String fe /** * Remove the value of the designated feature for the track with the * specified ID. - * + * * @param trackID * the track ID * @param feature @@ -604,7 +604,7 @@ public String toString() /** * Echoes the full content of this {@link FeatureModel}. - * + * * @return a String representation of the full content of this model. */ public String echo() diff --git a/src/main/java/fiji/plugin/trackmate/Logger.java b/src/main/java/fiji/plugin/trackmate/Logger.java index 48e2b5aa3..3e7e157ef 100644 --- a/src/main/java/fiji/plugin/trackmate/Logger.java +++ b/src/main/java/fiji/plugin/trackmate/Logger.java @@ -8,12 +8,12 @@ * 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 * . @@ -93,7 +93,7 @@ public void write( final char[] cbuf, final int off, final int len ) throws IOEx ? new Color( 0.4f, 0.4f, 0.9f ) : new Color( 0, 0, 0.7f ); GREEN_COLOR = bgIsDark - ? new Color( 0.4f, 0.9f, 0.4f ) + ? new Color( 0.2f, 0.6f, 0.2f ) : new Color( 0, 0.6f, 0 ); ERROR_COLOR = bgIsDark ? new Color( 0.8f, 0, 0 ).brighter() diff --git a/src/main/java/fiji/plugin/trackmate/Settings.java b/src/main/java/fiji/plugin/trackmate/Settings.java index 10bcc4fa3..4e6a60a21 100644 --- a/src/main/java/fiji/plugin/trackmate/Settings.java +++ b/src/main/java/fiji/plugin/trackmate/Settings.java @@ -8,12 +8,12 @@ * 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 * . @@ -56,7 +56,7 @@ public class Settings * {@link fiji.plugin.trackmate.visualization.TrackMateModelView} as a GUI * target. */ - public final ImagePlus imp; + public final transient ImagePlus imp; public double dt; @@ -113,9 +113,6 @@ public class Settings */ public SpotDetectorFactoryBase< ? > detectorFactory; - /** The the tracker to use. */ - public SpotTrackerFactory trackerFactory; - /** * Settings map for {@link fiji.plugin.trackmate.detection.SpotDetector}. * @@ -123,6 +120,9 @@ public class Settings */ public Map< String, Object > detectorSettings = new HashMap<>(); + /** The the tracker to use. */ + public SpotTrackerFactory trackerFactory; + /** * Settings map for {@link fiji.plugin.trackmate.tracking.SpotTracker}. * @@ -132,21 +132,21 @@ public class Settings // Filters - /** - * The feature filter list. - */ - protected List< FeatureFilter > spotFilters = new ArrayList<>(); - /** * The initial quality filter value that is used to clip spots of low * quality from spots. */ public Double initialSpotFilterValue = Double.valueOf( 0 ); + /** + * The feature filter list. + */ + protected List< FeatureFilter > spotFilters = new ArrayList<>(); + /** The track filter list that is used to prune track and spots. */ protected List< FeatureFilter > trackFilters = new ArrayList<>(); - protected String errorMessage; + protected transient String errorMessage; // Spot features diff --git a/src/main/java/fiji/plugin/trackmate/features/FeatureUtils.java b/src/main/java/fiji/plugin/trackmate/features/FeatureUtils.java index 3622346e8..3f4529130 100644 --- a/src/main/java/fiji/plugin/trackmate/features/FeatureUtils.java +++ b/src/main/java/fiji/plugin/trackmate/features/FeatureUtils.java @@ -419,6 +419,11 @@ public static final FeatureColorGenerator< Integer > createWholeTrackColorGenera } public static final double[] autoMinMax( final Model model, final TrackMateObject type, final String feature ) + { + return autoMinMax( model, type, feature, true ); + } + + public static final double[] autoMinMax( final Model model, final TrackMateObject type, final String feature, final boolean visibileOnly ) { switch ( type ) { @@ -429,7 +434,7 @@ public static final double[] autoMinMax( final Model model, final TrackMateObjec case SPOTS: case TRACKS: { - final double[] values = collectFeatureValues( feature, type, model, true ); + final double[] values = collectFeatureValues( feature, type, model, visibileOnly ); double min = Double.POSITIVE_INFINITY; double max = Double.NEGATIVE_INFINITY; for ( final double val : values ) diff --git a/src/main/java/fiji/plugin/trackmate/gui/components/tracker/SimpleLAPTrackerSettingsPanel.java b/src/main/java/fiji/plugin/trackmate/gui/components/tracker/SimpleLAPTrackerSettingsPanel.java index 5feb6b0d8..c74fd9d34 100644 --- a/src/main/java/fiji/plugin/trackmate/gui/components/tracker/SimpleLAPTrackerSettingsPanel.java +++ b/src/main/java/fiji/plugin/trackmate/gui/components/tracker/SimpleLAPTrackerSettingsPanel.java @@ -25,7 +25,6 @@ import static fiji.plugin.trackmate.gui.Fonts.FONT; import static fiji.plugin.trackmate.gui.Fonts.TEXTFIELD_DIMENSION; import static fiji.plugin.trackmate.tracking.TrackerKeys.DEFAULT_ALTERNATIVE_LINKING_COST_FACTOR; -import static fiji.plugin.trackmate.tracking.TrackerKeys.DEFAULT_BLOCKING_VALUE; import static fiji.plugin.trackmate.tracking.TrackerKeys.DEFAULT_CUTOFF_PERCENTILE; import static fiji.plugin.trackmate.tracking.TrackerKeys.DEFAULT_GAP_CLOSING_FEATURE_PENALTIES; import static fiji.plugin.trackmate.tracking.TrackerKeys.DEFAULT_LINKING_FEATURE_PENALTIES; @@ -37,7 +36,6 @@ import static fiji.plugin.trackmate.tracking.TrackerKeys.KEY_ALLOW_TRACK_MERGING; import static fiji.plugin.trackmate.tracking.TrackerKeys.KEY_ALLOW_TRACK_SPLITTING; import static fiji.plugin.trackmate.tracking.TrackerKeys.KEY_ALTERNATIVE_LINKING_COST_FACTOR; -import static fiji.plugin.trackmate.tracking.TrackerKeys.KEY_BLOCKING_VALUE; import static fiji.plugin.trackmate.tracking.TrackerKeys.KEY_CUTOFF_PERCENTILE; import static fiji.plugin.trackmate.tracking.TrackerKeys.KEY_GAP_CLOSING_FEATURE_PENALTIES; import static fiji.plugin.trackmate.tracking.TrackerKeys.KEY_GAP_CLOSING_MAX_DISTANCE; @@ -190,7 +188,6 @@ public Map< String, Object > getSettings() settings.put( KEY_MERGING_MAX_DISTANCE, DEFAULT_MERGING_MAX_DISTANCE ); settings.put( KEY_MERGING_FEATURE_PENALTIES, DEFAULT_MERGING_FEATURE_PENALTIES ); // Others - settings.put( KEY_BLOCKING_VALUE, DEFAULT_BLOCKING_VALUE ); settings.put( KEY_ALTERNATIVE_LINKING_COST_FACTOR, DEFAULT_ALTERNATIVE_LINKING_COST_FACTOR ); settings.put( KEY_CUTOFF_PERCENTILE, DEFAULT_CUTOFF_PERCENTILE ); // Panel ones diff --git a/src/main/java/fiji/plugin/trackmate/gui/displaysettings/DisplaySettingsIO.java b/src/main/java/fiji/plugin/trackmate/gui/displaysettings/DisplaySettingsIO.java index 2e597c044..e9568af23 100644 --- a/src/main/java/fiji/plugin/trackmate/gui/displaysettings/DisplaySettingsIO.java +++ b/src/main/java/fiji/plugin/trackmate/gui/displaysettings/DisplaySettingsIO.java @@ -8,12 +8,12 @@ * 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 * . @@ -31,6 +31,7 @@ import java.lang.reflect.Type; import java.nio.file.Files; import java.nio.file.Paths; +import java.util.Map; import java.util.stream.Collectors; import org.jdom2.Element; @@ -63,10 +64,13 @@ public static String toJson( final DisplaySettings ds ) return getGson().toJson( ds ); } - public static DisplaySettings fromJson( final String str ) + public static JsonElement toJsonTree( final DisplaySettings ds ) { - final DisplaySettings ds = ( str == null || str.isEmpty() ) ? readUserDefault() : getGson().fromJson( str, DisplaySettings.class ); + return getGson().toJsonTree( ds ); + } + private static void sanitize( final DisplaySettings ds ) + { // Sanitize min and max. final double spotMin = ds.getSpotMin(); final double spotMax = ds.getSpotMax(); @@ -74,7 +78,20 @@ public static DisplaySettings fromJson( final String str ) final double trackMin = ds.getTrackMin(); final double trackMax = ds.getTrackMax(); ds.setTrackMinMax( Math.min( trackMin, trackMax ), Math.max( trackMin, trackMax ) ); + } + + public static DisplaySettings fromJson( final String str ) + { + final DisplaySettings ds = ( str == null || str.isEmpty() ) ? readUserDefault() : getGson().fromJson( str, DisplaySettings.class ); + sanitize( ds ); + return ds; + } + public static DisplaySettings fromJsonTree( final Map< String, Object > displaySettingsJson ) + { + final Gson gson = getGson(); + final DisplaySettings ds = gson.fromJson( gson.toJsonTree( displaySettingsJson ), DisplaySettings.class ); + sanitize( ds ); return ds; } diff --git a/src/main/java/fiji/plugin/trackmate/gui/wizard/descriptors/StartDialogDescriptor.java b/src/main/java/fiji/plugin/trackmate/gui/wizard/descriptors/StartDialogDescriptor.java index 3d2eb223f..ea7accc8d 100644 --- a/src/main/java/fiji/plugin/trackmate/gui/wizard/descriptors/StartDialogDescriptor.java +++ b/src/main/java/fiji/plugin/trackmate/gui/wizard/descriptors/StartDialogDescriptor.java @@ -8,12 +8,12 @@ * 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 * . @@ -63,12 +63,25 @@ public class StartDialogDescriptor extends WizardPanelDescriptor private static final String KEY = "Start"; + + public static final String PUB0_URL = "https://doi.org/10.1016/j.ymeth.2016.09.016"; + + public static final String PUB0_TXT = "Tinevez JY, Perry N. Schindelin J, et al. " + + "'TrackMate: An open and extensible platform for single-particle tracking', " + + "Methods (2017)."; + public static final String PUB1_URL = "https://doi.org/10.1038/s41592-022-01507-1"; - public static final String PUB1_TXT = "Ershov, D., Phan, MS., Pylvänäinen, J.W., Rigaud S.U., et al. " - + "TrackMate 7: integrating state-of-the-art segmentation algorithms into tracking pipelines. " - + "Nat Methods (2022). https://doi.org/10.1038/s41592-022-01507-1"; - + public static final String PUB1_TXT = "Ershov D, Phan MS, Pylvänäinen JW, Rigaud SU, et al. " + + "'TrackMate 7: integrating state-of-the-art segmentation algorithms into tracking pipelines' " + + "Nature Methods (2022)."; + + public static final String PUB2_URL = "https://doi.org/10.1002/cpz1.70369"; + + public static final String PUB2_TXT = "Anselmet M, et al. " + + "'Automated optimization of bacterial tracking pipelines with trackmate 8' " + + "Current Protocols (2026)."; + private final Settings settings; private final Logger logger; @@ -89,12 +102,14 @@ public void aboutToDisplayPanel() logger.log( welcomeMessage, Logger.BLUE_COLOR ); logger.log( "Please note that TrackMate is available through Fiji, and is based on a publication. " + "If you use it successfully for your research please be so kind to cite our work:\n" ); + logger.log( PUB2_TXT + "\n", Logger.GREEN_COLOR ); + logger.log( PUB2_URL + "\n", Logger.BLUE_COLOR ); + logger.log( "and / or:\n" ); logger.log( PUB1_TXT + "\n", Logger.GREEN_COLOR ); logger.log( PUB1_URL + "\n", Logger.BLUE_COLOR ); logger.log( "and / or:\n" ); - logger.log( "Tinevez, JY.; Perry, N. & Schindelin, J. et al. (2017), 'TrackMate: An open and extensible platform for single-particle tracking.', " - + "Methods 115: 80-90, PMID 27713081.\n", Logger.GREEN_COLOR ); - logger.log( "https://www.sciencedirect.com/science/article/pii/S1046202316303346\n", Logger.BLUE_COLOR ); + logger.log( PUB0_TXT + "\n", Logger.GREEN_COLOR ); + logger.log( PUB0_URL + "\n", Logger.BLUE_COLOR ); logger.log( "\nNumerical feature analyzers:\n", Logger.BLUE_COLOR ); logger.log( settings.toStringFeatureAnalyzersInfo() ); diff --git a/src/main/java/fiji/plugin/trackmate/io/TmGeffWriter.java b/src/main/java/fiji/plugin/trackmate/io/TmGeffWriter.java deleted file mode 100644 index 98fd0909a..000000000 --- a/src/main/java/fiji/plugin/trackmate/io/TmGeffWriter.java +++ /dev/null @@ -1,256 +0,0 @@ -package fiji.plugin.trackmate.io; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import org.jgrapht.graph.DefaultWeightedEdge; -import org.mastodon.geff.GeffAxis; -import org.mastodon.geff.GeffEdge; -import org.mastodon.geff.GeffMetadata; -import org.mastodon.geff.GeffNode; -import org.mastodon.geff.PropMetadata; - -import fiji.plugin.trackmate.Dimension; -import fiji.plugin.trackmate.FeatureModel; -import fiji.plugin.trackmate.Model; -import fiji.plugin.trackmate.Spot; -import fiji.plugin.trackmate.Spot.SpotVisitor; -import fiji.plugin.trackmate.SpotBase; -import fiji.plugin.trackmate.SpotCollection; -import fiji.plugin.trackmate.SpotRoi; -import fiji.plugin.trackmate.TrackModel; -import gnu.trove.map.TObjectIntMap; -import gnu.trove.map.hash.TObjectIntHashMap; - -public class TmGeffWriter -{ - - public static void write( final Model model, final String zarrPath ) throws IOException - { - - /* - * Serialize spots - */ - final SpotCollection spots = model.getSpots(); - final Map< String, Boolean > isInt = model.getFeatureModel().getSpotFeatureIsInt(); - final GeffSpotVisitor visitor = new GeffSpotVisitor( isInt ); - spots.iterable( true ).forEach( spot -> spot.accept( visitor ) ); - - /* - * Serialize edges - */ - final TrackModel trackModel = model.getTrackModel(); - final Set< DefaultWeightedEdge > edges = trackModel.edgeSet(); - final FeatureModel fm = model.getFeatureModel(); - - final List< GeffEdge > geffEdges = new ArrayList<>(); - int edgeId = 0; - for ( final DefaultWeightedEdge edge : edges ) - { - final Spot source = trackModel.getEdgeSource( edge ); - final Integer srcId = visitor.spotToId.get( source ); - final Spot target = trackModel.getEdgeTarget( edge ); - final Integer tgtId = visitor.spotToId.get( target ); - if ( srcId == null || tgtId == null ) - continue; - - final boolean swap = source.getFeature( Spot.FRAME ) > target.getFeature( Spot.FRAME ); - final GeffEdge edgeNode = new GeffEdge.Builder() - .setId( edgeId++ ) - .setSourceNodeId( swap ? tgtId : srcId ) - .setTargetNodeId( swap ? srcId : tgtId ) - .setScore( trackModel.getEdgeWeight( edge ) ) - .setDistance( Math.sqrt( source.squareDistanceTo( target ) ) ) - .build(); - - // Feature - for ( final String edgeFeature : fm.getEdgeFeatures() ) - { - final Double ef = fm.getEdgeFeature( edge, edgeFeature ); - if ( ef == null ) - continue; - final Object val = ( fm.getEdgeFeatureIsInt().get( edgeFeature ) - ? ef.intValue() - : ef.doubleValue() ); - edgeNode.setProp( edgeFeature, val ); - } - geffEdges.add( edgeNode ); - } - - /* - * Serialize tracks - */ - // TODO -> nodes with a specific path. - - /* - * Metadata - */ - - // Axes - final List< GeffAxis > axes = buildAxes( model.getTimeUnits(), model.getSpaceUnits() ); - final GeffMetadata metadata = new GeffMetadata( "1.0.0", true, axes ); - - // Spot features - final Map< String, PropMetadata > nodePropsMetadata = new HashMap<>(); - for ( final String spotFeature : fm.getSpotFeatures() ) - { - final String dType = isInt.get( spotFeature ) ? "int32" : "float64"; - final Dimension dimension = fm.getSpotFeatureDimensions().get( spotFeature ); - final String unit = dimension.units( model.getSpaceUnits(), model.getTimeUnits() ); - final String name = fm.getSpotFeatureNames().get( spotFeature ); - // Description stores short names. - final String description = fm.getSpotFeatureShortNames().get( spotFeature ); - final PropMetadata propMetadata = new PropMetadata( spotFeature, dType, false, unit, name, description ); - nodePropsMetadata.put( spotFeature, propMetadata ); - } - metadata.setNodePropsMetadata( nodePropsMetadata ); - - // Edge features - final Map< String, PropMetadata > edgePropsMetadata = new HashMap<>(); - for ( final String edgeFeature : fm.getEdgeFeatures() ) - { - final String dType = fm.getEdgeFeatureIsInt().get( edgeFeature ) ? "int32" : "float64"; - final Dimension dimension = fm.getEdgeFeatureDimensions().get( edgeFeature ); - final String unit = dimension.units( model.getSpaceUnits(), model.getTimeUnits() ); - final String name = fm.getEdgeFeatureNames().get( edgeFeature ); - final String description = fm.getEdgeFeatureShortNames().get( edgeFeature ); - final PropMetadata propMetadata = new PropMetadata( edgeFeature, dType, false, unit, name, description ); - edgePropsMetadata.put( edgeFeature, propMetadata ); - } - metadata.setEdgePropsMetadata( edgePropsMetadata ); - - /* - * Write to disk - */ - - GeffNode.writeToZarr( visitor.nodes, zarrPath, metadata ); - GeffEdge.writeToZarr( geffEdges, zarrPath, metadata ); - GeffMetadata.writeToZarr( metadata, zarrPath ); - } - - private static List< GeffAxis > buildAxes( final String timeUnit, final String spaceUnit ) - { - return Arrays.asList( - GeffAxis.createTimeAxis( GeffAxis.NAME_TIME, timeUnit, null, null ), - GeffAxis.createSpaceAxis( GeffAxis.NAME_SPACE_X, normalizeSpaceUnit( spaceUnit ), null, null ), - GeffAxis.createSpaceAxis( GeffAxis.NAME_SPACE_Y, normalizeSpaceUnit( spaceUnit ), null, null ), - GeffAxis.createSpaceAxis( GeffAxis.NAME_SPACE_Z, normalizeSpaceUnit( spaceUnit ), null, null ) ); - } - - /** - * Maps common unit abbreviations to OME-Zarr compliant names. See - * https://ngff.openmicroscopy.org/latest/#axes-md for the valid set. - */ - static String normalizeSpaceUnit( final String unit ) - { - if ( unit == null || unit.isEmpty() ) - return "pixel"; - switch ( unit.trim() ) - { - case "um": - case "µm": - case "μm": - case "micron": - case "microns": - return "micrometer"; - case "nm": - return "nanometer"; - case "mm": - return "millimeter"; - case "cm": - return "centimeter"; - case "m": - return "meter"; - case "km": - return "kilometer"; - case "pm": - return "picometer"; - case "Å": - return "angstrom"; - default: - return unit; - } - } - - public static class GeffSpotVisitor implements SpotVisitor - { - - /** Features not in the general prop, because they are the core node. */ - private static final Set< String > SLOP_PROPS = Set.of( "FRAME", "POSITION_X", "POSITION_Y", "POSITION_Z", "RADIUS" ); - - private int geffId = 0; - - private final TObjectIntMap< Spot > spotToId = new TObjectIntHashMap< Spot >(); - - private final List< GeffNode > nodes = new ArrayList<>(); - - private final Map< String, Boolean > isInt; - - public GeffSpotVisitor( final Map< String, Boolean > isInt ) - { - this.isInt = isInt; - } - - private void serializeFeatures( final Spot spot, final GeffNode node ) - { - final Map< String, Double > features = spot.getFeatures(); - for ( final Map.Entry< String, Double > entry : features.entrySet() ) - { - final String name = entry.getKey(); - if ( SLOP_PROPS.contains( name ) ) - continue; - - final Object val = ( isInt.get( name ) ? entry.getValue().intValue() : entry.getValue() ); - node.setProp( name, val ); - } - } - - @Override - public void visit( final SpotBase spot ) - { - final GeffNode node = new GeffNode.Builder() - .id( geffId ) - .timepoint( spot.getFeature( Spot.FRAME ).intValue() ) - .x( spot.getDoublePosition( 0 ) ) - .y( spot.getDoublePosition( 1 ) ) - .z( spot.getDoublePosition( 2 ) ) - .radius( spot.getFeature( Spot.RADIUS ).doubleValue() ) - .build(); - serializeFeatures( spot, node ); - nodes.add( node ); - spotToId.put( spot, geffId++ ); - } - - @Override - public void visit( final SpotRoi spot ) - { - final int nPoints = spot.nPoints(); - final double[] polygonX = new double[ nPoints ]; - final double[] polygonY = new double[ nPoints ]; - for ( int i = 0; i < nPoints; i++ ) - { - polygonX[ i ] = spot.x( i ); - polygonY[ i ] = spot.y( i ); - } - - final GeffNode node = new GeffNode.Builder() - .id( geffId ) - .timepoint( spot.getFeature( Spot.FRAME ).intValue() ) - .x( spot.getDoublePosition( 0 ) ) - .y( spot.getDoublePosition( 1 ) ) - .z( spot.getDoublePosition( 2 ) ) - .radius( spot.getFeature( Spot.RADIUS ).doubleValue() ) - .polygonX( polygonX ) - .polygonY( polygonY ) - .build(); - serializeFeatures( spot, node ); - nodes.add( node ); - spotToId.put( spot, geffId++ ); - } - } -} diff --git a/src/main/java/fiji/plugin/trackmate/io/geff/TmGeffReader.java b/src/main/java/fiji/plugin/trackmate/io/geff/TmGeffReader.java new file mode 100644 index 000000000..383ff49b5 --- /dev/null +++ b/src/main/java/fiji/plugin/trackmate/io/geff/TmGeffReader.java @@ -0,0 +1,403 @@ +package fiji.plugin.trackmate.io.geff; +import static fiji.plugin.trackmate.SpotCollection.VISIBILITY; +import static fiji.plugin.trackmate.features.edges.EdgeTargetAnalyzer.SPOT_SOURCE_ID; +import static fiji.plugin.trackmate.features.edges.EdgeTargetAnalyzer.SPOT_TARGET_ID; +import static fiji.plugin.trackmate.features.track.TrackIndexAnalyzer.TRACK_ID; +import static fiji.plugin.trackmate.io.TmXmlKeys.GUI_STATE_ELEMENT_KEY; +import static fiji.plugin.trackmate.io.TmXmlKeys.LOG_ELEMENT_KEY; +import static fiji.plugin.trackmate.io.geff.TmGeffWriter.NAME_PROP; +import static fiji.plugin.trackmate.io.geff.TmGeffWriter.TRACKMATE_SPOT_ID_PROP; +import static fiji.plugin.trackmate.io.geff.TmGeffWriter.TRACK_GEFF_NAME; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Paths; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.jgrapht.graph.DefaultWeightedEdge; +import org.jgrapht.graph.SimpleWeightedGraph; +import org.mastodon.geff.GeffAxis; +import org.mastodon.geff.GeffEdge; +import org.mastodon.geff.GeffMetadata; +import org.mastodon.geff.GeffMetadata.RelatedObjects; +import org.mastodon.geff.GeffNode; +import org.mastodon.geff.VarlengthProperty; + +import fiji.plugin.trackmate.Dimension; +import fiji.plugin.trackmate.FeatureModel; +import fiji.plugin.trackmate.Model; +import fiji.plugin.trackmate.Settings; +import fiji.plugin.trackmate.Spot; +import fiji.plugin.trackmate.SpotBase; +import fiji.plugin.trackmate.SpotCollection; +import fiji.plugin.trackmate.SpotRoi; +import fiji.plugin.trackmate.features.edges.EdgeTargetAnalyzer; +import fiji.plugin.trackmate.features.edges.EdgeTimeLocationAnalyzer; +import fiji.plugin.trackmate.gui.displaysettings.DisplaySettings; +import fiji.plugin.trackmate.gui.displaysettings.DisplaySettingsIO; +import fiji.plugin.trackmate.io.json.SettingsIO; +import gnu.trove.map.TIntObjectMap; +import gnu.trove.map.TObjectIntMap; +import gnu.trove.map.hash.TIntObjectHashMap; +import gnu.trove.map.hash.TObjectIntHashMap; +import ij.IJ; +import ij.ImagePlus; + +public class TmGeffReader +{ + + private final String geffPath; + + private GeffMetadata metadata; + + public TmGeffReader( final String geffPath ) + { + this.geffPath = geffPath; + } + + public String getLog() + { + if ( null == metadata ) + metadata = GeffMetadata.readFromZarr( geffPath ); + + @SuppressWarnings( "unchecked" ) + final Map< String, Object > trackmateMD = ( Map< String, Object > ) metadata.getExtra().get( "trackmate" ); + final String log = ( String ) trackmateMD.get( LOG_ELEMENT_KEY ); + return log; + } + + public String getGUIState() + { + if ( null == metadata ) + metadata = GeffMetadata.readFromZarr( geffPath ); + + @SuppressWarnings( "unchecked" ) + final Map< String, Object > trackmateMD = ( Map< String, Object > ) metadata.getExtra().get( "trackmate" ); + final String guiState = ( String ) trackmateMD.get( GUI_STATE_ELEMENT_KEY ); + return guiState; + } + + @SuppressWarnings( "unchecked" ) + public DisplaySettings getDisplaySettings() + { + if ( null == metadata ) + metadata = GeffMetadata.readFromZarr( geffPath ); + + final Map< String, Object > trackmateMD = ( Map< String, Object > ) metadata.getExtra().get( "trackmate" ); + final Map< String, Object > displaySettingsJson = ( Map< String, Object > ) trackmateMD.get( "displaySettings" ); + return DisplaySettingsIO.fromJsonTree( displaySettingsJson ); + } + + public synchronized ImagePlus readImage() + { + if ( null == metadata ) + metadata = GeffMetadata.readFromZarr( geffPath ); + + final RelatedObjects relatedObjects = metadata.getRelatedObjects(); + if ( null == relatedObjects ) + return null; + + final List< String > imagePaths = relatedObjects.getImagePaths(); + for ( final String imagePath : imagePaths ) + { + final File imageFile = new File( new File( geffPath ).getParent(), imagePath ); + if ( !imageFile.exists() || !imageFile.canRead() ) + continue; + + final ImagePlus imp = IJ.openImage( imageFile.getAbsolutePath() ); + if ( null == imp ) + continue; + return imp; + } + return null; + } + + @SuppressWarnings( "unchecked" ) + public synchronized Settings readSettings( final ImagePlus imp ) + { + if ( null == metadata ) + metadata = GeffMetadata.readFromZarr( geffPath ); + + final Map< String, Object > trackmateMD = ( Map< String, Object > ) metadata.getExtra().get( "trackmate" ); + final Map< String, Object > settingsJson = ( Map< String, Object > ) trackmateMD.get( "settings" ); + + final Settings settings = new Settings( imp ); + SettingsIO.updateFromJsonTree( settingsJson, settings ); + return settings; + } + + public synchronized Model getModel() throws IOException + { + final Model model = new Model(); + + if ( null == metadata ) + metadata = GeffMetadata.readFromZarr( geffPath ); + + // Units + final boolean is2D = readUnits( model ); + + // Spots + final TIntObjectMap< Spot > spotIdMap = new TIntObjectHashMap<>(); + final TObjectIntMap< Spot > spotTrackIDMap = new TObjectIntHashMap<>(); + readSpots( model, is2D, spotIdMap, spotTrackIDMap ); + + // Read edges and tracks + readEdgesAndTracks( model, spotIdMap, spotTrackIDMap ); + + // Read feature declarations + readFeatureDeclarations( model.getFeatureModel() ); + + return model; + } + + @SuppressWarnings( "unchecked" ) + private void readFeatureDeclarations( final FeatureModel featureModel ) + { + final Map< String, Object > trackmateMD = ( Map< String, Object > ) metadata.getExtra().get( "trackmate" ); + final Map< String, Object > featureDeclarations = ( Map< String, Object > ) trackmateMD.get( "featureDeclarations" ); + + // Spot features + final List< String > spotFeatures = ( List< String > ) featureDeclarations.get( "spotFeatures" ); + final Map< String, String > spotFeatureNames = ( Map< String, String > ) featureDeclarations.get( "spotFeatureNames" ); + final Map< String, String > spotFeatureShortNames = ( Map< String, String > ) featureDeclarations.get( "spotFeatureShortNames" ); + final Map< String, String > spotFeatureDimensionsStr = ( Map< String, String > ) featureDeclarations.get( "spotFeatureDimensions" ); + final Map< String, Dimension > spotFeatureDimensions = new HashMap<>(); + for ( final String feature : spotFeatureDimensionsStr.keySet() ) + { + final String dimStr = spotFeatureDimensionsStr.get( feature ); + final Dimension dim = Dimension.valueOf( dimStr ); + spotFeatureDimensions.put( feature, dim ); + } + final Map< String, Boolean > spotFeatureIsInt = ( Map< String, Boolean > ) featureDeclarations.get( "spotFeatureIsInt" ); + featureModel.declareSpotFeatures( spotFeatures, spotFeatureNames, spotFeatureShortNames, spotFeatureDimensions, spotFeatureIsInt ); + + // Edge features + final List< String > edgeFeatures = ( List< String > ) featureDeclarations.get( "edgeFeatures" ); + final Map< String, String > edgeFeatureNames = ( Map< String, String > ) featureDeclarations.get( "edgeFeatureNames" ); + final Map< String, String > edgeFeatureShortNames = ( Map< String, String > ) featureDeclarations.get( "edgeFeatureShortNames" ); + final Map< String, String > edgeFeatureDimensionsStr = ( Map< String, String > ) featureDeclarations.get( "edgeFeatureDimensions" ); + final Map< String, Dimension > edgeFeatureDimensions = new HashMap<>(); + for ( final String feature : edgeFeatureDimensionsStr.keySet() ) + { + final String dimStr = edgeFeatureDimensionsStr.get( feature ); + final Dimension dim = Dimension.valueOf( dimStr ); + edgeFeatureDimensions.put( feature, dim ); + } + final Map< String, Boolean > edgeFeatureIsInt = ( Map< String, Boolean > ) featureDeclarations.get( "edgeFeatureIsInt" ); + featureModel.declareEdgeFeatures( edgeFeatures, edgeFeatureNames, edgeFeatureShortNames, edgeFeatureDimensions, edgeFeatureIsInt ); + + // Track features + final List< String > trackFeatures = ( List< String > ) featureDeclarations.get( "trackFeatures" ); + final Map< String, String > trackFeatureNames = ( Map< String, String > ) featureDeclarations.get( "trackFeatureNames" ); + final Map< String, String > trackFeatureShortNames = ( Map< String, String > ) featureDeclarations.get( "trackFeatureShortNames" ); + final Map< String, String > trackFeatureDimensionsStr = ( Map< String, String > ) featureDeclarations.get( "trackFeatureDimensions" ); + final Map< String, Dimension > trackFeatureDimensions = new HashMap<>(); + for ( final String feature : trackFeatureDimensionsStr.keySet() ) + { + final String dimStr = trackFeatureDimensionsStr.get( feature ); + final Dimension dim = Dimension.valueOf( dimStr ); + trackFeatureDimensions.put( feature, dim ); + } + final Map< String, Boolean > trackFeatureIsInt = ( Map< String, Boolean > ) featureDeclarations.get( "trackFeatureIsInt" ); + featureModel.declareTrackFeatures( trackFeatures, trackFeatureNames, trackFeatureShortNames, trackFeatureDimensions, trackFeatureIsInt ); + } + + private void readEdgesAndTracks( final Model model, final TIntObjectMap< Spot > spotIdMap, final TObjectIntMap< Spot > spotTrackIDMap ) + { + // Load files + final String geffTracksPath = Paths.get( geffPath, TRACK_GEFF_NAME ).toString(); + final List< GeffEdge > edges = GeffEdge.readFromZarr( geffPath, metadata ); + final GeffMetadata trackMetadata = GeffMetadata.readFromZarr( geffTracksPath ); + final List< GeffNode > tracks = GeffNode.readFromZarr( geffTracksPath, trackMetadata ); + + final FeatureModel fm = model.getFeatureModel(); + final SimpleWeightedGraph< Spot, DefaultWeightedEdge > graph = new SimpleWeightedGraph<>( DefaultWeightedEdge.class ); + final Map< Integer, Set< Spot > > connectedVertexSet = new HashMap<>(); + final Map< Integer, Set< DefaultWeightedEdge > > connectedEdgeSet = new HashMap<>(); + + for ( final GeffEdge edge : edges ) + { + // Connectivity + final int sid = edge.getSourceNodeId(); + final Spot source = spotIdMap.get( sid ); + final int tid = edge.getTargetNodeId(); + final Spot target = spotIdMap.get( tid ); + + graph.addVertex( source ); + graph.addVertex( target ); + final DefaultWeightedEdge e = graph.addEdge( source, target ); + + // Put back source and target with TrackMate Spot ID + fm.putEdgeFeature( e, SPOT_SOURCE_ID, Double.valueOf( source.ID() ) ); + fm.putEdgeFeature( e, SPOT_TARGET_ID, Double.valueOf( target.ID() ) ); + + // We did not serialize Z features for the 2D case, but we need to + // put them back when reading, because the feature model expects + // them to be there. These default values will be overwritten if the + // edge has a Z feature value. + fm.putEdgeFeature( e, EdgeTimeLocationAnalyzer.Z_LOCATION, Double.valueOf( 0. ) ); + + // Other Features + final Map< String, Object > props = edge.getProps(); + for ( final String feature : props.keySet() ) + fm.putEdgeFeature( e, feature, ( ( Number ) props.get( feature ) ).doubleValue() ); + + // Put back edge weight + final Double weight = fm.getEdgeFeature( e, EdgeTargetAnalyzer.EDGE_COST ); + graph.setEdgeWeight( e, weight ); + + // Track ID + final int trackID = spotTrackIDMap.get( source ); + final Set< Spot > trackSpots = connectedVertexSet.computeIfAbsent( trackID, k -> new HashSet<>() ); + trackSpots.add( source ); + trackSpots.add( target ); + connectedEdgeSet.computeIfAbsent( trackID, k -> new HashSet<>() ).add( e ); + } + + // Track visibility, name and feature values + final Map< Integer, Boolean > visibility = new HashMap<>( connectedEdgeSet.size() ); + final Map< Integer, String > savedTrackNames = new HashMap<>(); + for ( final GeffNode track : tracks ) + { + final int trackID = track.getId(); + + // Visibility + final Integer val = ( Integer ) track.getProp( VISIBILITY ); + final boolean isVisible = val > 0; + visibility.put( trackID, isVisible ); + + // Name + final VarlengthProperty nameProperty = track.getVarlengthProperty( NAME_PROP ); + final Object[] bytes = nameProperty.getData(); + final String name = fromByteArray( bytes ); + savedTrackNames.put( trackID, name ); + + // Features + final Map< String, Object > props = track.getProps(); + for ( final String feature : props.keySet() ) + { + if ( feature.equals( VISIBILITY ) || feature.equals( NAME_PROP ) ) + continue; + fm.putTrackFeature( trackID, feature, ( ( Number ) props.get( feature ) ).doubleValue() ); + } + } + + // Rebuild track model + model.getTrackModel().from( graph, connectedVertexSet, connectedEdgeSet, visibility, savedTrackNames ); + } + + private boolean readUnits( final Model model ) + { + final GeffAxis[] geffAxes = metadata.getGeffAxes(); + String spaceUnits = null; + String timeUnits = null; + int spaceDim = 0; + for ( final GeffAxis axis : geffAxes ) + { + if ( spaceUnits == null && axis.getType().equals( GeffAxis.TYPE_SPACE ) ) + { + spaceUnits = axis.getUnit(); + spaceDim++; + } + + if ( timeUnits == null && axis.getType().equals( GeffAxis.TYPE_TIME ) ) + timeUnits = axis.getUnit(); + } + model.setPhysicalUnits( spaceUnits, timeUnits ); + final boolean is2D = spaceDim < 3; + return is2D; + } + + private TIntObjectMap< Spot > readSpots( + final Model model, + final boolean is2D, + final TIntObjectMap< Spot > spotIdMap, + final TObjectIntMap< Spot > spotTrackIDMap ) throws IOException + { + // Where is stored the track ID? + final String trackIdProp = metadata.getTrackNodeProps().get( "lineage" ); + + final List< GeffNode > geffNodes = GeffNode.readFromZarr( geffPath, metadata ); + final SpotCollection spots = model.getSpots(); + for ( final GeffNode node : geffNodes ) + { + // Read its internal ID if present + int trackmateId; + final Object idObj = node.getProps().get( TRACKMATE_SPOT_ID_PROP ); + if ( null != idObj && idObj instanceof Integer ) + trackmateId = ( Integer ) idObj; + else + trackmateId = Spot.IDcounter.incrementAndGet(); + + // Frame + final int frame = node.getT(); + + // Deserialize + Spot spot = null; + + // Is it a mesh? + // TODO + + // Is it a polygon? + final double[] polygonX = node.getPolygonX(); + final double[] polygonY = node.getPolygonY(); + if ( polygonX != null && polygonY != null && polygonX.length > 0 && polygonY.length > 0 ) + { + // Put coords relative to center + final double x = node.getX(); + final double y = node.getY(); + for ( int i = 0; i < polygonX.length; i++ ) + { + polygonX[ i ] -= x; + polygonY[ i ] -= y; + } + spot = new SpotRoi( trackmateId, polygonX, polygonY ); + spot.setPosition( x, 0 ); + spot.setPosition( y, 1 ); + } + else + { + spot = new SpotBase( trackmateId ); + spot.setPosition( node.getX(), 0 ); + spot.setPosition( node.getY(), 1 ); + } + spot.putFeature( Spot.RADIUS, node.getRadius() ); + spot.setPosition( is2D ? 0. : node.getZ(), 2 ); + spots.add( spot, frame ); + spotIdMap.put( node.getId(), spot ); + spotTrackIDMap.put( spot, ( ( Number ) node.getProp( trackIdProp ) ).intValue() ); + + // Features + final Set< String > SKIP_FEATURES = Set.of( TRACKMATE_SPOT_ID_PROP, TRACK_ID, Spot.RADIUS, Spot.POSITION_X, Spot.POSITION_Y, Spot.POSITION_Z ); + final Map< String, Object > props = node.getProps(); + for ( final Map.Entry< String, Object > entry : props.entrySet() ) + { + final String key = entry.getKey(); + final Object value = entry.getValue(); + if ( SKIP_FEATURES.contains( key ) ) + continue; + spot.putFeature( key, ( ( Number ) value ).doubleValue() ); + } + + // Names + final VarlengthProperty nameProperty = node.getVarlengthProperty( NAME_PROP ); + final Object[] bytes = nameProperty.getData(); + final String name = fromByteArray( bytes ); + spot.setName( name ); + + } + return spotIdMap; + } + + private static final String fromByteArray( final Object[] bytes ) + { + final byte[] recoveredBytes0 = new byte[ bytes.length ]; + for ( int i = 0; i < bytes.length; i++ ) + recoveredBytes0[ i ] = ( ( Integer ) bytes[ i ] ).byteValue(); + return new String( recoveredBytes0, java.nio.charset.StandardCharsets.UTF_8 ); + } +} diff --git a/src/main/java/fiji/plugin/trackmate/io/geff/TmGeffWriter.java b/src/main/java/fiji/plugin/trackmate/io/geff/TmGeffWriter.java new file mode 100644 index 000000000..924c32998 --- /dev/null +++ b/src/main/java/fiji/plugin/trackmate/io/geff/TmGeffWriter.java @@ -0,0 +1,542 @@ +package fiji.plugin.trackmate.io.geff; + +import static fiji.plugin.trackmate.Spot.FRAME; +import static fiji.plugin.trackmate.Spot.POSITION_X; +import static fiji.plugin.trackmate.Spot.POSITION_Y; +import static fiji.plugin.trackmate.Spot.POSITION_Z; +import static fiji.plugin.trackmate.Spot.RADIUS; +import static fiji.plugin.trackmate.SpotCollection.VISIBILITY; +import static fiji.plugin.trackmate.features.edges.EdgeTargetAnalyzer.SPOT_SOURCE_ID; +import static fiji.plugin.trackmate.features.edges.EdgeTargetAnalyzer.SPOT_TARGET_ID; +import static fiji.plugin.trackmate.features.edges.EdgeTimeLocationAnalyzer.Z_LOCATION; +import static fiji.plugin.trackmate.features.track.TrackDurationAnalyzer.TRACK_START; +import static fiji.plugin.trackmate.features.track.TrackIndexAnalyzer.TRACK_ID; +import static fiji.plugin.trackmate.features.track.TrackMotilityAnalyzer.TRACK_MAX_DISTANCE_TRAVELED; +import static fiji.plugin.trackmate.io.TmXmlKeys.GUI_STATE_ELEMENT_KEY; +import static fiji.plugin.trackmate.io.TmXmlKeys.LOG_ELEMENT_KEY; +import static fiji.plugin.trackmate.io.TmXmlKeys.PLUGIN_VERSION_ATTRIBUTE_NAME; + +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.jgrapht.graph.DefaultWeightedEdge; +import org.mastodon.geff.GeffAxis; +import org.mastodon.geff.GeffEdge; +import org.mastodon.geff.GeffMetadata; +import org.mastodon.geff.GeffMetadata.DisplayHints; +import org.mastodon.geff.GeffMetadata.RelatedObjects; +import org.mastodon.geff.GeffNode; +import org.mastodon.geff.GeffNode.Builder; +import org.mastodon.geff.PropMetadata; +import org.mastodon.geff.VarlengthProperty; + +import com.google.gson.JsonElement; + +import fiji.plugin.trackmate.Dimension; +import fiji.plugin.trackmate.FeatureModel; +import fiji.plugin.trackmate.Model; +import fiji.plugin.trackmate.Settings; +import fiji.plugin.trackmate.Spot; +import fiji.plugin.trackmate.Spot.SpotVisitor; +import fiji.plugin.trackmate.SpotBase; +import fiji.plugin.trackmate.SpotCollection; +import fiji.plugin.trackmate.SpotRoi; +import fiji.plugin.trackmate.TrackMate; +import fiji.plugin.trackmate.TrackModel; +import fiji.plugin.trackmate.detection.DetectionUtils; +import fiji.plugin.trackmate.features.FeatureUtils; +import fiji.plugin.trackmate.features.track.TrackLocationAnalyzer; +import fiji.plugin.trackmate.gui.displaysettings.DisplaySettings; +import fiji.plugin.trackmate.gui.displaysettings.DisplaySettings.TrackMateObject; +import fiji.plugin.trackmate.gui.displaysettings.DisplaySettingsIO; +import fiji.plugin.trackmate.io.json.FeatureModelIO; +import fiji.plugin.trackmate.io.json.SettingsIO; +import fiji.plugin.trackmate.util.TMUtils; +import gnu.trove.map.TObjectIntMap; +import gnu.trove.map.hash.TObjectIntHashMap; + +public class TmGeffWriter +{ + + private static final String GEFF_VERSION = "1.0.0"; + + static final String TRACKMATE_SPOT_ID_PROP = "trackmate_spot_id"; + + static final String NAME_PROP = "name"; + + static final String TRACK_GEFF_NAME = "tracks.geff"; + + private final String geffPath; + + private final GeffMetadata metadata; + + private final GeffMetadata trackMetadata; + + private final List< GeffNode > geffNodes = new ArrayList<>(); + + private final List< GeffEdge > geffEdges = new ArrayList<>(); + + private final List< GeffNode > geffTrackNodes = new ArrayList<>(); + + private final Map< String, Object > trackmateInfo; + + public TmGeffWriter( final String zarrPath ) + { + this.geffPath = zarrPath; + this.metadata = new GeffMetadata( GEFF_VERSION, true ); + this.trackMetadata = new GeffMetadata( GEFF_VERSION, true ); + this.trackmateInfo = new HashMap<>(); + final Map< String, Object > extra = Map.of( "trackmate", trackmateInfo ); + metadata.setExtra( extra ); + trackmateInfo.put( PLUGIN_VERSION_ATTRIBUTE_NAME, TrackMate.PLUGIN_NAME_VERSION ); + } + + public void appendModel( final Model model ) + { + final String spaceUnits = model.getSpaceUnits(); + final String timeUnits = model.getTimeUnits(); + final boolean is2D = DetectionUtils.is2D( model ); + + /* + * Serialize spots + */ + final SpotCollection spots = model.getSpots(); + final GeffSpotVisitor visitor = new GeffSpotVisitor( is2D, model.getTrackModel(), model.getFeatureModel().getSpotFeatureIsInt() ); + spots.iterable( false ).forEach( spot -> spot.accept( visitor ) ); + + /* + * Serialize edges + */ + final TrackModel trackModel = model.getTrackModel(); + final Set< DefaultWeightedEdge > edges = trackModel.edgeSet(); + final FeatureModel fm = model.getFeatureModel(); + + int edgeId = 0; + for ( final DefaultWeightedEdge edge : edges ) + { + final Spot source = trackModel.getEdgeSource( edge ); + final Integer srcId = visitor.spotToId.get( source ); + final Spot target = trackModel.getEdgeTarget( edge ); + final Integer tgtId = visitor.spotToId.get( target ); + if ( srcId == null || tgtId == null ) + continue; + + final boolean swap = source.getFeature( FRAME ) > target.getFeature( FRAME ); + final GeffEdge edgeNode = new GeffEdge.Builder() + .setId( edgeId++ ) + .setSourceNodeId( swap ? tgtId : srcId ) + .setTargetNodeId( swap ? srcId : tgtId ) + .build(); + + // Feature + for ( final String edgeFeature : fm.getEdgeFeatures() ) + { + if ( edgeFeature.equals( SPOT_SOURCE_ID ) || edgeFeature.equals( SPOT_TARGET_ID ) ) + continue; + if ( is2D && edgeFeature.equals( Z_LOCATION ) ) + continue; + + final Double ef = fm.getEdgeFeature( edge, edgeFeature ); + edgeNode.setProp( edgeFeature, ef ); + } + geffEdges.add( edgeNode ); + } + + /* + * Metadata + */ + + // Axes + final List< GeffAxis > axes = buildAxes( spaceUnits, timeUnits, is2D, model ); + metadata.setGeffAxes( axes ); + + // Display hints + DisplayHints displayHints = new DisplayHints() + .displayHorizontal( POSITION_X ) + .displayVertical( POSITION_Y ) + .displayTime( FRAME ); + if ( !is2D ) + displayHints = displayHints.displayDepth( POSITION_Z ); + metadata.setDisplayHints( displayHints ); + + // Spot features + + // First, determine what spot features have an actual value. + final Set< String > spotFeaturesWithValue = new HashSet<>(); + for ( final Spot spot : spots.iterable( false ) ) + spotFeaturesWithValue.addAll( spot.getFeatures().keySet() ); + + // Then add only those to the metadata. + final Map< String, Boolean > isInt = fm.getSpotFeatureIsInt(); + final Map< String, PropMetadata > nodePropsMetadata = new HashMap<>(); + for ( final String spotFeature : spotFeaturesWithValue ) + { + if ( is2D && spotFeature.equals( POSITION_Z ) ) + continue; + if ( spotFeature.equals( RADIUS ) || spotFeature.equals( TRACK_ID ) ) + continue; + + final String dType = isInt.get( spotFeature ) ? "int32" : "float64"; + final Dimension dimension = fm.getSpotFeatureDimensions().get( spotFeature ); + final String unit = dimension.units( spaceUnits, timeUnits ); + final String name = fm.getSpotFeatureNames().get( spotFeature ); + final PropMetadata propMetadata = new PropMetadata( spotFeature, dType, false, unit, name, null ); + nodePropsMetadata.put( spotFeature, propMetadata ); + } + // Add the TRACKMATE_ID feature + final PropMetadata trackmateIdPropMetadata = new PropMetadata( TRACKMATE_SPOT_ID_PROP, "int32", false, null, "TrackMate ID", "The TrackMate internal ID of spots" ); + nodePropsMetadata.put( TRACKMATE_SPOT_ID_PROP, trackmateIdPropMetadata ); + // Add the 'radius' feature -> mandatory for GEFF + final PropMetadata radiusPropMetadata = new PropMetadata( "radius", "float64", false, spaceUnits, "Radius", "The radius of the spot" ); + nodePropsMetadata.put( "radius", radiusPropMetadata ); + // Spot name property + nodePropsMetadata.put( NAME_PROP, new PropMetadata( NAME_PROP, "uint8", true, null, "Spot name", "The name of the spot" ) ); + // Add the TRACK_ID feature -> map it to the GEFF 'lineage' property + final PropMetadata trackIdPropMetadata = new PropMetadata( TRACK_ID, "int32", false, null, "Track ID", "The TrackMate track ID of the spot" ); + nodePropsMetadata.put( TRACK_ID, trackIdPropMetadata ); + final Map< String, String > trackNodePros = Map.of( "lineage", TRACK_ID ); + metadata.setTrackNodeProps( trackNodePros ); + + metadata.setNodePropsMetadata( nodePropsMetadata ); + + // Edge features + + // First, determine what edge features have an actual value. + final Set< String > edgeFeaturesWithValue = new HashSet<>(); + for ( final DefaultWeightedEdge edge : edges ) + { + for ( final String edgeFeature : fm.getEdgeFeatures() ) + { + final Double ef = fm.getEdgeFeature( edge, edgeFeature ); + if ( ef != null ) + edgeFeaturesWithValue.add( edgeFeature ); + } + } + + final Map< String, PropMetadata > edgePropsMetadata = new HashMap<>(); + for ( final String edgeFeature : edgeFeaturesWithValue ) + { + if ( edgeFeature.equals( SPOT_SOURCE_ID ) || edgeFeature.equals( SPOT_TARGET_ID ) ) + continue; + if ( is2D && edgeFeature.equals( Z_LOCATION ) ) + continue; + + final String dType = fm.getEdgeFeatureIsInt().get( edgeFeature ) ? "int32" : "float64"; + final Dimension dimension = fm.getEdgeFeatureDimensions().get( edgeFeature ); + final String unit = dimension.units( spaceUnits, timeUnits ); + final String name = fm.getEdgeFeatureNames().get( edgeFeature ); + final PropMetadata propMetadata = new PropMetadata( edgeFeature, dType, false, unit, name, null ); + edgePropsMetadata.put( edgeFeature, propMetadata ); + } + metadata.setEdgePropsMetadata( edgePropsMetadata ); + + // Feature declarations + trackmateInfo.put( "featureDeclarations", FeatureModelIO.toJsonTree( fm ) ); + + /* + * Tracks feature values -> on a sub GEFF file (geffception) that has no + * edges, only nodes. + */ + + for ( final Integer trackID : trackModel.trackIDs( false ) ) + { + final double xt = fm.getTrackFeature( trackID, TrackLocationAnalyzer.X_LOCATION ); + final double yt = fm.getTrackFeature( trackID, TrackLocationAnalyzer.Y_LOCATION ); + final int tt = fm.getTrackFeature( trackID, TRACK_START ).intValue(); + final double radius = fm.getTrackFeature( trackID, TRACK_MAX_DISTANCE_TRAVELED ) / 2.; + + final GeffNode.Builder builder = new GeffNode.Builder() + .id( trackID ) + .timepoint( tt ) + .x( xt ) + .y( yt ) + .radius( radius ); + if ( !is2D ) + { + final double zt = fm.getTrackFeature( trackID, TrackLocationAnalyzer.Z_LOCATION ); + builder.z( zt ); + } + final GeffNode trackNode = builder.build(); + + // Track features + for ( final String trackFeature : fm.getTrackFeatures() ) + { + Object val; + if ( fm.getTrackFeatureIsInt().get( trackFeature ) ) + val = Integer.valueOf( fm.getTrackFeature( trackID, trackFeature ).intValue() ); + else + val = fm.getTrackFeature( trackID, trackFeature ); + trackNode.setProp( trackFeature, val ); + } + // Track visibility property + final Integer visibility = trackModel.isVisible( trackID ) ? 1 : 0; + trackNode.setProp( VISIBILITY, visibility ); + // Add the 'radius' feature -> mandatory for GEFF + final PropMetadata trackRadiusPropMetadata = new PropMetadata( "radius", "float64", false, spaceUnits, "Radius", "The radius of excursion of the track" ); + nodePropsMetadata.put( "radius", trackRadiusPropMetadata ); + // Track name -> variable length property + final String trackName = trackModel.name( trackID ); + final Object[] bytes = toByteArray( trackName ); + trackNode.setVarlengthProperty( NAME_PROP, new VarlengthProperty( NAME_PROP, "uint8", bytes ) ); + + geffTrackNodes.add( trackNode ); + } + + /* + * Tracks metadata + */ + + // Axes + final List< GeffAxis > trackAxes = buildTrackAxes( spaceUnits, timeUnits, is2D, model ); + trackMetadata.setGeffAxes( trackAxes ); + + // Display hints + DisplayHints trackDisplayHints = new DisplayHints() + .displayHorizontal( TrackLocationAnalyzer.X_LOCATION ) + .displayVertical( TrackLocationAnalyzer.Y_LOCATION ) + .displayTime( TRACK_START ); + if ( !is2D ) + trackDisplayHints = trackDisplayHints.displayDepth( TrackLocationAnalyzer.Z_LOCATION ); + trackMetadata.setDisplayHints( trackDisplayHints ); + + // Track features + + // First, determine what track features have an actual value. + final Set< String > trackFeaturesWithValue = new HashSet<>(); + for ( final DefaultWeightedEdge edge : edges ) + { + for ( final String trackFeature : fm.getTrackFeatures() ) + { + final Double ef = fm.getEdgeFeature( edge, trackFeature ); + if ( ef != null ) + trackFeaturesWithValue.add( trackFeature ); + } + } + + // Then add only those to the metadata. + final Map< String, Boolean > trackIsInt = fm.getTrackFeatureIsInt(); + final Map< String, PropMetadata > trackNodePropsMetadata = new HashMap<>(); + for ( final String trackFeature : trackFeaturesWithValue ) + { + if ( is2D && trackFeature.equals( TrackLocationAnalyzer.Z_LOCATION ) ) + continue; + + final String dType = trackIsInt.get( trackFeature ) ? "int32" : "float64"; + final Dimension dimension = fm.getSpotFeatureDimensions().get( trackFeature ); + final String unit = dimension.units( spaceUnits, timeUnits ); + final String name = fm.getSpotFeatureNames().get( trackFeature ); + final PropMetadata propMetadata = new PropMetadata( trackFeature, dType, false, unit, name, null ); + trackNodePropsMetadata.put( trackFeature, propMetadata ); + } + // Track visibility property + trackNodePropsMetadata.put( VISIBILITY, new PropMetadata( VISIBILITY, "int32", false, null, Spot.FEATURE_NAMES.get( VISIBILITY ), "Whether the track is visible in the display" ) ); + // Track name property + trackNodePropsMetadata.put( NAME_PROP, new PropMetadata( NAME_PROP, "uint8", true, null, "Track name", "The name of the track" ) ); + + trackMetadata.setNodePropsMetadata( trackNodePropsMetadata ); + } + + public void appendSettings( final Settings settings ) + { + // All settings + final JsonElement settingsJson = SettingsIO.toJsonTree( settings ); + trackmateInfo.put( "settings", settingsJson ); + + // Path to the image + String imagePathStr = TMUtils.getImagePathWithoutExtension( settings ); + if ( settings.imageFileName != null && !settings.imageFileName.isEmpty() ) + imagePathStr = imagePathStr + "." + settings.imageFileName.substring( settings.imageFileName.lastIndexOf( '.' ) + 1 ); + + // Make it relative to the save path + final Path imagePath = Paths.get( imagePathStr ).toAbsolutePath().normalize(); + final Path savePath = Paths.get( geffPath ).toAbsolutePath().normalize(); + metadata.setRelatedObjects( new RelatedObjects().image( savePath.getParent().relativize( imagePath ).toString() ) ); + } + + public void appendLog( final String log ) + { + trackmateInfo.put( LOG_ELEMENT_KEY, log ); + } + + public void appendDisplaySettings( final DisplaySettings ds ) + { + final JsonElement json = DisplaySettingsIO.toJsonTree( ds ); + trackmateInfo.put( "displaySettings", json ); + } + + public void appendGUIState( final String currentPanelIdentifier ) + { + trackmateInfo.put( GUI_STATE_ELEMENT_KEY, currentPanelIdentifier ); + } + + public void write() throws IOException + { + // Core GEFF + GeffNode.writeToZarr( geffNodes, geffPath, metadata ); + GeffEdge.writeToZarr( geffEdges, geffPath, metadata ); + GeffMetadata.writeToZarr( metadata, geffPath ); + + // Track GEFF + final String geffTracksPath = Paths.get( geffPath, TRACK_GEFF_NAME ).toString(); + GeffNode.writeToZarr( geffTrackNodes, geffTracksPath, trackMetadata ); + // Required to be a valid GEFF: + GeffEdge.writeToZarr( new ArrayList<>(), geffTracksPath, trackMetadata ); + GeffMetadata.writeToZarr( trackMetadata, geffTracksPath ); + } + + private class GeffSpotVisitor implements SpotVisitor + { + + /** Features not in the general prop, because they are the core node. */ + private static final Set< String > SKIP_PROPS = Set.of( FRAME, POSITION_X, POSITION_Y, POSITION_Z, RADIUS, TRACK_ID ); + + private int geffId = 0; + + private final TObjectIntMap< Spot > spotToId = new TObjectIntHashMap< Spot >(); + + private final boolean is2d; + + private final TrackModel trackModel; + + private final Map< String, Boolean > isInt; + + public GeffSpotVisitor( final boolean is2d, final TrackModel trackModel, final Map< String, Boolean > isInt ) + { + this.is2d = is2d; + this.trackModel = trackModel; + this.isInt = isInt; + } + + private void serializeFeatures( final Spot spot, final GeffNode node ) + { + final Map< String, Double > features = spot.getFeatures(); + for ( final String feature : features.keySet() ) + { + if ( SKIP_PROPS.contains( feature ) ) + continue; + + final Double obj = spot.getFeature( feature ); + final Object val; + if ( isInt.get( feature ) ) + val = Integer.valueOf( obj.intValue() ); + else + val = obj; + node.setProp( feature, val ); + } + + // Spot ID + node.setProp( TRACKMATE_SPOT_ID_PROP, spot.ID() ); + // Track ID -> will be mapped to the 'lineage' GEFF property + final Integer trackID = trackModel.trackIDOf( spot ); + if ( trackID != null ) + node.setProp( TRACK_ID, trackID.intValue() ); + // Name -> variable length property + final String name = spot.getName(); + if ( name != null ) + { + final Object[] bytes = toByteArray( name ); + node.setVarlengthProperty( NAME_PROP, new VarlengthProperty( NAME_PROP, "uint8", bytes ) ); + } + } + + @Override + public void visit( final SpotBase spot ) + { + final Builder builder = new GeffNode.Builder() + .id( geffId ) + .timepoint( spot.getFeature( FRAME ).intValue() ) + .x( spot.getDoublePosition( 0 ) ) + .y( spot.getDoublePosition( 1 ) ) + .radius( spot.getFeature( RADIUS ).doubleValue() ); + if ( !is2d ) + builder.z( spot.getDoublePosition( 2 ) ); + + final GeffNode node = builder.build(); + serializeFeatures( spot, node ); + geffNodes.add( node ); + spotToId.put( spot, geffId++ ); + } + + @Override + public void visit( final SpotRoi spot ) + { + final int nPoints = spot.nPoints(); + final double[] polygonX = new double[ nPoints ]; + final double[] polygonY = new double[ nPoints ]; + for ( int i = 0; i < nPoints; i++ ) + { + polygonX[ i ] = spot.x( i ); + polygonY[ i ] = spot.y( i ); + } + + final GeffNode node = new GeffNode.Builder() + .id( geffId ) + .timepoint( spot.getFeature( FRAME ).intValue() ) + .x( spot.getDoublePosition( 0 ) ) + .y( spot.getDoublePosition( 1 ) ) // No Z <- 2D + .radius( spot.getFeature( RADIUS ).doubleValue() ) + .polygonX( polygonX ) + .polygonY( polygonY ) + .build(); + serializeFeatures( spot, node ); + geffNodes.add( node ); + spotToId.put( spot, geffId++ ); + } + } + + private static final Object[] toByteArray( final String name ) + { + final byte[] bytes = name.getBytes( java.nio.charset.StandardCharsets.UTF_8 ); + final Object[] data = new Object[ bytes.length ]; + for ( int i = 0; i < bytes.length; i++ ) + data[ i ] = bytes[ i ] & 0xFF; + return data; + } + + private static final List< GeffAxis > buildAxes( final String spaceUnit, final String timeUnit, final boolean is2d, final Model model ) + { + final String[] spaceFeatures = is2d + ? new String[] { POSITION_X, POSITION_Y } + : new String[] { POSITION_X, POSITION_Y, POSITION_Z }; + return axesOf( TrackMateObject.SPOTS, spaceFeatures, FRAME, spaceUnit, timeUnit, model ); + } + + private static final List< GeffAxis > buildTrackAxes( final String spaceUnit, final String timeUnit, final boolean is2d, final Model model ) + { + final String[] spaceFeatures = is2d + ? new String[] { TrackLocationAnalyzer.X_LOCATION, TrackLocationAnalyzer.Y_LOCATION } + : new String[] { TrackLocationAnalyzer.X_LOCATION, TrackLocationAnalyzer.Y_LOCATION, TrackLocationAnalyzer.Z_LOCATION }; + return axesOf( TrackMateObject.TRACKS, spaceFeatures, TRACK_START, spaceUnit, timeUnit, model ); + } + + private static final List< GeffAxis > axesOf( + final TrackMateObject obj, + final String[] spaceFeatures, + final String timeFeature, + final String spaceUnit, + final String timeUnit, + final Model model ) + { + final String su = spaceUnit; + final String tu = timeUnit; + + final List< GeffAxis > axes = new ArrayList<>(); + + final double[] minMaxT = FeatureUtils.autoMinMax( model, obj, timeFeature, false ); + axes.add( GeffAxis.createTimeAxis( timeFeature, tu, minMaxT[ 0 ], minMaxT[ 1 ] ) ); + + for ( final String spaceFeature : spaceFeatures ) + { + final double[] minMaxX = FeatureUtils.autoMinMax( model, obj, spaceFeature, false ); + axes.add( GeffAxis.createSpaceAxis( spaceFeature, su, minMaxX[ 0 ], minMaxX[ 1 ] ) ); + } + return axes; + } +} diff --git a/src/main/java/fiji/plugin/trackmate/io/json/FeatureModelIO.java b/src/main/java/fiji/plugin/trackmate/io/json/FeatureModelIO.java new file mode 100644 index 000000000..ac195fcb5 --- /dev/null +++ b/src/main/java/fiji/plugin/trackmate/io/json/FeatureModelIO.java @@ -0,0 +1,22 @@ +package fiji.plugin.trackmate.io.json; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonElement; + +import fiji.plugin.trackmate.FeatureModel; + +public class FeatureModelIO +{ + private static Gson getGson() + { + return new GsonBuilder() + .setPrettyPrinting() + .create(); + } + + public static JsonElement toJsonTree( final FeatureModel featureModel ) + { + return getGson().toJsonTree( featureModel ); + } +} diff --git a/src/main/java/fiji/plugin/trackmate/io/json/SettingsIO.java b/src/main/java/fiji/plugin/trackmate/io/json/SettingsIO.java new file mode 100644 index 000000000..aebc2740a --- /dev/null +++ b/src/main/java/fiji/plugin/trackmate/io/json/SettingsIO.java @@ -0,0 +1,249 @@ +package fiji.plugin.trackmate.io.json; + +import java.awt.Rectangle; +import java.io.IOException; +import java.util.Map; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.InstanceCreator; +import com.google.gson.JsonElement; +import com.google.gson.TypeAdapter; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonToken; +import com.google.gson.stream.JsonWriter; + +import fiji.plugin.trackmate.Settings; +import fiji.plugin.trackmate.TrackMateModule; +import fiji.plugin.trackmate.detection.SpotDetectorFactoryBase; +import fiji.plugin.trackmate.features.edges.EdgeAnalyzer; +import fiji.plugin.trackmate.features.spot.SpotAnalyzerFactoryBase; +import fiji.plugin.trackmate.features.track.TrackAnalyzer; +import fiji.plugin.trackmate.providers.AbstractProvider; +import fiji.plugin.trackmate.providers.DetectorProvider; +import fiji.plugin.trackmate.providers.EdgeAnalyzerProvider; +import fiji.plugin.trackmate.providers.Spot2DMorphologyAnalyzerProvider; +import fiji.plugin.trackmate.providers.Spot3DMorphologyAnalyzerProvider; +import fiji.plugin.trackmate.providers.SpotAnalyzerProvider; +import fiji.plugin.trackmate.providers.TrackAnalyzerProvider; +import fiji.plugin.trackmate.providers.TrackerProvider; +import fiji.plugin.trackmate.tracking.SpotTrackerFactory; +import ij.gui.Roi; + +public class SettingsIO +{ + + private static Gson getGson( final int nChannels, final Settings updateTarget ) + { + final GsonBuilder builder = new GsonBuilder() + .setPrettyPrinting() + .serializeSpecialFloatingPointValues() + .registerTypeHierarchyAdapter( Roi.class, new RoiTypeAdapter() ) + .registerTypeHierarchyAdapter( SpotDetectorFactoryBase.class, new SpotDetectorTypeAdapter() ) + .registerTypeHierarchyAdapter( SpotTrackerFactory.class, new SpotTrackerTypeAdapter() ) + .registerTypeHierarchyAdapter( SpotAnalyzerFactoryBase.class, new SpotAnalyzerAdapter( nChannels ) ) + .registerTypeHierarchyAdapter( EdgeAnalyzer.class, new EdgeAnalyserTypeAdapter() ) + .registerTypeHierarchyAdapter( TrackAnalyzer.class, new TrackAnalyserTypeAdapter() ); + if ( updateTarget != null ) + builder.registerTypeAdapter( Settings.class, ( InstanceCreator< Settings > ) type -> updateTarget ); + return builder.create(); + } + + public static JsonElement toJsonTree( final Settings settings ) + { + final int nChannels = ( settings.imp == null ) ? 1 : settings.imp.getNChannels(); + return getGson( nChannels, null ).toJsonTree( settings ); + } + + public static void updateFromJsonTree( final Map< String, Object > settingsJson, final Settings updateTarget ) + { + final int nChannels = ( updateTarget.imp == null ) ? 1 : updateTarget.imp.getNChannels(); + final Gson gson = getGson( nChannels, updateTarget ); + final JsonElement tree = gson.toJsonTree( settingsJson ); + gson.fromJson( tree, Settings.class ); + + /* + * Post-processing: Since we are dealing with a Map< String, Object > + * settingsJson that is re returned by the N5Reader, we have some issues + * with the Json tree. All numbers are deserialized as doubles, and we + * need to convert some of them back to integers, particularly for the + * detector and tracker settings. We do this by using the default + * settings maps as a template, using the default value types to + * properly case numbers. + */ + final Map< String, Object > detectorDS = updateTarget.detectorFactory.getDefaultSettings(); + for ( final String key : detectorDS.keySet() ) + { + final Object val = updateTarget.detectorSettings.get( key ); + if ( val instanceof Double && detectorDS.get( key ) instanceof Integer ) + updateTarget.detectorSettings.put( key, ( ( Double ) val ).intValue() ); + } + + final Map< String, Object > trackerDS = updateTarget.trackerFactory.getDefaultSettings(); + for ( final String key : trackerDS.keySet() ) + { + final Object val = updateTarget.trackerSettings.get( key ); + if ( val instanceof Double && trackerDS.get( key ) instanceof Integer ) + updateTarget.trackerSettings.put( key, ( ( Double ) val ).intValue() ); + } + } + + private static class FactoryTypeAdapter< T extends TrackMateModule > extends TypeAdapter< T > + { + + private final AbstractProvider< T > provider; + + public FactoryTypeAdapter( final AbstractProvider< T > provider ) + { + this.provider = provider; + } + + @Override + public void write( final JsonWriter out, final T value ) throws IOException + { + out.value( value.getKey() ); + } + + @Override + public T read( final JsonReader in ) throws IOException + { + return provider.getFactory( in.nextString() ); + } + } + + @SuppressWarnings( "rawtypes" ) + private static class SpotDetectorTypeAdapter extends FactoryTypeAdapter< SpotDetectorFactoryBase > + { + + public SpotDetectorTypeAdapter() + { + super( new DetectorProvider() ); + } + + } + + private static class SpotTrackerTypeAdapter extends FactoryTypeAdapter< SpotTrackerFactory > + { + + public SpotTrackerTypeAdapter() + { + super( new TrackerProvider() ); + } + } + + private static class SpotAnalyzerAdapter extends TypeAdapter< SpotAnalyzerFactoryBase< ? > > + { + + private final SpotAnalyzerProvider spotAnalyzerProvider; + + private final Spot2DMorphologyAnalyzerProvider spot2dMorphologyAnalyzerProvider; + + private final Spot3DMorphologyAnalyzerProvider spot3dMorphologyAnalyzerProvider; + + public SpotAnalyzerAdapter( final int nChannels ) + { + spotAnalyzerProvider = new SpotAnalyzerProvider( nChannels ); + spot2dMorphologyAnalyzerProvider = new Spot2DMorphologyAnalyzerProvider( nChannels ); + spot3dMorphologyAnalyzerProvider = new Spot3DMorphologyAnalyzerProvider( nChannels ); + } + + @Override + public void write( final JsonWriter out, final SpotAnalyzerFactoryBase< ? > value ) throws IOException + { + out.value( value.getKey() ); + } + + @Override + public SpotAnalyzerFactoryBase< ? > read( final JsonReader in ) throws IOException + { + // Try each provider in turn + final String key = in.nextString(); + SpotAnalyzerFactoryBase< ? > factory = spotAnalyzerProvider.getFactory( key ); + if ( factory != null ) + return factory; + factory = spot2dMorphologyAnalyzerProvider.getFactory( key ); + if ( factory != null ) + return factory; + factory = spot3dMorphologyAnalyzerProvider.getFactory( key ); + if ( factory != null ) + return factory; + return null; + } + } + + private static class EdgeAnalyserTypeAdapter extends FactoryTypeAdapter< EdgeAnalyzer > + { + + public EdgeAnalyserTypeAdapter() + { + super( new EdgeAnalyzerProvider() ); + } + } + + private static class TrackAnalyserTypeAdapter extends FactoryTypeAdapter< TrackAnalyzer > + { + + public TrackAnalyserTypeAdapter() + { + super( new TrackAnalyzerProvider() ); + } + } + + private static class RoiTypeAdapter extends TypeAdapter< Roi > + { + + // We serialize only the bounding-box. + + @Override + public void write( final JsonWriter out, final Roi roi ) throws IOException + { + if ( roi == null ) + { + out.nullValue(); + return; + } + final Rectangle bounds = roi.getBounds(); + out.beginObject(); + out.name( "x" ).value( bounds.x ); + out.name( "y" ).value( bounds.y ); + out.name( "width" ).value( bounds.width ); + out.name( "height" ).value( bounds.height ); + out.endObject(); + } + + @Override + public Roi read( final JsonReader in ) throws IOException + { + if ( in.peek() == JsonToken.NULL ) + { + in.nextNull(); + return null; + } + int x = 0, y = 0, width = 0, height = 0; + in.beginObject(); + while ( in.hasNext() ) + { + switch ( in.nextName() ) + { + case "x": + x = in.nextInt(); + break; + case "y": + y = in.nextInt(); + break; + case "width": + width = in.nextInt(); + break; + case "height": + height = in.nextInt(); + break; + default: + in.skipValue(); + break; + } + } + in.endObject(); + return new Roi( x, y, width, height ); + } + } +} diff --git a/src/main/java/fiji/plugin/trackmate/tracking/TrackerKeys.java b/src/main/java/fiji/plugin/trackmate/tracking/TrackerKeys.java index 4016f4282..e87b376cd 100644 --- a/src/main/java/fiji/plugin/trackmate/tracking/TrackerKeys.java +++ b/src/main/java/fiji/plugin/trackmate/tracking/TrackerKeys.java @@ -251,13 +251,4 @@ public class TrackerKeys /** A default value for the {@value #KEY_CUTOFF_PERCENTILE} parameter. */ public static final double DEFAULT_CUTOFF_PERCENTILE = 0.9d; - /** - * Key for the parameter that stores the blocking value: cost for - * non-physical, forbidden links. Expected values are {@link Double}s, and - * are typically very large. - */ - public static final String KEY_BLOCKING_VALUE = "BLOCKING_VALUE"; - - /** A default value for the {@value #KEY_BLOCKING_VALUE} parameter. */ - public static final double DEFAULT_BLOCKING_VALUE = Double.POSITIVE_INFINITY; } diff --git a/src/main/java/fiji/plugin/trackmate/tracking/jaqaman/LAPUtils.java b/src/main/java/fiji/plugin/trackmate/tracking/jaqaman/LAPUtils.java index 09a714ed3..5fa66ab92 100644 --- a/src/main/java/fiji/plugin/trackmate/tracking/jaqaman/LAPUtils.java +++ b/src/main/java/fiji/plugin/trackmate/tracking/jaqaman/LAPUtils.java @@ -25,7 +25,6 @@ import static fiji.plugin.trackmate.tracking.TrackerKeys.DEFAULT_ALLOW_TRACK_MERGING; import static fiji.plugin.trackmate.tracking.TrackerKeys.DEFAULT_ALLOW_TRACK_SPLITTING; import static fiji.plugin.trackmate.tracking.TrackerKeys.DEFAULT_ALTERNATIVE_LINKING_COST_FACTOR; -import static fiji.plugin.trackmate.tracking.TrackerKeys.DEFAULT_BLOCKING_VALUE; import static fiji.plugin.trackmate.tracking.TrackerKeys.DEFAULT_CUTOFF_PERCENTILE; import static fiji.plugin.trackmate.tracking.TrackerKeys.DEFAULT_GAP_CLOSING_FEATURE_PENALTIES; import static fiji.plugin.trackmate.tracking.TrackerKeys.DEFAULT_GAP_CLOSING_MAX_DISTANCE; @@ -38,7 +37,6 @@ import static fiji.plugin.trackmate.tracking.TrackerKeys.KEY_ALLOW_TRACK_MERGING; import static fiji.plugin.trackmate.tracking.TrackerKeys.KEY_ALLOW_TRACK_SPLITTING; import static fiji.plugin.trackmate.tracking.TrackerKeys.KEY_ALTERNATIVE_LINKING_COST_FACTOR; -import static fiji.plugin.trackmate.tracking.TrackerKeys.KEY_BLOCKING_VALUE; import static fiji.plugin.trackmate.tracking.TrackerKeys.KEY_CUTOFF_PERCENTILE; import static fiji.plugin.trackmate.tracking.TrackerKeys.KEY_GAP_CLOSING_FEATURE_PENALTIES; import static fiji.plugin.trackmate.tracking.TrackerKeys.KEY_GAP_CLOSING_MAX_DISTANCE; @@ -158,7 +156,6 @@ public static final Map< String, Object > getDefaultSegmentSettingsMap() settings.put( KEY_MERGING_MAX_DISTANCE, DEFAULT_MERGING_MAX_DISTANCE ); settings.put( KEY_MERGING_FEATURE_PENALTIES, new HashMap<>( DEFAULT_MERGING_FEATURE_PENALTIES ) ); // Others - settings.put( KEY_BLOCKING_VALUE, DEFAULT_BLOCKING_VALUE ); settings.put( KEY_ALTERNATIVE_LINKING_COST_FACTOR, DEFAULT_ALTERNATIVE_LINKING_COST_FACTOR ); settings.put( KEY_CUTOFF_PERCENTILE, DEFAULT_CUTOFF_PERCENTILE ); // return @@ -294,7 +291,6 @@ public static final boolean checkSettingsValidity( final Map< String, Object > s // Others ok = ok & checkParameter( settings, KEY_CUTOFF_PERCENTILE, Double.class, errorHolder ); ok = ok & checkParameter( settings, KEY_ALTERNATIVE_LINKING_COST_FACTOR, Double.class, errorHolder ); - ok = ok & checkParameter( settings, KEY_BLOCKING_VALUE, Double.class, errorHolder ); // Check keys final List< String > mandatoryKeys = new ArrayList<>(); @@ -311,7 +307,6 @@ public static final boolean checkSettingsValidity( final Map< String, Object > s mandatoryKeys.add( KEY_MERGING_MAX_DISTANCE ); mandatoryKeys.add( KEY_ALTERNATIVE_LINKING_COST_FACTOR ); mandatoryKeys.add( KEY_CUTOFF_PERCENTILE ); - mandatoryKeys.add( KEY_BLOCKING_VALUE ); final List< String > optionalKeys = new ArrayList<>(); if ( linking ) { diff --git a/src/main/java/fiji/plugin/trackmate/tracking/jaqaman/SegmentTracker.java b/src/main/java/fiji/plugin/trackmate/tracking/jaqaman/SegmentTracker.java index a1fe2ea77..fcd20cba1 100644 --- a/src/main/java/fiji/plugin/trackmate/tracking/jaqaman/SegmentTracker.java +++ b/src/main/java/fiji/plugin/trackmate/tracking/jaqaman/SegmentTracker.java @@ -25,7 +25,6 @@ import static fiji.plugin.trackmate.tracking.TrackerKeys.KEY_ALLOW_TRACK_MERGING; import static fiji.plugin.trackmate.tracking.TrackerKeys.KEY_ALLOW_TRACK_SPLITTING; import static fiji.plugin.trackmate.tracking.TrackerKeys.KEY_ALTERNATIVE_LINKING_COST_FACTOR; -import static fiji.plugin.trackmate.tracking.TrackerKeys.KEY_BLOCKING_VALUE; import static fiji.plugin.trackmate.tracking.TrackerKeys.KEY_CUTOFF_PERCENTILE; import static fiji.plugin.trackmate.tracking.TrackerKeys.KEY_GAP_CLOSING_FEATURE_PENALTIES; import static fiji.plugin.trackmate.tracking.TrackerKeys.KEY_GAP_CLOSING_MAX_DISTANCE; @@ -278,7 +277,6 @@ private static final boolean checkSettingsValidity( final Map< String, Object > optionalKeys.add( KEY_GAP_CLOSING_FEATURE_PENALTIES ); optionalKeys.add( KEY_SPLITTING_FEATURE_PENALTIES ); optionalKeys.add( KEY_MERGING_FEATURE_PENALTIES ); - optionalKeys.add( KEY_BLOCKING_VALUE ); ok = ok & checkMapKeys( settings, mandatoryKeys, optionalKeys, str ); return ok; diff --git a/src/main/java/fiji/plugin/trackmate/tracking/jaqaman/SegmentTrackerFactory.java b/src/main/java/fiji/plugin/trackmate/tracking/jaqaman/SegmentTrackerFactory.java index ba9d6e215..c4a710f68 100644 --- a/src/main/java/fiji/plugin/trackmate/tracking/jaqaman/SegmentTrackerFactory.java +++ b/src/main/java/fiji/plugin/trackmate/tracking/jaqaman/SegmentTrackerFactory.java @@ -31,7 +31,6 @@ import static fiji.plugin.trackmate.tracking.TrackerKeys.KEY_ALLOW_TRACK_MERGING; import static fiji.plugin.trackmate.tracking.TrackerKeys.KEY_ALLOW_TRACK_SPLITTING; import static fiji.plugin.trackmate.tracking.TrackerKeys.KEY_ALTERNATIVE_LINKING_COST_FACTOR; -import static fiji.plugin.trackmate.tracking.TrackerKeys.KEY_BLOCKING_VALUE; import static fiji.plugin.trackmate.tracking.TrackerKeys.KEY_CUTOFF_PERCENTILE; import static fiji.plugin.trackmate.tracking.TrackerKeys.KEY_GAP_CLOSING_FEATURE_PENALTIES; import static fiji.plugin.trackmate.tracking.TrackerKeys.KEY_GAP_CLOSING_MAX_DISTANCE; @@ -109,7 +108,6 @@ public String marshal( final Map< String, Object > settings, final Element eleme // Others ok = ok & writeAttribute( settings, element, KEY_CUTOFF_PERCENTILE, Double.class, str ); ok = ok & writeAttribute( settings, element, KEY_ALTERNATIVE_LINKING_COST_FACTOR, Double.class, str ); - ok = ok & writeAttribute( settings, element, KEY_BLOCKING_VALUE, Double.class, str ); if ( !ok ) return str.toString(); @@ -188,7 +186,6 @@ public boolean unmarshallSegment( final Element element, final Map< String, Obje // Others ok = ok & readDoubleAttribute( element, settings, KEY_CUTOFF_PERCENTILE, errorHolder ); ok = ok & readDoubleAttribute( element, settings, KEY_ALTERNATIVE_LINKING_COST_FACTOR, errorHolder ); - ok = ok & readDoubleAttribute( element, settings, KEY_BLOCKING_VALUE, errorHolder ); return ok; } diff --git a/src/test/java/fiji/plugin/trackmate/io/TmGeffWriterTestDrive.java b/src/test/java/fiji/plugin/trackmate/io/TmGeffWriterTestDrive.java deleted file mode 100644 index 579a6c8a0..000000000 --- a/src/test/java/fiji/plugin/trackmate/io/TmGeffWriterTestDrive.java +++ /dev/null @@ -1,28 +0,0 @@ -package fiji.plugin.trackmate.io; - -import java.io.File; -import java.io.IOException; - -import fiji.plugin.trackmate.Model; - -public class TmGeffWriterTestDrive -{ - - public static void main( final String[] args ) throws IOException - { - final String path = "samples/FakeTracks.xml"; - final TmXmlReader reader = new TmXmlReader( new File( path ) ); - if ( !reader.isReadingOk() ) - { - System.err.println( reader.getErrorMessage() ); - return; - } - final String savePath = path.replace( ".xml", ".geff" ); - - final Model model = reader.getModel(); - - System.out.println( "Writing to " + savePath ); - TmGeffWriter.write( model, savePath ); - System.out.println( "Done." ); - } -} diff --git a/src/test/java/fiji/plugin/trackmate/io/geff/GeffTestBase.java b/src/test/java/fiji/plugin/trackmate/io/geff/GeffTestBase.java new file mode 100644 index 000000000..c07cc0d06 --- /dev/null +++ b/src/test/java/fiji/plugin/trackmate/io/geff/GeffTestBase.java @@ -0,0 +1,54 @@ +package fiji.plugin.trackmate.io.geff; + +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * Base class for GEFF tests. Sets up the native library path for blosc + * before any test code runs, covering all platforms and environments + * (Eclipse, Maven, CI) without requiring manual run configuration. + */ +public abstract class GeffTestBase +{ + static + { + setupJnaLibraryPath(); + } + + /** + * Prepends common blosc installation directories to {@code jna.library.path} + * so JNA can find {@code libblosc} regardless of the execution environment. + *

+ * Priority order matters: more specific paths (Apple Silicon Homebrew) come + * before more generic ones so the correct architecture is always preferred. + */ + private static void setupJnaLibraryPath() + { + final String[] candidates = { + "/opt/homebrew/lib", // macOS Apple Silicon (Homebrew) + "/usr/local/lib", // macOS Intel (Homebrew) or manual install + "/usr/lib", // Linux generic + "/usr/lib/x86_64-linux-gnu", // Ubuntu / Debian x86_64 + "/usr/lib/aarch64-linux-gnu", // Ubuntu / Debian ARM64 + }; + + // Start from whatever is already set (e.g. by Maven Surefire -D flags) + final String existing = System.getProperty( "jna.library.path", "" ); + final List< String > paths = new ArrayList<>( + Arrays.asList( existing.split( File.pathSeparator ) ) ); + paths.removeIf( String::isEmpty ); + + for ( final String candidate : candidates ) + { + final File dir = new File( candidate ); + if ( dir.isDirectory() && !paths.contains( candidate ) ) + paths.add( candidate ); + } + + final String joined = String.join( File.pathSeparator, paths ); + System.setProperty( "jna.library.path", joined ); + System.out.println( "[GeffTestBase] jna.library.path = " + joined ); + } +} diff --git a/src/test/java/fiji/plugin/trackmate/io/geff/GeffTestDeserializationTest.java b/src/test/java/fiji/plugin/trackmate/io/geff/GeffTestDeserializationTest.java new file mode 100644 index 000000000..c23297c29 --- /dev/null +++ b/src/test/java/fiji/plugin/trackmate/io/geff/GeffTestDeserializationTest.java @@ -0,0 +1,444 @@ +package fiji.plugin.trackmate.io.geff; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.File; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import org.assertj.core.presentation.StandardRepresentation; +import org.jgrapht.graph.DefaultWeightedEdge; +import org.junit.BeforeClass; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + +import fiji.plugin.trackmate.FeatureModel; +import fiji.plugin.trackmate.Model; +import fiji.plugin.trackmate.Settings; +import fiji.plugin.trackmate.Spot; +import fiji.plugin.trackmate.SpotCollection; +import fiji.plugin.trackmate.SpotRoi; +import fiji.plugin.trackmate.TrackModel; +import fiji.plugin.trackmate.gui.displaysettings.DisplaySettings; +import fiji.plugin.trackmate.io.TmXmlReader; + +/** + * Tests that check that a TrackMate model, settings etc, can be written and + * read to / from a GEFF file, and that the resulting objects are identical. + */ +public class GeffTestDeserializationTest extends GeffTestBase +{ + + /** + * A TrackMate XML file generated with TrackMate v8, containing only + * 'SpotBase' spots. + */ + static final String SPOT_BASE_PATH = GeffTestDeserializationTest.class + .getResource( "FakeTracks.xml" ) + .getFile(); + + /** + * A TrackMate XML file generated with TrackMate v8, containing only + * 'SpotRoi' spots. + */ + static final String SPOT_ROI_PATH = GeffTestDeserializationTest.class + .getResource( "MAX_Merged.xml" ) + .getFile(); + + /** + * A TrackMate XML file generated with TrackMate v8, containing 'SpotBase + * and 'SpotRoi' spots. + */ + static final String SPOT_MIXED_PATH = GeffTestDeserializationTest.class + .getResource( "MAX_Merged-mixed.xml" ) + .getFile(); + + @Test + public void testSpotBaseSerialization() throws Exception + { + testModelSerialization( SPOT_BASE_PATH ); + } + + @Test + public void testSpotRoiSerialization() throws Exception + { + testModelSerialization( SPOT_ROI_PATH ); + } + + @Test + public void testSpotMixedSerialization() throws Exception + { + testModelSerialization( SPOT_MIXED_PATH ); + } + + /** + * JUnit 4 rule that creates a temporary folder that is guaranteed to exist + * and be writable, and is automatically deleted after each test. + */ + @Rule + public TemporaryFolder temporaryFolder = new TemporaryFolder(); + + protected void testModelSerialization( final String path ) throws Exception + { + final TmXmlReader reader = new TmXmlReader( new File( path ) ); + if ( !reader.isReadingOk() ) + throw new Exception( reader.getErrorMessage() ); + + final Model initialModel = reader.getModel(); + final Settings initialSettings = reader.readSettings( null ); + final DisplaySettings initialDisplaySettings = reader.getDisplaySettings(); + final String initialLog = reader.getLog(); + final String initialGUIState = reader.getGUIState(); + + final String geffFile = new File( temporaryFolder.getRoot(), "test.geff" ).getAbsolutePath(); + final TmGeffWriter geffWriter = new TmGeffWriter( geffFile ); + geffWriter.appendModel( initialModel ); + geffWriter.appendSettings( initialSettings ); + geffWriter.appendDisplaySettings( initialDisplaySettings ); + geffWriter.appendLog( initialLog ); + geffWriter.appendGUIState( initialGUIState ); + geffWriter.write(); + + final TmGeffReader geffReader = new TmGeffReader( geffFile ); + + final Model readBackModel = geffReader.getModel(); + testModelEquality( initialModel, readBackModel ); + + final Settings readBackSettings = geffReader.readSettings( null ); + testSettingsEquality( initialSettings, readBackSettings ); + + final DisplaySettings readBackDisplaySettings = geffReader.getDisplaySettings(); + testDisplaySettingsEquality( initialDisplaySettings, readBackDisplaySettings ); + + final String readBackLog = geffReader.getLog(); + assertThat( readBackLog ) + .as( "TrackMate log" ) + .isEqualTo( initialLog ); + + final String readBackGUIState = geffReader.getGUIState(); + assertThat( readBackGUIState ) + .as( "TrackMate GUI state" ) + .isEqualTo( initialGUIState ); + } + + private void testDisplaySettingsEquality( final DisplaySettings initialDisplaySettings, final DisplaySettings readBackDisplaySettings ) + { + assertThat( initialDisplaySettings ) + .withRepresentation( new StandardRepresentation() + { + @Override + public String toStringOf( final Object obj ) + { + if ( obj instanceof final DisplaySettings ds ) + return String.format( "DisplaySettings[%d]", ds.hashCode() ); + return super.toStringOf( obj ); + } + } ) + .usingRecursiveComparison() + .isEqualTo( readBackDisplaySettings ); + } + + private void testSettingsEquality( final Settings initialSettings, final Settings readBackSettings ) + { + + assertThat( initialSettings ) + .withRepresentation( new StandardRepresentation() + { + @Override + public String toStringOf( final Object obj ) + { + if ( obj instanceof final Settings s ) + return String.format( "Settings[%d]", s.hashCode() ); + return super.toStringOf( obj ); + } + } ) + .usingRecursiveComparison() + .isEqualTo( readBackSettings ); + } + + private void testModelEquality( final Model initialModel, final Model readBackModel ) + { + assertThat( initialModel ) + .withRepresentation( new StandardRepresentation() + { + @Override + public String toStringOf( final Object obj ) + { + if ( obj instanceof final Model m ) + return String.format( "Model[%d]", m.hashCode() ); + return super.toStringOf( obj ); + } + } ) + .usingRecursiveComparison() + .withEqualsForType( + // Used to pair spots in sets. + ( a, b ) -> a.ID() == b.ID(), Spot.class ) + .ignoringFields( + // Treated separately + "spots", + "featureModel", + "trackModel", + // Listeners + "modelChangeListeners", + // Utils + "logger", + // Transaction state fields + "updateLevel", + "spotsAdded", + "spotsRemoved", + "spotsMoved", + "spotsUpdated", + "eventCache" ) + .isEqualTo( readBackModel ); + + /* + * SpotCollection + */ + + compareSpotCollections( initialModel.getSpots(), readBackModel.getSpots() ); + + /* + * Feature model + */ + + assertThat( initialModel.getFeatureModel() ) + .withRepresentation( new StandardRepresentation() + { + @Override + public String toStringOf( final Object obj ) + { + if ( obj instanceof final FeatureModel fm ) + return String.format( "FeatureModel[%d]", fm.hashCode() ); + return super.toStringOf( obj ); + } + } ) + .usingRecursiveComparison() + .ignoringFields( + "model", // Transient + "edgeFeatureValues" ) // Treated separately ) + .isEqualTo( readBackModel.getFeatureModel() ); + + // Compare edge feature values separately, because the keys are + // DefaultWeightedEdge objects + compareEdgeFeatureValues( initialModel, readBackModel ); + + /* + * Track model + */ + + compareTrackModels( initialModel.getTrackModel(), readBackModel.getTrackModel() ); + } + + private static void compareSpotCollections( final SpotCollection actual, final SpotCollection expected ) + { + // Same frames + assertThat( actual.keySet() ) + .as( "SpotCollection frames" ) + .containsExactlyInAnyOrderElementsOf( expected.keySet() ); + + actual.keySet().forEach( frame -> { + + final Iterable< Spot > actualSpots = actual.iterable( frame, false ); + final Iterable< Spot > expectedSpots = expected.iterable( frame, false ); + + // Same number of spots per frame + assertThat( actualSpots ) + .as( "number of spots in frame %d", frame ) + .hasSameSizeAs( expectedSpots ); + + // Build ID -> Spot lookup for expected + final Map< Integer, Spot > expectedById = new HashMap<>(); + expectedSpots.forEach( s -> expectedById.put( s.ID(), s ) ); + + actualSpots.forEach( actualSpot -> { + + // Spot exists in expected + final Spot expectedSpot = expectedById.get( actualSpot.ID() ); + assertThat( expectedSpot ) + .as( "Spot ID=%d missing in frame %d", actualSpot.ID(), frame ) + .isNotNull(); + + // Delegate to single-spot comparison + assertSpotEquals( actualSpot, expectedSpot ); + } ); + } ); + } + + private static void assertSpotEquals( final Spot actual, final Spot expected ) + { + // 1. Check same implementation type + assertThat( actual.getClass() ) + .as( "Spot ID=%d implementation type", actual.ID() ) + .isEqualTo( expected.getClass() ); + + // 2. Basic identity + assertThat( actual.ID() ) + .as( "Spot ID" ) + .isEqualTo( expected.ID() ); + + assertThat( actual.getName() ) + .as( "Spot ID=%d name", actual.ID() ) + .isEqualTo( expected.getName() ); + + // 3. Feature keys + assertThat( actual.getFeatures().keySet() ) + .as( "Spot ID=%d feature keys", actual.ID() ) + .containsExactlyInAnyOrderElementsOf( + expected.getFeatures().keySet() ); + + // 4. Feature values + assertThat( actual.getFeatures() ) + .as( "Spot ID=%d feature values", actual.ID() ) + .allSatisfy( ( key, value ) -> assertThat( value ) + .as( "Spot ID=%d feature '%s'", actual.ID(), key ) + .isEqualTo( + expected.getFeatures().getOrDefault( key, Double.NaN ) ) ); + + // 5. SpotRoi-specific: polygon coordinates + if ( actual instanceof SpotRoi ) + assertSpotRoiEquals( ( SpotRoi ) actual, ( SpotRoi ) expected ); + } + + private static void assertSpotRoiEquals( final SpotRoi actual, final SpotRoi expected ) + { + // Number of polygon vertices + assertThat( actual.nPoints() ) + .as( "SpotRoi ID=%d number of polygon points", actual.ID() ) + .isEqualTo( expected.nPoints() ); + + // X coordinates of polygon vertices (relative to center) + for ( int i = 0; i < actual.nPoints(); i++ ) + { + final int idx = i; // for lambda capture + assertThat( actual.xr( i ) ) + .as( "SpotRoi ID=%d polygon x[%d]", actual.ID(), idx ) + .isEqualTo( expected.xr( i ) ); + + assertThat( actual.yr( i ) ) + .as( "SpotRoi ID=%d polygon y[%d]", actual.ID(), idx ) + .isEqualTo( expected.yr( i ) ); + } + } + + private void compareTrackModels( final TrackModel actual, final TrackModel expected ) + { + // 1. All spots in the graph (including isolated ones) + assertThat( actual.vertexSet().stream() + .map( s -> s.ID() ) + .collect( Collectors.toSet() ) ) + .as( "TrackModel: spot IDs" ) + .containsExactlyInAnyOrderElementsOf( + expected.vertexSet().stream() + .map( s -> s.ID() ) + .collect( Collectors.toSet() ) ); + + // 2. Edge topology and weights + final Map< String, Double > actualEdges = buildEdgeWeightMap( actual ); + final Map< String, Double > expectedEdges = buildEdgeWeightMap( expected ); + + assertThat( actualEdges.keySet() ) + .as( "TrackModel: edges" ) + .containsExactlyInAnyOrderElementsOf( expectedEdges.keySet() ); + + assertThat( actualEdges ) + .as( "TrackModel: edge weights" ) + .allSatisfy( ( edgeKey, weight ) -> assertThat( weight ) + .as( "weight of edge [%s]", edgeKey ) + .isEqualTo( expectedEdges.get( edgeKey ) ) ); + + // 3. Track structure, visibility and names + compareTracks( actual, expected ); + } + + /** + * Build "srcID->tgtID" -> weight map, independent of edge object identity. + */ + private static Map< String, Double > buildEdgeWeightMap( final TrackModel model ) + { + final Map< String, Double > map = new LinkedHashMap<>(); + model.edgeSet().forEach( e -> { + final String key = model.getEdgeSource( e ).ID() + "->" + model.getEdgeTarget( e ).ID(); + map.put( key, model.getEdgeWeight( e ) ); + } ); + return map; + } + + /** Compare tracks matched by spot content, not by track ID. */ + private static void compareTracks( final TrackModel actual, final TrackModel expected ) + { + final Set< Integer > actualTrackIDs = actual.trackIDs( false ); + final Set< Integer > expectedTrackIDs = expected.trackIDs( false ); + + assertThat( actualTrackIDs ) + .as( "TrackModel: identical tracks IDs" ) + .isEqualTo( expectedTrackIDs ); + + actualTrackIDs.forEach( actualTID -> { + + // Visibility + assertThat( actual.isVisible( actualTID ) ) + .as( "visibility of track ID: [%d]", actualTID ) + .isEqualTo( expected.isVisible( actualTID ) ); + + // Name + assertThat( actual.name( actualTID ) ) + .as( "name of track ID: [%d]", actualTID ) + .isEqualTo( expected.name( actualTID ) ); + } ); + } + + private void compareEdgeFeatureValues( final Model m1, final Model m2 ) + { + final FeatureModel fm1 = m1.getFeatureModel(); + final FeatureModel fm2 = m2.getFeatureModel(); + + // If so, iterate edges from the track model instead: + m1.getTrackModel().edgeSet().forEach( edge -> { + final int sId = m1.getTrackModel().getEdgeSource( edge ).ID(); + final int tId = m1.getTrackModel().getEdgeTarget( edge ).ID(); + + // Find matching edge in readback model + final DefaultWeightedEdge matchedEdge = m2.getTrackModel().edgeSet().stream() + .filter( e -> m2.getTrackModel().getEdgeSource( e ).ID() == sId + && m2.getTrackModel().getEdgeTarget( e ).ID() == tId ) + .findFirst() + .orElseThrow( () -> new AssertionError( "No matching edge for ID" + sId + " -> ID" + tId ) ); + + // Compare feature by feature + fm1.getEdgeFeatures() + .forEach( featureKey -> { + final Double actual = fm1.getEdgeFeature( edge, featureKey ); + final Double expected = fm2.getEdgeFeature( matchedEdge, featureKey ); + + // Both null is ok. + if ( actual == null && expected == null ) + return; + + assertThat( actual ) + .as( "feature '%s' on edge (ID%d -> ID%d)", featureKey, sId, tId ) + .isEqualTo( expected ); + } ); + } ); + } + + @BeforeClass + public static void checkBlosc() + { + System.out.println( "[GeffCompatSpotBaseTest] Checking that blosc is loadable..." ); + System.out.println( "jna.library.path = " + System.getProperty( "jna.library.path" ) ); + System.out.println( "java.library.path = " + System.getProperty( "java.library.path" ) ); + try + { + new org.janelia.saalfeldlab.n5.blosc.BloscCompression(); + System.out.println( "blosc loaded successfully" ); + } + catch ( final Throwable t ) + { + System.err.println( "blosc load failed: " + t.getMessage() ); + } + } +} diff --git a/src/test/java/fiji/plugin/trackmate/io/geff/TmGeffIODemo.java b/src/test/java/fiji/plugin/trackmate/io/geff/TmGeffIODemo.java new file mode 100644 index 000000000..c670379ad --- /dev/null +++ b/src/test/java/fiji/plugin/trackmate/io/geff/TmGeffIODemo.java @@ -0,0 +1,176 @@ +package fiji.plugin.trackmate.io.geff; + +import static fiji.plugin.trackmate.gui.Icons.TRACKMATE_ICON; + +import java.awt.Color; +import java.io.File; +import java.io.IOException; + +import javax.swing.JFrame; + +import org.apache.commons.io.FileUtils; + +import fiji.plugin.trackmate.Logger; +import fiji.plugin.trackmate.Model; +import fiji.plugin.trackmate.SelectionModel; +import fiji.plugin.trackmate.Settings; +import fiji.plugin.trackmate.TrackMate; +import fiji.plugin.trackmate.features.edges.EdgeAnalyzer; +import fiji.plugin.trackmate.features.spot.SpotAnalyzerFactoryBase; +import fiji.plugin.trackmate.features.track.TrackAnalyzer; +import fiji.plugin.trackmate.gui.GuiUtils; +import fiji.plugin.trackmate.gui.components.LogPanel; +import fiji.plugin.trackmate.gui.displaysettings.DisplaySettings; +import fiji.plugin.trackmate.gui.wizard.TrackMateWizardSequence; +import fiji.plugin.trackmate.gui.wizard.WizardSequence; +import fiji.plugin.trackmate.gui.wizard.descriptors.LogPanelDescriptor2; +import fiji.plugin.trackmate.gui.wizard.descriptors.StartDialogDescriptor; +import fiji.plugin.trackmate.io.TmXmlReader; +import fiji.plugin.trackmate.util.TMUtils; +import fiji.plugin.trackmate.visualization.TrackMateModelView; +import fiji.plugin.trackmate.visualization.hyperstack.HyperStackDisplayer; +import ij.ImagePlus; + +public class TmGeffIODemo +{ + + public static void main( final String[] args ) throws IOException + { + final String path = GeffTestDeserializationTest.SPOT_MIXED_PATH; + System.out.println( "Reading from " + path ); + final TmXmlReader reader = new TmXmlReader( new File( path ) ); + if ( !reader.isReadingOk() ) + { + System.err.println( reader.getErrorMessage() ); + return; + } + System.out.println( "Done." ); + final String savePath = path.replace( ".xml", ".geff" ); + + final Model model = reader.getModel(); + final ImagePlus imp = reader.readImage(); + final Settings settings = reader.readSettings( imp ); + + System.out.println( "Deleting previous " + savePath ); + FileUtils.deleteDirectory( new File( savePath ) ); + System.out.println( "Done." ); + + System.out.println( "Writing to " + savePath ); + + final TmGeffWriter geffWriter = new TmGeffWriter( savePath ); + geffWriter.appendModel( model ); + geffWriter.appendSettings( settings ); + geffWriter.appendDisplaySettings( reader.getDisplaySettings() ); + geffWriter.appendLog( reader.getLog() ); + geffWriter.appendGUIState( reader.getGUIState() ); + geffWriter.write(); + + System.out.println( "Done." ); + + System.out.println( "Reading the model back from " + savePath ); + readBack( savePath ); + } + + private static void readBack( final String savePath ) throws IOException + { + final TmGeffReader geffReader = new TmGeffReader( savePath ); + + // Model + final Model model = geffReader.getModel(); + + // Image + final ImagePlus imp = geffReader.readImage(); + + // Settings + final Settings settings = geffReader.readSettings( imp ); + + /* + * Declare the analyzers that are in the settings to the model. This is + * required when we are loading a file that does not have the analyzer + * presents at runtime declared in the settings section of the file. + */ + for ( final SpotAnalyzerFactoryBase< ? > analyzer : settings.getSpotAnalyzerFactories() ) + model.getFeatureModel().declareSpotFeatures( + analyzer.getFeatures(), + analyzer.getFeatureNames(), + analyzer.getFeatureShortNames(), + analyzer.getFeatureDimensions(), + analyzer.getIsIntFeature() ); + + for ( final EdgeAnalyzer analyzer : settings.getEdgeAnalyzers() ) + model.getFeatureModel().declareEdgeFeatures( + analyzer.getFeatures(), + analyzer.getFeatureNames(), + analyzer.getFeatureShortNames(), + analyzer.getFeatureDimensions(), + analyzer.getIsIntFeature() ); + for ( final TrackAnalyzer analyzer : settings.getTrackAnalyzers() ) + model.getFeatureModel().declareTrackFeatures( + analyzer.getFeatures(), + analyzer.getFeatureNames(), + analyzer.getFeatureShortNames(), + analyzer.getFeatureDimensions(), + analyzer.getIsIntFeature() ); + + // Display settings + final DisplaySettings displaySettings = geffReader.getDisplaySettings(); + + // GUI state + final String panelIdentifier = geffReader.getGUIState(); + + // Log + final String log = geffReader.getLog(); + + // Put them together in a TrackMate instance. + final TrackMate trackmate = new TrackMate( model, settings ); + final SelectionModel selectionModel = new SelectionModel( model ); + + // Main view. + final TrackMateModelView displayer = new HyperStackDisplayer( model, selectionModel, settings.imp, displaySettings ); + displayer.render(); + + // Wizard. + final WizardSequence sequence = new TrackMateWizardSequence( trackmate, selectionModel, displaySettings ); + sequence.setCurrent( panelIdentifier ); + final JFrame frame = sequence.run( "From GEFF: " + savePath ); + frame.setIconImage( TRACKMATE_ICON.getImage() ); + GuiUtils.positionWindow( frame, settings.imp.getWindow() ); + + // Text + final LogPanelDescriptor2 logDescriptor = ( LogPanelDescriptor2 ) sequence.logDescriptor(); + final LogPanel logPanel = ( LogPanel ) logDescriptor.getPanelComponent(); + final Logger logger2 = logPanel.getLogger(); + + logger2.log( "Session log saved in the file:\n" + + "--------------------\n" + + log + + "--------------------\n", + Color.GRAY ); + + final String warning = ""; + if ( !warning.isEmpty() ) + { + logger2.log( "Warnings occurred during reading the file:\n" + + "--------------------\n" + + warning + + "--------------------\n", + Color.ORANGE.darker() ); + } + logger2.log( "File loaded on " + TMUtils.getCurrentTimeString() + '\n', Logger.BLUE_COLOR ); + final String welcomeMessage = TrackMate.PLUGIN_NAME_STR + " v" + TrackMate.PLUGIN_NAME_VERSION + '\n'; + // Log GUI processing start + logger2.log( welcomeMessage, Logger.BLUE_COLOR ); + logger2.log( "Please note that TrackMate is available through Fiji, and is based on a publication. " + + "If you use it successfully for your research please be so kind to cite our work:\n" ); + logger2.log( StartDialogDescriptor.PUB2_TXT + "\n", Logger.GREEN_COLOR ); + logger2.log( StartDialogDescriptor.PUB2_URL + "\n", Logger.BLUE_COLOR ); + logger2.log( "and / or:\n" ); + logger2.log( StartDialogDescriptor.PUB1_TXT + "\n", Logger.GREEN_COLOR ); + logger2.log( StartDialogDescriptor.PUB1_URL + "\n", Logger.BLUE_COLOR ); + logger2.log( "and / or:\n" ); + logger2.log( StartDialogDescriptor.PUB0_TXT + "\n", Logger.GREEN_COLOR ); + logger2.log( StartDialogDescriptor.PUB0_URL + "\n", Logger.BLUE_COLOR ); + + frame.setVisible( true ); + } +} diff --git a/src/test/resources/fiji/plugin/trackmate/io/geff/FakeTracks.xml b/src/test/resources/fiji/plugin/trackmate/io/geff/FakeTracks.xml new file mode 100644 index 000000000..28992be52 --- /dev/null +++ b/src/test/resources/fiji/plugin/trackmate/io/geff/FakeTracks.xml @@ -0,0 +1,757 @@ + + + Session log saved in the file: +-------------------- +TrackMate v8.1.6 started on: +Thu, 23 Jul 2026 09:44:18 +Please note that TrackMate is available through iji, and is based on a publication. If you use it successfully for your research please be so kind to cite our work: +rshov, D., Phan, MS., Pylvänäinen, J.W., Rigaud S.U., et al. TrackMate 7: integrating state-of-the-art segmentation algorithms into tracking pipelines. Nat Methods (2022). https://doi.org/10.1038/s41592-022-01507-1 +https://doi.org/10.1038/s41592-022-01507-1 +and / or: +Tinevez, JY.; Perry, N. & Schindelin, J. et al. (2017), 'TrackMate: An open and extensible platform for single-particle tracking.', Methods 115: 80-90, PMID 27713081. +https://www.sciencedirect.com/science/article/pii/S1046202316303346 + +Numerical feature analyzers: +Spot feature analyzers: + - Manual spot color provides: Spot color; is manual. + - Spot intensity provides: Mean ch1, Median ch1, Min ch1, Max ch1, Sum ch1, Std ch1. + - xTrack probabilities provides: P stuck, P diffusive; is manual. + - Spot contrast and SNR provides: Ctrst ch1, SNR ch1. +dge feature analyzers: + - Directional change provides: γ rate. + - dge speed provides: Speed, Disp. + - dge target provides: Source ID, Target ID, Cost. + - dge location provides: dge T, dge X, dge Y, dge Z. + - Manual edge color provides: dge color; is manual. +Track feature analyzers: + - Branching analyzer provides: N spots, N gaps, N splits, N merges, N complex, Lgst gap. + - Track duration provides: Duration, Track start, Track stop, Track disp. + - Track index provides: Index, ID. + - Track location provides: Track X, Track Y, Track Z. + - Track speed provides: Mean sp., Max speed, Min speed, Med. speed, Std speed. + - Track quality provides: Mean Q. + - Track motility analysis provides: Total dist., Max dist., Cfn. ratio, Mn. v. line, wd. progr., Mn. γ rate. + +Image region of interest: +Image data: +or the image named: akeTracks.tif. +Matching file akeTracks.tif in folder: /Users/tinevez/Development/TrackMateWS/TrackMate/samples/ +Geometry: + X = 6 - 122, dx = 1.00000 + Y = 1 - 125, dy = 1.00000 + Z = 0 - 0, dz = 1.00000 + T = 0 - 49, dt = 1.00000 + +Configured detector LoG detector with settings: + - target channel: 1 + - threshold: 0.0 + - radius: 2.5 + - do subpixel localization: true + - do median filtering: false + +Starting detection process using 12 threads. +Detection processes 12 frames simultaneously and allocates 1 thread per frame. +ound 19359 spots. +Detection done in 0.3 s. + +Computing spot quality histogram... +Initial thresholding with a quality threshold above 19.0 ... +Starting initial filtering process. +Retained 233 spots out of 19359. + +Calculating spot features... +Calculating features done in 0.0 s. + +Performing spot filtering on the following features: + - on Quality above 60.0 +Kept 84 spots out of 233. + +Configured tracker LAP Tracker with settings: + - max frame gap: 2 + - alternative linking cost factor: 1.05 + - linking feature penalties: + - linking max distance: 15.0 + - gap closing max distance: 15.0 + - merging feature penalties: + - splitting max distance: 15.0 + - blocking value: Infinity + - allow gap closing: true + - allow track splitting: false + - allow track merging: false + - merging max distance: 15.0 + - splitting feature penalties: + - cutoff percentile: 0.9 + - gap closing feature penalties: + +Starting tracking process. +Tracking done in 0.0 s. +ound 4 tracks. + - avg size: 21.0 spots. + - min size: 10 spots. + - max size: 42 spots. + +Configured tracker LAP Tracker with settings: + - max frame gap: 2 + - alternative linking cost factor: 1.05 + - linking feature penalties: + - linking max distance: 15.0 + - gap closing max distance: 15.0 + - merging feature penalties: + - splitting max distance: 15.0 + - blocking value: Infinity + - allow gap closing: true + - allow track splitting: true + - allow track merging: false + - merging max distance: 15.0 + - splitting feature penalties: + - cutoff percentile: 0.9 + - gap closing feature penalties: + +Starting tracking process. +Tracking done in 0.0 s. +ound 2 tracks. + - avg size: 42.0 spots. + - min size: 10 spots. + - max size: 74 spots. + +Calculating features done in 0.0 s. + +Performing track filtering on the following features: + - on Number of spots in track above 40.0 +Kept 1 spots out of 2. +Saving data... +Computing edge features: + - Directional change in 0 ms. + - dge speed in 1 ms. + - dge target in 0 ms. + - dge location in 1 ms. +Computation done in 3 ms. +Computing track features: + - Branching analyzer in 0 ms. + - Track duration in 1 ms. + - Track index in 0 ms. + - Track location in 0 ms. + - Track speed in 0 ms. + - Track quality in 0 ms. + - Track motility analysis in 0 ms. +Computation done in 1 ms. +-------------------- +ile loaded on Thu, 23 Jul 2026 09:45:19 +TrackMate v8.1.6 +Please note that TrackMate is available through iji, and is based on a publication. If you use it successfully for your research please be so kind to cite our work: +rshov, D., Phan, MS., Pylvänäinen, J.W., Rigaud S.U., et al. TrackMate 7: integrating state-of-the-art segmentation algorithms into tracking pipelines. Nat Methods (2022). https://doi.org/10.1038/s41592-022-01507-1 +https://doi.org/10.1038/s41592-022-01507-1 +and / or: +Tinevez, JY.; Perry, N. & Schindelin, J. et al. (2017), 'TrackMate: An open and extensible platform for single-particle tracking.', Methods 115: 80-90, PMID 27713081. +https://www.sciencedirect.com/science/article/pii/S1046202316303346 + +Performing track filtering on the following features: + - on Number of spots in track above -1.3 +Kept 2 spots out of 2. + +Performing track filtering on the following features: + - on Number of spots in track above 40.0 +Kept 1 spots out of 2. +Saving data... +Computing edge features: + - Directional change in 2 ms. + - dge speed in 0 ms. + - dge target in 2 ms. + - dge location in 2 ms. +Computation done in 8 ms. +Computing track features: + - Branching analyzer in 0 ms. + - Track duration in 0 ms. + - Track index in 0 ms. + - Track location in 0 ms. + - Track speed in 0 ms. + - Track quality in 3 ms. + - Track motility analysis in 0 ms. +Computation done in 4 ms. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { + "name": "CurrentDisplaySettings", + "spotUniformColor": "204, 51, 204, 255", + "spotColorByType": "TRACKS", + "spotColorByFeature": "TRACK_INDEX", + "spotDisplayRadius": 1.0, + "spotDisplayedAsRoi": true, + "spotMin": 0.0, + "spotMax": 10.0, + "spotShowName": true, + "trackMin": 0.0, + "trackMax": 10.0, + "trackColorByType": "TRACKS", + "trackColorByFeature": "TRACK_INDEX", + "trackUniformColor": "204, 204, 51, 255", + "undefinedValueColor": "0, 0, 0, 255", + "missingValueColor": "89, 89, 89, 255", + "highlightColor": "51, 230, 51, 255", + "trackDisplayMode": "FULL", + "colormap": "Jet", + "limitZDrawingDepth": false, + "drawingZDepth": 10.0, + "fadeTracks": true, + "fadeTrackRange": 30, + "useAntialiasing": true, + "spotVisible": true, + "trackVisible": true, + "font": { + "name": "Arial", + "style": 1, + "size": 12 + }, + "lineThickness": 1.0, + "selectionLineThickness": 4.0, + "trackschemeBackgroundColor1": "128, 128, 128, 255", + "trackschemeBackgroundColor2": "192, 192, 192, 255", + "trackschemeForegroundColor": "0, 0, 0, 255", + "trackschemeDecorationColor": "0, 0, 0, 255", + "trackschemeFillBox": false, + "spotFilled": false, + "spotTransparencyAlpha": 1.0 +} + diff --git a/src/test/resources/fiji/plugin/trackmate/io/geff/MAX_Merged-mixed.xml b/src/test/resources/fiji/plugin/trackmate/io/geff/MAX_Merged-mixed.xml new file mode 100644 index 000000000..b44b0d4d8 --- /dev/null +++ b/src/test/resources/fiji/plugin/trackmate/io/geff/MAX_Merged-mixed.xml @@ -0,0 +1,532 @@ + + + Session log saved in the file: +-------------------- +TrackMate v8.1.6 started on: +ri, 24 Jul 2026 10:16:29 +Please note that TrackMate is available through iji, and is based on a publication. If you use it successfully for your research please be so kind to cite our work: +rshov, D., Phan, MS., Pylvänäinen, J.W., Rigaud S.U., et al. TrackMate 7: integrating state-of-the-art segmentation algorithms into tracking pipelines. Nat Methods (2022). https://doi.org/10.1038/s41592-022-01507-1 +https://doi.org/10.1038/s41592-022-01507-1 +and / or: +Tinevez, JY.; Perry, N. & Schindelin, J. et al. (2017), 'TrackMate: An open and extensible platform for single-particle tracking.', Methods 115: 80-90, PMID 27713081. +https://www.sciencedirect.com/science/article/pii/S1046202316303346 + +Numerical feature analyzers: +Spot feature analyzers: + - Manual spot color provides: Spot color; is manual. + - Spot intensity provides: Mean ch1, Median ch1, Min ch1, Max ch1, Sum ch1, Std ch1, Mean ch2, Median ch2, Min ch2, Max ch2, Sum ch2, Std ch2. + - xTrack probabilities provides: P stuck, P diffusive; is manual. + - Spot contrast and SNR provides: Ctrst ch1, SNR ch1, Ctrst ch2, SNR ch2. +dge feature analyzers: + - Directional change provides: γ rate. + - dge speed provides: Speed, Disp. + - dge target provides: Source ID, Target ID, Cost. + - dge location provides: dge T, dge X, dge Y, dge Z. + - Manual edge color provides: dge color; is manual. +Track feature analyzers: + - Branching analyzer provides: N spots, N gaps, N splits, N merges, N complex, Lgst gap. + - Track duration provides: Duration, Track start, Track stop, Track disp. + - Track index provides: Index, ID. + - Track location provides: Track X, Track Y, Track Z. + - Track speed provides: Mean sp., Max speed, Min speed, Med. speed, Std speed. + - Track quality provides: Mean Q. + - Track motility analysis provides: Total dist., Max dist., Cfn. ratio, Mn. v. line, wd. progr., Mn. γ rate. + +Image region of interest: +Image data: +or the image named: MAX_Merged.tif. +Matching file MAX_Merged.tif in folder: /Users/tinevez/Development/TrackMateWS/TrackMate/samples/ +Geometry: + X = 0 - 239, dx = 0.198467 + Y = 0 - 294, dy = 0.198467 + Z = 0 - 0, dz = 1.00000 + T = 0 - 16, dt = 2.00000 + +Configured detector Mask detector with settings: + - target channel: 2 + - simplify contours: true + +Starting detection process using 12 threads. +Detection processes 12 frames simultaneously and allocates 1 thread per frame. +ound 78 spots. +Detection done in 0.1 s. + +Computing spot quality histogram... +Initial thresholding with a quality threshold above 19.0 ... +Starting initial filtering process. +Retained 78 spots out of 78. + +Adding morphology analyzers... + - Spot fit 2D ellipse provides: l. x0, l. y0, l. long axis, l. sh. axis, l. angle, l. a.r. + - Spot 2D shape descriptors provides: Area, Perim., Circ., Solidity, Shape index. + +Calculating spot features... +Calculating features done in 0.1 s. + +Performing spot filtering on the following features: + - on Area above 0.5 +Kept 78 spots out of 78. + +Configured tracker LAP Tracker with settings: + - max frame gap: 2 + - alternative linking cost factor: 1.05 + - linking feature penalties: + - linking max distance: 15.0 + - gap closing max distance: 15.0 + - merging feature penalties: + - splitting max distance: 15.0 + - blocking value: Infinity + - allow gap closing: true + - allow track splitting: true + - allow track merging: false + - merging max distance: 15.0 + - splitting feature penalties: + - cutoff percentile: 0.9 + - gap closing feature penalties: + +Starting tracking process. +Tracking done in 0.0 s. +ound 3 tracks. + - avg size: 25.7 spots. + - min size: 20 spots. + - max size: 32 spots. + +Calculating features done in 0.0 s. + +Performing track filtering on the following features: +No feature threshold set, kept the 3 tracks. +Saving data... +Computing edge features: + - Directional change in 1 ms. + - dge speed in 1 ms. + - dge target in 1 ms. + - dge location in 1 ms. +Computation done in 4 ms. +Computing track features: + - Branching analyzer in 0 ms. + - Track duration in 0 ms. + - Track index in 0 ms. + - Track location in 0 ms. + - Track speed in 0 ms. + - Track quality in 1 ms. + - Track motility analysis in 0 ms. +Computation done in 2 ms. +-------------------- +ile loaded on ri, 24 Jul 2026 10:56:11 +TrackMate v8.1.6 +Please note that TrackMate is available through iji, and is based on a publication. If you use it successfully for your research please be so kind to cite our work: +rshov, D., Phan, MS., Pylvänäinen, J.W., Rigaud S.U., et al. TrackMate 7: integrating state-of-the-art segmentation algorithms into tracking pipelines. Nat Methods (2022). https://doi.org/10.1038/s41592-022-01507-1 +https://doi.org/10.1038/s41592-022-01507-1 +and / or: +Tinevez, JY.; Perry, N. & Schindelin, J. et al. (2017), 'TrackMate: An open and extensible platform for single-particle tracking.', Methods 115: 80-90, PMID 27713081. +https://www.sciencedirect.com/science/article/pii/S1046202316303346 +Saving data... +Computing edge features: + - Directional change in 1 ms. + - dge speed in 0 ms. + - dge target in 1 ms. + - dge location in 1 ms. +Computation done in 5 ms. +Computing track features: + - Branching analyzer in 1 ms. + - Track duration in 0 ms. + - Track index in 0 ms. + - Track location in 0 ms. + - Track speed in 1 ms. + - Track quality in 0 ms. + - Track motility analysis in 0 ms. +Computation done in 2 ms. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.26605770622793656 1.8728117765285504 1.6553239573187604 1.0789453473337929 1.853790564617448 0.6820121327364141 1.853790564617448 -0.11185429645833977 1.853790564617448 -0.5087875110557185 1.4568573500200728 -1.1041873329517848 1.2583907427213816 -1.5011205475491636 0.8614575281240029 -1.6995871548478512 0.6629909208253153 -1.8980537621465388 0.26605770622793656 -1.8980537621465388 -0.13087550836943862 -1.8980537621465388 -0.5278087229668174 -1.6995871548478512 -0.9247419375641961 -1.5011205475491636 -1.9170749740576412 -0.31032090375702737 -2.1155415813563287 0.08661231084034782 -1.9170749740576412 0.28507891813903896 -1.9170749740576412 0.6820121327364141 -1.71860836675895 1.0789453473337929 -1.3216751521615748 1.2774119546324805 -1.1232085448628837 1.6743451692298592 0.06759109892924897 1.6743451692298592 + 0.3245964797822847 1.6954861931602654 0.523063087080974 1.2985529785628875 0.9199963016783528 1.2985529785628875 1.1184629089770404 0.9016197639655097 1.515396123574419 0.7031531566668203 1.515396123574419 -0.09071327252793537 1.515396123574419 -0.4876464871253132 1.1184629089770404 -1.0830463090213795 0.9199963016783528 -1.4799795236187574 0.12612987248359708 -1.6784461309174463 -0.27080334211378165 -1.6784461309174463 -1.0646697713085373 -0.8845797017226902 -1.4616029859059143 -0.6861130944240017 -1.6600695932046037 0.107753334770754 -1.6600695932046037 0.5046865493681318 -1.263136378607225 0.7031531566668203 -1.263136378607225 1.1000863712641982 -0.866203164009848 1.1000863712641982 -0.6677365567111586 1.497019585861576 -0.27080334211378165 1.6954861931602654 0.12612987248359708 1.6954861931602654 + 0.42425832719648326 1.5320553733191788 1.218124756391239 0.7381889441244232 1.4165913636899283 0.3412557295270444 1.218124756391239 -0.055677485070332544 1.218124756391239 -1.246477128862466 0.821191541793862 -1.4449437361611546 0.42425832719648326 -1.4449437361611546 0.027325112599106305 -1.4449437361611546 -0.5680747092969618 -1.0480105215637767 -0.9650079238943388 -0.8495439142650882 -1.1634745311930281 -0.4526106996677104 -1.560407745790405 -0.4526106996677104 -1.560407745790405 0.3412557295270444 -1.3619411384917175 0.7381889441244232 -0.7665413165956494 1.1351221587218001 -0.36960810199827243 1.3335887660204895 0.027325112599106305 1.3335887660204895 0.42425832719648326 1.5320553733191788 + 0.42754718677428727 2.005320019969126 1.0229470086703536 1.608386805371751 1.4198802232677323 1.4099201980730598 1.8168134378651075 0.21912055428092714 2.0152800451637987 -0.17781266031644805 2.0152800451637987 -0.5747458749138232 2.0152800451637987 -0.9716790895112055 1.8168134378651075 -1.1701456968098967 1.61834683056642 -1.5670789114072718 0.22908057947559612 -1.964012126004647 -0.16785263512177906 -1.964012126004647 -0.9617190643165365 -1.5670789114072718 -1.3586522789139117 -1.3686123041085807 -1.5571188862126029 -1.1701456968098967 -1.7555854935112905 -0.7732124822125144 -2.152518708108669 0.0206539469822431 -2.152518708108669 0.4175871615796183 -1.9540521008099816 0.6160537688783094 -1.7555854935112905 1.0129869834756846 -1.1601856716152241 1.608386805371751 -0.9617190643165365 1.806853412670442 -0.5647858497191578 2.005320019969126 0.22908057947559612 2.005320019969126 + + + -0.46131816424820826 1.4636308679375336 1.3248813014399907 0.8682310460414673 1.7218145160373695 0.6697644387427779 1.7218145160373695 0.27283122414540095 1.920281123336057 -0.12410199045197601 1.920281123336057 -0.5210352050493547 1.7218145160373695 -0.7195018123480441 1.52334790873868 -1.116435026945421 0.33254826494654566 -1.3149016342441104 -0.0643849496508313 -1.5133682415427998 -1.4536512007416533 -0.7195018123480441 -1.6521178080403427 -0.5210352050493547 -1.850584415339032 -0.12410199045197601 -1.850584415339032 0.27283122414540095 -1.850584415339032 0.6697644387427779 -1.6521178080403427 1.0666976533401566 -1.255184593442964 1.0666976533401566 -0.6597847715468976 1.4636308679375336 + 1.055640817408836 2.519532849463328 1.4525740320062148 2.3210662421646404 1.6510406393049024 1.9241330275672617 2.44490706849966 0.733333383775129 2.44490706849966 0.3364001691777503 2.2464404612009687 -0.06053304541962845 2.047973853902281 -0.45746626001700363 2.047973853902281 -0.8543994746143824 1.84950724660359 -1.251332689211761 1.2541074247075237 -1.6482659038091363 1.055640817408836 -2.045199118406515 0.6587076028114573 -2.243665725705206 0.2617743882140786 -2.4421323330038938 -0.5320920409806753 -2.4421323330038938 -0.929025255578054 -2.4421323330038938 -1.5244250774741204 -2.045199118406515 -1.921358292071499 -1.8467325111078274 -2.5167581139675654 -0.8543994746143824 -2.5167581139675654 -0.45746626001700363 -1.921358292071499 0.5348667764764414 -1.921358292071499 0.9317999910738166 -1.5244250774741204 1.1302665983725078 -1.5244250774741204 1.527199812969883 -0.929025255578054 2.1225996348659493 -0.7305586482793629 2.3210662421646404 -0.3336254336819877 2.3210662421646404 0.06330778091539102 2.519532849463328 0.8571742101101485 2.519532849463328 + -0.004550380766991324 1.66631443394252 0.9877826557264537 1.0709146120464537 1.3847158703238307 0.8724480047477643 1.58318247762252 0.47551479015038645 1.7816490849212094 0.27704818285169797 1.1862492630251413 -0.9137514609404356 0.9877826557264537 -1.112218068239124 0.590849441129075 -1.3106846755378134 0.19391622653169804 -1.5091512828365024 -0.2030169880656807 -1.5091512828365024 -0.5999502026630577 -1.5091512828365024 -0.9968834172604364 -1.3106846755378134 -1.195350024559124 -1.112218068239124 -1.5922832391565027 0.0785815755530086 -1.5922832391565027 0.47551479015038645 -0.9968834172604364 1.0709146120464537 -0.798416809961747 1.2693812193451421 -0.004550380766991324 1.66631443394252 + 0.5614624777540058 2.8628983201701743 1.5537955142474509 2.267498498274108 1.9507287288448296 2.069031890975417 2.149195336143517 1.6720986763780417 2.149195336143517 1.2751654617806594 2.3476619434422084 1.0766988544819753 2.3476619434422084 0.28283242528721786 2.3476619434422084 -0.11410078931015732 1.9507287288448296 -0.9079672185049148 1.9507287288448296 -1.30490043310229 1.3553289069487633 -1.9003002549983563 1.3553289069487633 -2.2972334695957386 0.9583956923513846 -2.2972334695957386 0.759929085052697 -2.694166684193114 0.3629958704553182 -2.892633291491805 0.16452926315663063 -2.694166684193114 -0.6293371660381268 -2.694166684193114 -1.0262703806355056 -2.694166684193114 -1.4232035952328808 -2.4957000768944297 -1.8201368098302595 -2.2972334695957386 -2.018603417128947 -1.5033670404009811 -2.2170700244276382 -1.30490043310229 -2.2170700244276382 -0.9079672185049148 -2.415536631726326 -0.5110340039075396 -2.415536631726326 -0.11410078931015732 -2.2170700244276382 0.28283242528721786 -2.2170700244276382 0.679765639884593 -1.621670202531572 1.6720986763780417 -1.4232035952328808 2.069031890975417 -0.4308705587394357 2.664431712871483 -0.03393734414206051 2.8628983201701743 0.3629958704553182 2.8628983201701743 + + + 0.9993719067424607 3.1555304548852448 1.7932383359372182 2.361664025690491 2.1901715505345933 2.1631974183918032 2.587104765131972 1.3693309891970458 2.7855713724306597 1.1708643818983582 2.587104765131972 -0.813801691088532 2.587104765131972 -1.2107349056859107 2.3886381578332845 -1.6076681202832859 2.1901715505345933 -1.806134727581977 1.7932383359372182 -2.0046013348806646 1.7932383359372182 -2.4015345494780433 1.3963051213398394 -2.4015345494780433 0.8009052994437731 -2.798467764075422 0.40397208484639435 -2.9969343713741097 0.007038870249015616 -2.9969343713741097 -0.38989434434835957 -2.9969343713741097 -0.7868275589457383 -2.798467764075422 -1.183760773543117 -2.798467764075422 -1.5806939881404958 -2.798467764075422 -1.977627202737871 -2.600001156776731 -1.977627202737871 -2.2030679421793558 -2.3745604173352497 -2.0046013348806646 -2.5730270246339373 -1.2107349056859107 -2.7714936319326284 -1.0122682983872195 -2.7714936319326284 0.1785313454049131 -2.7714936319326284 0.5754645600022918 -2.5730270246339373 0.972397774599667 -2.3745604173352497 1.3693309891970458 -1.5806939881404958 2.1631974183918032 -1.3822273808418046 2.5601306329891784 -0.9852941662444259 2.7585972402878696 -0.7868275589457383 2.957063847586557 0.007038870249015616 2.957063847586557 0.40397208484639435 2.957063847586557 0.8009052994437731 3.1555304548852448 + 0.35997948989170325 3.1119969238102314 0.756912704489082 2.9135303165115403 1.1538459190864607 2.9135303165115403 1.749245740982527 2.516597101914165 2.1461789555799022 2.318130494615474 2.3446455628785934 1.9211972800180988 2.7415787774759686 1.7227306727194076 2.9400453847746597 0.9288642435246501 3.138511992073351 0.7303976362259661 3.138511992073351 0.3334644216285838 3.138511992073351 -0.06346879296879138 2.9400453847746597 -0.46040200756616656 2.9400453847746597 -0.8573352221635488 2.3446455628785934 -1.8496682586569904 2.1461789555799022 -2.2466014732543655 1.749245740982527 -2.2466014732543655 1.1538459190864607 -2.842001295150439 0.9553793117877731 -3.040467902449123 -0.6323535466017383 -3.040467902449123 -1.029286761199117 -3.040467902449123 -1.4262199757964957 -2.842001295150439 -1.8231531903938745 -2.643534687851748 -2.2200864049912497 -2.0481348659556815 -2.6170196195886284 -1.8496682586569904 -2.815486226887316 -1.0558018294622329 -3.013952834186007 -0.6588686148648577 -3.013952834186007 -0.2619354002674825 -3.013952834186007 0.13499781432989977 -2.815486226887316 0.3334644216285838 -3.013952834186007 0.7303976362259661 -2.6170196195886284 1.5242640654207236 -2.6170196195886284 1.9211972800180988 -2.418553012289941 2.11966388731679 -2.021619797692562 2.318130494615474 -1.2277533684978046 2.7150637092128562 -1.029286761199117 2.9135303165115403 -0.6323535466017383 2.9135303165115403 -0.23542033200436308 3.1119969238102314 0.16151288259301566 2.9135303165115403 + -0.27289158503569233 1.2668785099232984 0.1240416295616864 1.068411902624609 0.5209748441590634 1.068411902624609 1.9102410952498854 0.27454547342985336 2.1087077025485748 0.07607886613116488 1.7117744879511978 -0.12238774116752449 1.5133078806525084 -0.5193209557649014 1.1163746660551297 -0.5193209557649014 0.9179080587564421 -0.9162541703622793 0.5209748441590634 -1.1147207776609687 0.322508236860374 -1.3131873849596576 -0.07442497773700296 -1.3131873849596576 -0.4713581923343799 -1.3131873849596576 -0.8682914069317587 -1.1147207776609687 -1.2652246215291356 -0.9162541703622793 -1.2652246215291356 -0.5193209557649014 -1.463691228827825 -0.12238774116752449 -1.463691228827825 0.6714786880272312 -1.463691228827825 1.068411902624609 -0.27289158503569233 1.2668785099232984 + 0.4976046820677418 1.3238297972350974 0.6960712893664294 0.9268965826377196 1.093004503963808 0.9268965826377196 1.093004503963808 0.5299633680403417 1.489937718561185 0.5299633680403417 1.6884043258598744 0.13303015344296387 1.6884043258598744 -0.6608362757517918 1.6884043258598744 -1.0577694903491697 1.093004503963808 -1.4547027049465475 0.6960712893664294 -1.6531693122452369 0.2991380747690524 -1.6531693122452369 -0.2962617471270139 -0.6608362757517918 -0.6931949617243927 -0.46236966845310334 -1.8839946055165253 -0.263903061154414 -2.280927820113904 -0.0654364538557255 -2.280927820113904 0.33149676074165235 -1.8839946055165253 0.5299633680403417 -1.6855279982178377 0.9268965826377196 -0.891661569023082 1.125363189936408 -0.6931949617243927 1.3238297972350974 0.10067146747036304 1.3238297972350974 + + + 0.023771141665156037 1.2439483284585648 0.420704356262533 1.0454817211598764 0.8176375708599117 1.0454817211598764 1.2145707854572887 1.0454817211598764 1.413037392755978 0.6485485065624985 1.6115040000546674 0.45008189926380915 1.413037392755978 0.0531486846664313 1.413037392755978 -0.34378452993094566 1.016104178158601 -0.542251137229635 0.8176375708599117 -0.9391843518270129 0.420704356262533 -1.1376509591257018 0.2222377489638454 -1.3361175664243907 -0.17469546563353333 -1.3361175664243907 -0.5716286802309103 -1.3361175664243907 -0.968561894828289 -1.1376509591257018 -1.1670285021269766 -0.7407177445283235 -1.365495109425666 -0.542251137229635 -1.365495109425666 -0.14531792263225718 -1.365495109425666 0.25161529196512067 -1.1670285021269766 0.6485485065624985 -0.968561894828289 1.0454817211598764 -0.5716286802309103 1.2439483284585648 -0.17469546563353333 1.2439483284585648 + -0.004531201079874592 1.725481371217831 0.5908686208161917 1.3285481566204522 0.9878018354135705 1.1300815493217646 1.5832016573096368 -1.053051130963814 1.3847350500109474 -1.4499843455611918 -0.5999310229759409 -1.2515177382625025 -0.9968642375733197 -1.2515177382625025 -1.3937974521706966 -0.6561179163664361 -1.592264059469386 -0.2591847017690583 -1.3937974521706966 0.13774851282831957 -1.3937974521706966 0.5346817274256965 -0.9968642375733197 1.1300815493217646 -0.7983976302746303 1.5270147639191416 -0.004531201079874592 1.725481371217831 + 0.122986062558752 3.4079906186554503 0.7183858844548183 3.011057404058075 1.115319099052197 3.011057404058075 2.3061187428443297 2.415657582162005 2.5045853501430173 2.2171909748633176 2.7030519574417085 1.8202577602659389 2.901518564740396 1.4233245456685637 2.901518564740396 1.026391331071185 3.0999851720390836 0.6294581164738062 3.0999851720390836 -0.9582747419157052 3.0999851720390836 -1.3552079565130803 2.901518564740396 -1.5536745638117715 2.5045853501430173 -1.752141171110459 2.107652135545642 -2.3475409930065254 1.909185528246951 -2.744474207603904 1.5122523136495722 -2.9429408149025917 1.115319099052197 -3.141407422201283 -0.0754805447399356 -3.141407422201283 -0.27394715203862674 -3.3398740294999705 -1.4647467958307594 -2.9429408149025917 -1.8616800104281381 -2.744474207603904 -2.258613225025517 -2.149074385707838 -2.655546439622892 -1.9506077784091502 -2.854013046921583 -1.5536745638117715 -3.052479654220271 -1.1567413492143928 -3.052479654220271 -0.759808134617014 -3.052479654220271 -0.36287492001963884 -3.2509462615189584 -0.1644083127209477 -3.2509462615189584 0.2325249018764275 -2.854013046921583 1.4233245456685637 -2.655546439622892 1.8202577602659389 -2.0601466177268257 2.2171909748633176 -1.8616800104281381 2.6141241894606964 -0.8693469739346931 3.2095240113567627 -0.47241375933731433 3.4079906186554503 -0.0754805447399356 3.4079906186554503 + -0.5524667458392507 3.7864631853191995 -0.15553353124187197 3.5879965780205083 0.6383328979528855 3.5879965780205083 1.0352661125502607 3.5879965780205083 2.0275991490437058 2.992596756124442 2.424532363641081 2.794130148825751 3.2183987928358384 1.404863897734927 3.4168654001345296 1.206397290436243 3.4168654001345296 0.8094640758388607 3.6153320074332207 0.4125308612414855 3.6153320074332207 0.015597646644110341 3.6153320074332207 -0.38133556795327195 3.4168654001345296 -0.7782687825506471 3.4168654001345296 -1.1752019971480294 2.8214655782384632 -2.167535033641471 2.622998970939772 -2.564468248238846 1.8291325417450146 -3.3583346774336036 1.4321993271476394 -3.5568012847322947 0.24139968335550677 -3.5568012847322947 -0.15553353124187197 -3.7552678920309788 -1.5447997823326922 -3.1598680701349124 -1.941732996930071 -3.1598680701349124 -2.3386662115274497 -2.9614014628362284 -2.5371328188261373 -2.564468248238846 -3.3309992480208948 -1.3736686044467135 -3.5294658553195823 -0.9767353898493383 -3.5294658553195823 0.6109974685401767 -3.5294658553195823 1.0079306831375519 -2.934066033423516 2.0002637196309934 -2.7355994261248284 2.3971969342283757 -2.140199604228762 2.992596756124442 -1.7432663896313834 3.191063363423126 -0.7509333531379383 3.7864631853191995 + + + 0.18440345135457648 4.215399090542583 0.5813366659519517 4.016932483243892 0.9782698805493304 4.016932483243892 1.9706029170427755 3.4215326613478254 2.3675361316401506 3.4215326613478254 2.962935953536217 2.826132839451759 2.962935953536217 2.429199624854384 3.3598691681335993 2.2307330175556928 3.5583357754322904 1.8337998029583176 3.7568023827309744 1.6353331956596264 3.7568023827309744 1.2383999810622512 3.9552689900296656 0.841466766464869 3.9552689900296656 -0.7462660919246389 3.9552689900296656 -1.143199306522014 3.3598691681335993 -2.1355323430154627 3.161402560834908 -2.532465557612838 2.764469346237533 -3.127865379508904 2.3675361316401506 -3.3263319868075953 1.5736697024453967 -3.7232652014049705 1.3752030951467091 -3.9217318087036617 -0.609462977840181 -3.9217318087036617 -1.0063961924375562 -3.9217318087036617 -1.8002626216323137 -3.7232652014049705 -2.1971958362296924 -3.5247985941062865 -2.7925956581257587 -2.92939877221022 -2.9910622654244463 -2.730932164911529 -3.784928694619204 -1.3416659138207052 -3.9833953019178914 -0.94473269922333 -3.9833953019178914 0.6430001591661849 -3.9833953019178914 1.03993337376356 -2.9910622654244463 2.826132839451759 -2.7925956581257587 3.0245994467504502 -1.601796014333626 3.6199992686465166 -1.403329407034935 3.8184658759452077 -1.0063961924375562 3.8184658759452077 0.18440345135457648 4.215399090542583 + 0.6249815655313711 1.8030520953955769 1.021914780128748 1.6045854880968875 1.2203813874274374 1.2076522734995105 1.418847994726125 1.0091856662008212 1.418847994726125 0.6122524516034424 1.418847994726125 0.21531923700606548 1.021914780128748 -0.5785471921886902 1.021914780128748 -0.9754804067860681 0.4265149582326817 -1.372413621383446 0.02958174363530297 -1.5708802286821344 -0.367351470962074 -1.5708802286821344 -0.7642846855594527 -1.7693468359808238 -0.9627512928581403 -1.5708802286821344 -1.359684507455519 -1.372413621383446 -1.5581511147542084 -0.9754804067860681 -1.5581511147542084 -0.5785471921886902 -0.5658180782607634 1.2076522734995105 -0.367351470962074 1.6045854880968875 0.4265149582326817 1.8030520953955769 + 0.5697072021891003 3.943313928551632 1.9589734532799206 3.149447499356878 2.3559066678772993 2.950980892058187 2.554373275175987 2.752514284759499 2.9513064897733656 2.5540476774608116 3.1497730970720568 2.157114462863433 3.3482397043707444 1.9586478555647453 3.546706311669432 0.7678482117726091 3.745172918968123 0.3709149971752339 3.546706311669432 -0.02601821742214483 3.546706311669432 -1.6137510758116562 3.3482397043707444 -1.8122176831103438 2.9513064897733656 -2.010684290409035 2.554373275175987 -2.6060841123051013 2.3559066678772993 -3.00301732690248 1.5620402386825454 -3.399950541499855 1.3635736313838542 -3.5984171487985464 0.966640416786479 -3.5984171487985464 0.5697072021891003 -3.796883756097234 0.17277398759172158 -3.796883756097234 -0.22415922700565716 -3.5984171487985464 -1.018025656200411 -3.5984171487985464 -1.4149588707977898 -3.5984171487985464 -2.407291907291235 -3.00301732690248 -2.80422512188861 -2.804550719603789 -3.39962494378468 -1.8122176831103438 -3.5980915510833675 -1.4152844685129686 -3.5980915510833675 -0.22448482472083242 -3.796558158382057 0.17244838987654276 -3.5980915510833675 0.3709149971752339 -3.39962494378468 0.7678482117726091 -3.39962494378468 1.1647814263699878 -3.39962494378468 1.5617146409673666 -2.6057585145899225 2.3555810701621205 -2.407291907291235 2.752514284759499 -1.8118920853951686 3.3479141066555655 -1.6134254780964774 3.546380713954253 0.37124059489040917 3.943313928551632 + 0.21935782911959834 1.6603023657674258 0.8147576510156647 1.263369151170048 1.2116908656130416 1.0649025438713586 1.410157472911731 0.27103611467660293 1.6086240802104204 -0.1258970999207749 1.2116908656130416 -0.7212969218168412 1.013224258314354 -1.118230136414219 0.6162910437169753 -1.316696743712908 0.21935782911959834 -1.515163351011597 -0.1775753854777804 -1.515163351011597 -0.5745086000751574 -1.515163351011597 -0.7729752073738467 -1.316696743712908 -1.1699084219712237 -1.118230136414219 -1.1699084219712237 -0.7212969218168412 -1.5668416365686024 -0.5228303145181519 -1.5668416365686024 -0.1258970999207749 -1.5668416365686024 0.27103611467660293 -1.1699084219712237 0.4695027219752923 -1.1699084219712237 0.8664359365726702 -0.7729752073738467 1.0649025438713586 -0.5745086000751574 1.4618357584687365 0.21935782911959834 1.6603023657674258 + + + 0.8912329810228456 3.9546935885265064 2.280499232113666 3.160827159331749 2.6774324467110446 2.9623605520330614 3.0743656613084234 2.366960730136995 3.4712988759057986 2.1684941228383074 3.4712988759057986 1.7715609082409287 3.8682320905031773 1.1761610863448624 4.066698697801868 0.7792278717474836 4.066698697801868 -0.014638557447270273 4.066698697801868 -0.411571772044649 3.8682320905031773 -0.8085049866420277 3.8682320905031773 -1.2054382012394065 3.4712988759057986 -1.8008380231354728 3.272832268607111 -2.197771237732848 2.8758990540097322 -2.396237845031539 2.6774324467110446 -2.793171059628918 1.8835660175162907 -2.9916376669276055 1.8835660175162907 -3.388570881524984 1.486632802918912 -3.388570881524984 1.0896995883215332 -3.587037488823672 0.8912329810228456 -3.7855040961223594 0.4942997664254669 -3.7855040961223594 0.09736655182808818 -3.9839707034210505 -0.6964998773666657 -3.7855040961223594 -1.0934330919640445 -3.9839707034210505 -1.4903663065614232 -3.7855040961223594 -1.8872995211587984 -3.7855040961223594 -2.0857661284574895 -3.587037488823672 -2.4826993430548683 -3.388570881524984 -2.8796325576522435 -2.396237845031539 -3.276565772249622 -2.197771237732848 -3.276565772249622 -1.8008380231354728 -3.673498986847001 -1.6023714158367817 -4.070432201444376 -0.21310516474596142 -4.070432201444376 0.18382804985141732 -3.8719655941456885 0.580761264448796 -3.8719655941456885 0.9776944790461712 -3.47503237954831 1.7715609082409287 -3.276565772249622 1.9700275155396163 -2.681165950353556 2.5654273374356826 -2.681165950353556 2.9623605520330614 -1.6888329138601108 3.5577603739291277 -1.291899699262732 3.756226981227819 -0.49803327006797815 3.756226981227819 -0.10110005547059941 3.756226981227819 0.2958331591267793 3.9546935885265064 0.6927663737241545 3.9546935885265064 + 1.401329483548011 4.172460639919279 1.9967293054440773 3.775527425321904 2.3936625200414525 3.577060818023213 3.18752894923621 2.5847277815297716 3.385995556534901 2.3862611742310804 3.7829287711322763 1.59239474503633 3.9813953784309675 1.393928137737639 3.9813953784309675 0.9969949231402566 4.179861985729659 0.6000617085428814 3.9813953784309675 -0.9876711498466264 3.9813953784309675 -1.3846043644440087 3.385995556534901 -2.37693740093745 3.18752894923621 -2.7738706155348325 2.790595734638835 -2.7738706155348325 2.5921291273401437 -3.1708038301322077 2.3936625200414525 -3.369270437430899 1.5997960908466986 -3.766203652028274 1.401329483548011 -3.964670259326965 0.6074630543532535 -3.964670259326965 0.21052983975587836 -4.163136866625649 -0.5833365894388791 -4.163136866625649 -0.9802698040362543 -4.163136866625649 -1.377203018633633 -3.964670259326965 -1.7741362332310118 -3.964670259326965 -2.9649358770231444 -2.9723372228335165 -3.361869091620523 -2.7738706155348325 -3.758802306217902 -1.7815375790413839 -3.9572689135165895 -1.3846043644440087 -4.155735520815277 -0.5907379352492512 -4.155735520815277 -0.19380472065187604 -3.9572689135165895 0.20312849394550625 -3.9572689135165895 0.9969949231402566 -3.9572689135165895 1.393928137737639 -3.5603356989192108 1.9893279596337052 -3.361869091620523 2.3862611742310804 -2.766469269724457 2.9816609961271467 -2.5680026624257657 3.180127603425838 -1.1787364113349454 3.9739940326205954 -0.7818031967375667 4.172460639919279 1.2028628762493234 4.172460639919279 + 0.41938600249380187 1.5311999460074608 0.8163192170911806 1.3327333387087723 1.01478582438987 0.9358001241113945 1.2132524316885576 0.7373335168127051 1.411719038987247 0.34040030221532724 1.411719038987247 -0.056532912382050604 1.411719038987247 -0.45346612697942756 0.8163192170911806 -1.0488659488754948 0.6178526097924912 -1.2473325561741837 0.22091939519511428 -1.4457991634728726 -0.17601381940226446 -1.6442657707715616 -0.7714136412983308 -1.2473325561741837 -1.1683468558957077 -1.0488659488754948 -1.3668134631943971 0.14193369491663876 -1.3668134631943971 0.5388669095140166 -1.1683468558957077 0.7373335168127051 -0.9698802485970202 1.134266731410083 0.22091939519511428 1.5311999460074608 + 1.069143430183555 1.6184252103195078 1.2676100374822443 1.2214919957221309 1.4660766447809337 1.0230253884234415 1.4660766447809337 0.2291589592286858 1.664543252079623 -0.16777425536869117 1.2676100374822443 -0.9616406845634469 1.069143430183555 -1.1601072918621362 -0.1216562136085777 -1.7555071137582026 -0.5185894282059564 -1.7555071137582026 -0.9155226428033334 -1.1601072918621362 -1.3124558574007112 -0.9616406845634469 -1.709389071998089 -0.16777425536869117 -1.709389071998089 0.2291589592286858 -1.1139892501020219 1.2214919957221309 -0.717056035504644 1.4199586030208202 0.07681039369011167 1.4199586030208202 0.4737436082874886 1.4199586030208202 0.672210215586178 1.6184252103195078 + + + 1.6113911294581982 4.3651043528242255 1.8098577367568858 3.968171138226843 2.2067909513542645 3.968171138226843 2.6037241659516397 3.769704530928159 3.397590595146397 2.9758381017334017 3.7945238097437795 2.7773714944347105 3.9929904170424635 1.5865718506425779 4.191457024341155 1.3881052433438867 4.191457024341155 0.19730559955175409 4.191457024341155 -0.1996276150456211 3.9929904170424635 -0.5965608296429963 3.9929904170424635 -0.9934940442403786 3.9929904170424635 -1.3904272588377538 3.397590595146397 -2.3827602953312024 3.199123987847713 -2.7796935099285776 2.4052575586529557 -3.573559939123335 2.2067909513542645 -3.97049315372071 1.4129245221595106 -4.168959761019401 1.2144579148608194 -4.367426368318085 0.023658271068686787 -4.367426368318085 -0.37327494352869195 -4.367426368318085 -0.7702081581260671 -4.168959761019401 -1.1671413727234459 -4.367426368318085 -1.5640745873208246 -4.168959761019401 -1.9610078019182033 -4.168959761019401 -2.3579410165155785 -3.97049315372071 -2.5564076238142697 -3.772026546422019 -2.7548742311129573 -3.375093331824644 -3.3502740530090236 -2.9781601172272687 -3.548740660307711 -2.5812269026298864 -3.94567387490509 -1.787360473435129 -4.144140482203781 -1.588893866136445 -4.144140482203781 -1.1919606515390626 -4.342607089502469 -0.7950274369416874 -4.342607089502469 -0.39809422234431224 -4.144140482203781 -0.001161007746929954 -4.342607089502469 0.39577220685044523 -4.342607089502469 0.7927054214478204 -2.953340838411645 3.174304709032093 -2.5564076238142697 3.372771316330777 -1.1671413727234459 4.166637745525534 -0.9686747654247583 4.3651043528242255 1.4129245221595106 4.3651043528242255 + 0.16491221451812876 1.5065159758638274 0.5618454291155057 1.3080493685651389 0.9587786437128845 1.3080493685651389 1.5541784656089508 0.3157163320716938 1.5541784656089508 -0.08121688252568404 1.157245251011572 -0.6766167044217504 0.9587786437128845 -1.0735499190191282 0.5618454291155057 -1.2720165263178171 0.16491221451812876 -1.470483133616506 -0.23202100007924997 -1.470483133616506 -0.6289542146766269 -1.470483133616506 -0.8274208219753163 -1.2720165263178171 -1.2243540365726933 -1.0735499190191282 -1.4228206438713826 -0.6766167044217504 -1.4228206438713826 -0.2796834898243725 -1.4228206438713826 0.11724972477300533 -1.2243540365726933 0.5141829393703832 -1.2243540365726933 0.911116153967761 -0.23202100007924997 1.5065159758638274 + 1.3286395641350257 1.2455161820195304 1.527106171433715 0.8485829674221517 1.7255727787324027 0.6501163601234641 1.7255727787324027 0.25318314552608534 1.3286395641350257 -0.5406832836686704 1.1301729568363363 -0.9376164982660473 0.33630652764158064 -1.1360831055647367 0.13783992034289128 -1.334549712863426 -0.2590932942544857 -1.334549712863426 -0.6560265088518635 -1.334549712863426 -1.0529597234492414 -1.1360831055647367 -1.4498929380466192 -0.9376164982660473 -1.6483595453453077 0.25318314552608534 -1.6483595453453077 0.6501163601234641 -1.2514263307479299 0.8485829674221517 -1.0529597234492414 1.047049574720841 -0.2590932942544857 1.047049574720841 0.13783992034289128 1.047049574720841 0.53477313494027 1.2455161820195304 0.931706349537647 1.2455161820195304 + 1.3412777795505306 4.4940939924542285 1.7382109941479094 4.295627385155541 2.3336108160439757 3.303294348662096 2.5320774233426633 2.906361134064717 2.929010637940042 2.7078945267660295 3.1274772452387296 2.5094279194673383 3.1274772452387296 2.112494704869963 3.5244104598361083 1.914028097571272 3.5244104598361083 1.5170948829738933 3.722877067134796 1.120161668376518 3.921343674433487 0.921695061077827 3.921343674433487 0.5247618464804518 4.119810281732175 0.12782863188307303 4.318276889030866 -0.2691045827143057 4.318276889030866 -0.6660377973116844 4.318276889030866 -1.0629710119090596 3.722877067134796 -1.658370833805126 3.3259438525374208 -1.658370833805126 3.1274772452387296 -2.4522372629998834 2.929010637940042 -2.650703870298571 2.3336108160439757 -3.2461036921946373 1.936677601446597 -3.2461036921946373 1.936677601446597 -3.643036906792016 1.7382109941479094 -4.039970121389395 1.3412777795505306 -4.238436728688082 0.9443445649531519 -4.238436728688082 0.5474113503557767 -4.238436728688082 0.34894474305708556 -4.039970121389395 0.15047813575839797 -3.643036906792016 -0.04798847154028962 -3.2461036921946373 -0.04798847154028962 -2.4522372629998834 -0.24645507883898077 -2.253770655701196 -0.6433882934363595 -2.4522372629998834 -1.0403215080337347 -2.650703870298571 -1.2387881153324258 -3.0476370848959498 -1.4372547226311134 -3.2461036921946373 -1.8341879372284922 -3.2461036921946373 -2.231121151825871 -3.2461036921946373 -2.628054366423246 -3.0476370848959498 -3.024987581020625 -3.0476370848959498 -3.620387402916691 -2.4522372629998834 -4.01732061751407 -2.4522372629998834 -4.01732061751407 -2.0553040484025047 -4.2157872248127575 -1.658370833805126 -4.01732061751407 -1.4599042265064384 -4.2157872248127575 -1.0629710119090596 -4.414253832111449 -0.6660377973116844 -4.414253832111449 -0.2691045827143057 -4.414253832111449 0.12782863188307303 -4.2157872248127575 0.5247618464804518 -4.01732061751407 0.7232284537791394 -3.4219207956180036 2.112494704869963 -3.2234541883193124 2.5094279194673383 -2.8265209737219372 2.7078945267660295 -2.4295877591245585 2.906361134064717 -1.2387881153324258 2.906361134064717 -0.8418549007350471 2.906361134064717 -0.8418549007350471 3.303294348662096 -0.44492168613766836 3.303294348662096 -0.04798847154028962 3.303294348662096 0.34894474305708556 3.898694170558162 0.5474113503557767 4.295627385155541 0.9443445649531519 4.4940939924542285 + + + + 0.5835307404791834 1.4538651860154923 1.377397169673939 0.6599987568207366 1.5758637769726285 0.26306554222335876 1.1789305623752497 -0.7292674942700854 0.9804639550765621 -1.1262007088674637 -0.2103356887155723 -1.5231339234648416 -0.6072689033129492 -1.5231339234648416 -0.8057355106116386 -1.3246673161661526 -1.004202117910328 -0.9277341015687748 -1.401135332507705 -0.7292674942700854 -1.401135332507705 0.0645989349246694 -1.401135332507705 0.46153214952204724 -1.2026687252090156 0.8584653641194251 -1.004202117910328 1.0569319714181145 -0.6072689033129492 1.255398578716803 -0.2103356887155723 1.4538651860154923 0.5835307404791834 1.4538651860154923 + 1.580181342248995 4.359415816353561 1.7786479495476861 3.9624826017561787 2.57251437874244 3.7640159944574947 2.770980986041131 3.5655493871588035 3.3663808079371975 2.970149565262737 3.7633140225345727 2.771682957964046 4.160247237131955 1.3824167068732223 4.358713844430639 0.9854834922758471 4.358713844430639 -0.20531615151628557 4.358713844430639 -0.6022493661136608 4.160247237131955 -0.999182580711043 4.160247237131955 -1.3961157953084182 3.5648474152358887 -2.388448831801867 3.3663808079371975 -2.785382046399242 2.9694475933398152 -2.983848653697933 2.9694475933398152 -3.3807818682953084 1.9771145568463737 -3.9761816901913747 1.580181342248995 -4.174648297490066 1.1832481276516198 -4.174648297490066 0.7863149130542411 -4.37311490478875 -0.4044847307378916 -4.37311490478875 -0.8014179453352703 -4.37311490478875 -1.7937509818287154 -3.9761816901913747 -2.190684196426094 -3.9761816901913747 -2.984550625620848 -3.5792484755939995 -3.1830172329195356 -3.3807818682953084 -3.976883662114293 -1.9915156172044846 -4.175350269412981 -1.5945824026071094 -4.175350269412981 -1.197649188009727 -4.373816876711672 -0.8007159734123519 -4.373816876711672 -0.006849544217594428 -4.373816876711672 0.39008367037978076 -4.175350269412981 0.7870168849771559 -4.175350269412981 1.1839500995745382 -4.175350269412981 1.5808833141719134 -3.7784170548156055 2.1762831360679797 -3.5799504475169144 2.573216350665362 -3.381483840218227 2.771682957964046 -2.984550625620848 2.970149565262737 -2.7860840183221605 3.3670827798601124 -2.5876174110234693 3.5655493871588035 -1.3968177672313367 4.16094920905487 -1.198351159932649 4.359415816353561 1.1832481276516198 4.359415816353561 + 0.5200663328919966 2.598421801358583 0.9169995474893753 2.3999551940598955 1.313932762086754 2.3999551940598955 1.5123993693854416 2.003021979462517 1.9093325839828204 2.003021979462517 2.306265798580199 1.8045553721638292 2.5047324058788867 1.4076221575664505 2.7031990131775743 1.209155550267763 2.9016656204762654 0.018355906475630235 2.9016656204762654 -0.3785773081217485 2.7031990131775743 -0.7755105227191272 2.306265798580199 -0.9739771300178148 1.9093325839828204 -1.96631016651126 1.7108659766841328 -2.3632433811086386 0.9169995474893753 -2.760176595706014 0.7185329401906877 -2.958643203004705 0.32159972559330896 -2.958643203004705 -0.07533348900406978 -2.958643203004705 -0.47226670360144496 -3.1571098103033925 -0.8691999181988237 -3.1571098103033925 -1.2661331327962024 -2.958643203004705 -1.6630663473935812 -2.3632433811086386 -1.8615329546922688 -1.96631016651126 -1.6630663473935812 -1.5693769519138812 -1.6630663473935812 -0.7755105227191272 -1.8615329546922688 -0.3785773081217485 -2.456932776588335 0.018355906475630235 -2.853865991185714 0.21682251377431783 -3.0523325984844014 0.6137557283716966 -3.2507992057830926 0.8122223356703842 -2.853865991185714 1.6060887648651416 -2.6553993838870262 2.003021979462517 -2.2584661692896475 2.003021979462517 -2.0599995619909564 2.3999551940598955 -1.6630663473935812 2.598421801358583 0.32159972559330896 2.598421801358583 + + + 0.06684705704603289 2.1771394958607857 0.26531366434472403 1.780206281263407 0.6622468789420992 1.780206281263407 1.2576467008381655 1.1848064593673406 1.4561133081368567 0.986339852068653 1.4561133081368567 0.5894066374712743 1.6545799154355443 0.19247342287389557 1.6545799154355443 -0.2044597917234796 1.8530465227342354 -0.6013930063208583 1.059180093539478 -1.9906592574116821 0.6622468789420992 -2.1891258647103697 0.26531366434472403 -2.1891258647103697 -0.1316195502526547 -2.1891258647103697 -0.3300861575513423 -1.9906592574116821 -0.727019372148721 -1.792192650112991 -1.5208858013434785 -0.40292639902217076 -1.719352408642166 -0.00599318442479202 -1.719352408642166 1.1848064593673406 -1.5208858013434785 1.5817396739647194 -1.3224191940447874 1.780206281263407 -0.9254859794474122 1.978672888562098 -0.1316195502526547 2.1771394958607857 + -0.39191192156001975 2.2922202715206303 0.20348790033604658 1.8952870569232552 0.6004211149334253 1.696820449624564 0.7988877222321129 1.2998872350271888 0.7988877222321129 0.9029540204298101 1.3942875441281792 0.3075541985337438 1.5927541514268704 0.10908759123505263 1.5927541514268704 -0.28784562336232256 1.791220758725558 -0.6847788379597013 1.5927541514268704 -1.08171205255708 1.5927541514268704 -1.4786452671544552 1.1958209368294916 -2.074045089050525 0.7988877222321129 -2.2725116963492127 0.40195450763473417 -2.074045089050525 0.005021293037358987 -2.074045089050525 -0.39191192156001975 -1.875578481751834 -1.3842449580534648 -0.28784562336232256 -1.5827115653521524 0.10908759123505263 -1.5827115653521524 0.5060208058324314 -1.7811781726508435 0.9029540204298101 -1.5827115653521524 1.2998872350271888 -1.5827115653521524 1.696820449624564 -0.5903785288587073 2.2922202715206303 + + 1.4082280288583533 2.0853741815739255 1.805161243455732 1.8869075742752344 2.0036278507544196 1.6884409669765432 2.4005610653517984 1.6884409669765432 2.7974942799491735 1.4899743596778592 3.1944274945465523 1.291507752379168 3.3928941018452434 -0.6931583206077221 2.9959608872478647 -0.8916249279064061 2.7974942799491735 -1.0900915352050973 2.4005610653517984 -1.2885581425037884 2.0036278507544196 -1.2885581425037884 1.606694636157041 -1.4870247498024796 1.4082280288583533 -1.6854913571011636 1.0112948142609746 -1.6854913571011636 0.6143615996635958 -1.6854913571011636 0.21742838506622064 -1.8839579643998547 -0.1795048295311581 -2.082424571698546 -0.5764380441285368 -2.082424571698546 -0.9733712587259156 -2.28089117899723 -1.965704295219357 -1.6854913571011636 -2.362637509816736 -1.4870247498024796 -2.7595707244141146 -1.4870247498024796 -2.958037331712802 -1.2885581425037884 -3.354970546310181 -1.0900915352050973 -3.5534371536088685 -0.2962251060103398 -3.5534371536088685 0.10070810858703538 -2.958037331712802 0.6961079304831017 -2.7595707244141146 0.8945745377817929 -1.3703044733232908 1.6884409669765432 -0.9733712587259156 1.8869075742752344 1.4082280288583533 2.0853741815739255 + 0.5723546502778021 1.5291266029809902 0.9692878648751808 1.3306599956823009 0.9692878648751808 0.933726781084923 1.3662210794725578 0.7352601737862345 1.3662210794725578 -0.05860625540852116 1.3662210794725578 -0.455539470005899 1.1677544721738684 -0.8524726846032769 0.7708212575764914 -1.0509392919019658 0.5723546502778021 -1.2494058992006547 0.17542143568042512 -1.4478725064993436 -0.22151177891695362 -1.4478725064993436 -0.6184449935143306 -1.4478725064993436 -1.0153782081117093 -1.2494058992006547 -1.213844815410397 -0.8524726846032769 -1.4123114227090863 -0.6540060773045875 -1.4123114227090863 -0.25707286270720964 -1.4123114227090863 0.13986035189016732 -1.0153782081117093 0.933726781084923 -0.6184449935143306 1.1321933883836124 -0.4199783862156412 1.3306599956823009 -0.02304517161826425 1.5291266029809902 0.3738880429791127 1.5291266029809902 + + + -0.5514923221793246 2.772234777691402 -0.1545591075819459 2.573768170392711 0.043907499716745235 2.3753015630940233 0.4408407143141204 2.3753015630940233 0.8377739289114992 2.3753015630940233 1.631640358106253 1.9783683484966446 2.028573572703632 1.779901741197957 2.028573572703632 1.3829685266005782 2.4255067873010105 1.1845019193018906 2.4255067873010105 0.7875687047045119 2.4255067873010105 0.39063549010713317 2.623973394599698 -0.006297724490242018 2.8224400018983893 -0.20476433178893316 2.4255067873010105 -1.3955639755810658 2.4255067873010105 -1.7924971901784446 1.4331737508075655 -2.387897012074511 1.0362405362101867 -2.5863636193731985 0.24237410701543283 -2.5863636193731985 -0.1545591075819459 -2.5863636193731985 -0.5514923221793246 -2.387897012074511 -0.9484255367766998 -2.387897012074511 -1.5438253586727662 -1.9909637974771321 -1.940758573270145 -1.7924971901784446 -1.940758573270145 -1.3955639755810658 -2.7346250024649024 -0.006297724490242018 -2.93309160976359 0.39063549010713317 -2.536158395166211 1.3829685266005782 -2.3376917878675236 1.779901741197957 -0.5514923221793246 2.772234777691402 + 0.04857524931393087 2.7510677173224494 0.6439750712099972 2.3541345027250706 1.0409082858073724 2.155667895426383 1.2393748931060635 1.7587346808290043 1.4378415004047511 1.3618014662316256 1.6363081077034423 1.163334858932938 2.0332413223008174 0.9648682516342468 2.2317079295995086 0.5679350370368716 2.430174536898196 0.1710018224394929 2.430174536898196 -0.6228646067552646 2.430174536898196 -1.0197978213526397 2.0332413223008174 -1.615197643248706 1.8347747150021299 -2.012130857846085 1.4378415004047511 -2.2105974651447724 1.0409082858073724 -2.2105974651447724 0.8424416785086848 -2.4090640724434635 0.04857524931393087 -2.4090640724434635 -0.34835796528344787 -2.4090640724434635 -1.1422243944782053 -2.012130857846085 -1.340691001776893 -1.8136642505473972 -1.5391576090755805 -1.4167310359500185 -1.9360908236729593 -1.2182644286513309 -2.333024038270338 -0.6228646067552646 -2.5314906455690256 -0.22593139215788582 -2.5314906455690256 0.1710018224394929 -2.333024038270338 0.5679350370368716 -2.333024038270338 0.9648682516342468 -1.9360908236729593 1.5602680735303167 -1.7376242163742717 1.957201288127692 -1.340691001776893 1.957201288127692 -0.9437577871795142 2.155667895426383 -0.7452911798808266 2.5526011100237582 0.04857524931393087 2.7510677173224494 + 0.10666487264508007 1.3784831901949133 0.5035980872424553 1.1800165828962221 0.900531301839834 1.1800165828962221 1.2974645164372127 1.1800165828962221 1.694397731034588 0.5846167610001558 1.892864338333279 0.18768354640278062 1.892864338333279 -0.6061828827919769 1.892864338333279 -1.003116097389352 1.4959311237359003 -1.2015827046880432 1.0989979091385216 -1.4000493119867272 0.30513147994376766 -1.4000493119867272 -0.09180173465361108 -1.4000493119867272 -0.29026834195229867 -1.2015827046880432 -0.6872015565496774 -1.2015827046880432 -1.4810679857444313 -0.8046494900906609 -1.87800120034181 -0.6061828827919769 -2.0764678076404977 0.5846167610001558 -1.87800120034181 0.783083368298847 -1.4810679857444313 0.9815499755975381 -1.2826013784457437 1.3784831901949133 -0.09180173465361108 1.3784831901949133 + 0.5033689354469288 1.4566221897235465 0.7018355427456164 1.0596889751261713 1.0987687573429952 1.0596889751261713 1.495701971940374 1.0596889751261713 1.8926351865377526 0.464289153230105 2.0911017938364402 0.06735593863272271 2.0911017938364402 -0.32957727596465247 1.8926351865377526 -0.7265104905620348 1.6941685792390615 -1.12344370515941 1.495701971940374 -1.321910312458101 1.0987687573429952 -1.5203769197567851 0.7018355427456164 -1.5203769197567851 0.30490232814824125 -1.5203769197567851 -0.885897315643895 -1.12344370515941 -1.2828305302412701 -1.12344370515941 -1.4812971375399613 -0.9249770978607188 -1.6797637448386489 -0.5280438832633436 -2.0766969594360276 -0.5280438832633436 -2.0766969594360276 0.26582254593141386 -2.0766969594360276 0.662755760528789 -1.4812971375399613 1.2581555824248554 -1.2828305302412701 1.4566221897235465 0.30490232814824125 1.4566221897235465 + 0.34967926047876574 1.0577615883502602 0.7466124750761445 0.8592949810515726 0.9450790823748321 0.6608283737528815 1.1435456896735232 0.2638951591555063 1.1435456896735232 -0.13303805544187242 0.9450790823748321 -0.5299712700392512 0.7466124750761445 -0.7284378773379387 0.34967926047876574 -0.9269044846366263 -0.04725395411860944 -0.9269044846366263 -0.4441871687159882 -0.9269044846366263 -0.8411203833133669 -0.7284378773379387 -1.2380535979107457 -0.5299712700392512 -1.2380535979107457 -0.13303805544187242 -1.2380535979107457 0.2638951591555063 -0.8411203833133669 0.2638951591555063 -0.6426537760146758 0.6608283737528815 -0.04725395411860944 1.0577615883502602 + 0.21835264632365714 1.6060437656105222 0.8137524682197235 1.2091105510131444 1.2106856828171004 1.010643943714455 1.4091522901157898 0.6137107291170771 1.4091522901157898 0.2167775145196993 1.4091522901157898 -0.18015570007767767 1.2106856828171004 -0.5770889146750555 0.8137524682197235 -0.7755555219737449 0.8137524682197235 -1.1724887365711227 0.41681925362234473 -1.3709553438698117 0.21835264632365714 -1.5694219511685006 -0.1785805682737216 -1.5694219511685006 -0.5755137828710986 -1.5694219511685006 -1.1709136047671649 -0.9740221292724338 -1.3693802120658543 -0.5770889146750555 -1.3693802120658543 -0.18015570007767767 -1.3693802120658543 0.2167775145196993 -0.9724469974684773 0.8121773364157665 -0.7739803901697879 1.2091105510131444 -0.1785805682737216 1.6060437656105222 + + + 0.3351919200236111 2.867340065119812 1.724458171114435 2.0734736359250583 1.9229247784131225 1.6765404213276796 2.319857993010501 1.0811405994316132 2.518324600309189 0.6842073848342345 2.518324600309189 -0.9035254735552769 2.518324600309189 -1.3004586881526539 2.12139138571181 -1.4989252954513415 2.12139138571181 -1.8958585100487202 1.724458171114435 -2.0943251173474096 1.5259915638157437 -2.4912583319447865 -0.4586745091711464 -2.689724939243476 -0.8556077237685216 -2.689724939243476 -2.0464073675606542 -1.6973919027500308 -2.2448739748593454 -1.3004586881526539 -2.443340582158033 -1.1019920808539645 -2.641807189456724 -0.7050588662565858 -2.641807189456724 -0.308125651659207 -2.641807189456724 0.08880756293816816 -2.443340582158033 0.4857407775355469 -2.443340582158033 0.8826739921329256 -1.8479407602619666 1.8750070286263707 -1.649474152963279 2.271940243223746 -1.451007545664588 2.470406850522437 -1.0540743310672127 2.470406850522437 -0.657141116469834 2.6688734578211246 -0.26020790187245524 2.867340065119812 0.1367253127249235 2.867340065119812 + 0.6338415521383709 0.7876084731085697 0.8323081594370585 0.390675258511191 0.4353749448396833 -0.20472456338487532 0.23690833754099216 -0.6016577779822541 -0.16002487705638302 -0.6016577779822541 -0.5569580916537618 -0.8001243852809417 -0.7554246989524493 -0.4031911706835629 -0.7554246989524493 -0.006257956086187733 -0.5569580916537618 0.1922086512125034 0.4353749448396833 0.7876084731085697 + 1.1500677029995146 2.9434471892930745 2.142400739492956 2.348047367397008 2.5393339540903312 2.1495807600983206 2.9362671686877135 1.5541809382022507 3.1347337759863976 1.1572477236048755 2.9362671686877135 0.7603145090074968 3.1347337759863976 0.363381294410118 3.1347337759863976 -0.03355192018726072 3.1347337759863976 -0.4304851347846359 2.5393339540903312 -1.422818171278081 2.340867346791647 -1.8197513858754597 1.3485343102981986 -2.415151207771526 1.1500677029995146 -2.8120844223689048 -0.8345983699873756 -2.8120844223689048 -1.2315315845847579 -2.8120844223689048 -1.628464799182133 -2.6136178150702136 -2.025398013779512 -2.6136178150702136 -2.2238646210781994 -2.415151207771526 -2.620797835675578 -1.6212847785767686 -3.017731050272957 -1.6212847785767686 -3.017731050272957 -1.2243515639793934 -3.2161976575716444 -0.8274183493820146 -3.2161976575716444 0.363381294410118 -3.2161976575716444 0.7603145090074968 -2.025398013779512 1.7526475455009418 -1.628464799182133 1.9511141527996294 -1.628464799182133 2.348047367397008 -1.2315315845847579 2.5465139746956957 -0.8345983699873756 2.5465139746956957 -0.6361317626886915 2.744980581994387 -0.23919854809130925 2.9434471892930745 0.9516010957008234 2.9434471892930745 + 1.0047858432259016 1.5104865416271744 1.4017190578232785 0.9150867197311081 1.600185665121968 0.5181535051337303 0.8063192359272122 -0.8711127459570922 0.6078526286285229 -1.26804596055447 0.2109194140311459 -1.466512567853159 0.012452806732456523 -1.6649791751518475 -0.38448040786492044 -1.466512567853159 -0.7814136224622992 -1.466512567853159 -1.1783468370596761 -1.26804596055447 -1.3768134443583655 -0.8711127459570922 -1.5752800516570549 -0.6726461386584033 -1.3768134443583655 -0.27571292406102543 -1.3768134443583655 0.12122029053635242 -1.1783468370596761 0.5181535051337303 -0.38448040786492044 1.312019934328486 0.012452806732456523 1.5104865416271744 0.8063192359272122 1.5104865416271744 + 1.1041035081096844 1.7914734035045825 1.5010367227070631 1.5930067962058985 1.8979699373044383 0.9976069743098321 2.0964365446031294 0.6006737597124499 2.294903151901817 -0.5901258840796828 2.0964365446031294 -0.987059098677058 1.8979699373044383 -1.1855257059757491 1.6995033300057507 -1.5824589205731243 1.302570115408372 -1.7809255278718155 1.1041035081096844 -1.9793921351705066 0.7071702935123056 -1.9793921351705066 0.3102370789149269 -1.9793921351705066 -0.8805625648772057 -1.5824589205731243 -1.277495779474581 -1.5824589205731243 -2.269828815968026 -0.39165927678099166 -2.468295423266717 0.005273937816383523 -2.468295423266717 0.4022071524137658 -2.0713622086693384 0.9976069743098321 -1.8728956013706508 1.3945401889072073 -1.475962386773272 1.5930067962058985 -1.277495779474581 1.7914734035045825 0.7071702935123056 1.7914734035045825 + 0.6440965594660106 2.136080044788038 1.0410297740633894 1.9376134374893539 1.2394963813620805 1.7391468301906627 1.437962988660768 1.3422136155932876 1.8348962032581468 1.1437470082945964 2.0333628105568344 0.7468137936972212 2.231829417855522 0.5483471863985301 2.430296025154213 0.1514139718011549 2.430296025154213 -0.2455192427962274 2.6287626324529008 -0.6424524573936026 2.231829417855522 -1.237852279289669 2.0333628105568344 -1.6347854938870512 1.6364295959594557 -1.6347854938870512 1.437962988660768 -2.0317187084844264 0.24716334486863545 -2.2301853157831175 -0.1497698697287433 -2.2301853157831175 -1.539036120819567 -1.43631888658836 -1.7375027281182547 -1.237852279289669 -2.1344359427156334 -0.4439858500949114 -2.5313691573130086 -0.2455192427962274 -2.5313691573130086 0.5483471863985301 -2.5313691573130086 0.9452804009959053 -2.332902550014321 1.3422136155932876 -1.7375027281182547 1.7391468301906627 -1.340569513520876 1.9376134374893539 -0.9436362989235008 1.9376134374893539 -0.546703084326122 2.136080044788038 0.6440965594660106 2.136080044788038 + + + 0.9486112831383053 2.7433138760306974 1.7424777123330628 1.94944744683594 2.1394109269304415 1.7509808395372488 2.337877534229129 0.9571144103424984 2.5363441415278167 0.5601811957451162 2.5363441415278167 0.16324798114774097 2.5363441415278167 -0.2336852334496342 1.9409443196317504 -1.622951484540458 1.9409443196317504 -2.019884699137833 1.5440111050343717 -2.2183513064365243 1.345544497735684 -2.4168179137352155 0.9486112831383053 -2.4168179137352155 0.5516780685409302 -2.6152845210339066 -0.24218836065382732 -2.6152845210339066 -0.639121575251206 -2.6152845210339066 -1.0360547898485812 -2.4168179137352155 -1.43298800444596 -2.4168179137352155 -2.0283878263420263 -1.8214180918391492 -2.2268544336407174 -1.622951484540458 -2.6237876482380926 -0.03521862615095017 -2.6237876482380926 0.3617145884464321 -2.0283878263420263 1.3540476249398736 -1.8299212190433387 1.7509808395372488 -1.2345213971472724 2.147914054134631 -1.0360547898485812 2.5448472687320063 -0.639121575251206 2.5448472687320063 -0.24218836065382732 2.7433138760306974 0.9486112831383053 2.7433138760306974 + 0.8397321315541326 2.8652982371454954 1.435131953450199 2.468365022548113 1.8320651680475777 2.269898415249429 2.427464989943644 1.2775653787559804 2.6259315972423316 0.8806321641586052 2.6259315972423316 -0.3101674796335274 2.6259315972423316 -0.7071006942309097 2.228998382644953 -1.8979003380230424 2.0305317753462653 -2.0963669453217264 1.6335985607488865 -2.2948335526204175 1.2366653461515114 -2.4933001599191087 0.8397321315541326 -2.4933001599191087 0.4427989169567539 -2.6917667672177927 0.2443323096580663 -2.890233374516484 -0.15260090493931244 -2.890233374516484 -0.5495341195366912 -2.890233374516484 -1.343400548731445 -2.4933001599191087 -1.7403337633288238 -2.2948335526204175 -2.33573358522489 -1.302500516126976 -2.732666799822269 -1.104033908828285 -2.732666799822269 0.48369894956123005 -2.732666799822269 0.8806321641586052 -2.33573358522489 1.0790987714572964 -2.33573358522489 1.4760319860546716 -1.7403337633288238 2.071431807950738 -1.5418671560301362 2.269898415249429 -0.7480007268353788 2.666831629846804 -0.5495341195366912 2.8652982371454954 0.641265524255445 2.8652982371454954 + 0.7196861095042237 1.5568080813153573 0.9181527168029131 1.1598748667179795 1.31508593140029 1.1598748667179795 1.31508593140029 0.7629416521206016 1.5135525386989794 0.36600843752322376 1.31508593140029 0.16754183022453528 1.31508593140029 -0.22939138437284257 1.1166193241016025 -0.6263245989702204 0.9181527168029131 -1.0232578135675983 0.3227528949068468 -1.420191028164976 -0.07418031969053196 -1.6186576354636646 -0.4711135342879089 -1.420191028164976 -0.8680467488852877 -1.420191028164976 -1.2649799634826646 -0.8247912062689093 -1.463446570781354 -0.42785799167153105 -1.463446570781354 -0.030924777074153198 -1.463446570781354 0.36600843752322376 -1.0665133561839752 0.5644750448219131 -0.8680467488852877 0.961408259419291 -0.6695801415865983 1.1598748667179795 -0.27264692698921955 1.3583414740166688 0.12428628760815741 1.5568080813153573 0.5212195022055344 1.5568080813153573 + 0.2065654885901047 3.10697735107561 0.6034987031874834 2.9085107437769224 1.0004319177848586 2.9085107437769224 1.595831739680925 2.5115775291795437 1.9927649542783037 2.313110921880856 2.191231561576995 1.9161777072834774 2.3896981688756824 1.717711099984788 2.786631383473061 0.9238446707900323 2.9850979907717488 0.7253780634913447 2.9850979907717488 -0.06848836570341099 3.1835645980704363 -0.46542158030078973 2.9850979907717488 -0.8623547948981667 2.9850979907717488 -1.2592880094955454 2.58816477617437 -1.8546878313916118 2.3896981688756824 -2.2516210459889887 1.595831739680925 -2.6485542605863674 1.3973651323822374 -2.847020867885057 1.0004319177848586 -2.847020867885057 0.6034987031874834 -3.0454874751837444 -0.19036772600727403 -3.0454874751837444 -0.5873009406046528 -3.0454874751837444 -1.976567191695473 -2.2516210459889887 -2.3735004062928517 -2.053154438690301 -2.571967013591541 -1.6562212240929224 -2.7704336208902287 -1.457754616794233 -2.7704336208902287 -1.060821402196856 -2.7704336208902287 -0.6638881875994773 -2.968900228188918 -0.26695497300210036 -3.1673668354876074 0.12997824159527838 -3.1673668354876074 0.5269114561926553 -2.571967013591541 1.5192444926861004 -2.571967013591541 1.9161777072834774 -1.976567191695473 2.5115775291795437 -1.7781005843967854 2.710044136478235 -1.3811673697994067 2.9085107437769224 -0.984234155202028 2.9085107437769224 -0.5873009406046528 3.10697735107561 0.2065654885901047 3.10697735107561 + 0.6299811246828142 0.8374689414041931 0.8284477319815053 0.4405357268068144 0.8284477319815053 0.04360251220943567 0.4315145173841266 -0.15486409508925192 0.4315145173841266 -0.5517973096866307 -0.3623519118106273 -0.7502639169853182 -0.759285126408006 -0.7502639169853182 -0.759285126408006 0.04360251220943567 -0.5608185191093185 0.4405357268068144 -0.16388530451193972 0.4405357268068144 0.4315145173841266 0.8374689414041931 + 1.612415617937991 3.186300300185472 2.2078154398340573 2.7893670855880934 2.6047486544314324 2.590900478289406 3.0016818690288076 1.7970340490946484 3.39861508362619 1.5985674417959608 3.39861508362619 1.201634227198582 3.39861508362619 0.8047010126012033 3.597081690924874 0.4077677980038281 3.597081690924874 0.010834583406449383 3.39861508362619 -0.18763202389224176 3.2001484763274988 -0.584565238489617 3.2001484763274988 -0.9814984530869957 3.0016818690288076 -1.3784316676843744 3.0016818690288076 -1.7753648822817532 2.4062820471327413 -2.1722980968791283 2.2078154398340573 -2.569231311476507 1.810882225236675 -2.569231311476507 0.8185491887432335 -3.1646311333725734 0.42161597414585117 -3.363097740671261 0.024682759548475985 -3.363097740671261 -0.3722504550488992 -3.363097740671261 -1.1661168842436567 -3.1646311333725734 -1.5630500988410319 -3.1646311333725734 -1.761516706139723 -2.7676979187751947 -2.5553831353344805 -2.569231311476507 -2.7538497426331645 -2.3707647041778195 -3.150782957230547 -1.576898274983062 -3.349249564529238 -1.3784316676843744 -3.349249564529238 -0.9814984530869957 -3.349249564529238 -0.584565238489617 -3.547716171827922 -0.18763202389224176 -3.547716171827922 0.20930119070513697 -3.349249564529238 0.6062344053025157 -3.349249564529238 1.0031676198998944 -2.7538497426331645 1.995500656393336 -2.5553831353344805 2.3924338709907147 -2.158449920737098 2.590900478289406 -1.761516706139723 2.590900478289406 -1.5630500988410319 2.7893670855880934 -0.7691836696462815 2.987833692886781 -0.3722504550488992 3.186300300185472 1.612415617937991 3.186300300185472 + + + 0.8099286882388625 2.8905393530826373 1.8022617247323076 2.295139531186571 2.1991949393296863 2.09667292388788 2.5961281539270615 1.5012731019918135 2.7945947612257527 1.1043398873944383 2.9930613685244403 -0.08645975639769432 2.9930613685244403 -0.4833929709950695 2.000728332030995 -2.269592436683272 1.8022617247323076 -2.468059043981963 1.4053285101349289 -2.6665256512806508 1.0083952955375537 -2.8649922585793384 -0.5793375628519577 -2.8649922585793384 -0.9762707774493364 -2.8649922585793384 -1.5716705993454028 -2.468059043981963 -1.9686038139427815 -2.269592436683272 -2.167070421241469 -1.8726592220858969 -2.564003635838848 -1.6741926147872093 -2.7624702431375354 -0.4833929709950695 -2.9609368504362266 -0.28492636369638547 -2.9609368504362266 0.508940065498372 -2.9609368504362266 0.9058732800957472 -2.7624702431375354 1.3028064946931295 -2.564003635838848 1.6997397092905047 -1.9686038139427815 2.09667292388788 -1.770137206644094 2.493606138485262 -1.3732039920467152 2.493606138485262 -0.9762707774493364 2.692072745783946 -0.5793375628519577 2.8905393530826373 0.611462080940175 2.8905393530826373 + 0.6023407305666204 1.383192956004085 0.9992739451639991 1.1847263487053956 1.396207159761376 0.5893265268093293 1.396207159761376 0.19239331221195144 1.1977405524626867 -0.2045399023854264 1.1977405524626867 -0.6014731169828043 0.6023407305666204 -1.196872938878871 0.20540751596924345 -1.39533954617756 -0.1915256986281353 -1.39533954617756 -0.5884589132255122 -1.39533954617756 -0.7869255205242016 -1.196872938878871 -1.1838587351215786 -0.9984063315801821 -1.382325342420268 0.19239331221195144 -1.382325342420268 0.5893265268093293 -0.3899923059268229 1.1847263487053956 0.00694090867055408 1.383192956004085 0.40387412326793104 1.383192956004085 + 0.856767683215093 3.006911754021651 2.246033934305917 2.2130453248268935 2.4445005416046044 1.8161121102295184 2.6429671489032955 1.6176455029308272 2.841433756201983 1.220712288333452 3.0399003635006707 -0.3670205700560558 3.0399003635006707 -0.7639537846534381 2.841433756201983 -1.1608869992508133 2.841433756201983 -1.5578202138481885 2.246033934305917 -1.9547534284455708 2.0475673270072257 -2.351686643042946 1.6506341124098505 -2.550153250341637 1.2537008978124717 -2.7486198576403282 0.856767683215093 -2.7486198576403282 -0.13556535327835206 -3.1455530722377034 -0.5324985678757272 -3.1455530722377034 -1.5248316043691723 -2.550153250341637 -1.921764818966551 -2.351686643042946 -2.5171646408626174 -1.7562868211468796 -2.715631248161305 -1.5578202138481885 -2.914097855459996 -1.1608869992508133 -2.914097855459996 -0.7639537846534381 -2.914097855459996 -0.3670205700560558 -3.1125644627586837 0.029912644541319366 -3.1125644627586837 0.42684585913869455 -3.1125644627586837 0.8237790737360768 -2.715631248161305 1.4191788956321432 -2.5171646408626174 1.8161121102295184 -2.1202314262652386 2.0145787175282095 -1.921764818966551 2.4115119321255847 -1.1278983897717936 2.609978539424276 -0.929431782473106 3.006911754021651 0.6583010759164054 3.006911754021651 + 0.4471014454144573 3.5647956271118257 1.0425012673105236 3.1678624125144488 1.4394344819079024 3.1678624125144488 2.0348343038039687 2.5724625906183824 2.431767518401344 2.5724625906183824 3.02716734029741 1.9770627687223161 3.2256339475961013 1.5801295541249374 3.62256716219348 0.5877965176314923 3.62256716219348 0.19086330303411536 3.424100554894789 -0.6030031261606403 3.424100554894789 -0.9999363407580191 2.8287007329987226 -1.9922693772514624 2.630234125700035 -2.389202591848841 2.2333009111026563 -2.5876691991475287 2.0348343038039687 -2.786135806446218 0.24863483811576614 -3.5800022356409738 -0.14829837648160904 -3.5800022356409738 -0.5452315910789878 -3.3815356283422844 -0.9421648056763665 -3.3815356283422844 -1.9344978421698116 -2.786135806446218 -2.3314310567671868 -2.786135806446218 -2.529897664065878 -2.389202591848841 -2.9268308786632566 -2.1907359845501517 -3.1252974859619442 -1.793802769952773 -3.3237640932606336 -1.5953361626540854 -3.3237640932606336 -0.8014697334593297 -3.3237640932606336 -0.40453651886195097 -3.522230700559321 -0.007603304264574007 -3.522230700559321 0.38932991033280473 -3.522230700559321 0.7862631249301817 -2.7283642713645655 2.1755293760210037 -2.529897664065878 2.5724625906183824 -1.5375646275724328 3.1678624125144488 -1.140631412975054 3.366329019813138 -0.3467649837803002 3.366329019813138 0.05016823081707855 3.366329019813138 0.4471014454144573 3.5647956271118257 + 0.5234411689574294 0.783420818284366 0.721907776256117 0.3864876036869873 0.3249745616587383 -0.20891221820907901 0.1265079543600507 -0.6058454328064578 -0.27042526023732805 -0.6058454328064578 -0.6673584748347032 -0.6058454328064578 -0.6673584748347032 -0.20891221820907901 -0.46889186753601564 0.18802099638829972 -0.0719586529386369 0.3864876036869873 0.1265079543600507 0.5849542109856749 0.5234411689574294 0.783420818284366 + 0.7031115425841392 3.7242342449626697 1.1000447571815144 3.5257676376639857 1.2985113644802055 3.3273010303652946 1.6954445790775807 3.3273010303652946 2.092377793674956 3.1288344230666034 2.489311008272338 2.930367815767916 3.0847108301684045 2.3349679938718495 3.2831774374670886 2.136501386573162 3.680110652064471 1.3426349573784044 3.878577259363155 0.9457017427810293 3.878577259363155 0.15183531358627178 3.878577259363155 -0.2450979010111034 3.680110652064471 -0.44356450830979455 3.680110652064471 -0.8404977229071733 3.2831774374670886 -1.6343641521019272 3.0847108301684045 -1.8328307594006148 1.8939111863762719 -3.023630403192751 1.6954445790775807 -3.2220970104914386 1.2985113644802055 -3.420563617790126 0.9015781498828233 -3.6190302250888173 -1.0830879231040669 -3.6190302250888173 -1.480021137701442 -3.6190302250888173 -1.6784877450001332 -3.420563617790126 -2.0754209595975084 -3.2220970104914386 -2.2738875668961995 -2.82516379589406 -2.6708207814935747 -2.82516379589406 -2.6708207814935747 -2.428230581296681 -3.06775399609095 -2.428230581296681 -3.266220603389641 -2.031297366699306 -3.464687210688332 -1.8328307594006148 -3.464687210688332 -1.4358975448032396 -3.6631538179870162 -1.0389643302058609 -3.8616204252857074 -0.6420311156084821 -3.8616204252857074 0.5487685281836505 -3.8616204252857074 0.9457017427810293 -2.2738875668961995 2.7319012084692282 -2.0754209595975084 2.930367815767916 -1.281554530402751 3.3273010303652946 -1.0830879231040669 3.5257676376639857 -0.6861547085066846 3.5257676376639857 -0.2892214939093094 3.5257676376639857 0.10771172068806578 3.7242342449626697 0.5046449352854481 3.7242342449626697 + + + 0.3584427210605803 0.763795731119032 0.3584427210605803 0.36686251652165325 0.5569093283592679 -0.030070698075721936 0.1599761137618927 -0.6254705199717883 -0.23695710083548605 -0.8239371272704794 -0.43542370813417364 -0.42700391267310067 -0.43542370813417364 -0.030070698075721936 -0.43542370813417364 0.36686251652165325 -0.23695710083548605 0.5653291238203444 0.1599761137618927 0.763795731119032 + 0.1966952716495456 3.473242642320457 0.5936284862469243 3.274776035021773 0.9905617008443031 3.274776035021773 2.3798279519351233 2.4809096058270157 2.5782945592338145 2.2824429985283246 2.776761166532502 1.8855097839309494 2.776761166532502 1.4885765693335742 2.9752277738311896 1.091643354736192 3.173694381129881 -0.09915628905594076 3.3721609884285684 -0.2976228963546248 2.3798279519351233 -2.083822362042831 2.1813613446364357 -2.480755576640206 1.784428130039057 -2.679222183938897 1.5859615227403694 -2.8776887912375813 0.7920950935456119 -3.2746220058349635 0.5936284862469243 -3.4730886131336476 -0.2002379429478296 -3.4730886131336476 -0.5971711575452083 -3.4730886131336476 -1.3910375867399658 -3.0761553985362724 -1.787970801337341 -2.8776887912375813 -2.1849040159347197 -2.282288969341515 -2.5818372305320985 -2.083822362042831 -2.780303837830786 -1.6868891474454486 -2.978770445129477 -1.4884225401467646 -3.177237052428165 -0.2976228963546248 -3.177237052428165 0.09931031824275038 -2.978770445129477 0.8931767474375079 -2.978770445129477 1.290109962034883 -2.5818372305320985 1.8855097839309494 -2.3833706232334073 2.2824429985283246 -1.9864374086360321 2.4809096058270157 -1.787970801337341 2.877842820424391 -1.3910375867399658 2.877842820424391 -0.7956377648438959 3.274776035021773 -0.39870455024652074 3.473242642320457 -0.001771335649142003 3.473242642320457 + 1.1605171802371146 3.7030794087173966 2.5497834313279384 2.909212979522639 2.9467166459253136 2.710746372223955 2.9467166459253136 2.313813157626573 3.3436498605226888 2.1153465503278817 3.54211646782138 1.3214801211331277 3.740583075120071 1.1230135138344401 3.740583075120071 -0.46471934455507125 3.740583075120071 -0.86165255915245 2.9467166459253136 -2.2509188102432702 2.7482500386266224 -2.647852024840649 1.954383609431872 -3.0447852394380277 1.954383609431872 -3.441718454035403 0.7635839656397323 -3.640185061334094 0.5651173583410483 -3.8386516686327816 -0.2287490708537092 -3.8386516686327816 -0.6256822854510844 -3.8386516686327816 -1.816481929243217 -3.2432518467367153 -2.014948536541908 -3.0447852394380277 -3.0072815730353497 -2.2509188102432702 -3.205748180334041 -1.8539855956458915 -3.205748180334041 -1.4570523810485163 -3.404214787632732 -1.2585857737498252 -3.801148002230107 -1.0601191664511376 -3.9996146095287983 0.13068047734099508 -4.1980812168274895 0.5276136919383738 -3.9996146095287983 0.7260802992370614 -3.602681394931423 0.9245469065357526 -3.404214787632732 1.3214801211331277 -3.404214787632732 1.7184133357305065 -3.0072815730353497 2.313813157626573 -2.8088149657366657 2.710746372223955 -1.0226155000484667 3.5046128014187055 -0.6256822854510844 3.7030794087173966 -0.2287490708537092 3.5046128014187055 0.7635839656397323 3.7030794087173966 + 0.3402902395295566 1.370673518816651 0.9356900614256247 0.7752736969205838 1.3326232760230017 0.7752736969205838 1.531089883321691 0.37834048232320594 1.531089883321691 -0.01859273227417102 1.1341566687243123 -0.6139925541702382 0.9356900614256247 -1.010925768767616 0.3402902395295566 -1.407858983364994 -0.056642975067820345 -1.407858983364994 -0.850509404262576 -1.010925768767616 -1.247442618859953 -0.8124591614689272 -1.4459092261586424 -0.01859273227417102 -1.4459092261586424 0.37834048232320594 -1.247442618859953 0.5768070896218953 -1.0489760115612654 0.9737403042192732 -0.6520427969638867 1.1722069115179616 -0.2551095823665097 1.370673518816651 0.14182363223086902 1.370673518816651 + 0.6399908460036379 3.169292824552734 1.0369240606010166 2.970826217254043 1.4338572751983953 2.970826217254043 1.632323882497083 2.5738930026566678 2.0292570970944617 2.5738930026566678 2.4261903116918404 2.3754263953579766 2.4261903116918404 1.9784931807605943 3.0215901335879067 0.9861601442671528 3.2200567408865943 0.5892269296697776 3.2200567408865943 0.19229371507239534 3.2200567408865943 -0.20463949952497984 3.0215901335879067 -0.601572714122355 3.0215901335879067 -0.9985059287197373 2.4261903116918404 -1.9908389652131788 2.2277237043931493 -2.387772179810561 1.8307904897957705 -2.387772179810561 1.8307904897957705 -2.7847053944079363 1.4338572751983953 -2.9831720017066274 0.4415242387049503 -3.181638609005315 0.04459102410757154 -3.3801052163040026 -0.3523421904898072 -3.181638609005315 -1.5431418342819399 -2.9831720017066274 -1.7416084415806274 -2.7847053944079363 -1.9400750488793186 -2.387772179810561 -2.535474870775383 -1.9908389652131788 -2.7339414780740725 -1.5939057506158036 -3.1308746926714512 -0.006172892226288695 -3.329341299970139 0.19229371507239534 -3.1308746926714512 0.5892269296697776 -3.1308746926714512 0.9861601442671528 -2.7339414780740725 1.7800265734619103 -2.535474870775383 1.9784931807605943 -2.138541656178006 2.1769597880592855 -1.9400750488793186 2.5738930026566678 -1.7416084415806274 2.772359609955352 -1.3446752269832487 2.970826217254043 -0.9477420123858735 3.169292824552734 0.6399908460036379 3.169292824552734 + -0.11556283462961403 3.8015032616990787 1.2737034164612098 3.007636832504325 1.670636631058585 3.007636832504325 2.66296966755203 2.4122370106082567 3.0599028821494088 2.213770403309569 3.8537693113441627 1.4199039741148134 4.052235918642854 1.0229707595174347 4.052235918642854 -0.167828884274698 4.052235918642854 -0.5647620988720767 3.8537693113441627 -0.9616953134694537 3.8537693113441627 -1.3586285280668324 3.4568360967467875 -1.9540283499628988 3.2583694894480963 -2.3509615645602757 2.861436274850721 -2.549428171858965 2.66296966755203 -2.7478947791576545 1.869103238357276 -3.1448279937550314 1.670636631058585 -3.343294601053721 1.2737034164612098 -3.343294601053721 0.876770201863831 -3.54176120835241 -0.3140294419283016 -3.54176120835241 -0.7109626565256804 -3.54176120835241 -2.4971621222138793 -2.7478947791576545 -2.894095336811258 -2.549428171858965 -3.4894951587073244 -1.55709513536552 -3.886428373304703 -1.3586285280668324 -3.886428373304703 -0.5647620988720767 -4.0848949806033925 -0.167828884274698 -3.6879617660060156 1.618370581413501 -3.4894951587073244 2.0153037960108797 -2.894095336811258 2.610703617906946 -2.4971621222138793 2.610703617906946 -2.2986955149151918 3.007636832504325 -1.7032956930191254 3.4045700471017035 -1.3063624784217467 3.603036654400391 -0.11556283462961403 3.8015032616990787 + + + 0.7122062329179109 3.5022803209505255 2.101472484008731 2.708413891755768 2.49840569860611 2.509947284457084 2.49840569860611 2.1130140698597017 2.6968723059047974 1.7160808552623266 3.093805520502176 1.5176142479636354 3.093805520502176 1.1206810333662602 3.2922721278008673 0.723747818768878 3.2922721278008673 -0.4670518250232547 3.490738735099555 -0.6655184323219387 3.093805520502176 -1.4593848615166962 3.093805520502176 -1.8563180761140714 2.2999390913074222 -2.650184505308829 2.101472484008731 -3.047117719906211 1.3076060548139772 -3.2455843272048988 1.109139447515286 -3.4440509345035863 0.3152730183205321 -3.4440509345035863 -0.08166019627684662 -3.642517541802274 -0.4785934108742218 -3.4440509345035863 -0.8755266254716005 -3.4440509345035863 -1.8678596619650456 -2.84865111260752 -2.2647928765624243 -2.650184505308829 -2.463259483861112 -2.2532512907114537 -2.6617260911598013 -2.0547846834127625 -3.0586593057571783 -1.260918254218005 -3.0586593057571783 -0.8639850396206299 -3.455592520354557 -0.26858521772456356 -3.455592520354557 0.12834799687281162 -3.2571259130558676 0.5252812114701939 -3.2571259130558676 0.9222144260675691 -3.2571259130558676 1.3191476406649443 -2.6617260911598013 2.311480677158393 -2.463259483861112 2.708413891755768 -1.8678596619650456 3.1053471063531504 -1.4709264473676686 3.3038137136518344 -1.0739932327702917 3.3038137136518344 -0.677060018172913 3.5022803209505255 0.5137396256192197 3.5022803209505255 + 0.3258782089912202 4.0482567663487625 2.112077674679419 3.452856944452696 2.509010889276798 3.254390337154005 3.1044107111728643 2.6589905152579387 3.302877318471552 2.460523907959251 3.6998105330689306 1.6666574787644954 3.898277140367618 1.2697242641671167 4.096743747666309 0.2773912276736734 4.295210354964997 -0.11954198692370532 4.096743747666309 -0.5164752015210823 4.096743747666309 -0.913408416118461 3.501343925770243 -1.905741452611906 3.302877318471552 -2.302674667209283 2.509010889276798 -3.0965410964040387 2.3105442819781103 -3.4934743110014157 1.5166778527833529 -3.691940918300105 1.3182112454846653 -3.8904075255987944 -0.6664548275022248 -3.8904075255987944 -1.0633880420996036 -3.8904075255987944 -2.452654293190424 -3.0965410964040387 -2.8495875077878026 -2.8980744891053494 -3.444987329683869 -2.302674667209283 -3.6434539369825565 -2.1042080599105937 -4.040387151579935 -1.310341630715838 -4.238853758878626 -1.1118750234171504 -4.040387151579935 -0.7149418088197717 -4.040387151579935 0.475857834972361 -4.040387151579935 0.8727910495697397 -4.040387151579935 1.2697242641671167 -3.444987329683869 1.865124086063183 -3.444987329683869 2.26205730066056 -2.8495875077878026 2.85745712255663 -2.651120900489115 3.0559237298553175 -0.8649214348009124 3.8497901590500714 -0.46798822020353725 4.0482567663487625 0.3258782089912202 4.0482567663487625 + 1.054910772876358 3.578406934114284 1.4518439874737368 3.3799403268155928 1.6503105947724244 2.9830071122182176 2.4441770239671783 2.7845405049195264 2.642643631265866 2.3876072903221512 2.841110238564557 2.18914068302346 3.039576845863248 1.792207468426085 3.4365100604606234 0.006008002737885931 3.4365100604606234 -0.39092521185949636 3.238043453161932 -0.7878584264568715 3.238043453161932 -1.1847916410542467 3.039576845863248 -1.581724855651629 2.642643631265866 -2.1771246775476953 2.4441770239671783 -2.5740578921450705 1.054910772876358 -3.367924321339828 0.6579775582789793 -3.566390928638519 -0.9297553001105321 -3.566390928638519 -1.3266885147079108 -3.566390928638519 -1.5251551220065984 -3.367924321339828 -1.9220883366039772 -3.169457714041137 -2.9144213730974187 -1.9786580702490042 -3.11288798039611 -1.581724855651629 -3.11288798039611 -1.1847916410542467 -3.3113545876947974 -0.7878584264568715 -3.3113545876947974 0.7998744319326363 -3.3113545876947974 1.1968076465300186 -3.11288798039611 1.3952742538287097 -3.11288798039611 1.792207468426085 -2.715954765798731 1.990674075724776 -2.715954765798731 2.3876072903221512 -2.3190215512013523 2.3876072903221512 -2.1205549439026647 2.7845405049195264 -1.1282219074092197 3.3799403268155928 -0.731288692811841 3.578406934114284 0.8564441655776669 3.578406934114284 + 0.1744100488383502 0.6495270784323353 0.37287665613704135 0.2525938638349565 0.37287665613704135 -0.5412725653597974 -0.024056558460337385 -0.739739172658485 -0.4209897730577161 -0.14433935076241866 -0.4209897730577161 0.2525938638349565 -0.22252316575902498 0.6495270784323353 0.1744100488383502 0.6495270784323353 + 0.35389777956605606 1.397507079075539 0.7508309941634348 1.1990404717768497 0.9492976014621242 1.0005738644781612 1.3462308160595011 0.20670743528340552 1.3462308160595011 -0.19022577931397233 0.9492976014621242 -0.7856256012100391 0.7508309941634348 -1.182558815807417 0.5523643868647454 -1.3810254231061059 0.15543117226736847 -1.3810254231061059 -0.24150204233001027 -1.3810254231061059 -0.6384352569273872 -1.182558815807417 -1.035368471524766 -0.984092208508728 -1.2338350788234536 -0.5871589939113502 -1.2338350788234536 0.20670743528340552 -1.2338350788234536 0.6036406498807834 -1.035368471524766 0.8021072571794718 -0.8369018642260766 1.1990404717768497 0.35389777956605606 1.397507079075539 + 0.9265573930572444 3.797810758944074 2.7127568587454434 2.8054777224506253 2.9112234660441345 2.607011115151934 3.1096900733428257 2.210077900554559 3.506623287940201 2.0116112932558714 3.705089895238892 1.8131446859571803 3.903556502537576 1.416211471359805 4.102023109836267 1.0192782567624263 4.102023109836267 0.6223450421650476 3.903556502537576 0.22541182756766887 3.903556502537576 -0.9653878162244638 3.903556502537576 -1.3623210308218425 3.705089895238892 -1.5607876381205301 3.506623287940201 -1.9577208527179089 3.1096900733428257 -2.1561874600165964 2.315823644148068 -2.9500538892113504 2.117357036849377 -3.346987103808729 1.7204238222520019 -3.346987103808729 1.1250240003559355 -3.743920318406108 0.7280907857585532 -3.9423869257047954 0.33115757116117805 -3.9423869257047954 -0.06577564343619713 -3.9423869257047954 -0.8596420726309546 -3.743920318406108 -1.2565752872283298 -3.743920318406108 -1.8519751091243961 -3.346987103808729 -2.0504417164230873 -2.9500538892113504 -2.4473749310204695 -2.9500538892113504 -2.8443081456178447 -2.7515872819126628 -3.2412413602152235 -2.1561874600165964 -3.6381745748125986 -1.9577208527179089 -3.6381745748125986 -1.5607876381205301 -3.83664118211129 -1.1638544235231514 -3.83664118211129 -0.7669212089257726 -3.6381745748125986 -0.36998799432839746 -3.6381745748125986 0.026945220268981274 -3.83664118211129 0.22541182756766887 -4.035107789409977 0.6223450421650476 -4.035107789409977 1.0192782567624263 -3.83664118211129 1.416211471359805 -3.83664118211129 1.8131446859571803 -3.6381745748125986 2.210077900554559 -3.439707967513911 2.4085445078532466 -1.653508501825712 3.4008775443466916 -1.2565752872283298 3.599344151645383 -0.8596420726309546 3.599344151645383 -0.6611754653322635 3.797810758944074 -0.2642422507348883 3.599344151645383 0.1326909638624869 3.797810758944074 0.9265573930572444 3.797810758944074 + + + 0.5979895403780162 1.2607220428048356 0.994922754975395 1.062255435506147 1.391855969572772 0.4668556136100799 1.391855969572772 0.06992239901270292 0.7964561476767056 -0.9224106374807421 0.5979895403780162 -1.31934385207812 0.20105632578063926 -1.31934385207812 -0.19587688881673948 -1.31934385207812 -0.5928101034141164 -1.120877244779431 -0.9897433180114952 -1.120877244779431 -1.1882099253101828 -0.7239440301820532 -1.3866765326088721 -0.32701081558467493 -1.3866765326088721 0.06992239901270292 -0.9897433180114952 0.6653222209087692 -0.7912767107128058 1.062255435506147 -0.3943434961154271 1.2607220428048356 0.39952293307932685 1.2607220428048356 + 0.6465863198475539 3.7717852465070223 2.43278578553576 2.7794522100135737 2.631252392834444 2.5809856027148825 3.4251188220292015 1.1917193516240658 3.6235854293278926 0.7947861370266835 3.6235854293278926 0.39785292242930836 3.6235854293278926 9.197078319331808E-4 3.4251188220292015 -0.3960135067654491 3.4251188220292015 -0.7929467213628243 3.4251188220292015 -1.1898799359602066 3.0281856074318263 -1.785279757856273 2.829719000133135 -2.182212972453648 2.234319178237069 -2.7776127943497144 2.0358525709383777 -2.9760794016484056 1.2419861417436202 -3.3730126162457807 0.845052927146245 -3.571479223544472 0.4481197125488663 -3.571479223544472 0.2496531052501787 -3.769945830843156 -0.14728010934720004 -3.769945830843156 -1.3380797531393327 -3.3730126162457807 -1.7350129677367114 -3.3730126162457807 -1.933479575035399 -2.9760794016484056 -2.3304127896327778 -2.9760794016484056 -2.5288793969314654 -2.5791461870510233 -2.925812611528844 -2.3806795797523392 -3.322745826126223 -1.3883465432588906 -3.5212124334249104 -0.9914133286615154 -3.5212124334249104 -0.19754689946675796 -3.5212124334249104 0.19938631513061722 -3.322745826126223 0.9932527443253747 -3.322745826126223 1.3901859589227499 -2.925812611528844 1.9855857808188162 -2.727346004230153 2.3825189954161985 -2.3304127896327778 2.5809856027148825 -2.1319461823340866 2.977918817312265 -1.7350129677367114 3.176385424610956 -1.5365463604380203 3.37485203190964 0.4481197125488663 3.7717852465070223 + -0.19987935438059168 3.083880733538571 0.19705386021678706 2.8854141262398834 0.990920289411541 2.8854141262398834 1.3878535040089197 2.8854141262398834 1.7847867186062985 2.290014304343817 2.1817199332036736 2.091547697045126 2.5786531478010524 1.297681267850372 2.77711975509974 1.0992146605516844 2.77711975509974 -0.4885181978378288 2.77711975509974 -0.8854514124352058 2.5786531478010524 -1.2823846270325845 2.5786531478010524 -1.6793178416299614 1.983253325904986 -2.2747176635260278 1.7847867186062985 -2.473184270824717 1.3878535040089197 -2.6716508781234065 0.990920289411541 -2.870117485422096 0.7924536821128534 -2.6716508781234065 -0.795279176276658 -2.6716508781234065 -1.1922123908740367 -2.6716508781234065 -1.9860788200687907 -2.2747176635260278 -2.3830120346661694 -2.07625105622734 -2.779945249263548 -1.480851234331272 -2.9784118565622357 -1.0839180197338951 -2.9784118565622357 -0.6869848051365182 -2.779945249263548 -0.2900515905391394 -2.779945249263548 0.5038148386556145 -2.779945249263548 0.9007480532529932 -2.3830120346661694 1.4961478751490596 -2.184545427367482 1.8930810897464383 -0.5968125689779704 2.8854141262398834 + -0.17565435358608994 2.973095679400707 0.22127886101128524 2.774629072102016 1.0151452902060427 2.774629072102016 1.412078504803425 2.774629072102016 1.610545112102109 2.576162464803325 2.0074783266994913 2.3776958575046407 2.2059449339981754 1.9807626429072585 2.4044115412968665 1.5838294283098833 2.4044115412968665 1.186896213712501 2.6028781485955577 0.9884296064138134 2.6028781485955577 -0.20237003737831927 2.6028781485955577 -0.599303251975698 2.4044115412968665 -0.9962364665730732 2.2059449339981754 -2.187036110365206 2.0074783266994913 -2.5839693249625846 1.2136118975047339 -2.7824359322612757 1.0151452902060427 -2.5839693249625846 -0.17565435358608994 -2.9809025395599633 -0.5725875681834687 -2.9809025395599633 -2.7557202484690464 -1.393169681170452 -2.954186855767734 -0.9962364665730732 -2.7557202484690464 -0.20237003737831927 -2.5572536411703553 0.19456317721905947 -2.5572536411703553 0.5914963918164382 -2.5572536411703553 0.9884296064138134 -1.961853819274289 1.9807626429072585 -1.7633872119756013 2.3776958575046407 -1.5649206046769102 2.576162464803325 -1.167987390079535 2.774629072102016 -0.3741209608847811 2.973095679400707 + 0.5491095124918353 3.7447498828348103 0.9460427270892122 3.546283275536119 1.342975941686591 3.546283275536119 1.739909156283968 3.546283275536119 2.1368423708813467 2.950883453640053 2.5337755854787254 2.7524168463413616 2.9307088000761006 1.9585504171466113 3.1291754073747917 1.7600838098479201 3.526108621972167 0.9662173806531626 3.724575229270858 0.7677507733544715 3.724575229270858 0.3708175587570963 3.724575229270858 -0.026115655840278862 3.3276420146734793 -1.2169152996324115 3.3276420146734793 -1.6138485142297938 2.9307088000761006 -2.20924833612586 2.732242192777413 -2.6061815507232353 2.1368423708813467 -3.0031147653206176 1.739909156283968 -3.2015813726193016 1.342975941686591 -3.2015813726193016 0.9460427270892122 -3.400047979917993 0.5491095124918353 -3.598514587216684 -0.6416901313002992 -3.598514587216684 -1.0386233458976761 -3.598514587216684 -1.2370899531963655 -3.400047979917993 -1.6340231677937425 -3.2015813726193016 -2.030956382391121 -3.2015813726193016 -2.427889596988498 -3.0031147653206176 -2.427889596988498 -2.6061815507232353 -2.824822811585877 -2.6061815507232353 -3.420222633481943 -1.6138485142297938 -3.6186892407806326 -1.2169152996324115 -3.6186892407806326 0.3708175587570963 -3.6186892407806326 0.7677507733544715 -2.824822811585877 2.1570170244452953 -2.6263562042871875 2.5539502390426776 -2.2294229896898106 2.5539502390426776 -2.2294229896898106 2.950883453640053 -1.8324897750924318 2.950883453640053 -1.4355565604950549 3.149350060938744 -1.2370899531963655 3.546283275536119 -0.8401567385989868 3.546283275536119 -0.4432235240016098 3.7447498828348103 0.3506429051931459 3.7447498828348103 + + + 0.5771346571390623 3.592191496670523 0.974067871736441 3.393724889371839 1.3710010863338162 3.393724889371839 1.9664009082298826 2.9967916747744567 2.3633341228272613 2.7983250674757656 3.1572005520220188 2.0044586382810152 3.35566715932071 1.607525423683633 3.554133766619394 0.4167257798915003 3.752600373918085 0.019792565294125097 3.554133766619394 -0.17867404200456605 3.554133766619394 -0.5756072566019412 3.554133766619394 -0.9725404711993235 3.35566715932071 -1.3694736857966987 3.1572005520220188 -1.7664069003940739 2.5618007301259524 -2.163340114991456 2.5618007301259524 -2.5602733295888314 0.37866804984037117 -3.751072973380964 -0.018265164757004015 -3.751072973380964 -1.4075314158478278 -3.354139758783589 -1.8044646304452066 -3.1556731514848977 -2.399864452341273 -2.7587399368875225 -2.796797666938648 -2.5602733295888314 -3.193730881536027 -1.7664069003940739 -3.3921974888347144 -1.5679402930953898 -3.3921974888347144 -1.1710070784980076 -3.3921974888347144 -0.7740738639006324 -3.5906640961334055 -0.3771406493032501 -3.5906640961334055 0.019792565294125097 -3.5906640961334055 0.4167257798915003 -3.3921974888347144 0.8136589944888826 -3.3921974888347144 1.2105922090862578 -2.796797666938648 2.2029252455796993 -2.5983310596399605 2.5998584601770816 -2.2013978450425817 2.7983250674757656 -2.002931237743894 2.9967916747744567 -1.2090648085491367 3.393724889371839 -1.010598201250449 3.592191496670523 0.18020144254168358 3.592191496670523 + 0.1874974607915405 3.596176770699138 0.7828972826876068 2.6038437342056966 0.981363889986298 2.2069105196083143 0.981363889986298 1.0161108758161852 0.7828972826876068 0.6191776612188065 0.981363889986298 0.42071105392011887 1.3782971045836732 0.42071105392011887 1.7752303191810554 0.22224444662142773 2.1721635337784306 0.023777839322740135 2.1721635337784306 -0.3731553752746386 2.1721635337784306 -0.7700885898720173 2.3706301410771218 -1.1670218044693925 2.3706301410771218 -1.5639550190667713 1.9736969264797395 -1.7624216263654588 1.9736969264797395 -2.1593548409628376 1.3782971045836732 -2.754754662858904 1.1798304972849891 -2.953221270157595 -0.01096914650715064 -2.953221270157595 -0.4079023611045258 -2.953221270157595 -0.8048355757019046 -2.754754662858904 -1.2017687902992797 -2.5562880555602163 -1.4002353975979709 -2.1593548409628376 -1.5987020048966585 -1.1670218044693925 -1.797168612195346 -0.7700885898720173 -1.4002353975979709 0.023777839322740135 -1.2017687902992797 0.22224444662142773 -1.4002353975979709 0.42071105392011887 -1.797168612195346 0.6191776612188065 -1.9956352194940372 1.4130440904135604 -2.194101826792725 1.8099773050109391 -1.9956352194940372 2.0084439123096303 -1.797168612195346 2.4053771269070054 -1.4002353975979709 2.6038437342056966 -1.2017687902992797 3.0007769488030718 -0.20943575380583468 3.596176770699138 + 0.38726432860077686 1.3444840422644528 0.7841975431981556 1.1460174349657644 0.982664150496845 0.947550827667075 1.1811307577955326 0.5506176130696971 1.379597365094222 0.15368439847232018 0.982664150496845 -0.44171542342374703 0.7841975431981556 -0.8386486380211249 0.5857309358994662 -1.2355818526185027 0.18879772130208927 -1.2355818526185027 -0.20813549329528946 -1.4340484599171912 -0.8035353151913558 -1.0371152453198138 -1.2004685297887328 -0.8386486380211249 -1.2004685297887328 -0.044782208826369185 -1.2004685297887328 0.35215100577100866 -1.0020019224900452 0.5506176130696971 -0.8035353151913558 0.947550827667075 -0.40660210059397706 1.1460174349657644 -0.009668885996600096 1.3444840422644528 0.38726432860077686 1.3444840422644528 + 0.6640987823453202 4.091390036752671 1.0610319969426971 3.8929234294539867 1.2594986042413865 3.6944568221552956 1.6564318188387652 3.6944568221552956 2.053365033436142 3.4959902148566044 2.450298248033521 3.2975236075579204 3.0456980699295872 2.702123785661854 3.244164677228275 2.503657178363163 3.6410978918256536 1.7097907491684055 3.839564499124341 1.5113241418697214 3.839564499124341 1.1143909272723391 4.038031106423032 0.7174577126749639 3.839564499124341 -0.07640871651979353 3.839564499124341 -0.4733419311171687 3.6410978918256536 -0.870275145714551 3.6410978918256536 -1.2672083603119262 3.0456980699295872 -2.2595413968053677 2.8472314626308997 -2.65647461140275 2.053365033436142 -3.4503410405975075 1.6564318188387652 -3.6488076478961915 1.2594986042413865 -3.6488076478961915 0.2671655677479432 -4.045740862493574 -0.12976764684943554 -4.045740862493574 -0.5267008614468125 -3.8472742551948826 -0.9236340760441912 -3.8472742551948826 -1.3205672906415682 -3.8472742551948826 -1.717500505238947 -3.6488076478961915 -1.9159671125376363 -3.4503410405975075 -2.3129003271350133 -3.2518744332988163 -2.709833541732392 -3.053407826000125 -3.106766756329769 -2.458008004104059 -3.503699970927146 -2.2595413968053677 -3.7021665782258353 -1.8626081822079925 -3.9006331855245246 -1.4656749676106173 -3.9006331855245246 0.5189911053762728 -3.9006331855245246 0.915924319973648 -3.3052333636284583 1.9082573564670966 -3.106766756329769 2.1067239637657877 -2.3129003271350133 3.0990570002592293 -1.9159671125376363 3.2975236075579204 -1.3205672906415682 3.6944568221552956 -0.9236340760441912 3.8929234294539867 -0.5267008614468125 3.8929234294539867 -0.12976764684943554 3.8929234294539867 0.06869896044925383 4.091390036752671 0.4656321750466308 4.091390036752671 + 2.4219781586374083 2.4306846384740055 2.8189113732347835 2.232218031175318 3.0173779805334746 1.8352848165779392 3.0173779805334746 0.6444851727858065 3.0173779805334746 0.24755195818842957 2.8189113732347835 0.0490853508897402 2.620444765936096 -0.34784786370763854 2.223511551338717 -0.5463144710063261 1.4296451221439632 -0.5463144710063261 1.0327119075465845 -0.5463144710063261 0.8342453002478969 -0.9432476856037049 0.6357786929492057 -1.1417142929023925 0.6357786929492057 -1.5386475074997712 0.43731208565051816 -1.9355807220971482 0.23884547835183056 -2.332513936694527 -0.15808773624554817 -2.332513936694527 -0.5550209508429269 -2.5309805439932163 -1.7458205946350596 -2.5309805439932163 -2.1427538092324383 -2.5309805439932163 -2.341220416531126 -2.1340473293958375 -2.539687023829817 -1.9355807220971482 -2.539687023829817 -1.5386475074997712 -2.7381536311285046 -1.1417142929023925 -2.7381536311285046 0.44601856548711716 -2.539687023829817 0.8429517800844941 -2.1427538092324383 0.8429517800844941 -1.547353987336372 1.2398849946818729 -1.1504207727389932 1.438351601980564 -0.3565543435442393 1.438351601980564 0.04037887105313942 1.6368182092792516 0.43731208565051816 2.232218031175318 0.8342453002478969 2.4306846384740055 1.231178514845272 2.232218031175318 1.6281117294426508 2.232218031175318 2.0250449440400295 2.232218031175318 2.4219781586374083 2.4306846384740055 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { + "name": "CurrentDisplaySettings", + "spotUniformColor": "204, 51, 204, 255", + "spotColorByType": "TRACKS", + "spotColorByFeature": "TRACK_INDEX", + "spotDisplayRadius": 1.0, + "spotDisplayedAsRoi": true, + "spotMin": 0.0, + "spotMax": 10.0, + "spotShowName": true, + "trackMin": 0.0, + "trackMax": 10.0, + "trackColorByType": "TRACKS", + "trackColorByFeature": "TRACK_INDEX", + "trackUniformColor": "204, 204, 51, 255", + "undefinedValueColor": "0, 0, 0, 255", + "missingValueColor": "89, 89, 89, 255", + "highlightColor": "51, 230, 51, 255", + "trackDisplayMode": "LOCAL_BACKWARD", + "colormap": "Jet", + "limitZDrawingDepth": false, + "drawingZDepth": 10.0, + "fadeTracks": true, + "fadeTrackRange": 30, + "useAntialiasing": true, + "spotVisible": true, + "trackVisible": true, + "font": { + "name": "Arial", + "style": 1, + "size": 12 + }, + "lineThickness": 2.0, + "selectionLineThickness": 4.0, + "trackschemeBackgroundColor1": "128, 128, 128, 255", + "trackschemeBackgroundColor2": "192, 192, 192, 255", + "trackschemeForegroundColor": "0, 0, 0, 255", + "trackschemeDecorationColor": "0, 0, 0, 255", + "trackschemeFillBox": false, + "spotFilled": false, + "spotTransparencyAlpha": 1.0 +} + diff --git a/src/test/resources/fiji/plugin/trackmate/io/geff/MAX_Merged.xml b/src/test/resources/fiji/plugin/trackmate/io/geff/MAX_Merged.xml new file mode 100644 index 000000000..918ae2e3f --- /dev/null +++ b/src/test/resources/fiji/plugin/trackmate/io/geff/MAX_Merged.xml @@ -0,0 +1,492 @@ + + + TrackMate v8.1.6 started on: +ri, 24 Jul 2026 10:16:29 +Please note that TrackMate is available through iji, and is based on a publication. If you use it successfully for your research please be so kind to cite our work: +rshov, D., Phan, MS., Pylvänäinen, J.W., Rigaud S.U., et al. TrackMate 7: integrating state-of-the-art segmentation algorithms into tracking pipelines. Nat Methods (2022). https://doi.org/10.1038/s41592-022-01507-1 +https://doi.org/10.1038/s41592-022-01507-1 +and / or: +Tinevez, JY.; Perry, N. & Schindelin, J. et al. (2017), 'TrackMate: An open and extensible platform for single-particle tracking.', Methods 115: 80-90, PMID 27713081. +https://www.sciencedirect.com/science/article/pii/S1046202316303346 + +Numerical feature analyzers: +Spot feature analyzers: + - Manual spot color provides: Spot color; is manual. + - Spot intensity provides: Mean ch1, Median ch1, Min ch1, Max ch1, Sum ch1, Std ch1, Mean ch2, Median ch2, Min ch2, Max ch2, Sum ch2, Std ch2. + - xTrack probabilities provides: P stuck, P diffusive; is manual. + - Spot contrast and SNR provides: Ctrst ch1, SNR ch1, Ctrst ch2, SNR ch2. +dge feature analyzers: + - Directional change provides: γ rate. + - dge speed provides: Speed, Disp. + - dge target provides: Source ID, Target ID, Cost. + - dge location provides: dge T, dge X, dge Y, dge Z. + - Manual edge color provides: dge color; is manual. +Track feature analyzers: + - Branching analyzer provides: N spots, N gaps, N splits, N merges, N complex, Lgst gap. + - Track duration provides: Duration, Track start, Track stop, Track disp. + - Track index provides: Index, ID. + - Track location provides: Track X, Track Y, Track Z. + - Track speed provides: Mean sp., Max speed, Min speed, Med. speed, Std speed. + - Track quality provides: Mean Q. + - Track motility analysis provides: Total dist., Max dist., Cfn. ratio, Mn. v. line, wd. progr., Mn. γ rate. + +Image region of interest: +Image data: +or the image named: MAX_Merged.tif. +Matching file MAX_Merged.tif in folder: /Users/tinevez/Development/TrackMateWS/TrackMate/samples/ +Geometry: + X = 0 - 239, dx = 0.198467 + Y = 0 - 294, dy = 0.198467 + Z = 0 - 0, dz = 1.00000 + T = 0 - 16, dt = 2.00000 + +Configured detector Mask detector with settings: + - target channel: 2 + - simplify contours: true + +Starting detection process using 12 threads. +Detection processes 12 frames simultaneously and allocates 1 thread per frame. +ound 78 spots. +Detection done in 0.1 s. + +Computing spot quality histogram... +Initial thresholding with a quality threshold above 19.0 ... +Starting initial filtering process. +Retained 78 spots out of 78. + +Adding morphology analyzers... + - Spot fit 2D ellipse provides: l. x0, l. y0, l. long axis, l. sh. axis, l. angle, l. a.r. + - Spot 2D shape descriptors provides: Area, Perim., Circ., Solidity, Shape index. + +Calculating spot features... +Calculating features done in 0.1 s. + +Performing spot filtering on the following features: + - on Area above 0.5 +Kept 78 spots out of 78. + +Configured tracker LAP Tracker with settings: + - max frame gap: 2 + - alternative linking cost factor: 1.05 + - linking feature penalties: + - linking max distance: 15.0 + - gap closing max distance: 15.0 + - merging feature penalties: + - splitting max distance: 15.0 + - blocking value: Infinity + - allow gap closing: true + - allow track splitting: true + - allow track merging: false + - merging max distance: 15.0 + - splitting feature penalties: + - cutoff percentile: 0.9 + - gap closing feature penalties: + +Starting tracking process. +Tracking done in 0.0 s. +ound 3 tracks. + - avg size: 25.7 spots. + - min size: 20 spots. + - max size: 32 spots. + +Calculating features done in 0.0 s. + +Performing track filtering on the following features: +No feature threshold set, kept the 3 tracks. +Saving data... +Computing edge features: + - Directional change in 1 ms. + - dge speed in 1 ms. + - dge target in 1 ms. + - dge location in 1 ms. +Computation done in 4 ms. +Computing track features: + - Branching analyzer in 0 ms. + - Track duration in 0 ms. + - Track index in 0 ms. + - Track location in 0 ms. + - Track speed in 0 ms. + - Track quality in 1 ms. + - Track motility analysis in 0 ms. +Computation done in 2 ms. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.3565394409571319 2.8354753970255224 1.9519392628531982 2.240075575129456 2.1504058701518876 2.0416089678307667 2.348872477450577 1.644675753233388 2.1504058701518876 1.247742538636011 2.1504058701518876 0.45387610944125534 2.1504058701518876 0.05694289484387749 1.9519392628531982 -0.141523712454811 1.1580728336584425 -0.141523712454811 0.7611396190610655 -0.33999031975350036 0.7611396190610655 -1.133856748948256 0.7611396190610655 -1.530789963545634 0.5626730117623762 -1.9277231781430109 0.3642064044636868 -2.3246563927403887 -0.032726810133690165 -2.523123000039078 -0.23119341743237953 -2.721589607337767 -0.6281266320297565 -2.721589607337767 -1.0250598466271352 -2.721589607337767 -2.0173928831205785 -1.9277231781430109 -2.215859490419268 -1.7292565708443224 -2.4143260977179573 -0.9353901416495667 -2.4143260977179573 -0.5384569270521888 -2.0173928831205785 -0.33999031975350036 -2.0173928831205785 0.05694289484387749 -1.6204596685232016 0.05694289484387749 -1.0250598466271352 0.6523427167399447 -0.8265932393284459 0.8508093240386332 -0.4296600247310689 2.0416089678307667 -0.23119341743237953 2.240075575129456 0.1657397971649992 2.4385421824281437 0.5626730117623762 2.637008789726833 0.9596062263597549 2.637008789726833 1.3565394409571319 2.8354753970255224 + 0.26605770622793656 1.8728117765285504 1.6553239573187604 1.0789453473337929 1.853790564617448 0.6820121327364141 1.853790564617448 -0.11185429645833977 1.853790564617448 -0.5087875110557185 1.4568573500200728 -1.1041873329517848 1.2583907427213816 -1.5011205475491636 0.8614575281240029 -1.6995871548478512 0.6629909208253153 -1.8980537621465388 0.26605770622793656 -1.8980537621465388 -0.13087550836943862 -1.8980537621465388 -0.5278087229668174 -1.6995871548478512 -0.9247419375641961 -1.5011205475491636 -1.9170749740576412 -0.31032090375702737 -2.1155415813563287 0.08661231084034782 -1.9170749740576412 0.28507891813903896 -1.9170749740576412 0.6820121327364141 -1.71860836675895 1.0789453473337929 -1.3216751521615748 1.2774119546324805 -1.1232085448628837 1.6743451692298592 0.06759109892924897 1.6743451692298592 + 0.42754718677428727 2.005320019969126 1.0229470086703536 1.608386805371751 1.4198802232677323 1.4099201980730598 1.8168134378651075 0.21912055428092714 2.0152800451637987 -0.17781266031644805 2.0152800451637987 -0.5747458749138232 2.0152800451637987 -0.9716790895112055 1.8168134378651075 -1.1701456968098967 1.61834683056642 -1.5670789114072718 0.22908057947559612 -1.964012126004647 -0.16785263512177906 -1.964012126004647 -0.9617190643165365 -1.5670789114072718 -1.3586522789139117 -1.3686123041085807 -1.5571188862126029 -1.1701456968098967 -1.7555854935112905 -0.7732124822125144 -2.152518708108669 0.0206539469822431 -2.152518708108669 0.4175871615796183 -1.9540521008099816 0.6160537688783094 -1.7555854935112905 1.0129869834756846 -1.1601856716152241 1.608386805371751 -0.9617190643165365 1.806853412670442 -0.5647858497191578 2.005320019969126 0.22908057947559612 2.005320019969126 + + + -0.46131816424820826 1.4636308679375336 1.3248813014399907 0.8682310460414673 1.7218145160373695 0.6697644387427779 1.7218145160373695 0.27283122414540095 1.920281123336057 -0.12410199045197601 1.920281123336057 -0.5210352050493547 1.7218145160373695 -0.7195018123480441 1.52334790873868 -1.116435026945421 0.33254826494654566 -1.3149016342441104 -0.0643849496508313 -1.5133682415427998 -1.4536512007416533 -0.7195018123480441 -1.6521178080403427 -0.5210352050493547 -1.850584415339032 -0.12410199045197601 -1.850584415339032 0.27283122414540095 -1.850584415339032 0.6697644387427779 -1.6521178080403427 1.0666976533401566 -1.255184593442964 1.0666976533401566 -0.6597847715468976 1.4636308679375336 + 1.055640817408836 2.519532849463328 1.4525740320062148 2.3210662421646404 1.6510406393049024 1.9241330275672617 2.44490706849966 0.733333383775129 2.44490706849966 0.3364001691777503 2.2464404612009687 -0.06053304541962845 2.047973853902281 -0.45746626001700363 2.047973853902281 -0.8543994746143824 1.84950724660359 -1.251332689211761 1.2541074247075237 -1.6482659038091363 1.055640817408836 -2.045199118406515 0.6587076028114573 -2.243665725705206 0.2617743882140786 -2.4421323330038938 -0.5320920409806753 -2.4421323330038938 -0.929025255578054 -2.4421323330038938 -1.5244250774741204 -2.045199118406515 -1.921358292071499 -1.8467325111078274 -2.5167581139675654 -0.8543994746143824 -2.5167581139675654 -0.45746626001700363 -1.921358292071499 0.5348667764764414 -1.921358292071499 0.9317999910738166 -1.5244250774741204 1.1302665983725078 -1.5244250774741204 1.527199812969883 -0.929025255578054 2.1225996348659493 -0.7305586482793629 2.3210662421646404 -0.3336254336819877 2.3210662421646404 0.06330778091539102 2.519532849463328 0.8571742101101485 2.519532849463328 + 0.5614624777540058 2.8628983201701743 1.5537955142474509 2.267498498274108 1.9507287288448296 2.069031890975417 2.149195336143517 1.6720986763780417 2.149195336143517 1.2751654617806594 2.3476619434422084 1.0766988544819753 2.3476619434422084 0.28283242528721786 2.3476619434422084 -0.11410078931015732 1.9507287288448296 -0.9079672185049148 1.9507287288448296 -1.30490043310229 1.3553289069487633 -1.9003002549983563 1.3553289069487633 -2.2972334695957386 0.9583956923513846 -2.2972334695957386 0.759929085052697 -2.694166684193114 0.3629958704553182 -2.892633291491805 0.16452926315663063 -2.694166684193114 -0.6293371660381268 -2.694166684193114 -1.0262703806355056 -2.694166684193114 -1.4232035952328808 -2.4957000768944297 -1.8201368098302595 -2.2972334695957386 -2.018603417128947 -1.5033670404009811 -2.2170700244276382 -1.30490043310229 -2.2170700244276382 -0.9079672185049148 -2.415536631726326 -0.5110340039075396 -2.415536631726326 -0.11410078931015732 -2.2170700244276382 0.28283242528721786 -2.2170700244276382 0.679765639884593 -1.621670202531572 1.6720986763780417 -1.4232035952328808 2.069031890975417 -0.4308705587394357 2.664431712871483 -0.03393734414206051 2.8628983201701743 0.3629958704553182 2.8628983201701743 + -0.004550380766991324 1.66631443394252 0.9877826557264537 1.0709146120464537 1.3847158703238307 0.8724480047477643 1.58318247762252 0.47551479015038645 1.7816490849212094 0.27704818285169797 1.1862492630251413 -0.9137514609404356 0.9877826557264537 -1.112218068239124 0.590849441129075 -1.3106846755378134 0.19391622653169804 -1.5091512828365024 -0.2030169880656807 -1.5091512828365024 -0.5999502026630577 -1.5091512828365024 -0.9968834172604364 -1.3106846755378134 -1.195350024559124 -1.112218068239124 -1.5922832391565027 0.0785815755530086 -1.5922832391565027 0.47551479015038645 -0.9968834172604364 1.0709146120464537 -0.798416809961747 1.2693812193451421 -0.004550380766991324 1.66631443394252 + + + 1.4460221505167965 2.0426752572582227 1.644488757815484 1.645742042660845 2.041421972412863 1.645742042660845 2.041421972412863 1.248808828063467 2.43835518701024 1.248808828063467 2.636821794308929 0.8518756134660892 2.636821794308929 -0.33892403032604435 2.43835518701024 -0.5373906376247337 2.041421972412863 -0.7358572449234222 1.644488757815484 -0.9343238522221116 1.2475555432181071 -0.9343238522221116 0.8506223286207284 -0.9343238522221116 -0.34017731517140426 -1.7281902814168664 -0.5386439224700936 -2.1251234960142447 -1.7294435662622263 -2.1251234960142447 -2.126376780859605 -1.9266568887155557 -2.3248433881582926 -1.529723674118178 -2.523309995456982 -1.1327904595208 -2.523309995456982 0.0580091842713335 -2.3248433881582926 0.256475791570022 -1.530976958963537 0.6534090061673998 -1.3325103516648493 0.8518756134660892 -1.13404374436616 1.248808828063467 -0.5386439224700936 1.645742042660845 -0.1417107078727149 1.8442086499595334 0.25522250672466207 2.0426752572582227 1.4460221505167965 2.0426752572582227 + 0.9993719067424607 3.1555304548852448 1.7932383359372182 2.361664025690491 2.1901715505345933 2.1631974183918032 2.587104765131972 1.3693309891970458 2.7855713724306597 1.1708643818983582 2.587104765131972 -0.813801691088532 2.587104765131972 -1.2107349056859107 2.3886381578332845 -1.6076681202832859 2.1901715505345933 -1.806134727581977 1.7932383359372182 -2.0046013348806646 1.7932383359372182 -2.4015345494780433 1.3963051213398394 -2.4015345494780433 0.8009052994437731 -2.798467764075422 0.40397208484639435 -2.9969343713741097 0.007038870249015616 -2.9969343713741097 -0.38989434434835957 -2.9969343713741097 -0.7868275589457383 -2.798467764075422 -1.183760773543117 -2.798467764075422 -1.5806939881404958 -2.798467764075422 -1.977627202737871 -2.600001156776731 -1.977627202737871 -2.2030679421793558 -2.3745604173352497 -2.0046013348806646 -2.5730270246339373 -1.2107349056859107 -2.7714936319326284 -1.0122682983872195 -2.7714936319326284 0.1785313454049131 -2.7714936319326284 0.5754645600022918 -2.5730270246339373 0.972397774599667 -2.3745604173352497 1.3693309891970458 -1.5806939881404958 2.1631974183918032 -1.3822273808418046 2.5601306329891784 -0.9852941662444259 2.7585972402878696 -0.7868275589457383 2.957063847586557 0.007038870249015616 2.957063847586557 0.40397208484639435 2.957063847586557 0.8009052994437731 3.1555304548852448 + 0.35997948989170325 3.1119969238102314 0.756912704489082 2.9135303165115403 1.1538459190864607 2.9135303165115403 1.749245740982527 2.516597101914165 2.1461789555799022 2.318130494615474 2.3446455628785934 1.9211972800180988 2.7415787774759686 1.7227306727194076 2.9400453847746597 0.9288642435246501 3.138511992073351 0.7303976362259661 3.138511992073351 0.3334644216285838 3.138511992073351 -0.06346879296879138 2.9400453847746597 -0.46040200756616656 2.9400453847746597 -0.8573352221635488 2.3446455628785934 -1.8496682586569904 2.1461789555799022 -2.2466014732543655 1.749245740982527 -2.2466014732543655 1.1538459190864607 -2.842001295150439 0.9553793117877731 -3.040467902449123 -0.6323535466017383 -3.040467902449123 -1.029286761199117 -3.040467902449123 -1.4262199757964957 -2.842001295150439 -1.8231531903938745 -2.643534687851748 -2.2200864049912497 -2.0481348659556815 -2.6170196195886284 -1.8496682586569904 -2.815486226887316 -1.0558018294622329 -3.013952834186007 -0.6588686148648577 -3.013952834186007 -0.2619354002674825 -3.013952834186007 0.13499781432989977 -2.815486226887316 0.3334644216285838 -3.013952834186007 0.7303976362259661 -2.6170196195886284 1.5242640654207236 -2.6170196195886284 1.9211972800180988 -2.418553012289941 2.11966388731679 -2.021619797692562 2.318130494615474 -1.2277533684978046 2.7150637092128562 -1.029286761199117 2.9135303165115403 -0.6323535466017383 2.9135303165115403 -0.23542033200436308 3.1119969238102314 0.16151288259301566 2.9135303165115403 + + + -0.22245501686833435 2.897631207505822 0.7698780196251107 2.500697992908443 1.1668112342224877 2.3022313856097556 1.1668112342224877 1.9052981710123769 1.1668112342224877 1.508364956415 1.365277841521177 1.111431741817622 1.365277841521177 0.7144985272202442 1.5637444488198664 0.31756531262286636 1.365277841521177 -0.6747677238705787 1.5637444488198664 -1.0717009384679566 1.365277841521177 -1.4686341530653344 1.365277841521177 -1.8655673676627114 0.5714114123264213 -2.6594337968574675 0.17447819772904438 -2.8579004041561564 -0.22245501686833435 -2.8579004041561564 -0.6193882314657113 -2.8579004041561564 -1.2147880533617776 -2.262500582260089 -1.413254660660467 -2.0640339749614007 -1.413254660660467 -1.6671007603640229 -1.413254660660467 -1.270167545766645 -1.01632144606309 -0.47630111657188934 -0.8178548387644007 -0.27783450927320086 -1.01632144606309 0.11909870532417699 -1.413254660660467 0.31756531262286636 -1.413254660660467 0.7144985272202442 -1.6117212679591564 1.111431741817622 -1.2147880533617776 2.1037647783110662 -1.01632144606309 2.500697992908443 -0.8178548387644007 2.897631207505822 -0.42092162416702195 2.897631207505822 + 0.122986062558752 3.4079906186554503 0.7183858844548183 3.011057404058075 1.115319099052197 3.011057404058075 2.3061187428443297 2.415657582162005 2.5045853501430173 2.2171909748633176 2.7030519574417085 1.8202577602659389 2.901518564740396 1.4233245456685637 2.901518564740396 1.026391331071185 3.0999851720390836 0.6294581164738062 3.0999851720390836 -0.9582747419157052 3.0999851720390836 -1.3552079565130803 2.901518564740396 -1.5536745638117715 2.5045853501430173 -1.752141171110459 2.107652135545642 -2.3475409930065254 1.909185528246951 -2.744474207603904 1.5122523136495722 -2.9429408149025917 1.115319099052197 -3.141407422201283 -0.0754805447399356 -3.141407422201283 -0.27394715203862674 -3.3398740294999705 -1.4647467958307594 -2.9429408149025917 -1.8616800104281381 -2.744474207603904 -2.258613225025517 -2.149074385707838 -2.655546439622892 -1.9506077784091502 -2.854013046921583 -1.5536745638117715 -3.052479654220271 -1.1567413492143928 -3.052479654220271 -0.759808134617014 -3.052479654220271 -0.36287492001963884 -3.2509462615189584 -0.1644083127209477 -3.2509462615189584 0.2325249018764275 -2.854013046921583 1.4233245456685637 -2.655546439622892 1.8202577602659389 -2.0601466177268257 2.2171909748633176 -1.8616800104281381 2.6141241894606964 -0.8693469739346931 3.2095240113567627 -0.47241375933731433 3.4079906186554503 -0.0754805447399356 3.4079906186554503 + -0.5524667458392507 3.7864631853191995 -0.15553353124187197 3.5879965780205083 0.6383328979528855 3.5879965780205083 1.0352661125502607 3.5879965780205083 2.0275991490437058 2.992596756124442 2.424532363641081 2.794130148825751 3.2183987928358384 1.404863897734927 3.4168654001345296 1.206397290436243 3.4168654001345296 0.8094640758388607 3.6153320074332207 0.4125308612414855 3.6153320074332207 0.015597646644110341 3.6153320074332207 -0.38133556795327195 3.4168654001345296 -0.7782687825506471 3.4168654001345296 -1.1752019971480294 2.8214655782384632 -2.167535033641471 2.622998970939772 -2.564468248238846 1.8291325417450146 -3.3583346774336036 1.4321993271476394 -3.5568012847322947 0.24139968335550677 -3.5568012847322947 -0.15553353124187197 -3.7552678920309788 -1.5447997823326922 -3.1598680701349124 -1.941732996930071 -3.1598680701349124 -2.3386662115274497 -2.9614014628362284 -2.5371328188261373 -2.564468248238846 -3.3309992480208948 -1.3736686044467135 -3.5294658553195823 -0.9767353898493383 -3.5294658553195823 0.6109974685401767 -3.5294658553195823 1.0079306831375519 -2.934066033423516 2.0002637196309934 -2.7355994261248284 2.3971969342283757 -2.140199604228762 2.992596756124442 -1.7432663896313834 3.191063363423126 -0.7509333531379383 3.7864631853191995 + + + 0.18440345135457648 4.215399090542583 0.5813366659519517 4.016932483243892 0.9782698805493304 4.016932483243892 1.9706029170427755 3.4215326613478254 2.3675361316401506 3.4215326613478254 2.962935953536217 2.826132839451759 2.962935953536217 2.429199624854384 3.3598691681335993 2.2307330175556928 3.5583357754322904 1.8337998029583176 3.7568023827309744 1.6353331956596264 3.7568023827309744 1.2383999810622512 3.9552689900296656 0.841466766464869 3.9552689900296656 -0.7462660919246389 3.9552689900296656 -1.143199306522014 3.3598691681335993 -2.1355323430154627 3.161402560834908 -2.532465557612838 2.764469346237533 -3.127865379508904 2.3675361316401506 -3.3263319868075953 1.5736697024453967 -3.7232652014049705 1.3752030951467091 -3.9217318087036617 -0.609462977840181 -3.9217318087036617 -1.0063961924375562 -3.9217318087036617 -1.8002626216323137 -3.7232652014049705 -2.1971958362296924 -3.5247985941062865 -2.7925956581257587 -2.92939877221022 -2.9910622654244463 -2.730932164911529 -3.784928694619204 -1.3416659138207052 -3.9833953019178914 -0.94473269922333 -3.9833953019178914 0.6430001591661849 -3.9833953019178914 1.03993337376356 -2.9910622654244463 2.826132839451759 -2.7925956581257587 3.0245994467504502 -1.601796014333626 3.6199992686465166 -1.403329407034935 3.8184658759452077 -1.0063961924375562 3.8184658759452077 0.18440345135457648 4.215399090542583 + 0.21935782911959834 1.6603023657674258 0.8147576510156647 1.263369151170048 1.2116908656130416 1.0649025438713586 1.410157472911731 0.27103611467660293 1.6086240802104204 -0.1258970999207749 1.2116908656130416 -0.7212969218168412 1.013224258314354 -1.118230136414219 0.6162910437169753 -1.316696743712908 0.21935782911959834 -1.515163351011597 -0.1775753854777804 -1.515163351011597 -0.5745086000751574 -1.515163351011597 -0.7729752073738467 -1.316696743712908 -1.1699084219712237 -1.118230136414219 -1.1699084219712237 -0.7212969218168412 -1.5668416365686024 -0.5228303145181519 -1.5668416365686024 -0.1258970999207749 -1.5668416365686024 0.27103611467660293 -1.1699084219712237 0.4695027219752923 -1.1699084219712237 0.8664359365726702 -0.7729752073738467 1.0649025438713586 -0.5745086000751574 1.4618357584687365 0.21935782911959834 1.6603023657674258 + 0.6249815655313711 1.8030520953955769 1.021914780128748 1.6045854880968875 1.2203813874274374 1.2076522734995105 1.418847994726125 1.0091856662008212 1.418847994726125 0.6122524516034424 1.418847994726125 0.21531923700606548 1.021914780128748 -0.5785471921886902 1.021914780128748 -0.9754804067860681 0.4265149582326817 -1.372413621383446 0.02958174363530297 -1.5708802286821344 -0.367351470962074 -1.5708802286821344 -0.7642846855594527 -1.7693468359808238 -0.9627512928581403 -1.5708802286821344 -1.359684507455519 -1.372413621383446 -1.5581511147542084 -0.9754804067860681 -1.5581511147542084 -0.5785471921886902 -0.5658180782607634 1.2076522734995105 -0.367351470962074 1.6045854880968875 0.4265149582326817 1.8030520953955769 + 0.5697072021891003 3.943313928551632 1.9589734532799206 3.149447499356878 2.3559066678772993 2.950980892058187 2.554373275175987 2.752514284759499 2.9513064897733656 2.5540476774608116 3.1497730970720568 2.157114462863433 3.3482397043707444 1.9586478555647453 3.546706311669432 0.7678482117726091 3.745172918968123 0.3709149971752339 3.546706311669432 -0.02601821742214483 3.546706311669432 -1.6137510758116562 3.3482397043707444 -1.8122176831103438 2.9513064897733656 -2.010684290409035 2.554373275175987 -2.6060841123051013 2.3559066678772993 -3.00301732690248 1.5620402386825454 -3.399950541499855 1.3635736313838542 -3.5984171487985464 0.966640416786479 -3.5984171487985464 0.5697072021891003 -3.796883756097234 0.17277398759172158 -3.796883756097234 -0.22415922700565716 -3.5984171487985464 -1.018025656200411 -3.5984171487985464 -1.4149588707977898 -3.5984171487985464 -2.407291907291235 -3.00301732690248 -2.80422512188861 -2.804550719603789 -3.39962494378468 -1.8122176831103438 -3.5980915510833675 -1.4152844685129686 -3.5980915510833675 -0.22448482472083242 -3.796558158382057 0.17244838987654276 -3.5980915510833675 0.3709149971752339 -3.39962494378468 0.7678482117726091 -3.39962494378468 1.1647814263699878 -3.39962494378468 1.5617146409673666 -2.6057585145899225 2.3555810701621205 -2.407291907291235 2.752514284759499 -1.8118920853951686 3.3479141066555655 -1.6134254780964774 3.546380713954253 0.37124059489040917 3.943313928551632 + + + 0.41938600249380187 1.5311999460074608 0.8163192170911806 1.3327333387087723 1.01478582438987 0.9358001241113945 1.2132524316885576 0.7373335168127051 1.411719038987247 0.34040030221532724 1.411719038987247 -0.056532912382050604 1.411719038987247 -0.45346612697942756 0.8163192170911806 -1.0488659488754948 0.6178526097924912 -1.2473325561741837 0.22091939519511428 -1.4457991634728726 -0.17601381940226446 -1.6442657707715616 -0.7714136412983308 -1.2473325561741837 -1.1683468558957077 -1.0488659488754948 -1.3668134631943971 0.14193369491663876 -1.3668134631943971 0.5388669095140166 -1.1683468558957077 0.7373335168127051 -0.9698802485970202 1.134266731410083 0.22091939519511428 1.5311999460074608 + 1.069143430183555 1.6184252103195078 1.2676100374822443 1.2214919957221309 1.4660766447809337 1.0230253884234415 1.4660766447809337 0.2291589592286858 1.664543252079623 -0.16777425536869117 1.2676100374822443 -0.9616406845634469 1.069143430183555 -1.1601072918621362 -0.1216562136085777 -1.7555071137582026 -0.5185894282059564 -1.7555071137582026 -0.9155226428033334 -1.1601072918621362 -1.3124558574007112 -0.9616406845634469 -1.709389071998089 -0.16777425536869117 -1.709389071998089 0.2291589592286858 -1.1139892501020219 1.2214919957221309 -0.717056035504644 1.4199586030208202 0.07681039369011167 1.4199586030208202 0.4737436082874886 1.4199586030208202 0.672210215586178 1.6184252103195078 + 0.8912329810228456 3.9546935885265064 2.280499232113666 3.160827159331749 2.6774324467110446 2.9623605520330614 3.0743656613084234 2.366960730136995 3.4712988759057986 2.1684941228383074 3.4712988759057986 1.7715609082409287 3.8682320905031773 1.1761610863448624 4.066698697801868 0.7792278717474836 4.066698697801868 -0.014638557447270273 4.066698697801868 -0.411571772044649 3.8682320905031773 -0.8085049866420277 3.8682320905031773 -1.2054382012394065 3.4712988759057986 -1.8008380231354728 3.272832268607111 -2.197771237732848 2.8758990540097322 -2.396237845031539 2.6774324467110446 -2.793171059628918 1.8835660175162907 -2.9916376669276055 1.8835660175162907 -3.388570881524984 1.486632802918912 -3.388570881524984 1.0896995883215332 -3.587037488823672 0.8912329810228456 -3.7855040961223594 0.4942997664254669 -3.7855040961223594 0.09736655182808818 -3.9839707034210505 -0.6964998773666657 -3.7855040961223594 -1.0934330919640445 -3.9839707034210505 -1.4903663065614232 -3.7855040961223594 -1.8872995211587984 -3.7855040961223594 -2.0857661284574895 -3.587037488823672 -2.4826993430548683 -3.388570881524984 -2.8796325576522435 -2.396237845031539 -3.276565772249622 -2.197771237732848 -3.276565772249622 -1.8008380231354728 -3.673498986847001 -1.6023714158367817 -4.070432201444376 -0.21310516474596142 -4.070432201444376 0.18382804985141732 -3.8719655941456885 0.580761264448796 -3.8719655941456885 0.9776944790461712 -3.47503237954831 1.7715609082409287 -3.276565772249622 1.9700275155396163 -2.681165950353556 2.5654273374356826 -2.681165950353556 2.9623605520330614 -1.6888329138601108 3.5577603739291277 -1.291899699262732 3.756226981227819 -0.49803327006797815 3.756226981227819 -0.10110005547059941 3.756226981227819 0.2958331591267793 3.9546935885265064 0.6927663737241545 3.9546935885265064 + 1.401329483548011 4.172460639919279 1.9967293054440773 3.775527425321904 2.3936625200414525 3.577060818023213 3.18752894923621 2.5847277815297716 3.385995556534901 2.3862611742310804 3.7829287711322763 1.59239474503633 3.9813953784309675 1.393928137737639 3.9813953784309675 0.9969949231402566 4.179861985729659 0.6000617085428814 3.9813953784309675 -0.9876711498466264 3.9813953784309675 -1.3846043644440087 3.385995556534901 -2.37693740093745 3.18752894923621 -2.7738706155348325 2.790595734638835 -2.7738706155348325 2.5921291273401437 -3.1708038301322077 2.3936625200414525 -3.369270437430899 1.5997960908466986 -3.766203652028274 1.401329483548011 -3.964670259326965 0.6074630543532535 -3.964670259326965 0.21052983975587836 -4.163136866625649 -0.5833365894388791 -4.163136866625649 -0.9802698040362543 -4.163136866625649 -1.377203018633633 -3.964670259326965 -1.7741362332310118 -3.964670259326965 -2.9649358770231444 -2.9723372228335165 -3.361869091620523 -2.7738706155348325 -3.758802306217902 -1.7815375790413839 -3.9572689135165895 -1.3846043644440087 -4.155735520815277 -0.5907379352492512 -4.155735520815277 -0.19380472065187604 -3.9572689135165895 0.20312849394550625 -3.9572689135165895 0.9969949231402566 -3.9572689135165895 1.393928137737639 -3.5603356989192108 1.9893279596337052 -3.361869091620523 2.3862611742310804 -2.766469269724457 2.9816609961271467 -2.5680026624257657 3.180127603425838 -1.1787364113349454 3.9739940326205954 -0.7818031967375667 4.172460639919279 1.2028628762493234 4.172460639919279 + + + 0.16491221451812876 1.5065159758638274 0.5618454291155057 1.3080493685651389 0.9587786437128845 1.3080493685651389 1.5541784656089508 0.3157163320716938 1.5541784656089508 -0.08121688252568404 1.157245251011572 -0.6766167044217504 0.9587786437128845 -1.0735499190191282 0.5618454291155057 -1.2720165263178171 0.16491221451812876 -1.470483133616506 -0.23202100007924997 -1.470483133616506 -0.6289542146766269 -1.470483133616506 -0.8274208219753163 -1.2720165263178171 -1.2243540365726933 -1.0735499190191282 -1.4228206438713826 -0.6766167044217504 -1.4228206438713826 -0.2796834898243725 -1.4228206438713826 0.11724972477300533 -1.2243540365726933 0.5141829393703832 -1.2243540365726933 0.911116153967761 -0.23202100007924997 1.5065159758638274 + 1.3286395641350257 1.2455161820195304 1.527106171433715 0.8485829674221517 1.7255727787324027 0.6501163601234641 1.7255727787324027 0.25318314552608534 1.3286395641350257 -0.5406832836686704 1.1301729568363363 -0.9376164982660473 0.33630652764158064 -1.1360831055647367 0.13783992034289128 -1.334549712863426 -0.2590932942544857 -1.334549712863426 -0.6560265088518635 -1.334549712863426 -1.0529597234492414 -1.1360831055647367 -1.4498929380466192 -0.9376164982660473 -1.6483595453453077 0.25318314552608534 -1.6483595453453077 0.6501163601234641 -1.2514263307479299 0.8485829674221517 -1.0529597234492414 1.047049574720841 -0.2590932942544857 1.047049574720841 0.13783992034289128 1.047049574720841 0.53477313494027 1.2455161820195304 0.931706349537647 1.2455161820195304 + 1.3412777795505306 4.4940939924542285 1.7382109941479094 4.295627385155541 2.3336108160439757 3.303294348662096 2.5320774233426633 2.906361134064717 2.929010637940042 2.7078945267660295 3.1274772452387296 2.5094279194673383 3.1274772452387296 2.112494704869963 3.5244104598361083 1.914028097571272 3.5244104598361083 1.5170948829738933 3.722877067134796 1.120161668376518 3.921343674433487 0.921695061077827 3.921343674433487 0.5247618464804518 4.119810281732175 0.12782863188307303 4.318276889030866 -0.2691045827143057 4.318276889030866 -0.6660377973116844 4.318276889030866 -1.0629710119090596 3.722877067134796 -1.658370833805126 3.3259438525374208 -1.658370833805126 3.1274772452387296 -2.4522372629998834 2.929010637940042 -2.650703870298571 2.3336108160439757 -3.2461036921946373 1.936677601446597 -3.2461036921946373 1.936677601446597 -3.643036906792016 1.7382109941479094 -4.039970121389395 1.3412777795505306 -4.238436728688082 0.9443445649531519 -4.238436728688082 0.5474113503557767 -4.238436728688082 0.34894474305708556 -4.039970121389395 0.15047813575839797 -3.643036906792016 -0.04798847154028962 -3.2461036921946373 -0.04798847154028962 -2.4522372629998834 -0.24645507883898077 -2.253770655701196 -0.6433882934363595 -2.4522372629998834 -1.0403215080337347 -2.650703870298571 -1.2387881153324258 -3.0476370848959498 -1.4372547226311134 -3.2461036921946373 -1.8341879372284922 -3.2461036921946373 -2.231121151825871 -3.2461036921946373 -2.628054366423246 -3.0476370848959498 -3.024987581020625 -3.0476370848959498 -3.620387402916691 -2.4522372629998834 -4.01732061751407 -2.4522372629998834 -4.01732061751407 -2.0553040484025047 -4.2157872248127575 -1.658370833805126 -4.01732061751407 -1.4599042265064384 -4.2157872248127575 -1.0629710119090596 -4.414253832111449 -0.6660377973116844 -4.414253832111449 -0.2691045827143057 -4.414253832111449 0.12782863188307303 -4.2157872248127575 0.5247618464804518 -4.01732061751407 0.7232284537791394 -3.4219207956180036 2.112494704869963 -3.2234541883193124 2.5094279194673383 -2.8265209737219372 2.7078945267660295 -2.4295877591245585 2.906361134064717 -1.2387881153324258 2.906361134064717 -0.8418549007350471 2.906361134064717 -0.8418549007350471 3.303294348662096 -0.44492168613766836 3.303294348662096 -0.04798847154028962 3.303294348662096 0.34894474305708556 3.898694170558162 0.5474113503557767 4.295627385155541 0.9443445649531519 4.4940939924542285 + 1.6113911294581982 4.3651043528242255 1.8098577367568858 3.968171138226843 2.2067909513542645 3.968171138226843 2.6037241659516397 3.769704530928159 3.397590595146397 2.9758381017334017 3.7945238097437795 2.7773714944347105 3.9929904170424635 1.5865718506425779 4.191457024341155 1.3881052433438867 4.191457024341155 0.19730559955175409 4.191457024341155 -0.1996276150456211 3.9929904170424635 -0.5965608296429963 3.9929904170424635 -0.9934940442403786 3.9929904170424635 -1.3904272588377538 3.397590595146397 -2.3827602953312024 3.199123987847713 -2.7796935099285776 2.4052575586529557 -3.573559939123335 2.2067909513542645 -3.97049315372071 1.4129245221595106 -4.168959761019401 1.2144579148608194 -4.367426368318085 0.023658271068686787 -4.367426368318085 -0.37327494352869195 -4.367426368318085 -0.7702081581260671 -4.168959761019401 -1.1671413727234459 -4.367426368318085 -1.5640745873208246 -4.168959761019401 -1.9610078019182033 -4.168959761019401 -2.3579410165155785 -3.97049315372071 -2.5564076238142697 -3.772026546422019 -2.7548742311129573 -3.375093331824644 -3.3502740530090236 -2.9781601172272687 -3.548740660307711 -2.5812269026298864 -3.94567387490509 -1.787360473435129 -4.144140482203781 -1.588893866136445 -4.144140482203781 -1.1919606515390626 -4.342607089502469 -0.7950274369416874 -4.342607089502469 -0.39809422234431224 -4.144140482203781 -0.001161007746929954 -4.342607089502469 0.39577220685044523 -4.342607089502469 0.7927054214478204 -2.953340838411645 3.174304709032093 -2.5564076238142697 3.372771316330777 -1.1671413727234459 4.166637745525534 -0.9686747654247583 4.3651043528242255 1.4129245221595106 4.3651043528242255 + + + 1.580181342248995 4.359415816353561 1.7786479495476861 3.9624826017561787 2.57251437874244 3.7640159944574947 2.770980986041131 3.5655493871588035 3.3663808079371975 2.970149565262737 3.7633140225345727 2.771682957964046 4.160247237131955 1.3824167068732223 4.358713844430639 0.9854834922758471 4.358713844430639 -0.20531615151628557 4.358713844430639 -0.6022493661136608 4.160247237131955 -0.999182580711043 4.160247237131955 -1.3961157953084182 3.5648474152358887 -2.388448831801867 3.3663808079371975 -2.785382046399242 2.9694475933398152 -2.983848653697933 2.9694475933398152 -3.3807818682953084 1.9771145568463737 -3.9761816901913747 1.580181342248995 -4.174648297490066 1.1832481276516198 -4.174648297490066 0.7863149130542411 -4.37311490478875 -0.4044847307378916 -4.37311490478875 -0.8014179453352703 -4.37311490478875 -1.7937509818287154 -3.9761816901913747 -2.190684196426094 -3.9761816901913747 -2.984550625620848 -3.5792484755939995 -3.1830172329195356 -3.3807818682953084 -3.976883662114293 -1.9915156172044846 -4.175350269412981 -1.5945824026071094 -4.175350269412981 -1.197649188009727 -4.373816876711672 -0.8007159734123519 -4.373816876711672 -0.006849544217594428 -4.373816876711672 0.39008367037978076 -4.175350269412981 0.7870168849771559 -4.175350269412981 1.1839500995745382 -4.175350269412981 1.5808833141719134 -3.7784170548156055 2.1762831360679797 -3.5799504475169144 2.573216350665362 -3.381483840218227 2.771682957964046 -2.984550625620848 2.970149565262737 -2.7860840183221605 3.3670827798601124 -2.5876174110234693 3.5655493871588035 -1.3968177672313367 4.16094920905487 -1.198351159932649 4.359415816353561 1.1832481276516198 4.359415816353561 + 0.5835307404791834 1.4538651860154923 1.377397169673939 0.6599987568207366 1.5758637769726285 0.26306554222335876 1.1789305623752497 -0.7292674942700854 0.9804639550765621 -1.1262007088674637 -0.2103356887155723 -1.5231339234648416 -0.6072689033129492 -1.5231339234648416 -0.8057355106116386 -1.3246673161661526 -1.004202117910328 -0.9277341015687748 -1.401135332507705 -0.7292674942700854 -1.401135332507705 0.0645989349246694 -1.401135332507705 0.46153214952204724 -1.2026687252090156 0.8584653641194251 -1.004202117910328 1.0569319714181145 -0.6072689033129492 1.255398578716803 -0.2103356887155723 1.4538651860154923 0.5835307404791834 1.4538651860154923 + 0.9243709126243687 2.8107930040182474 1.3213041272217474 2.61232639671956 1.7182373418191226 2.61232639671956 2.7105703783125676 2.0169265748234935 3.1075035929099464 1.8184599675248059 3.305970200208634 1.0245935383300484 3.504436807507325 0.8261269310313608 3.504436807507325 0.4291937164339821 3.504436807507325 0.03226050183660334 2.51210377101388 -1.7539389638515956 2.3136371637151925 -2.1508721784489744 1.9167039491178137 -2.349338785747662 1.7182373418191226 -2.5478053930463496 0.9243709126243687 -2.7462720003450407 0.5274376980269899 -2.7462720003450407 0.13050448342961474 -2.9447386076437283 -0.266428731167764 -2.9447386076437283 -0.46489533846645514 -2.7462720003450407 -0.8618285530638303 -2.5478053930463496 -1.0602951603625215 -2.1508721784489744 -1.258761767661209 -1.7539389638515956 -1.6556949822585878 -1.7539389638515956 -2.0526281968559665 -1.7539389638515956 -2.4495614114533417 -1.9524055711502832 -2.8464946260507205 -1.9524055711502832 -3.044961233349408 -2.1508721784489744 -3.441894447946787 -1.9524055711502832 -3.8388276625441655 -1.9524055711502832 -4.037294269842853 -1.555472356552908 -4.235760877141544 -1.1585391419555293 -4.037294269842853 -0.9600725346568382 -3.8388276625441655 -0.563139320059463 -3.044961233349408 0.23072710913529448 -2.648028018752033 0.4291937164339821 -2.4495614114533417 0.8261269310313608 -2.648028018752033 1.2230601456287395 -2.4495614114533417 1.4215267529274271 -2.251094804154654 1.8184599675248059 -1.4572283749598967 2.61232639671956 -1.0602951603625215 2.8107930040182474 0.5274376980269899 2.8107930040182474 + + + -0.8893247559444539 2.896640690329267 -0.09545832674969645 2.1027742611345133 0.30147488784767873 1.9043076538358221 0.4999414951463699 1.5073744392384434 0.4999414951463699 1.1104412246410682 0.6984081024450575 0.7135080100436895 0.6984081024450575 0.31657479544631073 0.8968747097437486 0.11810818814762314 1.2938079243411238 0.11810818814762314 1.6907411389385025 0.11810818814762314 2.881540782730635 -0.4772916337484432 3.0800073900293263 -0.6757582410471343 3.278473997328014 -1.0726914556445095 3.278473997328014 -1.4696246702418883 2.881540782730635 -2.2634910994366457 2.6830741754319476 -2.4619577067353333 2.286140960834569 -2.6604243140340227 1.8892077462371901 -2.4619577067353333 1.492274531639815 -2.4619577067353333 0.10300828054899114 -1.6680912775405758 -0.2939249340483876 -1.4696246702418883 -0.6908581486457628 -1.4696246702418883 -1.0877913632431415 -1.4696246702418883 -1.286257970541829 -1.2711580629432007 -1.6831911851392078 -1.0726914556445095 -2.4770576143339653 0.31657479544631073 -2.675524221632653 0.7135080100436895 -2.675524221632653 1.5073744392384434 -2.675524221632653 1.9043076538358221 -2.4770576143339653 2.301240868433201 -2.278591007035274 2.4997074757318885 -1.0877913632431415 2.896640690329267 + -0.39191192156001975 2.2922202715206303 0.20348790033604658 1.8952870569232552 0.6004211149334253 1.696820449624564 0.7988877222321129 1.2998872350271888 0.7988877222321129 0.9029540204298101 1.3942875441281792 0.3075541985337438 1.5927541514268704 0.10908759123505263 1.5927541514268704 -0.28784562336232256 1.791220758725558 -0.6847788379597013 1.5927541514268704 -1.08171205255708 1.5927541514268704 -1.4786452671544552 1.1958209368294916 -2.074045089050525 0.7988877222321129 -2.2725116963492127 0.40195450763473417 -2.074045089050525 0.005021293037358987 -2.074045089050525 -0.39191192156001975 -1.875578481751834 -1.3842449580534648 -0.28784562336232256 -1.5827115653521524 0.10908759123505263 -1.5827115653521524 0.5060208058324314 -1.7811781726508435 0.9029540204298101 -1.5827115653521524 1.2998872350271888 -1.5827115653521524 1.696820449624564 -0.5903785288587073 2.2922202715206303 + 1.4082280288583533 2.0853741815739255 1.805161243455732 1.8869075742752344 2.0036278507544196 1.6884409669765432 2.4005610653517984 1.6884409669765432 2.7974942799491735 1.4899743596778592 3.1944274945465523 1.291507752379168 3.3928941018452434 -0.6931583206077221 2.9959608872478647 -0.8916249279064061 2.7974942799491735 -1.0900915352050973 2.4005610653517984 -1.2885581425037884 2.0036278507544196 -1.2885581425037884 1.606694636157041 -1.4870247498024796 1.4082280288583533 -1.6854913571011636 1.0112948142609746 -1.6854913571011636 0.6143615996635958 -1.6854913571011636 0.21742838506622064 -1.8839579643998547 -0.1795048295311581 -2.082424571698546 -0.5764380441285368 -2.082424571698546 -0.9733712587259156 -2.28089117899723 -1.965704295219357 -1.6854913571011636 -2.362637509816736 -1.4870247498024796 -2.7595707244141146 -1.4870247498024796 -2.958037331712802 -1.2885581425037884 -3.354970546310181 -1.0900915352050973 -3.5534371536088685 -0.2962251060103398 -3.5534371536088685 0.10070810858703538 -2.958037331712802 0.6961079304831017 -2.7595707244141146 0.8945745377817929 -1.3703044733232908 1.6884409669765432 -0.9733712587259156 1.8869075742752344 1.4082280288583533 2.0853741815739255 + 0.5723546502778021 1.5291266029809902 0.9692878648751808 1.3306599956823009 0.9692878648751808 0.933726781084923 1.3662210794725578 0.7352601737862345 1.3662210794725578 -0.05860625540852116 1.3662210794725578 -0.455539470005899 1.1677544721738684 -0.8524726846032769 0.7708212575764914 -1.0509392919019658 0.5723546502778021 -1.2494058992006547 0.17542143568042512 -1.4478725064993436 -0.22151177891695362 -1.4478725064993436 -0.6184449935143306 -1.4478725064993436 -1.0153782081117093 -1.2494058992006547 -1.213844815410397 -0.8524726846032769 -1.4123114227090863 -0.6540060773045875 -1.4123114227090863 -0.25707286270720964 -1.4123114227090863 0.13986035189016732 -1.0153782081117093 0.933726781084923 -0.6184449935143306 1.1321933883836124 -0.4199783862156412 1.3306599956823009 -0.02304517161826425 1.5291266029809902 0.3738880429791127 1.5291266029809902 + + + 0.04857524931393087 2.7510677173224494 0.6439750712099972 2.3541345027250706 1.0409082858073724 2.155667895426383 1.2393748931060635 1.7587346808290043 1.4378415004047511 1.3618014662316256 1.6363081077034423 1.163334858932938 2.0332413223008174 0.9648682516342468 2.2317079295995086 0.5679350370368716 2.430174536898196 0.1710018224394929 2.430174536898196 -0.6228646067552646 2.430174536898196 -1.0197978213526397 2.0332413223008174 -1.615197643248706 1.8347747150021299 -2.012130857846085 1.4378415004047511 -2.2105974651447724 1.0409082858073724 -2.2105974651447724 0.8424416785086848 -2.4090640724434635 0.04857524931393087 -2.4090640724434635 -0.34835796528344787 -2.4090640724434635 -1.1422243944782053 -2.012130857846085 -1.340691001776893 -1.8136642505473972 -1.5391576090755805 -1.4167310359500185 -1.9360908236729593 -1.2182644286513309 -2.333024038270338 -0.6228646067552646 -2.5314906455690256 -0.22593139215788582 -2.5314906455690256 0.1710018224394929 -2.333024038270338 0.5679350370368716 -2.333024038270338 0.9648682516342468 -1.9360908236729593 1.5602680735303167 -1.7376242163742717 1.957201288127692 -1.340691001776893 1.957201288127692 -0.9437577871795142 2.155667895426383 -0.7452911798808266 2.5526011100237582 0.04857524931393087 2.7510677173224494 + 0.34967926047876574 1.0577615883502602 0.7466124750761445 0.8592949810515726 0.9450790823748321 0.6608283737528815 1.1435456896735232 0.2638951591555063 1.1435456896735232 -0.13303805544187242 0.9450790823748321 -0.5299712700392512 0.7466124750761445 -0.7284378773379387 0.34967926047876574 -0.9269044846366263 -0.04725395411860944 -0.9269044846366263 -0.4441871687159882 -0.9269044846366263 -0.8411203833133669 -0.7284378773379387 -1.2380535979107457 -0.5299712700392512 -1.2380535979107457 -0.13303805544187242 -1.2380535979107457 0.2638951591555063 -0.8411203833133669 0.2638951591555063 -0.6426537760146758 0.6608283737528815 -0.04725395411860944 1.0577615883502602 + -0.5514923221793246 2.772234777691402 -0.1545591075819459 2.573768170392711 0.043907499716745235 2.3753015630940233 0.4408407143141204 2.3753015630940233 0.8377739289114992 2.3753015630940233 1.631640358106253 1.9783683484966446 2.028573572703632 1.779901741197957 2.028573572703632 1.3829685266005782 2.4255067873010105 1.1845019193018906 2.4255067873010105 0.7875687047045119 2.4255067873010105 0.39063549010713317 2.623973394599698 -0.006297724490242018 2.8224400018983893 -0.20476433178893316 2.4255067873010105 -1.3955639755810658 2.4255067873010105 -1.7924971901784446 1.4331737508075655 -2.387897012074511 1.0362405362101867 -2.5863636193731985 0.24237410701543283 -2.5863636193731985 -0.1545591075819459 -2.5863636193731985 -0.5514923221793246 -2.387897012074511 -0.9484255367766998 -2.387897012074511 -1.5438253586727662 -1.9909637974771321 -1.940758573270145 -1.7924971901784446 -1.940758573270145 -1.3955639755810658 -2.7346250024649024 -0.006297724490242018 -2.93309160976359 0.39063549010713317 -2.536158395166211 1.3829685266005782 -2.3376917878675236 1.779901741197957 -0.5514923221793246 2.772234777691402 + 0.10666487264508007 1.3784831901949133 0.5035980872424553 1.1800165828962221 0.900531301839834 1.1800165828962221 1.2974645164372127 1.1800165828962221 1.694397731034588 0.5846167610001558 1.892864338333279 0.18768354640278062 1.892864338333279 -0.6061828827919769 1.892864338333279 -1.003116097389352 1.4959311237359003 -1.2015827046880432 1.0989979091385216 -1.4000493119867272 0.30513147994376766 -1.4000493119867272 -0.09180173465361108 -1.4000493119867272 -0.29026834195229867 -1.2015827046880432 -0.6872015565496774 -1.2015827046880432 -1.4810679857444313 -0.8046494900906609 -1.87800120034181 -0.6061828827919769 -2.0764678076404977 0.5846167610001558 -1.87800120034181 0.783083368298847 -1.4810679857444313 0.9815499755975381 -1.2826013784457437 1.3784831901949133 -0.09180173465361108 1.3784831901949133 + 0.5033689354469288 1.4566221897235465 0.7018355427456164 1.0596889751261713 1.0987687573429952 1.0596889751261713 1.495701971940374 1.0596889751261713 1.8926351865377526 0.464289153230105 2.0911017938364402 0.06735593863272271 2.0911017938364402 -0.32957727596465247 1.8926351865377526 -0.7265104905620348 1.6941685792390615 -1.12344370515941 1.495701971940374 -1.321910312458101 1.0987687573429952 -1.5203769197567851 0.7018355427456164 -1.5203769197567851 0.30490232814824125 -1.5203769197567851 -0.885897315643895 -1.12344370515941 -1.2828305302412701 -1.12344370515941 -1.4812971375399613 -0.9249770978607188 -1.6797637448386489 -0.5280438832633436 -2.0766969594360276 -0.5280438832633436 -2.0766969594360276 0.26582254593141386 -2.0766969594360276 0.662755760528789 -1.4812971375399613 1.2581555824248554 -1.2828305302412701 1.4566221897235465 0.30490232814824125 1.4566221897235465 + 0.21835264632365714 1.6060437656105222 0.8137524682197235 1.2091105510131444 1.2106856828171004 1.010643943714455 1.4091522901157898 0.6137107291170771 1.4091522901157898 0.2167775145196993 1.4091522901157898 -0.18015570007767767 1.2106856828171004 -0.5770889146750555 0.8137524682197235 -0.7755555219737449 0.8137524682197235 -1.1724887365711227 0.41681925362234473 -1.3709553438698117 0.21835264632365714 -1.5694219511685006 -0.1785805682737216 -1.5694219511685006 -0.5755137828710986 -1.5694219511685006 -1.1709136047671649 -0.9740221292724338 -1.3693802120658543 -0.5770889146750555 -1.3693802120658543 -0.18015570007767767 -1.3693802120658543 0.2167775145196993 -0.9724469974684773 0.8121773364157665 -0.7739803901697879 1.2091105510131444 -0.1785805682737216 1.6060437656105222 + + + 1.0047858432259016 1.5104865416271744 1.4017190578232785 0.9150867197311081 1.600185665121968 0.5181535051337303 0.8063192359272122 -0.8711127459570922 0.6078526286285229 -1.26804596055447 0.2109194140311459 -1.466512567853159 0.012452806732456523 -1.6649791751518475 -0.38448040786492044 -1.466512567853159 -0.7814136224622992 -1.466512567853159 -1.1783468370596761 -1.26804596055447 -1.3768134443583655 -0.8711127459570922 -1.5752800516570549 -0.6726461386584033 -1.3768134443583655 -0.27571292406102543 -1.3768134443583655 0.12122029053635242 -1.1783468370596761 0.5181535051337303 -0.38448040786492044 1.312019934328486 0.012452806732456523 1.5104865416271744 0.8063192359272122 1.5104865416271744 + 0.3351919200236111 2.867340065119812 1.724458171114435 2.0734736359250583 1.9229247784131225 1.6765404213276796 2.319857993010501 1.0811405994316132 2.518324600309189 0.6842073848342345 2.518324600309189 -0.9035254735552769 2.518324600309189 -1.3004586881526539 2.12139138571181 -1.4989252954513415 2.12139138571181 -1.8958585100487202 1.724458171114435 -2.0943251173474096 1.5259915638157437 -2.4912583319447865 -0.4586745091711464 -2.689724939243476 -0.8556077237685216 -2.689724939243476 -2.0464073675606542 -1.6973919027500308 -2.2448739748593454 -1.3004586881526539 -2.443340582158033 -1.1019920808539645 -2.641807189456724 -0.7050588662565858 -2.641807189456724 -0.308125651659207 -2.641807189456724 0.08880756293816816 -2.443340582158033 0.4857407775355469 -2.443340582158033 0.8826739921329256 -1.8479407602619666 1.8750070286263707 -1.649474152963279 2.271940243223746 -1.451007545664588 2.470406850522437 -1.0540743310672127 2.470406850522437 -0.657141116469834 2.6688734578211246 -0.26020790187245524 2.867340065119812 0.1367253127249235 2.867340065119812 + 0.6338415521383709 0.7876084731085697 0.8323081594370585 0.390675258511191 0.4353749448396833 -0.20472456338487532 0.23690833754099216 -0.6016577779822541 -0.16002487705638302 -0.6016577779822541 -0.5569580916537618 -0.8001243852809417 -0.7554246989524493 -0.4031911706835629 -0.7554246989524493 -0.006257956086187733 -0.5569580916537618 0.1922086512125034 0.4353749448396833 0.7876084731085697 + 1.1500677029995146 2.9434471892930745 2.142400739492956 2.348047367397008 2.5393339540903312 2.1495807600983206 2.9362671686877135 1.5541809382022507 3.1347337759863976 1.1572477236048755 2.9362671686877135 0.7603145090074968 3.1347337759863976 0.363381294410118 3.1347337759863976 -0.03355192018726072 3.1347337759863976 -0.4304851347846359 2.5393339540903312 -1.422818171278081 2.340867346791647 -1.8197513858754597 1.3485343102981986 -2.415151207771526 1.1500677029995146 -2.8120844223689048 -0.8345983699873756 -2.8120844223689048 -1.2315315845847579 -2.8120844223689048 -1.628464799182133 -2.6136178150702136 -2.025398013779512 -2.6136178150702136 -2.2238646210781994 -2.415151207771526 -2.620797835675578 -1.6212847785767686 -3.017731050272957 -1.6212847785767686 -3.017731050272957 -1.2243515639793934 -3.2161976575716444 -0.8274183493820146 -3.2161976575716444 0.363381294410118 -3.2161976575716444 0.7603145090074968 -2.025398013779512 1.7526475455009418 -1.628464799182133 1.9511141527996294 -1.628464799182133 2.348047367397008 -1.2315315845847579 2.5465139746956957 -0.8345983699873756 2.5465139746956957 -0.6361317626886915 2.744980581994387 -0.23919854809130925 2.9434471892930745 0.9516010957008234 2.9434471892930745 + 1.1041035081096844 1.7914734035045825 1.5010367227070631 1.5930067962058985 1.8979699373044383 0.9976069743098321 2.0964365446031294 0.6006737597124499 2.294903151901817 -0.5901258840796828 2.0964365446031294 -0.987059098677058 1.8979699373044383 -1.1855257059757491 1.6995033300057507 -1.5824589205731243 1.302570115408372 -1.7809255278718155 1.1041035081096844 -1.9793921351705066 0.7071702935123056 -1.9793921351705066 0.3102370789149269 -1.9793921351705066 -0.8805625648772057 -1.5824589205731243 -1.277495779474581 -1.5824589205731243 -2.269828815968026 -0.39165927678099166 -2.468295423266717 0.005273937816383523 -2.468295423266717 0.4022071524137658 -2.0713622086693384 0.9976069743098321 -1.8728956013706508 1.3945401889072073 -1.475962386773272 1.5930067962058985 -1.277495779474581 1.7914734035045825 0.7071702935123056 1.7914734035045825 + 0.6440965594660106 2.136080044788038 1.0410297740633894 1.9376134374893539 1.2394963813620805 1.7391468301906627 1.437962988660768 1.3422136155932876 1.8348962032581468 1.1437470082945964 2.0333628105568344 0.7468137936972212 2.231829417855522 0.5483471863985301 2.430296025154213 0.1514139718011549 2.430296025154213 -0.2455192427962274 2.6287626324529008 -0.6424524573936026 2.231829417855522 -1.237852279289669 2.0333628105568344 -1.6347854938870512 1.6364295959594557 -1.6347854938870512 1.437962988660768 -2.0317187084844264 0.24716334486863545 -2.2301853157831175 -0.1497698697287433 -2.2301853157831175 -1.539036120819567 -1.43631888658836 -1.7375027281182547 -1.237852279289669 -2.1344359427156334 -0.4439858500949114 -2.5313691573130086 -0.2455192427962274 -2.5313691573130086 0.5483471863985301 -2.5313691573130086 0.9452804009959053 -2.332902550014321 1.3422136155932876 -1.7375027281182547 1.7391468301906627 -1.340569513520876 1.9376134374893539 -0.9436362989235008 1.9376134374893539 -0.546703084326122 2.136080044788038 0.6440965594660106 2.136080044788038 + + + 0.9486112831383053 2.7433138760306974 1.7424777123330628 1.94944744683594 2.1394109269304415 1.7509808395372488 2.337877534229129 0.9571144103424984 2.5363441415278167 0.5601811957451162 2.5363441415278167 0.16324798114774097 2.5363441415278167 -0.2336852334496342 1.9409443196317504 -1.622951484540458 1.9409443196317504 -2.019884699137833 1.5440111050343717 -2.2183513064365243 1.345544497735684 -2.4168179137352155 0.9486112831383053 -2.4168179137352155 0.5516780685409302 -2.6152845210339066 -0.24218836065382732 -2.6152845210339066 -0.639121575251206 -2.6152845210339066 -1.0360547898485812 -2.4168179137352155 -1.43298800444596 -2.4168179137352155 -2.0283878263420263 -1.8214180918391492 -2.2268544336407174 -1.622951484540458 -2.6237876482380926 -0.03521862615095017 -2.6237876482380926 0.3617145884464321 -2.0283878263420263 1.3540476249398736 -1.8299212190433387 1.7509808395372488 -1.2345213971472724 2.147914054134631 -1.0360547898485812 2.5448472687320063 -0.639121575251206 2.5448472687320063 -0.24218836065382732 2.7433138760306974 0.9486112831383053 2.7433138760306974 + 0.8397321315541326 2.8652982371454954 1.435131953450199 2.468365022548113 1.8320651680475777 2.269898415249429 2.427464989943644 1.2775653787559804 2.6259315972423316 0.8806321641586052 2.6259315972423316 -0.3101674796335274 2.6259315972423316 -0.7071006942309097 2.228998382644953 -1.8979003380230424 2.0305317753462653 -2.0963669453217264 1.6335985607488865 -2.2948335526204175 1.2366653461515114 -2.4933001599191087 0.8397321315541326 -2.4933001599191087 0.4427989169567539 -2.6917667672177927 0.2443323096580663 -2.890233374516484 -0.15260090493931244 -2.890233374516484 -0.5495341195366912 -2.890233374516484 -1.343400548731445 -2.4933001599191087 -1.7403337633288238 -2.2948335526204175 -2.33573358522489 -1.302500516126976 -2.732666799822269 -1.104033908828285 -2.732666799822269 0.48369894956123005 -2.732666799822269 0.8806321641586052 -2.33573358522489 1.0790987714572964 -2.33573358522489 1.4760319860546716 -1.7403337633288238 2.071431807950738 -1.5418671560301362 2.269898415249429 -0.7480007268353788 2.666831629846804 -0.5495341195366912 2.8652982371454954 0.641265524255445 2.8652982371454954 + 0.7196861095042237 1.5568080813153573 0.9181527168029131 1.1598748667179795 1.31508593140029 1.1598748667179795 1.31508593140029 0.7629416521206016 1.5135525386989794 0.36600843752322376 1.31508593140029 0.16754183022453528 1.31508593140029 -0.22939138437284257 1.1166193241016025 -0.6263245989702204 0.9181527168029131 -1.0232578135675983 0.3227528949068468 -1.420191028164976 -0.07418031969053196 -1.6186576354636646 -0.4711135342879089 -1.420191028164976 -0.8680467488852877 -1.420191028164976 -1.2649799634826646 -0.8247912062689093 -1.463446570781354 -0.42785799167153105 -1.463446570781354 -0.030924777074153198 -1.463446570781354 0.36600843752322376 -1.0665133561839752 0.5644750448219131 -0.8680467488852877 0.961408259419291 -0.6695801415865983 1.1598748667179795 -0.27264692698921955 1.3583414740166688 0.12428628760815741 1.5568080813153573 0.5212195022055344 1.5568080813153573 + 0.2065654885901047 3.10697735107561 0.6034987031874834 2.9085107437769224 1.0004319177848586 2.9085107437769224 1.595831739680925 2.5115775291795437 1.9927649542783037 2.313110921880856 2.191231561576995 1.9161777072834774 2.3896981688756824 1.717711099984788 2.786631383473061 0.9238446707900323 2.9850979907717488 0.7253780634913447 2.9850979907717488 -0.06848836570341099 3.1835645980704363 -0.46542158030078973 2.9850979907717488 -0.8623547948981667 2.9850979907717488 -1.2592880094955454 2.58816477617437 -1.8546878313916118 2.3896981688756824 -2.2516210459889887 1.595831739680925 -2.6485542605863674 1.3973651323822374 -2.847020867885057 1.0004319177848586 -2.847020867885057 0.6034987031874834 -3.0454874751837444 -0.19036772600727403 -3.0454874751837444 -0.5873009406046528 -3.0454874751837444 -1.976567191695473 -2.2516210459889887 -2.3735004062928517 -2.053154438690301 -2.571967013591541 -1.6562212240929224 -2.7704336208902287 -1.457754616794233 -2.7704336208902287 -1.060821402196856 -2.7704336208902287 -0.6638881875994773 -2.968900228188918 -0.26695497300210036 -3.1673668354876074 0.12997824159527838 -3.1673668354876074 0.5269114561926553 -2.571967013591541 1.5192444926861004 -2.571967013591541 1.9161777072834774 -1.976567191695473 2.5115775291795437 -1.7781005843967854 2.710044136478235 -1.3811673697994067 2.9085107437769224 -0.984234155202028 2.9085107437769224 -0.5873009406046528 3.10697735107561 0.2065654885901047 3.10697735107561 + 0.6299811246828142 0.8374689414041931 0.8284477319815053 0.4405357268068144 0.8284477319815053 0.04360251220943567 0.4315145173841266 -0.15486409508925192 0.4315145173841266 -0.5517973096866307 -0.3623519118106273 -0.7502639169853182 -0.759285126408006 -0.7502639169853182 -0.759285126408006 0.04360251220943567 -0.5608185191093185 0.4405357268068144 -0.16388530451193972 0.4405357268068144 0.4315145173841266 0.8374689414041931 + 1.612415617937991 3.186300300185472 2.2078154398340573 2.7893670855880934 2.6047486544314324 2.590900478289406 3.0016818690288076 1.7970340490946484 3.39861508362619 1.5985674417959608 3.39861508362619 1.201634227198582 3.39861508362619 0.8047010126012033 3.597081690924874 0.4077677980038281 3.597081690924874 0.010834583406449383 3.39861508362619 -0.18763202389224176 3.2001484763274988 -0.584565238489617 3.2001484763274988 -0.9814984530869957 3.0016818690288076 -1.3784316676843744 3.0016818690288076 -1.7753648822817532 2.4062820471327413 -2.1722980968791283 2.2078154398340573 -2.569231311476507 1.810882225236675 -2.569231311476507 0.8185491887432335 -3.1646311333725734 0.42161597414585117 -3.363097740671261 0.024682759548475985 -3.363097740671261 -0.3722504550488992 -3.363097740671261 -1.1661168842436567 -3.1646311333725734 -1.5630500988410319 -3.1646311333725734 -1.761516706139723 -2.7676979187751947 -2.5553831353344805 -2.569231311476507 -2.7538497426331645 -2.3707647041778195 -3.150782957230547 -1.576898274983062 -3.349249564529238 -1.3784316676843744 -3.349249564529238 -0.9814984530869957 -3.349249564529238 -0.584565238489617 -3.547716171827922 -0.18763202389224176 -3.547716171827922 0.20930119070513697 -3.349249564529238 0.6062344053025157 -3.349249564529238 1.0031676198998944 -2.7538497426331645 1.995500656393336 -2.5553831353344805 2.3924338709907147 -2.158449920737098 2.590900478289406 -1.761516706139723 2.590900478289406 -1.5630500988410319 2.7893670855880934 -0.7691836696462815 2.987833692886781 -0.3722504550488992 3.186300300185472 1.612415617937991 3.186300300185472 + + + 0.8099286882388625 2.8905393530826373 1.8022617247323076 2.295139531186571 2.1991949393296863 2.09667292388788 2.5961281539270615 1.5012731019918135 2.7945947612257527 1.1043398873944383 2.9930613685244403 -0.08645975639769432 2.9930613685244403 -0.4833929709950695 2.000728332030995 -2.269592436683272 1.8022617247323076 -2.468059043981963 1.4053285101349289 -2.6665256512806508 1.0083952955375537 -2.8649922585793384 -0.5793375628519577 -2.8649922585793384 -0.9762707774493364 -2.8649922585793384 -1.5716705993454028 -2.468059043981963 -1.9686038139427815 -2.269592436683272 -2.167070421241469 -1.8726592220858969 -2.564003635838848 -1.6741926147872093 -2.7624702431375354 -0.4833929709950695 -2.9609368504362266 -0.28492636369638547 -2.9609368504362266 0.508940065498372 -2.9609368504362266 0.9058732800957472 -2.7624702431375354 1.3028064946931295 -2.564003635838848 1.6997397092905047 -1.9686038139427815 2.09667292388788 -1.770137206644094 2.493606138485262 -1.3732039920467152 2.493606138485262 -0.9762707774493364 2.692072745783946 -0.5793375628519577 2.8905393530826373 0.611462080940175 2.8905393530826373 + 0.856767683215093 3.006911754021651 2.246033934305917 2.2130453248268935 2.4445005416046044 1.8161121102295184 2.6429671489032955 1.6176455029308272 2.841433756201983 1.220712288333452 3.0399003635006707 -0.3670205700560558 3.0399003635006707 -0.7639537846534381 2.841433756201983 -1.1608869992508133 2.841433756201983 -1.5578202138481885 2.246033934305917 -1.9547534284455708 2.0475673270072257 -2.351686643042946 1.6506341124098505 -2.550153250341637 1.2537008978124717 -2.7486198576403282 0.856767683215093 -2.7486198576403282 -0.13556535327835206 -3.1455530722377034 -0.5324985678757272 -3.1455530722377034 -1.5248316043691723 -2.550153250341637 -1.921764818966551 -2.351686643042946 -2.5171646408626174 -1.7562868211468796 -2.715631248161305 -1.5578202138481885 -2.914097855459996 -1.1608869992508133 -2.914097855459996 -0.7639537846534381 -2.914097855459996 -0.3670205700560558 -3.1125644627586837 0.029912644541319366 -3.1125644627586837 0.42684585913869455 -3.1125644627586837 0.8237790737360768 -2.715631248161305 1.4191788956321432 -2.5171646408626174 1.8161121102295184 -2.1202314262652386 2.0145787175282095 -1.921764818966551 2.4115119321255847 -1.1278983897717936 2.609978539424276 -0.929431782473106 3.006911754021651 0.6583010759164054 3.006911754021651 + 0.6023407305666204 1.383192956004085 0.9992739451639991 1.1847263487053956 1.396207159761376 0.5893265268093293 1.396207159761376 0.19239331221195144 1.1977405524626867 -0.2045399023854264 1.1977405524626867 -0.6014731169828043 0.6023407305666204 -1.196872938878871 0.20540751596924345 -1.39533954617756 -0.1915256986281353 -1.39533954617756 -0.5884589132255122 -1.39533954617756 -0.7869255205242016 -1.196872938878871 -1.1838587351215786 -0.9984063315801821 -1.382325342420268 0.19239331221195144 -1.382325342420268 0.5893265268093293 -0.3899923059268229 1.1847263487053956 0.00694090867055408 1.383192956004085 0.40387412326793104 1.383192956004085 + 0.4471014454144573 3.5647956271118257 1.0425012673105236 3.1678624125144488 1.4394344819079024 3.1678624125144488 2.0348343038039687 2.5724625906183824 2.431767518401344 2.5724625906183824 3.02716734029741 1.9770627687223161 3.2256339475961013 1.5801295541249374 3.62256716219348 0.5877965176314923 3.62256716219348 0.19086330303411536 3.424100554894789 -0.6030031261606403 3.424100554894789 -0.9999363407580191 2.8287007329987226 -1.9922693772514624 2.630234125700035 -2.389202591848841 2.2333009111026563 -2.5876691991475287 2.0348343038039687 -2.786135806446218 0.24863483811576614 -3.5800022356409738 -0.14829837648160904 -3.5800022356409738 -0.5452315910789878 -3.3815356283422844 -0.9421648056763665 -3.3815356283422844 -1.9344978421698116 -2.786135806446218 -2.3314310567671868 -2.786135806446218 -2.529897664065878 -2.389202591848841 -2.9268308786632566 -2.1907359845501517 -3.1252974859619442 -1.793802769952773 -3.3237640932606336 -1.5953361626540854 -3.3237640932606336 -0.8014697334593297 -3.3237640932606336 -0.40453651886195097 -3.522230700559321 -0.007603304264574007 -3.522230700559321 0.38932991033280473 -3.522230700559321 0.7862631249301817 -2.7283642713645655 2.1755293760210037 -2.529897664065878 2.5724625906183824 -1.5375646275724328 3.1678624125144488 -1.140631412975054 3.366329019813138 -0.3467649837803002 3.366329019813138 0.05016823081707855 3.366329019813138 0.4471014454144573 3.5647956271118257 + 0.5234411689574294 0.783420818284366 0.721907776256117 0.3864876036869873 0.3249745616587383 -0.20891221820907901 0.1265079543600507 -0.6058454328064578 -0.27042526023732805 -0.6058454328064578 -0.6673584748347032 -0.6058454328064578 -0.6673584748347032 -0.20891221820907901 -0.46889186753601564 0.18802099638829972 -0.0719586529386369 0.3864876036869873 0.1265079543600507 0.5849542109856749 0.5234411689574294 0.783420818284366 + 0.7031115425841392 3.7242342449626697 1.1000447571815144 3.5257676376639857 1.2985113644802055 3.3273010303652946 1.6954445790775807 3.3273010303652946 2.092377793674956 3.1288344230666034 2.489311008272338 2.930367815767916 3.0847108301684045 2.3349679938718495 3.2831774374670886 2.136501386573162 3.680110652064471 1.3426349573784044 3.878577259363155 0.9457017427810293 3.878577259363155 0.15183531358627178 3.878577259363155 -0.2450979010111034 3.680110652064471 -0.44356450830979455 3.680110652064471 -0.8404977229071733 3.2831774374670886 -1.6343641521019272 3.0847108301684045 -1.8328307594006148 1.8939111863762719 -3.023630403192751 1.6954445790775807 -3.2220970104914386 1.2985113644802055 -3.420563617790126 0.9015781498828233 -3.6190302250888173 -1.0830879231040669 -3.6190302250888173 -1.480021137701442 -3.6190302250888173 -1.6784877450001332 -3.420563617790126 -2.0754209595975084 -3.2220970104914386 -2.2738875668961995 -2.82516379589406 -2.6708207814935747 -2.82516379589406 -2.6708207814935747 -2.428230581296681 -3.06775399609095 -2.428230581296681 -3.266220603389641 -2.031297366699306 -3.464687210688332 -1.8328307594006148 -3.464687210688332 -1.4358975448032396 -3.6631538179870162 -1.0389643302058609 -3.8616204252857074 -0.6420311156084821 -3.8616204252857074 0.5487685281836505 -3.8616204252857074 0.9457017427810293 -2.2738875668961995 2.7319012084692282 -2.0754209595975084 2.930367815767916 -1.281554530402751 3.3273010303652946 -1.0830879231040669 3.5257676376639857 -0.6861547085066846 3.5257676376639857 -0.2892214939093094 3.5257676376639857 0.10771172068806578 3.7242342449626697 0.5046449352854481 3.7242342449626697 + + + 0.1966952716495456 3.473242642320457 0.5936284862469243 3.274776035021773 0.9905617008443031 3.274776035021773 2.3798279519351233 2.4809096058270157 2.5782945592338145 2.2824429985283246 2.776761166532502 1.8855097839309494 2.776761166532502 1.4885765693335742 2.9752277738311896 1.091643354736192 3.173694381129881 -0.09915628905594076 3.3721609884285684 -0.2976228963546248 2.3798279519351233 -2.083822362042831 2.1813613446364357 -2.480755576640206 1.784428130039057 -2.679222183938897 1.5859615227403694 -2.8776887912375813 0.7920950935456119 -3.2746220058349635 0.5936284862469243 -3.4730886131336476 -0.2002379429478296 -3.4730886131336476 -0.5971711575452083 -3.4730886131336476 -1.3910375867399658 -3.0761553985362724 -1.787970801337341 -2.8776887912375813 -2.1849040159347197 -2.282288969341515 -2.5818372305320985 -2.083822362042831 -2.780303837830786 -1.6868891474454486 -2.978770445129477 -1.4884225401467646 -3.177237052428165 -0.2976228963546248 -3.177237052428165 0.09931031824275038 -2.978770445129477 0.8931767474375079 -2.978770445129477 1.290109962034883 -2.5818372305320985 1.8855097839309494 -2.3833706232334073 2.2824429985283246 -1.9864374086360321 2.4809096058270157 -1.787970801337341 2.877842820424391 -1.3910375867399658 2.877842820424391 -0.7956377648438959 3.274776035021773 -0.39870455024652074 3.473242642320457 -0.001771335649142003 3.473242642320457 + 0.3402902395295566 1.370673518816651 0.9356900614256247 0.7752736969205838 1.3326232760230017 0.7752736969205838 1.531089883321691 0.37834048232320594 1.531089883321691 -0.01859273227417102 1.1341566687243123 -0.6139925541702382 0.9356900614256247 -1.010925768767616 0.3402902395295566 -1.407858983364994 -0.056642975067820345 -1.407858983364994 -0.850509404262576 -1.010925768767616 -1.247442618859953 -0.8124591614689272 -1.4459092261586424 -0.01859273227417102 -1.4459092261586424 0.37834048232320594 -1.247442618859953 0.5768070896218953 -1.0489760115612654 0.9737403042192732 -0.6520427969638867 1.1722069115179616 -0.2551095823665097 1.370673518816651 0.14182363223086902 1.370673518816651 + -0.11556283462961403 3.8015032616990787 1.2737034164612098 3.007636832504325 1.670636631058585 3.007636832504325 2.66296966755203 2.4122370106082567 3.0599028821494088 2.213770403309569 3.8537693113441627 1.4199039741148134 4.052235918642854 1.0229707595174347 4.052235918642854 -0.167828884274698 4.052235918642854 -0.5647620988720767 3.8537693113441627 -0.9616953134694537 3.8537693113441627 -1.3586285280668324 3.4568360967467875 -1.9540283499628988 3.2583694894480963 -2.3509615645602757 2.861436274850721 -2.549428171858965 2.66296966755203 -2.7478947791576545 1.869103238357276 -3.1448279937550314 1.670636631058585 -3.343294601053721 1.2737034164612098 -3.343294601053721 0.876770201863831 -3.54176120835241 -0.3140294419283016 -3.54176120835241 -0.7109626565256804 -3.54176120835241 -2.4971621222138793 -2.7478947791576545 -2.894095336811258 -2.549428171858965 -3.4894951587073244 -1.55709513536552 -3.886428373304703 -1.3586285280668324 -3.886428373304703 -0.5647620988720767 -4.0848949806033925 -0.167828884274698 -3.6879617660060156 1.618370581413501 -3.4894951587073244 2.0153037960108797 -2.894095336811258 2.610703617906946 -2.4971621222138793 2.610703617906946 -2.2986955149151918 3.007636832504325 -1.7032956930191254 3.4045700471017035 -1.3063624784217467 3.603036654400391 -0.11556283462961403 3.8015032616990787 + 0.3584427210605803 0.763795731119032 0.3584427210605803 0.36686251652165325 0.5569093283592679 -0.030070698075721936 0.1599761137618927 -0.6254705199717883 -0.23695710083548605 -0.8239371272704794 -0.43542370813417364 -0.42700391267310067 -0.43542370813417364 -0.030070698075721936 -0.43542370813417364 0.36686251652165325 -0.23695710083548605 0.5653291238203444 0.1599761137618927 0.763795731119032 + 1.1605171802371146 3.7030794087173966 2.5497834313279384 2.909212979522639 2.9467166459253136 2.710746372223955 2.9467166459253136 2.313813157626573 3.3436498605226888 2.1153465503278817 3.54211646782138 1.3214801211331277 3.740583075120071 1.1230135138344401 3.740583075120071 -0.46471934455507125 3.740583075120071 -0.86165255915245 2.9467166459253136 -2.2509188102432702 2.7482500386266224 -2.647852024840649 1.954383609431872 -3.0447852394380277 1.954383609431872 -3.441718454035403 0.7635839656397323 -3.640185061334094 0.5651173583410483 -3.8386516686327816 -0.2287490708537092 -3.8386516686327816 -0.6256822854510844 -3.8386516686327816 -1.816481929243217 -3.2432518467367153 -2.014948536541908 -3.0447852394380277 -3.0072815730353497 -2.2509188102432702 -3.205748180334041 -1.8539855956458915 -3.205748180334041 -1.4570523810485163 -3.404214787632732 -1.2585857737498252 -3.801148002230107 -1.0601191664511376 -3.9996146095287983 0.13068047734099508 -4.1980812168274895 0.5276136919383738 -3.9996146095287983 0.7260802992370614 -3.602681394931423 0.9245469065357526 -3.404214787632732 1.3214801211331277 -3.404214787632732 1.7184133357305065 -3.0072815730353497 2.313813157626573 -2.8088149657366657 2.710746372223955 -1.0226155000484667 3.5046128014187055 -0.6256822854510844 3.7030794087173966 -0.2287490708537092 3.5046128014187055 0.7635839656397323 3.7030794087173966 + 0.6399908460036379 3.169292824552734 1.0369240606010166 2.970826217254043 1.4338572751983953 2.970826217254043 1.632323882497083 2.5738930026566678 2.0292570970944617 2.5738930026566678 2.4261903116918404 2.3754263953579766 2.4261903116918404 1.9784931807605943 3.0215901335879067 0.9861601442671528 3.2200567408865943 0.5892269296697776 3.2200567408865943 0.19229371507239534 3.2200567408865943 -0.20463949952497984 3.0215901335879067 -0.601572714122355 3.0215901335879067 -0.9985059287197373 2.4261903116918404 -1.9908389652131788 2.2277237043931493 -2.387772179810561 1.8307904897957705 -2.387772179810561 1.8307904897957705 -2.7847053944079363 1.4338572751983953 -2.9831720017066274 0.4415242387049503 -3.181638609005315 0.04459102410757154 -3.3801052163040026 -0.3523421904898072 -3.181638609005315 -1.5431418342819399 -2.9831720017066274 -1.7416084415806274 -2.7847053944079363 -1.9400750488793186 -2.387772179810561 -2.535474870775383 -1.9908389652131788 -2.7339414780740725 -1.5939057506158036 -3.1308746926714512 -0.006172892226288695 -3.329341299970139 0.19229371507239534 -3.1308746926714512 0.5892269296697776 -3.1308746926714512 0.9861601442671528 -2.7339414780740725 1.7800265734619103 -2.535474870775383 1.9784931807605943 -2.138541656178006 2.1769597880592855 -1.9400750488793186 2.5738930026566678 -1.7416084415806274 2.772359609955352 -1.3446752269832487 2.970826217254043 -0.9477420123858735 3.169292824552734 0.6399908460036379 3.169292824552734 + + + 0.7122062329179109 3.5022803209505255 2.101472484008731 2.708413891755768 2.49840569860611 2.509947284457084 2.49840569860611 2.1130140698597017 2.6968723059047974 1.7160808552623266 3.093805520502176 1.5176142479636354 3.093805520502176 1.1206810333662602 3.2922721278008673 0.723747818768878 3.2922721278008673 -0.4670518250232547 3.490738735099555 -0.6655184323219387 3.093805520502176 -1.4593848615166962 3.093805520502176 -1.8563180761140714 2.2999390913074222 -2.650184505308829 2.101472484008731 -3.047117719906211 1.3076060548139772 -3.2455843272048988 1.109139447515286 -3.4440509345035863 0.3152730183205321 -3.4440509345035863 -0.08166019627684662 -3.642517541802274 -0.4785934108742218 -3.4440509345035863 -0.8755266254716005 -3.4440509345035863 -1.8678596619650456 -2.84865111260752 -2.2647928765624243 -2.650184505308829 -2.463259483861112 -2.2532512907114537 -2.6617260911598013 -2.0547846834127625 -3.0586593057571783 -1.260918254218005 -3.0586593057571783 -0.8639850396206299 -3.455592520354557 -0.26858521772456356 -3.455592520354557 0.12834799687281162 -3.2571259130558676 0.5252812114701939 -3.2571259130558676 0.9222144260675691 -3.2571259130558676 1.3191476406649443 -2.6617260911598013 2.311480677158393 -2.463259483861112 2.708413891755768 -1.8678596619650456 3.1053471063531504 -1.4709264473676686 3.3038137136518344 -1.0739932327702917 3.3038137136518344 -0.677060018172913 3.5022803209505255 0.5137396256192197 3.5022803209505255 + 1.054910772876358 3.578406934114284 1.4518439874737368 3.3799403268155928 1.6503105947724244 2.9830071122182176 2.4441770239671783 2.7845405049195264 2.642643631265866 2.3876072903221512 2.841110238564557 2.18914068302346 3.039576845863248 1.792207468426085 3.4365100604606234 0.006008002737885931 3.4365100604606234 -0.39092521185949636 3.238043453161932 -0.7878584264568715 3.238043453161932 -1.1847916410542467 3.039576845863248 -1.581724855651629 2.642643631265866 -2.1771246775476953 2.4441770239671783 -2.5740578921450705 1.054910772876358 -3.367924321339828 0.6579775582789793 -3.566390928638519 -0.9297553001105321 -3.566390928638519 -1.3266885147079108 -3.566390928638519 -1.5251551220065984 -3.367924321339828 -1.9220883366039772 -3.169457714041137 -2.9144213730974187 -1.9786580702490042 -3.11288798039611 -1.581724855651629 -3.11288798039611 -1.1847916410542467 -3.3113545876947974 -0.7878584264568715 -3.3113545876947974 0.7998744319326363 -3.3113545876947974 1.1968076465300186 -3.11288798039611 1.3952742538287097 -3.11288798039611 1.792207468426085 -2.715954765798731 1.990674075724776 -2.715954765798731 2.3876072903221512 -2.3190215512013523 2.3876072903221512 -2.1205549439026647 2.7845405049195264 -1.1282219074092197 3.3799403268155928 -0.731288692811841 3.578406934114284 0.8564441655776669 3.578406934114284 + 0.35389777956605606 1.397507079075539 0.7508309941634348 1.1990404717768497 0.9492976014621242 1.0005738644781612 1.3462308160595011 0.20670743528340552 1.3462308160595011 -0.19022577931397233 0.9492976014621242 -0.7856256012100391 0.7508309941634348 -1.182558815807417 0.5523643868647454 -1.3810254231061059 0.15543117226736847 -1.3810254231061059 -0.24150204233001027 -1.3810254231061059 -0.6384352569273872 -1.182558815807417 -1.035368471524766 -0.984092208508728 -1.2338350788234536 -0.5871589939113502 -1.2338350788234536 0.20670743528340552 -1.2338350788234536 0.6036406498807834 -1.035368471524766 0.8021072571794718 -0.8369018642260766 1.1990404717768497 0.35389777956605606 1.397507079075539 + 0.3258782089912202 4.0482567663487625 2.112077674679419 3.452856944452696 2.509010889276798 3.254390337154005 3.1044107111728643 2.6589905152579387 3.302877318471552 2.460523907959251 3.6998105330689306 1.6666574787644954 3.898277140367618 1.2697242641671167 4.096743747666309 0.2773912276736734 4.295210354964997 -0.11954198692370532 4.096743747666309 -0.5164752015210823 4.096743747666309 -0.913408416118461 3.501343925770243 -1.905741452611906 3.302877318471552 -2.302674667209283 2.509010889276798 -3.0965410964040387 2.3105442819781103 -3.4934743110014157 1.5166778527833529 -3.691940918300105 1.3182112454846653 -3.8904075255987944 -0.6664548275022248 -3.8904075255987944 -1.0633880420996036 -3.8904075255987944 -2.452654293190424 -3.0965410964040387 -2.8495875077878026 -2.8980744891053494 -3.444987329683869 -2.302674667209283 -3.6434539369825565 -2.1042080599105937 -4.040387151579935 -1.310341630715838 -4.238853758878626 -1.1118750234171504 -4.040387151579935 -0.7149418088197717 -4.040387151579935 0.475857834972361 -4.040387151579935 0.8727910495697397 -4.040387151579935 1.2697242641671167 -3.444987329683869 1.865124086063183 -3.444987329683869 2.26205730066056 -2.8495875077878026 2.85745712255663 -2.651120900489115 3.0559237298553175 -0.8649214348009124 3.8497901590500714 -0.46798822020353725 4.0482567663487625 0.3258782089912202 4.0482567663487625 + 0.1744100488383502 0.6495270784323353 0.37287665613704135 0.2525938638349565 0.37287665613704135 -0.5412725653597974 -0.024056558460337385 -0.739739172658485 -0.4209897730577161 -0.14433935076241866 -0.4209897730577161 0.2525938638349565 -0.22252316575902498 0.6495270784323353 0.1744100488383502 0.6495270784323353 + 0.9265573930572444 3.797810758944074 2.7127568587454434 2.8054777224506253 2.9112234660441345 2.607011115151934 3.1096900733428257 2.210077900554559 3.506623287940201 2.0116112932558714 3.705089895238892 1.8131446859571803 3.903556502537576 1.416211471359805 4.102023109836267 1.0192782567624263 4.102023109836267 0.6223450421650476 3.903556502537576 0.22541182756766887 3.903556502537576 -0.9653878162244638 3.903556502537576 -1.3623210308218425 3.705089895238892 -1.5607876381205301 3.506623287940201 -1.9577208527179089 3.1096900733428257 -2.1561874600165964 2.315823644148068 -2.9500538892113504 2.117357036849377 -3.346987103808729 1.7204238222520019 -3.346987103808729 1.1250240003559355 -3.743920318406108 0.7280907857585532 -3.9423869257047954 0.33115757116117805 -3.9423869257047954 -0.06577564343619713 -3.9423869257047954 -0.8596420726309546 -3.743920318406108 -1.2565752872283298 -3.743920318406108 -1.8519751091243961 -3.346987103808729 -2.0504417164230873 -2.9500538892113504 -2.4473749310204695 -2.9500538892113504 -2.8443081456178447 -2.7515872819126628 -3.2412413602152235 -2.1561874600165964 -3.6381745748125986 -1.9577208527179089 -3.6381745748125986 -1.5607876381205301 -3.83664118211129 -1.1638544235231514 -3.83664118211129 -0.7669212089257726 -3.6381745748125986 -0.36998799432839746 -3.6381745748125986 0.026945220268981274 -3.83664118211129 0.22541182756766887 -4.035107789409977 0.6223450421650476 -4.035107789409977 1.0192782567624263 -3.83664118211129 1.416211471359805 -3.83664118211129 1.8131446859571803 -3.6381745748125986 2.210077900554559 -3.439707967513911 2.4085445078532466 -1.653508501825712 3.4008775443466916 -1.2565752872283298 3.599344151645383 -0.8596420726309546 3.599344151645383 -0.6611754653322635 3.797810758944074 -0.2642422507348883 3.599344151645383 0.1326909638624869 3.797810758944074 0.9265573930572444 3.797810758944074 + + + 0.6465863198475539 3.7717852465070223 2.43278578553576 2.7794522100135737 2.631252392834444 2.5809856027148825 3.4251188220292015 1.1917193516240658 3.6235854293278926 0.7947861370266835 3.6235854293278926 0.39785292242930836 3.6235854293278926 9.197078319331808E-4 3.4251188220292015 -0.3960135067654491 3.4251188220292015 -0.7929467213628243 3.4251188220292015 -1.1898799359602066 3.0281856074318263 -1.785279757856273 2.829719000133135 -2.182212972453648 2.234319178237069 -2.7776127943497144 2.0358525709383777 -2.9760794016484056 1.2419861417436202 -3.3730126162457807 0.845052927146245 -3.571479223544472 0.4481197125488663 -3.571479223544472 0.2496531052501787 -3.769945830843156 -0.14728010934720004 -3.769945830843156 -1.3380797531393327 -3.3730126162457807 -1.7350129677367114 -3.3730126162457807 -1.933479575035399 -2.9760794016484056 -2.3304127896327778 -2.9760794016484056 -2.5288793969314654 -2.5791461870510233 -2.925812611528844 -2.3806795797523392 -3.322745826126223 -1.3883465432588906 -3.5212124334249104 -0.9914133286615154 -3.5212124334249104 -0.19754689946675796 -3.5212124334249104 0.19938631513061722 -3.322745826126223 0.9932527443253747 -3.322745826126223 1.3901859589227499 -2.925812611528844 1.9855857808188162 -2.727346004230153 2.3825189954161985 -2.3304127896327778 2.5809856027148825 -2.1319461823340866 2.977918817312265 -1.7350129677367114 3.176385424610956 -1.5365463604380203 3.37485203190964 0.4481197125488663 3.7717852465070223 + 0.5979895403780162 1.2607220428048356 0.994922754975395 1.062255435506147 1.391855969572772 0.4668556136100799 1.391855969572772 0.06992239901270292 0.7964561476767056 -0.9224106374807421 0.5979895403780162 -1.31934385207812 0.20105632578063926 -1.31934385207812 -0.19587688881673948 -1.31934385207812 -0.5928101034141164 -1.120877244779431 -0.9897433180114952 -1.120877244779431 -1.1882099253101828 -0.7239440301820532 -1.3866765326088721 -0.32701081558467493 -1.3866765326088721 0.06992239901270292 -0.9897433180114952 0.6653222209087692 -0.7912767107128058 1.062255435506147 -0.3943434961154271 1.2607220428048356 0.39952293307932685 1.2607220428048356 + -0.19987935438059168 3.083880733538571 0.19705386021678706 2.8854141262398834 0.990920289411541 2.8854141262398834 1.3878535040089197 2.8854141262398834 1.7847867186062985 2.290014304343817 2.1817199332036736 2.091547697045126 2.5786531478010524 1.297681267850372 2.77711975509974 1.0992146605516844 2.77711975509974 -0.4885181978378288 2.77711975509974 -0.8854514124352058 2.5786531478010524 -1.2823846270325845 2.5786531478010524 -1.6793178416299614 1.983253325904986 -2.2747176635260278 1.7847867186062985 -2.473184270824717 1.3878535040089197 -2.6716508781234065 0.990920289411541 -2.870117485422096 0.7924536821128534 -2.6716508781234065 -0.795279176276658 -2.6716508781234065 -1.1922123908740367 -2.6716508781234065 -1.9860788200687907 -2.2747176635260278 -2.3830120346661694 -2.07625105622734 -2.779945249263548 -1.480851234331272 -2.9784118565622357 -1.0839180197338951 -2.9784118565622357 -0.6869848051365182 -2.779945249263548 -0.2900515905391394 -2.779945249263548 0.5038148386556145 -2.779945249263548 0.9007480532529932 -2.3830120346661694 1.4961478751490596 -2.184545427367482 1.8930810897464383 -0.5968125689779704 2.8854141262398834 + -0.17565435358608994 2.973095679400707 0.22127886101128524 2.774629072102016 1.0151452902060427 2.774629072102016 1.412078504803425 2.774629072102016 1.610545112102109 2.576162464803325 2.0074783266994913 2.3776958575046407 2.2059449339981754 1.9807626429072585 2.4044115412968665 1.5838294283098833 2.4044115412968665 1.186896213712501 2.6028781485955577 0.9884296064138134 2.6028781485955577 -0.20237003737831927 2.6028781485955577 -0.599303251975698 2.4044115412968665 -0.9962364665730732 2.2059449339981754 -2.187036110365206 2.0074783266994913 -2.5839693249625846 1.2136118975047339 -2.7824359322612757 1.0151452902060427 -2.5839693249625846 -0.17565435358608994 -2.9809025395599633 -0.5725875681834687 -2.9809025395599633 -2.7557202484690464 -1.393169681170452 -2.954186855767734 -0.9962364665730732 -2.7557202484690464 -0.20237003737831927 -2.5572536411703553 0.19456317721905947 -2.5572536411703553 0.5914963918164382 -2.5572536411703553 0.9884296064138134 -1.961853819274289 1.9807626429072585 -1.7633872119756013 2.3776958575046407 -1.5649206046769102 2.576162464803325 -1.167987390079535 2.774629072102016 -0.3741209608847811 2.973095679400707 + 0.5491095124918353 3.7447498828348103 0.9460427270892122 3.546283275536119 1.342975941686591 3.546283275536119 1.739909156283968 3.546283275536119 2.1368423708813467 2.950883453640053 2.5337755854787254 2.7524168463413616 2.9307088000761006 1.9585504171466113 3.1291754073747917 1.7600838098479201 3.526108621972167 0.9662173806531626 3.724575229270858 0.7677507733544715 3.724575229270858 0.3708175587570963 3.724575229270858 -0.026115655840278862 3.3276420146734793 -1.2169152996324115 3.3276420146734793 -1.6138485142297938 2.9307088000761006 -2.20924833612586 2.732242192777413 -2.6061815507232353 2.1368423708813467 -3.0031147653206176 1.739909156283968 -3.2015813726193016 1.342975941686591 -3.2015813726193016 0.9460427270892122 -3.400047979917993 0.5491095124918353 -3.598514587216684 -0.6416901313002992 -3.598514587216684 -1.0386233458976761 -3.598514587216684 -1.2370899531963655 -3.400047979917993 -1.6340231677937425 -3.2015813726193016 -2.030956382391121 -3.2015813726193016 -2.427889596988498 -3.0031147653206176 -2.427889596988498 -2.6061815507232353 -2.824822811585877 -2.6061815507232353 -3.420222633481943 -1.6138485142297938 -3.6186892407806326 -1.2169152996324115 -3.6186892407806326 0.3708175587570963 -3.6186892407806326 0.7677507733544715 -2.824822811585877 2.1570170244452953 -2.6263562042871875 2.5539502390426776 -2.2294229896898106 2.5539502390426776 -2.2294229896898106 2.950883453640053 -1.8324897750924318 2.950883453640053 -1.4355565604950549 3.149350060938744 -1.2370899531963655 3.546283275536119 -0.8401567385989868 3.546283275536119 -0.4432235240016098 3.7447498828348103 0.3506429051931459 3.7447498828348103 + + + 0.5771346571390623 3.592191496670523 0.974067871736441 3.393724889371839 1.3710010863338162 3.393724889371839 1.9664009082298826 2.9967916747744567 2.3633341228272613 2.7983250674757656 3.1572005520220188 2.0044586382810152 3.35566715932071 1.607525423683633 3.554133766619394 0.4167257798915003 3.752600373918085 0.019792565294125097 3.554133766619394 -0.17867404200456605 3.554133766619394 -0.5756072566019412 3.554133766619394 -0.9725404711993235 3.35566715932071 -1.3694736857966987 3.1572005520220188 -1.7664069003940739 2.5618007301259524 -2.163340114991456 2.5618007301259524 -2.5602733295888314 0.37866804984037117 -3.751072973380964 -0.018265164757004015 -3.751072973380964 -1.4075314158478278 -3.354139758783589 -1.8044646304452066 -3.1556731514848977 -2.399864452341273 -2.7587399368875225 -2.796797666938648 -2.5602733295888314 -3.193730881536027 -1.7664069003940739 -3.3921974888347144 -1.5679402930953898 -3.3921974888347144 -1.1710070784980076 -3.3921974888347144 -0.7740738639006324 -3.5906640961334055 -0.3771406493032501 -3.5906640961334055 0.019792565294125097 -3.5906640961334055 0.4167257798915003 -3.3921974888347144 0.8136589944888826 -3.3921974888347144 1.2105922090862578 -2.796797666938648 2.2029252455796993 -2.5983310596399605 2.5998584601770816 -2.2013978450425817 2.7983250674757656 -2.002931237743894 2.9967916747744567 -1.2090648085491367 3.393724889371839 -1.010598201250449 3.592191496670523 0.18020144254168358 3.592191496670523 + 0.38726432860077686 1.3444840422644528 0.7841975431981556 1.1460174349657644 0.982664150496845 0.947550827667075 1.1811307577955326 0.5506176130696971 1.379597365094222 0.15368439847232018 0.982664150496845 -0.44171542342374703 0.7841975431981556 -0.8386486380211249 0.5857309358994662 -1.2355818526185027 0.18879772130208927 -1.2355818526185027 -0.20813549329528946 -1.4340484599171912 -0.8035353151913558 -1.0371152453198138 -1.2004685297887328 -0.8386486380211249 -1.2004685297887328 -0.044782208826369185 -1.2004685297887328 0.35215100577100866 -1.0020019224900452 0.5506176130696971 -0.8035353151913558 0.947550827667075 -0.40660210059397706 1.1460174349657644 -0.009668885996600096 1.3444840422644528 0.38726432860077686 1.3444840422644528 + 2.4219781586374083 2.4306846384740055 2.8189113732347835 2.232218031175318 3.0173779805334746 1.8352848165779392 3.0173779805334746 0.6444851727858065 3.0173779805334746 0.24755195818842957 2.8189113732347835 0.0490853508897402 2.620444765936096 -0.34784786370763854 2.223511551338717 -0.5463144710063261 1.4296451221439632 -0.5463144710063261 1.0327119075465845 -0.5463144710063261 0.8342453002478969 -0.9432476856037049 0.6357786929492057 -1.1417142929023925 0.6357786929492057 -1.5386475074997712 0.43731208565051816 -1.9355807220971482 0.23884547835183056 -2.332513936694527 -0.15808773624554817 -2.332513936694527 -0.5550209508429269 -2.5309805439932163 -1.7458205946350596 -2.5309805439932163 -2.1427538092324383 -2.5309805439932163 -2.341220416531126 -2.1340473293958375 -2.539687023829817 -1.9355807220971482 -2.539687023829817 -1.5386475074997712 -2.7381536311285046 -1.1417142929023925 -2.7381536311285046 0.44601856548711716 -2.539687023829817 0.8429517800844941 -2.1427538092324383 0.8429517800844941 -1.547353987336372 1.2398849946818729 -1.1504207727389932 1.438351601980564 -0.3565543435442393 1.438351601980564 0.04037887105313942 1.6368182092792516 0.43731208565051816 2.232218031175318 0.8342453002478969 2.4306846384740055 1.231178514845272 2.232218031175318 1.6281117294426508 2.232218031175318 2.0250449440400295 2.232218031175318 2.4219781586374083 2.4306846384740055 + 0.1874974607915405 3.596176770699138 0.7828972826876068 2.6038437342056966 0.981363889986298 2.2069105196083143 0.981363889986298 1.0161108758161852 0.7828972826876068 0.6191776612188065 0.981363889986298 0.42071105392011887 1.3782971045836732 0.42071105392011887 1.7752303191810554 0.22224444662142773 2.1721635337784306 0.023777839322740135 2.1721635337784306 -0.3731553752746386 2.1721635337784306 -0.7700885898720173 2.3706301410771218 -1.1670218044693925 2.3706301410771218 -1.5639550190667713 1.9736969264797395 -1.7624216263654588 1.9736969264797395 -2.1593548409628376 1.3782971045836732 -2.754754662858904 1.1798304972849891 -2.953221270157595 -0.01096914650715064 -2.953221270157595 -0.4079023611045258 -2.953221270157595 -0.8048355757019046 -2.754754662858904 -1.2017687902992797 -2.5562880555602163 -1.4002353975979709 -2.1593548409628376 -1.5987020048966585 -1.1670218044693925 -1.797168612195346 -0.7700885898720173 -1.4002353975979709 0.023777839322740135 -1.2017687902992797 0.22224444662142773 -1.4002353975979709 0.42071105392011887 -1.797168612195346 0.6191776612188065 -1.9956352194940372 1.4130440904135604 -2.194101826792725 1.8099773050109391 -1.9956352194940372 2.0084439123096303 -1.797168612195346 2.4053771269070054 -1.4002353975979709 2.6038437342056966 -1.2017687902992797 3.0007769488030718 -0.20943575380583468 3.596176770699138 + 0.6640987823453202 4.091390036752671 1.0610319969426971 3.8929234294539867 1.2594986042413865 3.6944568221552956 1.6564318188387652 3.6944568221552956 2.053365033436142 3.4959902148566044 2.450298248033521 3.2975236075579204 3.0456980699295872 2.702123785661854 3.244164677228275 2.503657178363163 3.6410978918256536 1.7097907491684055 3.839564499124341 1.5113241418697214 3.839564499124341 1.1143909272723391 4.038031106423032 0.7174577126749639 3.839564499124341 -0.07640871651979353 3.839564499124341 -0.4733419311171687 3.6410978918256536 -0.870275145714551 3.6410978918256536 -1.2672083603119262 3.0456980699295872 -2.2595413968053677 2.8472314626308997 -2.65647461140275 2.053365033436142 -3.4503410405975075 1.6564318188387652 -3.6488076478961915 1.2594986042413865 -3.6488076478961915 0.2671655677479432 -4.045740862493574 -0.12976764684943554 -4.045740862493574 -0.5267008614468125 -3.8472742551948826 -0.9236340760441912 -3.8472742551948826 -1.3205672906415682 -3.8472742551948826 -1.717500505238947 -3.6488076478961915 -1.9159671125376363 -3.4503410405975075 -2.3129003271350133 -3.2518744332988163 -2.709833541732392 -3.053407826000125 -3.106766756329769 -2.458008004104059 -3.503699970927146 -2.2595413968053677 -3.7021665782258353 -1.8626081822079925 -3.9006331855245246 -1.4656749676106173 -3.9006331855245246 0.5189911053762728 -3.9006331855245246 0.915924319973648 -3.3052333636284583 1.9082573564670966 -3.106766756329769 2.1067239637657877 -2.3129003271350133 3.0990570002592293 -1.9159671125376363 3.2975236075579204 -1.3205672906415682 3.6944568221552956 -0.9236340760441912 3.8929234294539867 -0.5267008614468125 3.8929234294539867 -0.12976764684943554 3.8929234294539867 0.06869896044925383 4.091390036752671 0.4656321750466308 4.091390036752671 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { + "name": "CurrentDisplaySettings", + "spotUniformColor": "204, 51, 204, 255", + "spotColorByType": "TRACKS", + "spotColorByFeature": "TRACK_INDEX", + "spotDisplayRadius": 1.0, + "spotDisplayedAsRoi": true, + "spotMin": 0.0, + "spotMax": 10.0, + "spotShowName": true, + "trackMin": 0.0, + "trackMax": 10.0, + "trackColorByType": "TRACKS", + "trackColorByFeature": "TRACK_INDEX", + "trackUniformColor": "204, 204, 51, 255", + "undefinedValueColor": "0, 0, 0, 255", + "missingValueColor": "89, 89, 89, 255", + "highlightColor": "51, 230, 51, 255", + "trackDisplayMode": "LOCAL_BACKWARD", + "colormap": "Jet", + "limitZDrawingDepth": false, + "drawingZDepth": 10.0, + "fadeTracks": true, + "fadeTrackRange": 30, + "useAntialiasing": true, + "spotVisible": true, + "trackVisible": true, + "font": { + "name": "Arial", + "style": 1, + "size": 12 + }, + "lineThickness": 2.0, + "selectionLineThickness": 4.0, + "trackschemeBackgroundColor1": "128, 128, 128, 255", + "trackschemeBackgroundColor2": "192, 192, 192, 255", + "trackschemeForegroundColor": "0, 0, 0, 255", + "trackschemeDecorationColor": "0, 0, 0, 255", + "trackschemeFillBox": false, + "spotFilled": false, + "spotTransparencyAlpha": 1.0 +} +