Throughout the previous articles I have made various references to the CPI Config. This article will review the CPI config itself with an emphasis on actual examples.

When editing your CPI config I recommend using Notepad++, a free text editor that has style formatting available for several programming languages. Our syntax is based on YAML, so in order for Notepad++ to properly highlight the syntax, save your file as a .yaml. However, this doesn’t really matter as we’ll copy and paste in the equations we need.

What is the CPI Config?

The CPI Config is what houses all the equations, parameters, methods, well log tracks, and modules that are shipped with Petrophysics Insights. The CPI Config can be modified so that you can add new equations, parameters or even entire modules to your workspace. This is the easiest way to integrate proprietary or non-standard methods into your workflow.

CPI Config Structure

The CPI configuration is split into a number of files, each associated with a module or some other base functionality. You can reach the CPI Config by clicking on your email address located in the upper right-hand corner of the window and selecting “CPI Config” from the menu.

The CPI Config is shown below.


In addition to the base CPI Config, there is an “Overrides” tab. This is where you can make modifications to the CPI Config and extend it. To submit overrides, simply copy and paste them into the overrides window and click on the button “Submit custom overrides”.

To best understand how to construct a CPI Config we will walk several examples and attempt to explain them in sufficient detail so that you can start constructing your own CPI Config overrides to extend and customize Danomics to your needs.

Parameters

Parameters are the building blocks of the CPI Config. They are, of course, used in the equations, but are also what form the basis of what is displayed in the parameter tables (that are called in the modules later on).

To understand how to construct parameters we will use a real example from the Danomics’ Vclay Module.

First, remember that spacing (indentation) matters. You need to appropriately align the key words, place a colon after them, and then a space after the colon.

