DisPerSE - persistent structures identification - Skeleton dataAutomatic identification of persistent structures in 2D or 3D.
keywords: Morse complex, topology, peak, void, source, wall, filament, cosmic web, cosmology, structure identification.2013-01-24T03:58:22+01:00thierry sousbieurn:md5:f62b3bf39b9948523836119476648bbfDotclearvtk skeleton formatsurn:md5:611138afc79e8da4f1ebda37f6c51ad22420-05-07T15:06:00+01:002012-05-26T11:51:24+02:00thierry sousbieSkeleton data <p>VTK formats are developed for the Visualization Tool Kit library (<a href="http://localhost/dotclear/index.php?post/vtk-formats">VTK</a>) and can be used for 3D visualization with software such as <a href="https://wci.llnl.gov/codes/visit/">VisIt</a> or <a href="http://www.paraview.org/">ParaView</a>. Skeletons are stored as <em>VTK polygon data</em> and can be output in fours different VTK formats:
<br /><br /></p>
<ul>
<li>-<strong>vtk</strong>: the legacy format</li>
<li>-<strong>vtk_ascii</strong>: ASCII version of the vtk format</li>
<li>-<strong>vtp</strong>: a more recently developed XML version of the vtk format,</li>
<li>-<strong>vtp_ascii</strong>: ASCII version of the vtp format</li>
</ul>
<p><br />
<br />
The specifications for these formats can be found in this <a href="http://localhost/dotclear/index.php?post/www.vtk.org/VTK/img/file-formats.pdf" title="VTK formats PDF">PDF</a> file. See also <a href="http://www.cacr.caltech.edu/~slombey/asci/vtk/vtk_formats.simple.html">here</a> and <a href="http://mathema.tician.de/node/430" title="there">there</a> for additional information.
<br />
<br />
<br />
<br />
<br /></p>crits_ascii formaturn:md5:a36d6123b06f743a8cfd629740502e4d2420-05-06T15:03:00+01:002012-05-24T16:31:02+02:00thierry sousbieSkeleton data <p>This ASCII format is a very simple one. It consists in a list of all the critical points with some useful information for each of them.
<br />
<br /></p>
<table border="1"><caption> crits_ascii format</caption><tr ><td width="50%" ></td><td width="50%" ></td></tr>
<tr valign="top"><th> #critical points</th><td> Header</td></tr>
<tr valign="top"><th> #X0 X1 X2 value type pair_id boundary</th><td> Header identifying each column</td></tr>
<tr valign="top"><th> #NDIMS NPOINTS</th><td> Number of dimensions and number of points</td></tr>
<tr valign="top"><th> X0 X1 X2 value type pair_id boundary</th><td> The value of the fields for the first point</td></tr>
<tr valign="top"><th> ....</th><td> One such line for each NPOINTS points</td></tr>
</table>
<p><br />
<br />
<ins>Notations</ins>:</p>
<ul>
<li>-<strong>X_0</strong>,..., <strong>X_ndims</strong> : the coordinates of the pooint</li>
<li>-<strong>value</strong> : Value of the field.</li>
<li>-<strong>type</strong> : the critical index of the point. A value of NDIMS+1 indicates a bifurcation point or a trimmed extremity.</li>
<li>-<strong>pair_id</strong> : index of the other critical point in the persistence pair. C style convention is used, indices starting at 0, and points without perisstence pairs have their own index for <em>pair_id</em>.</li>
<li>-<strong>boundary</strong> : value can be <em>0</em>, <em>1</em> or <em>2</em> when the point is inside the domain, on the boundary, or outside (e.g. at infinity)</li>
</ul>segs_ascii formaturn:md5:364e501555e6d066eda82436e0a953252420-05-04T15:03:00+01:002013-01-24T04:56:07+01:00thierry sousbieSkeleton data <p>This ASCII format is a very simple one. It consists in a list of individual segments describing the local orientation of the arcs as well as some limited information on the filament they belong. This may be used for doing statistical analysis of local properties of filaments such as the local orientation of a magnetic field for instance. Note that all the segments are oriented from the lower critical index extremity of the filament they belong toward the other extremity (which does NOT mean that the value is strictly increasing, as local fluctuations of amplitude the persistence threshold are still allowed ... ).
<br />
<ins><strong>nb</strong></ins>: you probably want to use option <em><a href="http://localhost/dotclear/index.php?post/skelconv#breakdown">-breakdown</a></em> of <em><a href="http://localhost/dotclear/index.php?post/skelconv">skelconv</a></em> before using this format.
<br />
<br /></p>
<table border="1"><caption> segs_ascii format</caption><tr ><td width="50%" ></td><td width="50%" ></td></tr>
<tr valign="top"><th> #arc segments</th><td> Header</td></tr>
<tr valign="top"><th> #U0 U1 U2 V0 V1 V2 value_U value_V type boundary</th><td> Header identifying each column</td></tr>
<tr valign="top"><th> #NDIMS NSEGS</th><td> Number of dimensions and number of segments</td></tr>
<tr valign="top"><th> U0 U1 U2 V0 V1 V2 value_U value_V type boundary</th><td> The value of the fields for the first segment</td></tr>
<tr valign="top"><th> ....</th><td> One such line for each NSEGS segment</td></tr>
</table>
<p><br />
<br />
<ins>Notations</ins>:</p>
<ul>
<li>-<strong>U_0</strong>,..., <strong>U_ndims</strong> : The coordinates of the first extremity of the segment. It is the one closest to the lowest critical index CP along the filament it belongs to.</li>
<li>-<strong>V_0</strong>,..., <strong>V_ndims</strong> : The coordinates of the second extremity of the segment. It is the one closest to the highest critical index CP along the filament it belongs to.</li>
<li>-<strong>value_U</strong>, <strong>value_V</strong> : Value of the field in U and V.</li>
<li>-<strong>type</strong> : the type of arc the segment belongs to. The type of an arc is the minimum critical index of the CP at the extremity of the filament the segment belong to.</li>
<li>-<strong>boundary</strong> : value can be <em>0</em>, <em>1</em> or <em>2</em> when the segment is inside the domain, on the boundary, or outside (e.g. at infinity)</li>
</ul>NDskl_ascii formaturn:md5:6f0d89c6789bb8662825d1d4061e3b812420-05-03T15:02:00+01:002012-05-27T15:50:00+02:00thierry sousbieSkeleton data <p>An ASCII format that contains the same amount of information as <a href="http://localhost/dotclear/index.php?post/NDskl-format">NDskl</a> files, but organized in a different way. In particular, filaments are not described as lists of segments but rather each filament is described by an origin node, a destination node, and a set of sampling points.
<br />
<br /></p>
<table border="1"><caption> NDskl_ascii format</caption><tr ><td width="50%" ></td><td width="50%" ></td></tr>
<tr valign="top"><th> ANDSKEL</th><td> header</td></tr>
<tr valign="top"><th> ndims</th><td> the number of dimensions</td></tr>
<tr valign="top"><th> #comments go here</th><td> OPTIONAL: should start with '#' if present (the 80 first characters are read and stored).</td></tr>
<tr valign="top"><th> BBOX [x0_1 .. x0_d] [delta_1 .. delta_d]</th><td> OPTIONAL: the bounding box, defined by the 'ndims' coordinates of the origin 'x0' and extent 'delta'.</td></tr>
<tr valign="top"><th> [CRITICAL POINTS]</th><td> Marks the beginning of the critical points section</td></tr>
<tr valign="top"><th> ncrit</th><td> The number of critical points (CP)</td></tr>
<tr valign="top"><th> type pos[0] ... pos[ndims-1] value pairID boundary</th><td style="background:lightblue"> Info on the first CP: critical index, position, value, index of CP in the persistence pair, 0 if not on the boundary</td></tr>
<tr valign="top"><th> nfil</th><td style="background:lightblue"> The number of filaments connected to this CP</td></tr>
<tr valign="top"><th> destId[0] filId[0]</th><td style="background:lightblue"> Info on the first filament: index of the CP at the other extremity of the filament, and index of the filament (see filaments table below)</td></tr>
<tr valign="top"><th> ...</th><td style="background:lightblue"> One line for each filament connecting on the CP</td></tr>
<tr valign="top"><th> destId[nfil-1] filId[nfil-1]</th><td style="background:lightblue"> Information on the last filament</td></tr>
<tr valign="top"><th style="background:red">.....</th><td style="background:red"></td></tr>
<tr valign="top"><th style="background:red"> .....</th><td style="background:red"> one blue block for each CP.</td></tr>
<tr valign="top"><th style="background:red"> .....</th><td style="background:red"></td></tr>
<tr valign="top"><th> [FILAMENTS]</th><td> Marks the beginning of the filaments section</td></tr>
<tr valign="top"><th> nfil</th><td> Total number of filaments</td></tr>
<tr valign="top"><th> CP1 CP2 nSamp</th><td style="background:lightblue"> index of the CP at the extremity of the first filament and number of sampling points</td></tr>
<tr valign="top"><th> P[0][0] ... P[0][ndims-1]</th><td style="background:lightblue">position of the first sampling point of first filament.</td></tr>
<tr valign="top"><th> ...</th><td style="background:lightblue">One line for each sampling point of first filament.</td></tr>
<tr valign="top"><th> P[nSamp-1][0] ... P[nSamp-1][ndims-1]</th><td style="background:lightblue">Position of the last sampling point</td></tr>
<tr valign="top"><th style="background:red">.....</th><td style="background:red"></td></tr>
<tr valign="top"><th style="background:red"> .....</th><td style="background:red"> one blue block for each filament.</td></tr>
<tr valign="top"><th style="background:red"> .....</th><td style="background:red"></td></tr>
<tr valign="top"><th> [CRITICAL POINTS DATA]</th><td> Marks the beginning of the CP data section</td></tr>
<tr valign="top"><th> NF</th><td> Number of fields associated to each CP.</td></tr>
<tr valign="top"><th> CP_DATA_FIELD_NAME_1</th><td> Name of the first field</td></tr>
<tr valign="top"><th> ...</th><td></td></tr>
<tr valign="top"><th> CP_DATA_FIELD_NAME_NF</th><td> Name of the last field</td></tr>
<tr valign="top"><th> val_1[0] ... val_NF[0]</th><td> Value of each field for first CP</td></tr>
<tr valign="top"><th> ...</th><td></td></tr>
<tr valign="top"><th> val_1[N_CP-1] ... val_NF[N_CP-1]</th><td> Value of each field for last CP</td></tr>
<tr valign="top"><th> [FILAMENTS DATA]</th><td> Marks the beginning of the filaments data section</td></tr>
<tr valign="top"><th> NF</th><td> Number of fields associated to each sampling point of each filament.</td></tr>
<tr valign="top"><th> FIL_DATA_FIELD_NAME_1</th><td> Name of the first field</td></tr>
<tr valign="top"><th> ...</th><td></td></tr>
<tr valign="top"><th> FIL_DATA_FIELD_NAME_NF</th><td> Name of the last field</td></tr>
<tr valign="top"><th> val_1[0][0] ... val_NF[0][0]</th><td style="background:lightblue"> field values for first sampling point, first filament</td></tr>
<tr valign="top"><th> ...</th><td style="background:lightblue"></td></tr>
<tr valign="top"><th> val_1[0][nSamp[0]] ... val_NF[0][nSamp[0]]</th><td style="background:lightblue"> field values for last sampling point, first filament</td></tr>
<tr valign="top"><th style="background:red">.....</th><td style="background:red"></td></tr>
<tr valign="top"><th style="background:red"> .....</th><td style="background:red"> one blue block for each filament.</td></tr>
<tr valign="top"><th style="background:red"> .....</th><td style="background:red"></td></tr>
</table>NDskl formaturn:md5:c09ea460592168c167557156662495152420-05-02T15:01:00+01:002012-05-27T12:55:36+02:00thierry sousbieSkeleton data <p>This is the native binary format of DisPerSE. Functions for reading and writing <em>NDskl</em> format in <em>C</em> can be found within the file <code>${DISPERSE_SRC}/src/C/NDskeleton.c</code> (see functions <em>Load_NDskel</em>, <em>Save_NDskel</em> and also <em>Create_NDskel</em>). In this format, the arcs of the Morse-Smale complex are described as arrays of nodes and segments with data associated to each of them. Each node contains information on critical points (which may also be bifurcations points or trimmed extremities of filaments). Each segment contains information on the local geometry of the arcs and global properties of the skeleton.
<br />
<br />
When using the C functions from Disperse, data is loaded into the following <em>C</em> structure which is close to the actual structure of the file (see file <code>${DISPERSE_SRC}/src/C/NDskeleton.h</code>):</p>
<pre>struct NDskl_seg_str {
int nodes[2]; // index of the nodes at the extremity of the arc. Segment is oriented from nodes[0] toward nodes[1]
float *pos; // points to appropriate location in segpos
int flags; // non null if on boundary
int index; // index of the segment in the Seg array
double *data; // points to the nsegdata supplementary data for this segment
struct NDskl_seg_str *Next; // points to next segment in the arc, NULL if extremity (->connects to nodes[1])
struct NDskl_seg_str *Prev; // points to previous segment in the arc, NULL if extremity (->connects to nodes[0])
};
typedef struct NDskl_seg_str NDskl_seg;</pre>
<pre> struct NDskl_node_str {
float *pos; // points to appropriate location in nodepos
int flags; // non null if on boundary
int nnext; // number of arcs connected
int type; // critical index
int index; // index of the node in the Node array
int *nsegs; // number pf segments in each of the the nnext arcs
double *data; // points to the nnodedata supplementary data for this segment
struct NDskl_node_str **Next; // points to the node at the other extremity of each of the nnext arcs
struct NDskl_seg_str **Seg; // points to the first segment in the arcs, starting from current node.
};
typedef struct NDskl_node_str NDskl_node;</pre>
<pre> typedef struct NDskel_str {
char comment[80];
int ndims; // number of dimensions
int *dims; // dimension of the underlying grid, only meaningfull when computed from a regular grid
double *x0; // origin of the bounding box
double *delta; // dimension of the bounding box
int nsegs; // number of segments
int nnodes; // number of nodes
int nsegdata; // number of additional data for segments
int nnodedata; // number of additional data for nodes
char **segdata_info; // name of additional fields for segments
char **nodedata_info; // name of additional fields for nodes
float *segpos; // positions of the extremities of segments (2xndims coords for each segment)
float *nodepos; // positions of the nodes (ndims coords for each segment)
double *segdata; // additional data for segments (nsegs times nsegdata consecutive values)
double *nodedata; // additional data for nodes (nnodes times nnodedata consecutive values)
NDskl_seg *Seg; // segment array (contains all segs)
NDskl_node *Node; // nodes array (contains all nodes)
} NDskel;</pre>
<p><br />
<br />
The <em>NDskl</em> binary format is organized as follows (blocks are delimited by <em>dummy</em> variables indicating the size of the blocks for FORTRAN compatibility, but they are ignored in C):
<br />
<br /></p>
<table style="margin: 1em auto 1em auto"><caption>NDskl binary format</caption><tr valign="top"><td width="10%">field</td><td width="10%">type</td><td width="10%">size</td><td width="65%">comment</td></tr>
<tr valign="top"><td style="background:grey">dummy</td><td style="background:grey">int(4B) </td><td style="background:grey">1</td><td style="background:grey"> for FORTRAN compatibility</td></tr>
<tr valign="top"><td>tag</td><td>char(1B)</td><td>16</td><td>identifies the file type. Value : "NDSKEL"</td></tr>
<tr valign="top"><td style="background:grey">dummy</td><td style="background:grey">int(4B) </td><td style="background:grey">1</td><td style="background:grey"></td></tr>
<tr valign="top"><td style="background:grey">dummy</td><td style="background:grey">int(4B) </td><td style="background:grey">1</td><td style="background:grey"></td></tr>
<tr valign="top"><td>comment</td><td>char(1B)</td><td>80</td><td>a comment on the file (string)</td></tr>
<tr valign="top"><td>ndims</td><td>int(4B)</td><td>1</td><td>number of dimensions</td></tr>
<tr valign="top"><td>dims</td><td>int(4B)</td><td>20</td><td>dimension of underlying grid (0=none, ndims values are read)</td></tr>
<tr valign="top"><td>x0</td><td>double(8B)</td><td>20</td><td>origin of bounding box (ndims first values are meaningful)</td></tr>
<tr valign="top"><td>delta</td><td>double(8B)</td><td>20</td><td>size of bounding box (ndims first values are meaningful)</td></tr>
<tr valign="top"><td>nsegs</td><td>int(4B)</td><td>1</td><td>number of segments</td></tr>
<tr valign="top"><td>nnodes</td><td>int(4B)</td><td>1</td><td>number of nodes</td></tr>
<tr valign="top"><td>nsegdata</td><td>int(4B)</td><td>1</td><td>number of additional data associated to segments.</td></tr>
<tr valign="top"><td>nnodedata</td><td>int(4B)</td><td>1</td><td>number of additional data associated to nodes.</td></tr>
<tr valign="top"><td style="background:grey">dummy</td><td style="background:grey">int(4B) </td><td style="background:grey">1</td><td style="background:grey"></td></tr>
<tr valign="top"><td style="background:grey">dummy</td><td style="background:grey">int(4B) </td><td style="background:grey">1</td><td style="background:grey"> this block is ommited if nsegdata=0</td></tr>
<tr valign="top"><td>seg_data_info</td><td>char(1B)</td><td>20×nsegdata</td><td>name of the segment data field</td></tr>
<tr valign="top"><td style="background:grey">dummy</td><td style="background:grey">int(4B) </td><td style="background:grey">1</td><td style="background:grey"> this block is ommited if nsegdata=0</td></tr>
<tr valign="top"><td style="background:grey">dummy</td><td style="background:grey">int(4B) </td><td style="background:grey">1</td><td style="background:grey"> this block is ommited if nnodedata=0</td></tr>
<tr valign="top"><td>node_data_info</td><td>char(1B)</td><td>20×nnodedata</td><td>name of the node data field</td></tr>
<tr valign="top"><td style="background:grey">dummy</td><td style="background:grey">int(4B) </td><td style="background:grey">1</td><td style="background:grey"> this block is ommited if nnodedata=0</td></tr>
<tr valign="top"><td style="background:grey">dummy</td><td style="background:grey">int(4B) </td><td style="background:grey">1</td><td style="background:grey"></td></tr>
<tr valign="top"><td>segpos</td><td>float(4B)</td><td>2×nsegs×ndims</td><td>coordinates of segment extremities</td></tr>
<tr valign="top"><td style="background:grey">dummy</td><td style="background:grey">int(4B) </td><td style="background:grey">1</td><td style="background:grey"></td></tr>
<tr valign="top"><td style="background:grey">dummy</td><td style="background:grey">int(4B) </td><td style="background:grey">1</td><td style="background:grey"></td></tr>
<tr valign="top"><td>nodepos</td><td>float(4B)</td><td>nnodes×ndims</td><td>coordinates of nodes</td></tr>
<tr valign="top"><td style="background:grey">dummy</td><td style="background:grey">int(4B) </td><td style="background:grey">1</td><td style="background:grey"></td></tr>
<tr valign="top"><td style="background:grey">dummy</td><td style="background:grey">int(4B) </td><td style="background:grey">1</td><td style="background:grey"></td></tr>
<tr valign="top"><td>segdata</td><td>double(8B)</td><td>nsegdata×nsegs</td><td>value of the segments data fields</td></tr>
<tr valign="top"><td style="background:grey">dummy</td><td style="background:grey">int(4B) </td><td style="background:grey">1</td><td style="background:grey"></td></tr>
<tr valign="top"><td style="background:grey">dummy</td><td style="background:grey">int(4B) </td><td style="background:grey">1</td><td style="background:grey"></td></tr>
<tr valign="top"><td>nodedata</td><td>double(8B)</td><td>nnodedata×nnodes</td><td>value of the nodes data fields</td></tr>
<tr valign="top"><td style="background:grey">dummy</td><td style="background:grey">int(4B) </td><td style="background:grey">1</td><td style="background:grey"></td></tr>
<tr valign="top"><td style="background:grey">dummy</td><td style="background:grey">int(4B) </td><td style="background:grey">1</td><td style="background:red"> following block is repeated for each node (×nnodes).</td></tr>
<tr valign="top"><td>pos_index</td><td>int(4B)</td><td>1</td><td>index in the nodepos/nodedata arrays</td></tr>
<tr valign="top"><td>flags</td><td>int(4B)</td><td>1</td><td>flags (identify boundary nodes)</td></tr>
<tr valign="top"><td>nnext</td><td>int(4B)</td><td>1</td><td>number of connected arcs</td></tr>
<tr valign="top"><td>type</td><td>int(4B)</td><td>1</td><td>critical index (ndims+1 for bifurcations / trimmed arc axtremity)</td></tr>
<tr valign="top"><td>index</td><td>int(4B)</td><td>1</td><td>index of this node</td></tr>
<tr valign="top"><td>nsegs</td><td>int(4B)</td><td>nnext</td><td>number of segments in each connected arc</td></tr>
<tr valign="top"><td> * </td><td>*</td><td>*</td><td style="background:red">blue section repeated for each connected arc (×nnext)</td></tr>
<tr valign="top"><td>nextNode</td><td>int(4B)</td><td>1</td><td style="background:lightblue">index of the other node of the arc</td></tr>
<tr valign="top"><td>nextSeg</td><td>int(4B)</td><td>1</td><td style="background:lightblue">index of the first segment on the arc</td></tr>
<tr valign="top"><td style="background:grey">dummy</td><td style="background:grey">int(4B) </td><td style="background:grey">1</td><td style="background:grey"></td></tr>
<tr valign="top"><td style="background:grey">dummy</td><td style="background:grey">int(4B) </td><td style="background:grey">1</td><td style="background:red"> following block is repeated for each segment (×nsegs).</td></tr>
<tr valign="top"><td>pos_index</td><td>int(4B)</td><td>1</td><td>index in the segpos/segdata arrays</td></tr>
<tr valign="top"><td>nodes</td><td>int(4B)</td><td>2</td><td>index of the 2 nodes at the endpoints of the current arc.</td></tr>
<tr valign="top"><td>flags</td><td>int(4B)</td><td>1</td><td>flags (identify boundary nodes)</td></tr>
<tr valign="top"><td>index</td><td>int(4B)</td><td>1</td><td>index of this segment</td></tr>
<tr valign="top"><td>next_seg</td><td>int(4B)</td><td>1</td><td>index of the next segment in the node (-1 if none)</td></tr>
<tr valign="top"><td>prev_seg</td><td>int(4B)</td><td>1</td><td>index of the previous segment in the node (-1 if none)</td></tr>
<tr valign="top"><td style="background:grey">dummy</td><td style="background:grey">int(4B) </td><td style="background:grey">1</td><td style="background:grey"></td></tr>
<tr valign="top"></tr>
</table>Skeleton filesurn:md5:5a11e7d49bef99b40d28c01c537d6cad2420-05-01T06:56:00+01:002012-07-18T11:10:05+02:00thierry sousbieSkeleton data <p>This file type is designed to store the critical points and arcs of the Morse-Smale complex (i.e. one dimensionnal filamentary structures). In skeleton files, the filamentary network is described as lists of nodes representing critical points or bifurcation points if available (see option <em><a href="http://localhost/dotclear/index.php?post/skelconv#breakdown">-breakdown</a></em> of <a href="http://localhost/dotclear/index.php?post/skelconv">skelconv</a>), lists of segments tracing the local geometry of arcs and filaments originating from and leading to nodes and described as lists of segments. The base skeleton format is <a href="http://localhost/dotclear/index.php?post/NDskl-format">NDskl</a> which is used internally, but this format may be converted to several other more or less complex formats of skeleton files adapted to different applications (see option <em><a href="http://localhost/dotclear/index.php?post/skelconv#to">-to</a></em> in program <a href="http://localhost/dotclear/index.php?post/skelconv">skelconv</a>, a list of available formats is displayed when running the program without argument).<br />
<ins>nb</ins>: Within skeleton files, the segments are always oriented in the ascending direction of the arcs, which does *NOT* necessarily mean that the value of the field is necessarily increasing locally ! Indeed, the value is locally allowed to fluctuate within the persistence threshold, so the field value does not have to be strictly increasing locally along an arc.
<br />
<br />
<strong><ins>Available formats</ins></strong>:
<br />
<br /></p>
<ul>
<li>-<strong><a href="http://localhost/dotclear/index.php?post/NDskl-format">NDskl</a></strong> (Read / Write):<br /> This is the format of the skeleton files created with <a href="http://localhost/dotclear/index.php?post/mse">mse</a>. It is a relatively complex binary format that contains all the information on the geometry and connectivity of the arcs of the Morse-Smale complex (i.e. filaments).</li>
</ul>
<p><br /></p>
<ul>
<li>-<strong><a href="http://localhost/dotclear/index.php?post/NDskl_ascii-format">NDskl_ascii</a></strong> (Write only):<br /> This ASCII format contains the same amount of information as <em>NDskl</em> files, but organized in a different way. In particular, filaments are not described as lists of segments but rather each filament is described by an origin node, a destination node, and a set of sampling points.</li>
</ul>
<p><br /></p>
<ul>
<li>-<strong><a href="http://localhost/dotclear/index.php?post/segs_ascii-format">segs_ascii</a></strong> and <strong><a href="http://localhost/dotclear/index.php?post/crits_ascii-format">crits_ascii</a></strong> (Write only):<br /> This is a simplified ASCII file format designed to be easily readable but that only contains a subset of the information available in <em>NDskl</em> files. In particular, <em>segs_ascii</em> files contain a list of individual segments describing the local orientation of the arcs as well as some limited information on the filament they belong to, while <em>crits_ascii</em> contain information on the critical points and bifurcation points only.</li>
</ul>
<p><br /></p>
<ul>
<li>-<strong><a href="http://localhost/dotclear/index.php?post/vtk-formats">vtk</a></strong>, <strong><a href="http://localhost/dotclear/index.php?post/vtk-formats">vtk_ascii</a></strong>, <strong><a href="http://localhost/dotclear/index.php?post/vtk-formats">vtp</a></strong> and <strong><a href="http://localhost/dotclear/index.php?post/vtk-formats">vtp_ascii</a></strong> (Write only):<br /> These formats are binary and ASCII legacy and XML <a href="http://www.vtk.org/">VTK</a> formats that are readable by several 3D visualization tools, such as <a href="https://wci.llnl.gov/codes/visit/">VisIt</a> or <a href="http://www.paraview.org/">ParaView</a> for instance.</li>
</ul>
<p><br /></p>
<ul>
<li>-<strong><a href="http://localhost/dotclear/index.php?post/networks">NDnet</a></strong> (Write only):<br /> Using this format, skeleton files can be converted to <a href="http://localhost/dotclear/index.php?post/networks">unstructured networks</a> (use <em><a href="http://localhost/dotclear/index.php?post/netconv">netconv</a></em> to convert <em>NDnet</em> files to other network formats).</li>
</ul>
<p><br />
<br />
<strong><ins>Additional data</ins></strong>: In addition to the topology and geometry of filamentary structures, more complete formats (i.e. <a href="http://localhost/dotclear/index.php?post/NDskl-format">NDskl</a>, <a href="http://localhost/dotclear/index.php?post/NDskl_ascii-format">NDskl_ascii</a> and all <a href="http://localhost/dotclear/index.php?post/vtk-formats">vtk</a> formats) may store arbitrary additional information associated to filaments and nodes that can be used by <em><a href="http://localhost/dotclear/index.php?post/skelconv">skelconv</a></em> (run <em>skelconv filename.NDskl -info</em> for a list of additional data available in skeleton file <em>filename.NDskl</em>). By default, <a href="http://localhost/dotclear/index.php?post/mse">mse</a> stores the following additional data in skeleton type files:
<br />
<br /></p>
<ul>
<li>-<strong>persistence</strong> / <strong>persistence_ratio</strong> / <strong>persistence_nsigmas</strong> (Nodes only) :<br /> The persistence (expressed as a difference, ratio or in <em>number of sigmas</em>) of the persistence pair containing the corresponding critical point. A negative or null value indicates that the node is not a critical point or that it does not belong to a persistence pair.</li>
</ul>
<p><br /></p>
<ul>
<li>-<strong>persistence_pair</strong> (Nodes only):<br /> The index of the node that corresponds to the other critical point in the persistence pair (indices start at 0). The value is the index of the current node itself when it is not a critical point or it does not belong to a persistence pair.</li>
</ul>
<p><br /><a name="parent"></a></p>
<ul>
<li>-<strong>parent_index</strong> / <strong>parent_log_index</strong> (Nodes only):<br /> For each extrema only (i.e. minima and maxima), the index of the node that corresponds to the other extremum into which it would be merged if its persistence pair was canceled (indices start at 0). This can be used to reconstruct the tree of the hierarchy of maxima and minima. The value is -1 for non extrema critical points. The difference between the two versions is that the second (<em>parent_log_index</em>) is the hierarchy computed from the logarithm of the field. This second version is useful only for discrete point samples whose MS-complex is obtained from the delaunay tessellation computed with <em><a href="http://localhost/dotclear/index.php?post/Usage">delaunay_nD</a></em>. Practically, <em>parent_log_index</em> can be used whenever persistence pairs are cancelled in order of increasing ratio (option <em><a href="http://localhost/dotclear/index.php?post/mse#nsig">-nsig</a></em> in <em>mse</em>), and <em>parent_index</em> whenever persistence pairs are cancelled in order of increasing difference (option <em><a href="http://localhost/dotclear/index.php?post/mse#cut">-cut</a></em> in <em>mse</em>).</li>
</ul>
<p><br /></p>
<ul>
<li>-<strong>field_value</strong> / <strong>log_field_value</strong> (Nodes and Segments) :<br /> The value of the field and it logarithm. For segments, the suffix <em>_p1</em> and <em>_p2</em> is added to indicate which extremity of the segment it corresponds to.</li>
</ul>
<p><br /></p>
<ul>
<li>-<strong>cell</strong> (Nodes and Segments) :<br /> The <em>type</em> and <em>index</em> of the cell corresponding to the node / segment in the initial network (i.e. from which the skeleton was computed). For segments, the suffix <em>_p1</em> and <em>_p2</em> is added to indicate which extremity of the segment it corresponds to. The value is a double precision floating number whose integer part is the index of the cell and decimal part its type. For instance, the 156th vertex (i.e. 0-cell) in the cell complex is represented as 156.0, while the 123th tetrahedron is 123.3. Note that the index of the 0-cell correpond to the index of the pixel / vertices in the original network from which the skeleton was computed.</li>
</ul>
<p><br /></p>
<ul>
<li>-<strong>robustness</strong> / <strong>robustness_ratio</strong> (Nodes and Segments) :<br /> The robustness of the node / segment. Robustness is a local measure of how contrasted the critical point / filament is with respect to its <em>local</em> background, and it is therefore a good way to select only highly contrasted subsets of the filamentary structures (see option <em><a href="http://localhost/dotclear/index.php?post/skelconv#trim">-trimBelow</a></em> in <em><a href="http://localhost/dotclear/index.php?post/skelconv">skelconv</a></em>). Note that robustness, like persistence, is defined as a difference or ratio between the value of the field in two points, so the robustness threshold has the same order of magnitude as the persistence threshold.</li>
</ul>
<p><br /></p>
<ul>
<li>- <strong>type</strong> (Segments only) :<br /> The type of arc the segment belongs to. The value corresponds to the lowest critical index of the two critical points at the extremities of the arc the segments belongs to. For instance, in dimension D, the ridges (filaments) have type <em>D-1</em>.</li>
</ul>