PageSourceSearch

https://docs-vrgeo-version3.netlify.app/assets/js/f4a45e98.fe06b273.js

js docs-vrgeo-version3.netlify.app collected 2026-10-03 10:42:59 UTC 26,452 bytes, 1 lines download raw bytes

1"use strict";(globalThis.webpackChunkvrgs_docs_v_3_1=globalThis.webpackChunkvrgs_docs_v_3_1||[]).push([[28443],{88018(e,t,n){n.r(t),n.d(t,{assets:()=>h,contentTitle:()=>o,default:()=>c,frontMatter:()=>a,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"general/fractures-structure/dfn-validating-against-outcrop","title":"DFN: Validating Against Outcrop","description":"Checking a Discrete Fracture Network against the outcrop it came from \u2014 running the comparison, reading the report, and what to change when an axis fails. Requires the DFN licence feature.","source":"@site/versioned_docs/version-3.4/general/fractures-structure/dfn-validating-against-outcrop.md","sourceDirName":"general/fractures-structure","slug":"/general/fractures-structure/dfn-validating-against-outcrop","permalink":"/docs/general/fractures-structure/dfn-validating-against-outcrop","draft":false,"unlisted":false,"editUrl":"https://github.com/vrgeoscience/vrgs_docs_v3/tree/master/versioned_docs/version-3.4/general/fractures-structure/dfn-validating-against-outcrop.md","tags":[],"version":"3.4","sidebarPosition":6,"frontMatter":{"sidebar_label":"DFN \u2014 Validating Against Outcrop","sidebar_position":6,"metaDescription":"Cut a synthetic DFN with the outcrop mesh your traces were mapped on, compare trace-to-trace, and read the visual validation report.","description":"Checking a Discrete Fracture Network against the outcrop it came from \u2014 running the comparison, reading the report, and what to change when an axis fails. Requires the DFN licence feature."},"sidebar":"docs","previous":{"title":"DFN \u2014 Matching Interpretations","permalink":"/docs/general/fractures-structure/dfn-interpretation-matching"},"next":{"title":"Auto Structural Mapping","permalink":"/docs/auto-structure-mapping"}}');var s=n(74848),i=n(28453);const a={sidebar_label:"DFN \u2014 Validating Against Outcrop",sidebar_position:6,metaDescription:"Cut a synthetic DFN with the outcrop mesh your traces were mapped on, compare trace-to-trace, and read the visual validation report.",description:"Checking a Discrete Fracture Network against the outcrop it came from \u2014 running the comparison, reading the report, and what to change when an axis fails. Requires the DFN licence feature."},o="DFN: Validating Against Outcrop",h={},d=[{value:"Why the comparison has to be done this way",id:"why-the-comparison-has-to-be-done-this-way",level:2},{value:"Running it",id:"running-it",level:2},{value:"Seeing the fractures that matter",id:"seeing-the-fractures-that-matter",level:2},{value:"Reading the report",id:"reading-the-report",level:2},{value:"Verdict strip",id:"verdict-strip",level:3},{value:"Trace length distribution",id:"trace-length-distribution",level:3},{value:"Q-Q plot",id:"q-q-plot",level:3},{value:"Orientation",id:"orientation",level:3},{value:"Intensity",id:"intensity",level:3},{value:"Per-set breakdown",id:"per-set-breakdown",level:3},{value:"What to change when an axis fails",id:"what-to-change-when-an-axis-fails",level:2},{value:"Statistics derived from",id:"statistics-derived-from",level:3},{value:"Truncation at modelled surfaces",id:"truncation-at-modelled-surfaces",level:3},{value:"Censoring",id:"censoring",level:2},{value:"The censoring correction",id:"the-censoring-correction",level:3},{value:"Limitations",id:"limitations",level:2},{value:"See also",id:"see-also",level:2}];function l(e){const t={a:"a",admonition:"admonition",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"dfn-validating-against-outcrop",children:"DFN: Validating Against Outcrop"})}),"\n",(0,s.jsxs)(t.p,{children:["A DFN is only useful if it reproduces the rock. This guide covers the\n",(0,s.jsx)(t.strong,{children:"Score DFN against Selected Traces\u2026"})," command, which cuts your synthetic\nnetwork with the same outcrop surface you mapped on, compares the resulting\ntraces against your interpretation, and writes a visual report you can read \u2014\nor hand to a reviewer."]}),"\n",(0,s.jsxs)(t.p,{children:["If you have not built a DFN from interpreted data yet, read\n",(0,s.jsx)(t.a,{href:"/docs/general/fractures-structure/dfn-interpretation-matching",children:"DFN \u2014 Matching Interpretations"})," first."]}),"\n",(0,s.jsx)(t.h2,{id:"why-the-comparison-has-to-be-done-this-way",children:"Why the comparison has to be done this way"}),"\n",(0,s.jsx)(t.p,{children:"A mapped trace and a synthetic fracture are not the same kind of thing:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["A fracture is a ",(0,s.jsx)(t.strong,{children:"disc in 3D"}),"; a trace is the ",(0,s.jsx)(t.strong,{children:"chord"})," where that disc meets\nthe outcrop. Chords are shorter than diameters, and how much shorter depends\non where the fracture sits relative to the face."]}),"\n",(0,s.jsxs)(t.li,{children:["Most fractures in the model ",(0,s.jsx)(t.strong,{children:"never reach the outcrop at all"}),", so they should\ncontribute nothing to the comparison."]}),"\n",(0,s.jsxs)(t.li,{children:["Traces that run off the edge of the exposure are ",(0,s.jsx)(t.strong,{children:"cut short"}),". Their real\nlength is unknown \u2014 you only know it is ",(0,s.jsx)(t.em,{children:"at least"})," what you mapped."]}),"\n",(0,s.jsxs)(t.li,{children:["A set lying nearly ",(0,s.jsx)(t.strong,{children:"parallel to the face"}
1)," barely shows on it, however\nabundant it is in the rock."]}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["Comparing fracture diameters against trace lengths therefore penalises a model\nthat is completely correct. VRGS instead applies your sampling geometry to the\nmodel: it intersects the network with your mesh, chains the intersection\nsegments into traces, and compares ",(0,s.jsx)(t.strong,{children:"traces against traces"}),". Both sides are\nthen the same measurement, made the same way, on the same surface."]}),"\n",(0,s.jsx)(t.h2,{id:"running-it",children:"Running it"}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:["Ctrl-click three things in the project tree: the ",(0,s.jsx)(t.strong,{children:"DFN"}),", the ",(0,s.jsx)(t.strong,{children:"outcrop\nmesh"}),", and the ",(0,s.jsx)(t.strong,{children:"trace polylines"})," (or the folder containing them)."]}),"\n",(0,s.jsxs)(t.li,{children:["Right-click \u2192 ",(0,s.jsx)(t.strong,{children:"Score DFN against Selected Traces\u2026"}),"."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"The DFN is cut against the mesh, which takes a few seconds to a minute on a\nlarge network \u2014 a progress bar reports it."}),"\n",(0,s.jsxs)(t.p,{children:["You are then asked for a number of ",(0,s.jsx)(t.strong,{children:"realizations"}),". Enter 0 or 1 to score the\nnetwork as it stands. Enter more to run an ensemble: the model is regenerated\nthat many times with different seeds and each realization is cut against the\nsame outcrop, so the report can show the model's own spread rather than one\nseed's result. Cost is linear in the number you give, and the network you are\nlooking at is left untouched \u2014 the ensemble runs on a scratch copy."]}),"\n",(0,s.jsx)(t.p,{children:"When it finishes you get a summary dialog and an SVG report written next to\nyour project and opened in your default viewer."}),"\n",(0,s.jsx)(t.admonition,{title:"Keep the figure",type:"tip",children:(0,s.jsxs)(t.p,{children:["The run also stashes its figure for the session, so\n",(0,s.jsx)(t.strong,{children:"Insert \u2192 Figure \u2192 DFN Validation"})," in an\n",(0,s.jsx)(t.a,{href:"/docs/general/viewing-collaboration/report-view",children:"analysis report"})," picks it up. Do it\nbefore you close the project: unlike a stereonet, this figure cannot be\nrecaptured on demand \u2014 the synthetic sample and the ensemble spread only exist\nwhile the run does."]})}),"\n",(0,s.jsx)(t.admonition,{type:"note",children:(0,s.jsx)(t.p,{children:"The traces must have been mapped on the mesh you select. Selecting a different\noutcrop compares two things measured in different places, and the numbers will\nbe meaningless even though the command runs."})}),"\n",(0,s.jsx)(t.h2,{id:"seeing-the-fractures-that-matter",children:"Seeing the fractures that matter"}),"\n",(0,s.jsx)(t.p,{children:"Most of a DFN never reaches the outcrop, so most of what you see in 3D could\nnot have produced your interpretation at all. Comparing the whole network\nagainst a mapped face by eye is comparing an interpretation against a cloud\nthat was never going to match it."}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Show Outcrop-Constrained Fractures Only"})," (right-click the DFN) hides\neverything except the fractures that actually cut the mesh \u2014 the ones that\nshould correspond to your mapped traces. The rest of the network is still\nthere; it is only hidden."]}),"\n",(0,s.jsxs)(t.p,{children:["The subset is recorded whenever the DFN is cut against a mesh, by either\n",(0,s.jsx)(t.strong,{children:"Mesh Intersections"})," or the scoring command above, and it comes from the very\ntraces that were produced or scored. So what you inspect by eye is exactly the\npopulation the report's numbers describe."]}),"\n",(0,s.jsx)(t.admonition,{type:"note",children:(0,s.jsx)(t.p,{children:"Regenerating the DFN clears the subset. Fracture identities are reused when a\nnetwork is rebuilt, so a subset kept across a regenerate would name the wrong\nfractures \u2014 while still looking authoritative. Cut against the mesh again after\nregenerating."})}),"\n",(0,s.jsx)(t.p,{children:'If you switch the filter on before ever cutting against a mesh, VRGS says so\nrather than emptying the view. An empty view would read as "the model produces\nnothing at this outcrop", which is the opposite of the truth.'}),"\n",(0,s.jsx)(t.h2,{id:"reading-the-report",children:"Reading the report"}
1),"\n",(0,s.jsx)(t.h3,{id:"verdict-strip",children:"Verdict strip"}),"\n",(0,s.jsxs)(t.p,{children:["Three chips across the top \u2014 length, orientation, intensity \u2014 each green or\nred. They are a summary, not the answer; the panels below say ",(0,s.jsx)(t.em,{children:"why"}),"."]}),"\n",(0,s.jsx)(t.h3,{id:"trace-length-distribution",children:"Trace length distribution"}),"\n",(0,s.jsx)(t.p,{children:"Two cumulative curves on a log-x axis: your mapped traces (solid blue) and the\nsynthetic traces (dashed orange). If the model is right they lie on top of each\nother."}),"\n",(0,s.jsxs)(t.p,{children:["Below the curves: the ",(0,s.jsx)(t.strong,{children:"Kolmogorov-Smirnov D statistic"})," and its ",(0,s.jsx)(t.strong,{children:"p-value"}),"."]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"D"})," is the largest vertical gap between the curves. It measures ",(0,s.jsx)(t.em,{children:"how big"}),"\nthe disagreement is."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"p"})," is the probability of seeing a gap that large if both populations\nreally came from the same distribution. It measures ",(0,s.jsx)(t.em,{children:"whether the\ndisagreement is real"}),"."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Both matter, and neither substitutes for the other. The same D = 0.08 is\nunremarkable with 50 traces and decisive with 5000. VRGS takes the verdict from\np, so a large model is not marked as failing simply because a large sample can\nresolve a trivial difference."}),"\n",(0,s.jsx)(t.admonition,{type:"tip",children:(0,s.jsx)(t.p,{children:'A small p with a small D means "a real but tiny difference" \u2014 usually fine. A\nlarge p with a large D means "not enough data to tell" \u2014 map more traces before\nconcluding anything.'})}),"\n",(0,s.jsx)(t.h3,{id:"q-q-plot",children:"Q-Q plot"}),"\n",(0,s.jsx)(t.p,{children:"Observed quantiles on the x axis, synthetic on the y, with a dashed y = x line."}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"On the line"})," \u2014 the distributions agree across their whole range."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Above the line"})," \u2014 the model generates traces longer than you mapped."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Below the line"})," \u2014 shorter."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Bending away only at the right-hand end"})," \u2014 the two agree on ordinary\nfractures but disagree on the large ones. That is a size-distribution\nproblem: adjust the power-law exponent or the maximum size."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"The Q-Q plot tells you which way to move a parameter. The KS statistic does\nnot \u2014 it only tells you the largest gap."}),"\n",(0,s.jsx)(t.h3,{id:"orientation",children:"Orientation"}),"\n",(0,s.jsx)(t.p,{children:"An equal-area lower-hemisphere stereonet. The synthetic pole density is shaded\nunderneath, your mapped poles are drawn on top as circles."}),"\n",(0,s.jsx)(t.p,{children:"Two numbers are reported:"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Measure"}),(0,s.jsx)(t.th,{children:"Meaning"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Principal axes N\xb0 apart"}),(0,s.jsx)(t.td,{children:"Angle between the two populations' mean axes. Zero is aligned."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Density misfit"}),(0,s.jsx)(t.td,{children:"Difference between the two normalised pole densities, 0 (identical) to 1 (no overlap)."})]})]})]}),"\n",(0,s.jsxs)(t.p,{children:["Both are needed. A mean direction and a concentration cannot distinguish a\ntight cluster from a girdle sharing the same axis; the density misfit can. The\n",(0,s.jsx)(t.strong,{children:"Woodcock K"})," values are also shown: above 1 is a cluster, below 1 a girdle."]}),"\n",(0,s.jsxs)(t.p,{children:["Orientations are treated as ",(0,s.jsx)(t.strong,{children:"axes"})," throughout, so a pole and its opposite are\nthe same plane. This matters most for steep sets, where the two descriptions of\none plane sit at opposite ends of a near-horizontal axis."]}),"\n",(0,s.jsx)(t.h3,{id:"intensity",children:"Intensity"}),"\n",(0,s.jsx)(t.p,{children:"Paired bars for the three intensity measures, observed above and synthetic\nbelow:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"P21"})," \u2014 trace length per unit outcrop area. Measured the same way on both\nsides, from real traces, not converted from P32."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"P10"})," \u2014 traces per unit traverse length."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"P32"}),' \u2014 target against realized. This one is about the generator rather\nthan the outcrop: it answers "did I get the intensity I asked for?",\nindependently of whether that intensity was right.']}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Where an ensemble has been run, a shaded band shows the P5\u2013P95 range across\nrealizations, and the summary says whether your outcrop is an ordinary draw\nfrom the model or falls outside its usual spread."}),"\n",(0,s.jsx)(t.p,{children:"This is the difference between an anecdote and a statement about the model. A\nsingle realization can only tell you what that seed produced; if it happens to\nland 15% low on P21 you cannot tell whether the model is wrong or the seed was\nunlucky. Twenty realizations answer that. Around 20\u201350 is usually enough to\nplace an observation; more mainly sharpens the band's edges."}),"\n",(0,s.jsx)(t.h3,{id:"per-set-breakdown",children:"Per-set breakdown"}),"\n",(0,s.jsx)(t.p,{children:"One row per fracture set plus a pooled total. A network that matches in\naggregate can still have every individual set wrong \u2014 tw
1o sets can be\nindividually mis-oriented in ways that cancel in the pooled statistics."}),"\n",(0,s.jsxs)(t.p,{children:["Each mapped trace is attributed to the set whose mean pole it best matches,\nwithin 30\xb0. ",(0,s.jsx)(t.strong,{children:"Traces matching no set are reported at the bottom of the table,\nnot discarded."})," A large residual is itself the finding: your interpretation\ncontains a fracture set the model does not have."]}),"\n",(0,s.jsx)(t.h2,{id:"what-to-change-when-an-axis-fails",children:"What to change when an axis fails"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Symptom"}),(0,s.jsx)(t.th,{children:"Likely cause"}),(0,s.jsx)(t.th,{children:"What to adjust"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Q-Q bends up at the right"}),(0,s.jsx)(t.td,{children:"Model's large fractures are too large"}),(0,s.jsxs)(t.td,{children:["Lower ",(0,s.jsx)(t.code,{children:"Size Max"}),", or raise the power-law exponent"]})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Q-Q above the line throughout"}),(0,s.jsx)(t.td,{children:"Whole size distribution shifted large"}),(0,s.jsx)(t.td,{children:"Re-derive the size distribution from measurements"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Synthetic curve much steeper"}),(0,s.jsx)(t.td,{children:"Model size range too narrow"}),(0,s.jsxs)(t.td,{children:["Widen ",(0,s.jsx)(t.code,{children:"Size Min"})," / ",(0,s.jsx)(t.code,{children:"Size Max"})]})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Principal axes far apart"}),(0,s.jsx)(t.td,{children:"Mean orientation wrong"}),(0,s.jsx)(t.td,{children:"Re-derive from orientation groups, or check the set assignment"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Density misfit high, axes aligned"}),(0,s.jsx)(t.td,{children:"Fabric shape wrong (cluster vs girdle)"}),(0,s.jsxs)(t.td,{children:["Adjust ",(0,s.jsx)(t.code,{children:"Fisher K"})," \u2014 low K spreads poles into a girdle"]})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"P21 ratio well below 1"}),(0,s.jsx)(t.td,{children:"Model produces too little trace length"}),(0,s.jsx)(t.td,{children:"Raise P32, or check whether a set lies nearly parallel to your face"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Realized/target P32 far from 1"}),(0,s.jsx)(t.td,{children:"Generator not delivering the requested intensity"}),(0,s.jsx)(t.td,{children:"Check the termination rule and spatial model"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Many unassigned traces"}),(0,s.jsx)(t.td,{children:"The model is missing a set"}),(0,s.jsx)(t.td,{children:"Add a fracture set for the unmatched orientations"})]})]})]}),"\n",(0,s.jsx)(t.h3,{id:"statistics-derived-from",children:"Statistics derived from"}),"\n",(0,s.jsxs)(t.p,{children:["Below the per-set table, one line per set names the source behind its P32, size\nand orientation, with the chord model used and an ",(0,s.jsx)(t.em,{children:"[assumed]"})," marker on\nanything that was not a direct measurement."]}),"\n",(0,s.jsx)(t.p,{children:"This is what makes the report reviewable rather than merely impressive. A score\ntells you how well the model matches; it cannot tell you whether the thing it\nmatched was measured or assumed. An excellent match against an intensity that\nwas itself derived from an assumed fracture size is not evidence of anything \u2014\nand without this line there is no way to tell the two apart."}),"\n",(0,s.jsxs)(t.p,{children:["See ",(0,s.jsx)(t.a,{href:"/docs/general/fractures-structure/dfn-interpretation-matching",children:"DFN \u2014 Matching Interpretations \xa74"})," for how\nto choose those sources."]}),"\n",(0,s.jsx)(t.h3,{id:"truncation-at-modelled-surfaces",children:"Truncation at modelled surfaces"}),"\n",(0,s.jsxs)(t.p,{children:["When the DFN has ",(0,s.jsx)(t.a,{href:"/docs/general/fractures-structure/dfn-user-guide#model-surfaces",children:"model surfaces"})," attached,\nthe header states the bounded volume and each surface's coverage, and the per-set\ntable gains two counts: fractures ",(0,s.jsx)(t.strong,{children:"clipped"})," at an upper or lower limit, and\nfractures ",(0,s.jsx)(t.strong,{children:"stopped"})," at an internal barrier."]}),"\n",(0,s.jsxs)(t.p,{children:["These are reported because they change what the size comparison means. A\nbed-confined set is generated from its fitted size distribution and then cut, so\n",(0,s.jsx)(t.strong,{children:"its realised sizes are not the distribution it was given"}),' \u2014 that is the\nintended mechanism, not a fault. But it means a Q-Q plot bending below the line\nis expected for such a set, and reading it as "the size distribution is wrong"\nwould send you to adjust a parameter that is doing exactly what it should.']}),"\n",(0,s.jsx)(t.p,{children:"If the clipped count is high and you did not intend bed confinement, check the\ncoverage figures: a surface spanning only part of the domain constrains only\nthat part, so a set can be confined in one region and free in another."}),"\n",(0,s.jsx)(t.h2,{id:"censoring",children:"Censoring"}),"\n",(0,s.jsxs)(t.p,{children:["Traces that reach the edge of the exposure are ",(0,s.jsx)(t.strong,{children:"right-censored"})," \u2014 their real\nlength is a lower bound. VRGS flags them on both sides: on the synthetic side\nby testing whether a trace ends on a boundary edge of the mesh, on the observed\nside from your mapped geometry. The counts appear in the report footer."]}),"\n",(0,s.jsx)(t.p,{children:"By default all traces are compared, censored or not. That is the honest choice\nhere, because the synthetic side was cut with the same outcrop and is censored\nthe same way \u2014 the bias is present in both populations and largely cancels."}),"\n",(0,s.jsx)(t.p,{children:"Excluding censored traces from both 
1sides is also possible, but it discards\ndata and biases against long fractures, which are precisely the ones most\nlikely to run off the exposure."}),"\n",(0,s.jsx)(t.h3,{id:"the-censoring-correction",children:"The censoring correction"}),"\n",(0,s.jsx)(t.p,{children:"The report footer states what your mapped lengths imply about the rock once\nthe exposure edge is allowed for, for example:"}),"\n",(0,s.jsxs)(t.blockquote,{children:["\n",(0,s.jsx)(t.p,{children:"31 of 180 mapped traces reach the exposure edge. Median mapped length 3.40,\nbut the population they came from has median 4.15 (\xd71.22) once that is\nallowed for."}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:['This comes from a right-censored maximum-likelihood fit: censored traces\ncontribute "the true length is at least this" to the likelihood instead of\n"the true length is this". For the power-law and exponential families that has\na closed form \u2014 the count of ',(0,s.jsx)(t.em,{children:"complete"})," traces over a sum taken across ",(0,s.jsx)(t.em,{children:"all"})," of\nthem \u2014 and both reduce to the ordinary estimator when nothing is censored."]}),"\n",(0,s.jsx)(t.p,{children:"A ratio near 1 means your exposure is large enough that the edge is not\ndistorting what you measured. A ratio well above 1 means it is, and that the\nsize distribution you derive from these traces will be too short unless the\ncorrection is applied."}),"\n",(0,s.jsx)(t.p,{children:"The median is reported rather than the mean because a power law with an\nexponent at or below 2 has no finite mean, and fracture-length exponents\ncommonly sit there."}),"\n",(0,s.jsx)(t.h2,{id:"limitations",children:"Limitations"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["The comparison is only as good as the ",(0,s.jsx)(t.strong,{children:"co-location"})," of your traces and your\nmesh. Traces drawn on a different LOD, or on a mesh since edited, will\ncompare badly for reasons that have nothing to do with the DFN."]}),"\n",(0,s.jsxs)(t.li,{children:["Traces below your ",(0,s.jsx)(t.strong,{children:"mapping resolution"})," were never drawn, so the observed\npopulation is truncated at the small end while the synthetic one is not. If\nthe disagreement is confined to the shortest traces, this is usually why.\nSet a minimum trace length to compare like with like."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"One mesh per run."})," If your outcrop is split across several meshes, merge\nthem first."]}),"\n",(0,s.jsxs)(t.li,{children:["The report is a ",(0,s.jsx)(t.strong,{children:"snapshot"}),". It is not saved with the project; re-run it\nafter regenerating the DFN. The composite scores in the property bar are\ncleared automatically when the network changes. To keep a copy, insert the\nfigure into an ",(0,s.jsx)(t.a,{href:"/docs/general/viewing-collaboration/report-view",children:"analysis report"}),"\nbefore the project closes."]}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"see-also",children:"See also"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.a,{href:"/docs/general/fractures-structure/dfn-interpretation-matching",children:"DFN \u2014 Matching Interpretations"})," \u2014 building a\nDFN whose statistics come from interpreted data."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.a,{href:"/docs/general/fractures-structure/dfn-user-guide",children:"DFN User Guide"})," \u2014 generation, visualisation,\nintersections, attributes and analysis."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.a,{href:"/docs/general/fractures-structure/fracture-intensity-mapping",children:"Fracture Intensity Mapping"})," \u2014 P21 / P32\ncomputed per mesh vertex from mapped traces."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.a,{href:"/docs/general/viewing-collaboration/report-view",children:"Analysis Reports"})," \u2014 collecting this\nfigure and its numbers into a document you can send."]}),"\n"]})]})}function c(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},28453(e,t,n){n.d(t,{R:()=>a,x:()=>o});var r=n(96540);const s={},i=r.createContext(s);function a(e){const t=r.useContext(i);return r.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.