Comments lines are not read and are started with a hashtag(#). Note that some lines on here are wrapped (e.g., the tooltips). This is purely for display convenience purposes and differences between the screen width available on this page vs. that available elsewhere.

To start the parameters section you must at the start of the section call the “param:” key word once. This let’s the CPI Config know you are just entering parameters until you call another section (like “equation:” or “track:”, as shown later).

The word “key” designates the parameter name that is used in coding, while the key word “name” is the display name. The parameter “key” must be unique from other parameters and curve names.

The “type” key word is optional and can be used to specify is a parameter is a DROPDOWN or CHECKBOX type of parameter.

The “byFormation” keyword means that, if true, you will see a parameter entry box for every zone in a well, while if false, means you will only see it once for the whole well. This is useful for things like the surface temperature, which is zone independent.

There are options for “boolDefault”, “stringDefault”, and “floatDefault”, which designate what type of parameter it is and what the default value displayed in the parameter entry table will be. “boolDefault” is useful for the CHECKBOX type, “stringDefault” is useful for the DROPDOWN type, and “floatDefault” is best suited for parameters that are values.

The optional “advanced” key word is used to determine if the parameter shows up only under the Advanced parameters tab (advanced: true) or if it is visible in both basic/advanced views (advanced: false).

The optional “visibleIf” key word can be used to set conditions on if a parameter is shown. In the example below, we only show the gr_clean and gr_clay parameters if the use_vcl_gr parameter is true.

The “option” key word is used for DROPDOWN menus, and is used to populate the dropdown selection menu. The “key” in these should correspond to your equation name options (see equations section) and the “name” can be whatever you want. Only the “name” will be displayed.

The optional “tooltip” key word is used to provide a description of the parameter. Note that for long comments, if you want to put in a carriage return you’ll need to type in \n as an escape character. Tooltips are incredibly useful when you are writing CPI Config files for other users are they can provide clarity of intent.

param:
#These are the parameters for the Clay Volume Module
  #Vclay from GR parameters
  - key: use_vcl_gr
    name: Use GR
    type: CHECKBOX
    byFormation: true
    boolDefault: true
    advanced: true
    tooltip: "Check to use a Vclay from Gamma Ray methodology."
    
  - key: vcl_gr_method
    name: GR Method
    type: DROPDOWN
    byFormation: true
    stringDefault: vcl_gr_basic
    advanced: true
    tooltip: "Select the desired Gamma Ray methodology."
    visibleIf: "use_vcl_gr"
    option:
      - key: vcl_gr_basic
        name: GR Clay
      - key: vcl_gr_ly
        name: GR Clay (Larionov Young)
      - key: vcl_gr_lo
        name: GR Clay (Larionov Old)
      - key: vcl_gr_clavier
        name: GR Clay (Clavier)
      - key: vcl_gr_steiber
        name: GR Clay (Steiber)

  - key: gr_clean
    name: GR Clean
    byFormation: true
    floatDefault: 20
    advanced: false
    tooltip: "Gamma Ray value for a clean reservoir interval.\nValue is remapped from key well to other wells.\nParameter can be adjusted via dragging and dropping the black line in the GR track."
    visibleIf: "use_vcl_gr"
    
  - key: gr_clay
    name: GR Clay
    byFormation: true
    floatDefault: 100
    advanced: false
    tooltip: "Gamma Ray value for a shale interval.\nValue is remapped from key well to other wells.\nParameter can be adjusted via dragging and dropping the green line in the GR track."
    visibleIf: "use_vcl_gr"

  #Vclay from SP parameters
  - key: use_vcl_sp
    name: Use SP
    type: CHECKBOX
    byFormation: true
    boolDefault: true
    advanced: true
    tooltip: "Check to use a Vclay from SP methodology."
  
  - key: sp_clean
    name: SP Clean
    byFormation: true
    floatDefault: -80
    advanced: true
    tooltip: "SP value for a clean reservoir interval.\nValue is remapped from key well to other wells.\nParameter can be adjusted via dragging and dropping the black line in the SP track."
    visibleIf: "use_vcl_sp"
    
  - key: sp_clay
    name: SP Clay
    byFormation: true
    floatDefault: 2
    advanced: true
    tooltip: "SP value for a shale interval.\nValue is remapped from key well to other wells.\nParameter can be adjusted via dragging and dropping the blue line in the SP track."
    visibleIf: "use_vcl_sp"

        
  #Vclay from N-D parameters  
  - key: use_vcl_nd
    name: Use ND
    type: CHECKBOX
    byFormation: true
    boolDefault: true
    advanced: true
    tooltip: "Check to use a Vclay from Neutron-Density methodology."
    
  - key: nphi_clean1
    name: NPHI Matrix
    byFormation: true
    floatDefault: -0.02
    advanced: false
    tooltip: "Neutron value for the clean line endpoint at zero porosity.\nValue is remapped from key well to other wells."
    visibleIf: "use_vcl_nd"
    
  - key: nphi_clean2
    name: NPHI Clean2
    byFormation: true
    floatDefault: 0.36 
    advanced: true
    visibleIf: "use_vcl_nd"
    tooltip: "Neutron value for the reservoir matrix lithology at high porosity."
    
  - key: rhob_clean1
    name: RHOB Matrix
    byFormation: true
    floatDefault: 2.65
    advanced: false
    visibleIf: "isoneof(porosity_method, den_porosity, nd_porosity, pecking_porosity) || use_vcl_nd"
    tooltip: "Bulk Density value for the reservoir matrix lithology.\nValue is remapped from key well to other wells."
    
  - key: rhob_clean2
    name: RHOB Clean2
    byFormation: true
    floatDefault: 2.0 
    advanced: true
    visibleIf: "use_vcl_nd"
    tooltip: "Bulk Density value for the clean line end-point at high porosity."
 
  - key: nphi_clay
    name: NPHI Clay
    byFormation: true
    floatDefault: 0.40
    advanced: true
    visibleIf: "use_vcl_nd"
    tooltip: "Neutron value for the clay end-point."
    
  - key: rhob_clay
    name: RHOB Clay
    byFormation: true
    floatDefault: 2.55
    advanced: true
    visibleIf: "use_vcl_nd"
    tooltip: "Bulk Density value for the clay end-point."

If you are receiving an error upon submitting your CPI Config override, check the indentation and spacing. If you are experiencing unexpected behavior, check the “visibleIf” key word – it is often easy to forget that you may need to call a parameter under multiple different scenarios, and its visibility may be hidden by the selection of a different parameter option in a previous module.

Equations

Syntax, Operators & Functions

Within the CPI Config best practice dictates that we differentiate between curve names and parameter names. Curve names are designated with the “@” symbol; for example, “@gr” means that you are using the Gamma Ray curve. Parameter names are designated with the “$” symbol; for example the “$gr_clean” and “$gr_clay” are for the GR Clean and GR Clay parameters for the Vclay from Gamma Ray methodology.

The following mathematical operators are available:

Operators & LogicalsDescription
+Addition
Subtraction
/Division
*Multiplication
^Exponent
<Less than
>Greater than
<=Less than or equal to
>=Greater than or equal to
==Equal to
!=Not equal to
! Is not; logical for curves
&&And
||Or

In addition to the mathematical operators and logicals listed above, Danomics has a series of functions available for use, as outlined in the table below.

FunctionDescription
abs(arg)Returns the absolute value of arg
min(arg1, arg2)Returns the lower value of arg1 and arg2
max(arg1, arg2)Returns the higher value of arg1 and arg2
clamp(arg1, arg2, arg3)Returns arg1 if arg2 < arg1 < arg3
if arg1 < arg2, returns arg2
if arg1 > arg3, returns arg3
isnan(arg)Returns True if arg is NaN,
otherwise returns False
ifelse(arg1, arg2, arg3)Evaluates if arg1 is True/False
If True returns arg2
If False returns arg3
linterp(arg1, arg2, arg3,
arg4, arg5)
Performs a linear interpolation.
arg1 is the curve value to interpolate
arg2 is the low reference value for arg1
arg3 is the low value to interpolate against
arg4 is the high reference value for arg1
arg5 is the high value to interpolate
against
percentile(arg1, arg2)Returns the value corresponding to the
percentile (arg1) of the curve (arg2)
keywell(arg)Returns the value corresponding to the
arg performed on the keywell
lookup(arg)arg should be an equation name. Returns
value of referenced equation.
log10(arg)Returns log base 10 of arg
log(arg)Returns natural log of arg
eEuler’s number, base of natural log
contiguous(arg)Returns the value of number the number
of continuous samples of arg. Arg should
be a curve that is 0 or 1.
masked_op(arg1, arg2,
arg3)
Returns the mask of arg1 (boolean), with
conditions (arg2) for a funciton (arg3)
sum(arg)Returns the sum of the arg
cumsum(arg)Returns the cumulative sum of the arg
maxsample(arg)Returns the maximum sample of arg
lowp(arg1, arg2)Returns low pass filter of curve arg1 that smooths based on number of steps set out in arg2.
average(arg) Returns the average of the arg
byformation(arg)Performs the arg on a zonal basis, defined
by the formation tops. Usually combined
with sum(), cumsum(), or percentile()
bystatswindow(arg)Performs the arg within the depth ranges
of the Statistics Window. Usually
combined with percentile()

Continuing with our example from the parameters section, here is the associated code from the Vclay module. First, note that lines that start with a hashtag (#) are comments only. Second, note that spacing matters… you need to keep proper alignment. Finally, note that many of these equations are made more complicated than they normally would be because we have added in extra functionality and sense checks.

When you start an equation, you need to designate the “key”. The key is what the resulting curve name will be. So, vcl_nd is the Vclay curve from neutron-density.

The expression is the equation itself. Paremeters are prefixed with a “$” and curves are prefixed with an “@”.

We optionally can specify the “units” and the “description”. Both of these will be included in the LAS output if exported, so it is best practice to include them.

In the Vclay from Gamma Ray seciton note that we use an expression that says “ifelse($use_vcl_gr, lookup(vcl_gr_method), null)”. This example shows how selections from dropdowns selection menus are handled as well as booleans. The first argument in the ifelse() statement is the $use_vcl_gr; if it the box is checked, it is True and second argument is executed. The second argument “lookup(vcl_gr_method)” basically asks, “What is was the selected method?” It then uses that method for the curve value for that zone. The final argument “null” is what will be written to the curve if you don’t check the checkbox for $use_vcl_gr.

The “lookup()” function is important to understand if you want to create custom menus. The options in your dropdown menu must correspond to the equation names you have available – this is how they are linked to one another.

The order of operations is maintained and equations execute from left to right. Equations can be in any order in the file. For example, even though effective porosity is derived from total porosity, you can put the equations anywhere in the “equations” section.

equation:
# Equations for Vclay calculation module 
  #Vclay from Neutron-Density
  - key: vcl_nd
    expression: ifelse($use_vcl_nd, ifelse(@badhole==1, null, clamp((($rhob_clean2 - $rhob_clean1) * (@neutron_final - $nphi_clean1) - (@density - $rhob_clean1) * ($nphi_clean2 - $nphi_clean1)) / (($rhob_clean2 - $rhob_clean1) * ($nphi_clay - $nphi_clean1) - ($rhob_clay - $rhob_clean1) * ($nphi_clean2 - $nphi_clean1)), 0, 1)), null)
    units: .dec
    description: ND Clay Volume
    
  #Vclay from Gamma Ray
  - key: vcl_gr
    expression: ifelse($use_vcl_gr, lookup(vcl_gr_method), null)
    units: .dec
    description: GR Clay Volume
  - { key: vcl_gr_basic,   expression: "clamp(               (@gr_final - $gr_clean) / ($gr_clay - $gr_clean)     ,0,1)" }
  - { key: vcl_gr_ly,      expression: "clamp(0.083*(2^(3.7*((@gr_final - $gr_clean) / ($gr_clay - $gr_clean)))-1),0,1)" }
  - { key: vcl_gr_lo,      expression: "clamp(0.33*(2^(2*((@gr_final - $gr_clean) / ($gr_clay - $gr_clean)))-1),0,1)" }
  - { key: vcl_gr_clavier, expression: "clamp(1.7-(3.38-(((@gr_final - $gr_clean) / ($gr_clay - $gr_clean))+0.7)^2)^0.5,0,1)" }
  - { key: vcl_gr_steiber, expression: "clamp(0.5*((@gr_final - $gr_clean) / ($gr_clay - $gr_clean))/(1.5-((@gr_final - $gr_clean) / ($gr_clay - $gr_clean))),0,1)" }
 
 
  #Vclay from SP  
  - key: vcl_sp
    expression: ifelse($use_vcl_sp, clamp((@sp_final - $sp_clean)/($sp_clay - $sp_clean),0,1), null)    
    units: .dec
    description: SP Clay Volume
    
  #VWCL output curve using the minimum of the selected methods.
  - key: vwcl
    expression: clamp(min(ifelse(isnan(@vcl_gr),9999, @vcl_gr), min(ifelse(isnan(@vcl_sp),9999, @vcl_sp), ifelse(isnan(@vcl_nd),9999, @vcl_nd))), 0, 1)
    units: .dec
    description: Clay Volume
    #9999 is just a placeholder value to handle NaN values

Finally, just for completeness, let’s look at the example of the Vclay from SP. the equation itself is just:

(@sp_final - $sp_clean)/($sp_clay - $sp_clean)

However, since clay volume can be between zero and one (i.e., you can’t have less than 0% clay, nor more than 100%), we wrap the formula in clamp() to force that. This makes the equation:

clamp((@sp_final - $sp_clean)/($sp_clay - $sp_clean),0,1)

Finally, we only want Vcl_sp to have a value if we click on the $use_vcl_sp checkbox, so we wrap the above equation in an ifelse() function. This gives us:

ifelse($use_vcl_sp, clamp((@sp_final - $sp_clean)/($sp_clay - $sp_clean),0,1), null) 

This final statement, in plain English says, “If $use_vcl_sp is true, then calculate a Vclay from SP, but clamp it to be between 0 and 1. If the $use_vcl_sp is false, make the value a null).

In general, building up equations this way is quite a good way to increase sophistication while making sure that you understand how it is executing.

Tip: If you get an error and don’t know why, check your parentheses and consider wrapping the whole equation in parentheses.

Finally, always make sure to test your equations by looking at the results and making sure changes in the parameters and curve change the result in a way that makes sense.

Named Defaults

Named Defaults allow you to use “presets” such as the Lithology Preset in the Clay Volume and Porosity Modules. Named Defaults can contain as many or few parameters as the user desires. Below is the actual example of the sandstone and limestone presets.

namedDefaults:
  - key: sandstone_lithology
    value:
    - {param: use_vcl_gr, boolDefault: true}
    - {param: vcl_gr_method, stringDefault: vcl_gr_basic}
    - {param: use_vcl_sp, boolDefault: false}
    - {param: use_vcl_nd, boolDefault: true}
    - {param: porosity_method, stringDefault: nd_porosity}
    - {param: use_substitute, boolDefault: true}
    - {param: use_toc_correction, boolDefault: false}
    - {param: gr_clean, floatDefault: 20}
    - {param: gr_clay, floatDefault: 110}
    - {param: rhob_clean1, floatDefault: 2.65}
    - {param: nphi_clean1, floatDefault: -0.02}
    - {param: dt_matrix, floatDefault: 56}
    - {param: dt_shale, floatDefault: 140}
    - {param: rhob_clean2, floatDefault: 1.95}
    - {param: nphi_clean2, floatDefault: 0.38}
    - {param: rhob_clay, floatDefault: 2.55}
    - {param: nphi_clay, floatDefault: 0.40}
    - {param: rho_fluid, floatDefault: 1.00}
    - {param: dt_water, floatDefault: 189}
    - {param: phi_shale, floatDefault: 0.30}
    - {param: phi_max, floatDefault: 0.30}
    - {param: ktoc, floatDefault: 0.80}
    - {param: dens_kerogen, floatDefault: 1.26}
    - {param: phin_kerogen, floatDefault: 0.65}
    - {param: phid_kerogen, floatDefault: 0.84}
    - {param: phis_kergoen, floatDefault: 0.65}
    - {param: saturation_method, stringDefault: archie}
       
  - key: limestone_lithology
    value:
    - {param: use_vcl_gr, boolDefault: true}
    - {param: vcl_gr_method, stringDefault: vcl_gr_basic}
    - {param: use_vcl_sp, boolDefault: false}
    - {param: use_vcl_nd, boolDefault: true}
    - {param: porosity_method, stringDefault: nd_porosity}
    - {param: use_substitute, boolDefault: true}
    - {param: use_toc_correction, boolDefault: false}
    - {param: gr_clean, floatDefault: 10}
    - {param: gr_clay, floatDefault: 110}
    - {param: rhob_clean1, floatDefault: 2.71}
    - {param: nphi_clean1, floatDefault: 0.00}
    - {param: dt_matrix, floatDefault: 49}
    - {param: dt_shale, floatDefault: 140}
    - {param: rhob_clean2, floatDefault: 2.02}
    - {param: nphi_clean2, floatDefault: 0.40}
    - {param: rhob_clay, floatDefault: 2.55}
    - {param: nphi_clay, floatDefault: 0.40}
    - {param: rho_fluid, floatDefault: 1.00}
    - {param: dt_water, floatDefault: 189}
    - {param: phi_shale, floatDefault: 0.30}
    - {param: phi_max, floatDefault: 0.30}
    - {param: ktoc, floatDefault: 0.80}
    - {param: dens_kerogen, floatDefault: 1.26}
    - {param: phin_kerogen, floatDefault: 0.65}
    - {param: phid_kerogen, floatDefault: 0.84}
    - {param: phis_kergoen, floatDefault: 0.65}
    - {param: saturation_method, stringDefault: archie} 

Exports

The exports sections sets what log curves and what petrophysical properties are exported by default, as well as what maps are generated by default. The code is structured as shown below.

export:
  defaultExportCurve: [ vwcl, phit, phie, sw, net_res, net_pay]
  formationSummaryCurve: [ gross_res_summary, net_res_summary, 
                           net_pay_summary]

The defaultExportCurve is to set the curves that are written during an LAS export without the need for additional selection. The formationSummaryCurve determines what properties are mapped and what properties are exported as part of the CPI export.

Note: For results in the formationSummaryCurve the values need to be single values on a per zone or per well basis. That is, to export @net_pay you should, for example, use byformation(sum(@net_pay*$step)).

Tracks, Modules, and Module Tracks

The example below is Danomics’ actual “Clay Volume” well log display panel. The track section is initiated by calling the keyword “track”. This is only done once. Afterwards, each individual well log track will start with the “key”, which is the unique string for that track.

Every track starts with a “track” designation and requires a “type” of LOG_GRAPH. You can optionally specify the “width”. If it is a raw curve you specify it with “curve” or if it is computed you need to specify it with “computedCurve”.

For axis, xmin is always the lefthand value and xmax is always the righthand value. You can specify if it is logarithmic.

Shading (fill) can be done from constant to curve, curve to constant, or curve to curve.

There is no limit to the number of curves/fills you can have per track, but for pragmatism we recommend no more than five at most.

To drag and drop parameters, you need to display the “paramMarker” on the track.

The color of the curve is set by “stroke”. Stroke can be left blank, which is particularly useful when trying to display blocked values such as pay or reservoir flags.

We strongly recommend that you start with an existing plot and modify it to meet your needs until you are comfortable with the syntax for building plots from scratch. However, once you understand the process, creating new plots and combining it with associated equations and parameters means you can significantly extend the software in a few minutes.

track:
  - key: gr_markers
    type: LOG_GRAPH
    width: 100
    curve:
      - key: gr_final
        name: Gamma Ray
        xmin: 0
        xmax: 200
        numTicks: 5
        stroke: green
        paramMarker:
          - param: gr_clean
            stroke: black
          - param: gr_clay
            stroke: green
    fill:
      - left: { constant: 80 }
        right: { curve: gr_final }
        color: "#808080"

  - key: sp_final
    type: LOG_GRAPH
    width: 100
    curve:
      - key: sp_final
        name: SP
        xmin: -125
        xmax: 125
        numTicks: 5
        stroke: blue
        paramMarker:
          - param: sp_clean
            stroke: black
          - param: sp_clay
            stroke: blue

  - key: neutron_density_narrow
    type: LOG_GRAPH
    width: 100
    curve:
      - { key: density_final, name: "Density", xmin: 1.95, xmax: 2.95, stroke: red }
      - { key: neutron_final, name: "Neutron", xmin: 0.45, xmax: -0.15, stroke: green }
    fill:
      - left: { curve: density_final }
        right: { curve: neutron_final }
        color: "#ffe066"
      - left: { curve: neutron_final }
        right: { curve: density_final }
        color: "#808080"

  - key: vcl_gr_nd
    type: LOG_GRAPH
    width: 150
    curve:
      - { key: vcl_gr, name: "Vclay (GR)", xmin: 0, xmax: 1, stroke: green }
      - { key: vcl_nd, name: "Vclay (ND)", xmin: 0, xmax: 1, stroke: red }

  - key: vcl_gr_sp
    type: LOG_GRAPH
    width: 150
    curve:
      - { key: vcl_gr, name: "Vclay (GR)", xmin: 0, xmax: 1, stroke: green }
      - { key: vcl_sp, name: "Vclay (SP)", xmin: 0, xmax: 1, stroke: blue }

  - key: vwcl_wide
    type: LOG_GRAPH
    width: 150
    curve:
      - { key: vwcl, name: "Vclay (Final)", xmin: 0, xmax: 1, stroke: black }

Now that we have defined the parameters and tracks we can define our module and module tracks as follows:

module:
  - key: vclay
    name: Clay Volume
    param:
      - lithology_nameddefaults
      - use_vcl_gr
      - vcl_gr_method
      - gr_clean
      - gr_clay
      - use_vcl_nd
      - rhob_clean1
      - nphi_clean1
      - rhob_clean2
      - nphi_clean2
      - rhob_clay
      - nphi_clay
      - use_vcl_sp
      - sp_clean
      - sp_clay

moduleTracks:
  - key: vclay
    track:
      - gr_markers
      - depth_40
      - sp_final
      - neutron_density_narrow
      - vcl_gr_nd
      - vcl_gr_sp
      - vwcl_wide

In the above, the “module” key word is what allows you to name the module and specify, in order, what parameters will be visible in the parameter entry window. The “moduleTracks” key word allows you to specify what tracks will be visible in the well log panel.

X-section Templates

Cross-section aliases are essentially the same as plot templates, except that you use a different designation to specify that they belong to the cross-section. The example below shows the default GR-Resistivity template. Note that it is calling tracks that have been built in a manner similar to those shown above.

crossSection:
  - key: gr_res
    name: GR-Resistivity
    track: [xs__gr, xs__depth_30, xs__res]
            color: "red" 

Curve Aliases

The curve aliases section is to designate curve alias names. The section is structured as shown below:

aliasedCurve:
  - key: cali
    alias: [acal, c1, c13, c13a, c13h, c13i, c13l, c13m, c13p, c13z]
            
  - key: drho
    alias: [dc, dcor_n, dcor, decr, drh, drho, hbdc, hdra, hdrh]

You can have as many aliases as desired. The curve alias names should be distinct from curve names used in equations.

Note: In the example above we are showing a significantly truncated list for our actual aliases. You can wrap these onto multiple lines.

Hints & Tips

  • Spacing matters. You need to properly align your keys and keywords.
  • The structure follows YAML standards. When in doubt, take a look at https://yaml.org.
  • You have access to the default CPI Config when you subscribe to Danomics. Use it as a guide for extending the parameters, equations, and plots.
  • Use an editor like Notepad++ that supports syntax highlighting – this will make life much easier!
  • If you get hopelessly lost, just delete and reset your project to the default CPI Config with no overrides.
  • Most error messages you get will likely be due to typos, minor syntax errors, or spacing – just carefully re-read your code in your editor to find out what went wrong.
  • Make sure to test our code – if you make a new plot, inspect it closely to make sure that everything is showing up as planned. Test your equations for commonsense. Make sure that results are moving in the direction you expect when you change parameters.
  • At Danomics, we pride ourselves on customer service, so if you have any questions or you want help, just let us know and we’ll be happy to help you set up custom templates, equations, etc.
  • Remember that after you submit your code you should save your project then refresh the page (using the refresh button in the browser or ctrl + r). Remember to SAVE YOUR WORK before doing this!