# Adding CDC growth reference standards to the O3 Growth Chart

**URL:** <https://talk.openmrs.org/t/adding-cdc-growth-reference-standards-to-the-o3-growth-chart/49833>\
**Category:** Community\
**Tags:** developers-forum\
**Created:** [July 25, 2026, 4:56pm UTC](https://talk.openmrs.org/t/adding-cdc-growth-reference-standards-to-the-o3-growth-chart/49833 "2026-07-25T16:56:19Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![sudeshkar](https://talk.openmrs.org/user_avatar/talk.openmrs.org/sudeshkar/32/22138_2.png) [@sudeshkar](https://talk.openmrs.org/u/sudeshkar)\
**Post date:** [July 25, 2026, 4:56pm UTC](https://talk.openmrs.org/t/adding-cdc-growth-reference-standards-to-the-o3-growth-chart/49833/1 "2026-07-25T16:56:19Z")

</div>

Hi Everyone,

I’ve been reading through `openmrs-esm-patient-growth-chart-app` and running it locally, and I’d like to propose adding CDC growth references alongside the existing WHO ones. Before writing any code I wanted to check the approach with people who know this module better than I do.

**\*\*Where things stand.\*\*** The module ships WHO weight-for-age for birth to five years and renders it well. Patients over five hit an empty state. The README already lists CDC as in scope, so this is filling in something that was planned rather than proposing a new direction.

**\*\*What I found while working out where a second dataset would go.\*\*** Most of the chart is shaped around there being exactly one — the percentile list, the colour map, the axis ticks, the chart title and the age cutoff are all literals in `growth-chart.utils.ts` and `growth-chart.component.tsx`. That’s a completely reasonable way to ship a first vertical slice, but it means adding CDC is mostly a de-hardcoding job rather than a data drop.

One thing genuinely blocks the simple approach: **\*\*CDC publishes no 15th or 85th percentile for weight-for-age.\*\*** Those columns exist only in the BMI-for-age and weight-for-stature tables. CDC’s chart uses 3/5/10/25/50/75/90/95/97 where WHO’s uses 3/15/50/85/97 — that’s what each body’s printed chart actually shows. So the curve set has to become a property of the dataset rather than a global constant. WHO’s chart then stays exactly as it is today, and CDC draws its own.

CDC also splits weight-for-age across two files (birth–36 months, and 2–20 years) that overlap. I’m proposing the 24-month switch point CDC’s own SAS program uses, implemented in a committed generator script so the data is reproducible rather than hand-converted.

**\*\*The payoff\*\*** is that five- to twenty-year-olds get a real chart instead of an empty state, since CDC weight-for-age runs to 20 years.

I’ve written the detail up properly — investigation notes with file references, the proposed refactor with before/after code, requirements, test plan, and a two-PR delivery plan:

PROPOSAL LINK ([CDC-Growth-Chart-Proposal - Google Docs](https://docs.google.com/document/d/1oQEWajaGuhPe045Y8E7A2ta5iXHkU7UcwZy7QnURrY8/edit?usp=sharing))

A few things I’d genuinely like input on before I start:

1. Should WHO remain the default standard for all deployments, or should that be per-distro?

2. Nine CDC curves as published, or subset to five for visual parity with the WHO chart?

3. Would you rather extend WHO to its 5–19 reference than add CDC? Its weight-for-age component stops at 10 years, which is what led me to CDC — but that’s a deployment-context call, not a technical one.

4. Is turning the over-five empty state into a chart acceptable as default behaviour, or should it sit behind config for a release?

One unrelated thing I ran into and mention in the proposal: the stylesheet’s line-styling rules use the Carbon v10 `bx–` prefix, but `@carbon/charts@1.27.3` only emits `cds–`, so the dashed reference curves and the bold patient line never actually apply. Happy to send that up as a small separate fix first if that’s easier to review.

I’m flexible on scope and happy to split this differently, or set it aside if it isn’t a priority right now. I’ll file a Jira ticket once there’s rough agreement on direction.

Thanks!@lumuchris256 @anjisvj @grace @jayasanka @dilankavishka

---

<div class="post-metadata">

**Author:** ![dilankavishka](https://talk.openmrs.org/user_avatar/talk.openmrs.org/dilankavishka/32/20475_2.png) [@dilankavishka](https://talk.openmrs.org/u/dilankavishka)\
**Post date:** [July 28, 2026, 1:49pm UTC](https://talk.openmrs.org/t/adding-cdc-growth-reference-standards-to-the-o3-growth-chart/49833/2 "2026-07-28T13:49:33Z")

</div>

Hey @sudeshkar! thank you for your interest in doing this project.

We should keep the WHO reference data as the default reference for the growth chart, and we should implement the CDC as a configurable option. this means that if any implementer wants to add CDC references, they would be able to simply enable CDC using the configurations.

BTW, I would suggest that before we implement the CDC charts, we should do some more research and gather more feedback on how we’re going to implement this.

More than that, our focus is on getting the growth chart into the **patient-chart repo** because it’s currently living in its own repo. also, we need to add height-for-age charts using the WHO references.

Thanks.

---

<div class="post-metadata">

**Author:** ![sudeshkar](https://talk.openmrs.org/user_avatar/talk.openmrs.org/sudeshkar/32/22138_2.png) [@sudeshkar](https://talk.openmrs.org/u/sudeshkar)\
**Post date:** [July 30, 2026, 4:10pm UTC](https://talk.openmrs.org/t/adding-cdc-growth-reference-standards-to-the-o3-growth-chart/49833/3 "2026-07-30T16:10:38Z")

</div>

Thanks @dilankavishka — that’s a helpful steer, and I’m happy to fit CDC around the current priorities rather than ahead of them.

I agree with the direction: WHO should remain the default reference, with CDC as an opt-in configuration if and when it becomes useful. That also settles my questions about the default behaviour, so I’ll set those aside.

I also wanted to correct one thing from my earlier post. I mentioned sending the `bx--` → `cds--` stylesheet fix as a separate PR, but after looking more closely I saw that @dennis PR #10 already covers it (and more thoroughly than I was planning to). I’ve pulled the branch, tested it against dev3, and I’ll leave my feedback there instead of duplicating the work.

I also went back and read O3-5448. Burke had already raised the question of using WHO’s 5–19 references, and the phased approach there was to finish and deploy the 0–5 work first before expanding further. That makes sense, so I’ll follow that sequencing rather than push CDC ahead of it.

One implementation detail that might be worth keeping in mind for the future is that WHO’s 5–19 references only extend **weight-for-age** to 10 years (while height-for-age and BMI-for-age continue to 19). I don’t think that changes the current roadmap, but it’s probably useful context when the 5–19 work comes around. CDC was only interesting to me because it extends weight-for-age to 20 years, so if implementers don’t have a need for that, I’m perfectly happy for O3-5834 to stay in the backlog.

In the meantime, I’d be happy to help wherever it’s most useful. I can continue reviewing and testing PRs, or take on some of the refactoring work needed to make the chart configuration data-driven if that would help the height-for-age work. If there’s another issue that’s a higher priority, I’m happy to work on that instead.

Thanks again for the guidance.

---

<div class="post-metadata">

**Author:** ![jayasanka](https://talk.openmrs.org/user_avatar/talk.openmrs.org/jayasanka/32/22204_2.png) [@jayasanka](https://talk.openmrs.org/u/jayasanka)\
**Post date:** [September 10, 2026, 11:38am UTC](https://talk.openmrs.org/t/adding-cdc-growth-reference-standards-to-the-o3-growth-chart/49833/4 "2026-09-10T11:38:04Z")

</div>

Thanks for proposing this, @sudeshkar!

One important requirement we should keep in mind is that the reference ranges shouldn’t be hardcoded into the module.

So rather than asking, “How can we support CDC reference ranges?”, I think the question should be: “How can we make reference ranges configurable so implementers can provide whichever reference ranges they use?”

That keeps the solution generic instead of tying it to a specific source.

---

<div class="post-metadata">

**Author:** ![sudeshkar](https://talk.openmrs.org/user_avatar/talk.openmrs.org/sudeshkar/32/22138_2.png) [@sudeshkar](https://talk.openmrs.org/u/sudeshkar)\
**Post date:** [September 10, 2026, 7:09pm UTC](https://talk.openmrs.org/t/adding-cdc-growth-reference-standards-to-the-o3-growth-chart/49833/5 "2026-09-10T19:09:57Z")

</div>

Thanks @jayasanka — I agree with the reframing. I think that’s a better way to approach this than starting with CDC specifically.

If we add CDC as another built-in reference, we’d still have the same problem for anyone using a different national or local reference. So instead of making the chart support WHO and CDC separately, I think we should make the reference data configurable and let the chart work with whichever reference an implementer provides. WHO can remain the default so there’s no change for existing deployments.

While looking into this again, I also realised that the LMS data already in the current WHO dataset could fit this approach quite well. The data already contains L, M, and S values, although we’re not currently using them. If we build the reference format around LMS, we could derive the required percentiles and z-scores from the same data instead of storing every percentile separately.

That also solves the issue I raised earlier about CDC having a different set of published curves. The underlying data can support any percentile, while the reference configuration can decide which curves should actually be displayed. So WHO could keep its 3/15/50/85/97 curves, while CDC could use its published set, without those choices being hardcoded into the chart.

I’d still like the format to support precomputed percentile data as well, since some references may not provide LMS parameters.

The main thing I’m unsure about now is where the actual reference datasets should live. They’re too large to put directly into the config, so I see a few possibilities:

1. Bundle the datasets with the module and use configuration to select one.
2. Load them from a configured URL/resource and validate them when loaded.
3. Store them as OpenMRS backend resources.

I don’t have a strong preference yet, so I’d rather get some input on what fits best with the platform before deciding on that part.

For now, I’ll keep following the priorities @dilankavishka mentioned. I’m testing Dennis’s PR #10, and I’d be happy to help with the patient-chart migration or the WHO height-for-age work. I think height-for-age would actually be a good place to start applying this approach to a real requirement.

If everyone thinks this direction makes sense, I can put together a short design note for the reference-data format and configuration before starting any implementation.

Thanks again for the guidance!

---

<div class="post-metadata">

**Author:** ![jayasanka](https://talk.openmrs.org/user_avatar/talk.openmrs.org/jayasanka/32/22204_2.png) [@jayasanka](https://talk.openmrs.org/u/jayasanka)\
**Post date:** [September 10, 2026, 7:34pm UTC](https://talk.openmrs.org/t/adding-cdc-growth-reference-standards-to-the-o3-growth-chart/49833/6 "2026-09-10T19:34:04Z")

</div>

Okay sorry if I’m completely wrong here.. but I’m starting to feel like I’m talking to an AI agent rather than you. A lot of the replies are basically repeating what I said but way longer.

What I care about most is that you actually **understand what you’re working on** and bring your own thinking into it. Try stuff, explore a bit, ask when you’re stuck and just tell me what **you** think. I’d take a short messy reply in your own words over a long polished one any day haha. ❤

---

<div class="post-metadata">

**Author:** ![sudeshkar](https://talk.openmrs.org/user_avatar/talk.openmrs.org/sudeshkar/32/22138_2.png) [@sudeshkar](https://talk.openmrs.org/u/sudeshkar)\
**Post date:** [September 11, 2026, 9:48am UTC](https://talk.openmrs.org/t/adding-cdc-growth-reference-standards-to-the-o3-growth-chart/49833/7 "2026-09-11T09:48:12Z")

</div>

Sorry @jayasanka , No your completely correct, i used the ai for sound better, proper grammer and i just tried to make that better because i thought like this a discussion for that if its a long more detailed one reply it convey points better , we all using ai tools a lot its visible while i generate a reply using ai or my own,

I’m current exploring this , i understanding what you said need to create a chart module that need to be generic right? From my finding the current who standard chid age 0-5 the chart works for the child age 6-20 its doesn’t support so i think that if we implement the cdc standard its support up to 20 years . While exploring currently the module only supporting the who standard. And it striked me like it wasn’t as simple as adding another file to support cdc , and i decided to what if i change to percentile curve configuration for each dataset this was my first idea @jayasanka .

After you msg i got another perspective need to build a generic support growth chart component

---

<div class="post-metadata">

**Author:** ![sudeshkar](https://talk.openmrs.org/user_avatar/talk.openmrs.org/sudeshkar/32/22138_2.png) [@sudeshkar](https://talk.openmrs.org/u/sudeshkar)\
**Post date:** [September 12, 2026, 3:33pm UTC](https://talk.openmrs.org/t/adding-cdc-growth-reference-standards-to-the-o3-growth-chart/49833/8 "2026-09-12T15:33:04Z")

</div>

hi @jayasanka @dilankavishka , here what i did .The growth references contain LMS values right. so i wrote a script verify lms to generate percentiles again and i tested out the WHO and CDC Data

 ![LMS script test result](https://talk.openmrs.org/uploads/default/original/3X/9/0/907ef9507ad0336874fd1d236d86667e31f629e9.png)it matched closely

the 2nd step i chance the chart hardcoded specific for the WHO into recieve a reference, so the WHO or CDC lives in reference , now the reference can pass the curve it need to generate. the other important chance previously chart expected the JSON to literally contain a column for every percentile it wanted so i changed that to get the values in two ways Calculate the percentile or Use the value already provided, now the curves doesnt necessarily have to exist as a column in the json it can calculate and generate.

so i explored and i tried by creating growth reference config and giving it to chart to generate relavent growth chart.

i tested with CDC , the first i issue i faced the LMS calculations produce very precise decimal numbers someting like : 16.616648838216005 , so to fix that i set that in reference how many decimal places its published values use.

 ![who-weight-for-age](https://talk.openmrs.org/uploads/default/original/3X/b/c/bc5d7547b390b75f4781215654f47ff45e5e86cf.png) ![cdc-weight-for-age](https://talk.openmrs.org/uploads/default/original/3X/6/d/6d008acba4c78e63b31b5a1f4e259387735a1ece.png)

you can see my implementation with this link i pushed to my forked repo on new branch

> **[Comparing openmrs:main...sudeshkar:growth-reference-format ·...](https://github.com/openmrs/openmrs-esm-patient-growth-chart-app/compare/main...sudeshkar:openmrs-esm-patient-growth-chart-app:growth-reference-format?expand=1)**
>
> Archived. This app now lives at https://github.com/openmrs/openmrs-esm-patient-chart/tree/main/packages/esm-patient-growth-chart-app. - Comparing openmrs:main...sudeshkar:growth-reference-format · ...

i dont know whether my thinking is correct or not , i tried and what i found is here , sorry for the bad english hope you guys got what i tried to say.

Thankyou

---

<div class="post-metadata">

**Author:** ![sudeshkar](https://talk.openmrs.org/user_avatar/talk.openmrs.org/sudeshkar/32/22138_2.png) [@sudeshkar](https://talk.openmrs.org/u/sudeshkar)\
**Post date:** [September 19, 2026, 10:52pm UTC](https://talk.openmrs.org/t/adding-cdc-growth-reference-standards-to-the-o3-growth-chart/49833/9 "2026-09-19T22:52:01Z")

</div>

Hi , @jayasanka here what i got. before, the config gave only a name and the module looked that name up in a fixed list inside the code. so you could only pick what i already put there. now the whole reference goes in the config. the module does not know WHO or CDC, it only knows the format. it also works if a reference has no L, M, S at all,

i took CDC out of the module completely, it is only an example file now.

one more thing, a curve can now say `p` (percentile) or `z` (SD line). both are calculated from the same L, M, S rows. so the WHO percentile chart and the WHO z-score chart come from the same data.

this is the whole config for a z-score chart:

```json
{
  "@openmrs/esm-patient-growth-chart-app": {
    "growthReference": {
      "id": "who-weight-for-age-0-5-z-scores",
      "title": "Weight-for-age z-scores, birth to 5 years",
      "x": { "title": "ageInMonths", "domain": [0, 60], "tickStep": 2 },
      "y": { "title": "weightKg", "domain": [0, 30], "tickStep": 5, "precision": 1 },
      "curves": [
        { "id": "-3 SD", "z": -3 },
        { "id": "-2 SD", "z": -2 },
        { "id": "0 SD", "z": 0 },
        { "id": "+2 SD", "z": 2 },
        { "id": "+3 SD", "z": 3 }
      ],
      "data": {
        "male": [{"x":0,"l":0.3487,"m":3.3464,"s":0.14602}, ... 60 more rows],
        "female": [... 61 rows]
      }
    }
  }
}

```

 ![image](https://talk.openmrs.org/uploads/default/original/3X/6/d/6d3c671bb8f5af0d3d1aa5aade2ba9f7dd9323c7.png) ![image](https://talk.openmrs.org/uploads/default/original/3X/f/5/f5f4b004fbb56b030fe0d59c45584218ed223f91.png) ![image](https://talk.openmrs.org/uploads/default/original/3X/3/d/3dced1582d584afc9a54356affa0a035003b16a4.png)

the CDC one and the z-score one come from config files. the patient line is demo data.the colour only shows distance from the middle line, not a clinical limit, so -2 SD and -3 SD come out the same colour. you can set a curve colour in the config.

if the config has a wrong reference it says what is wrong, like `data.male must be ordered by ascending x, but 0 follows 1`, and falls back to WHO.

 ![image](https://talk.openmrs.org/uploads/default/original/3X/d/0/d03e3edd96003f44c2288ff743bb85c865e81e37.png)

not done yet - i draw the SD curves but i don’t show the patient’s z-score number, and it is still weight-for-age only.

two things i am not sure about. is this the right direction? and this repo is archived, should i open the PR in `openmrs-esm-patient-chart` instead?

can see the code change in my forked repo Branch: [Comparing openmrs:main...sudeshkar:growth-reference-format · openmrs/openmrs-esm-patient-growth-chart-app · GitHub](https://github.com/openmrs/openmrs-esm-patient-growth-chart-app/compare/main...sudeshkar:openmrs-esm-patient-growth-chart-app:growth-reference-format?expand=1)
