. Stocks at 1 Magh of each fiscal year; births over the year around it.
viewof fy = Inputs.select(fyOptions, {label:"Fiscal year",value: (newDate()).getFullYear(),format: y => fyLabel.get(y) +" ("+ y +"/"+ (y +1) +")"})
viewof tier = Inputs.select(meta.levels.map(d => d.key), {label:"Tier",value:"district",format: k => levelLabel.get(k)})
viewof within = Inputs.select(withinOptions, {label:"Within",value:"all",format: c => c ==="all"?"All": (regionByCode.get(c)?.name?? c),disabled: withinOptions.length<=1})
viewof programmeSel = Inputs.select(["all",...programmes], {label:"Programme",value:"all",format: p => p ==="all"?"All programmes": (programmeLabels.get(p) ?? p)})
viewof search = Inputs.search(tierRows, {placeholder:"Find an area",label:"Search"})
// The tier one step above the chosen one, so a reader can look at the wards of// one municipality or the municipalities of one district rather than the// whole country.parentLevel = ({province:"national",district:"province",municipality:"district",ward:"municipality"})[tier] ??null
// d3.csv rather than FileAttachment: the file is chosen at run time. Codes are// kept as strings; d3.autoType would turn a ward code into a number and lose// nothing here, but the region lookup is by string and one silent mismatch is// a table of blank names.rawRows = d3.csv("data/fy/"+ fy +"_"+ tier +".csv", d => {const o = {code:String(d.code)};for (const k ofObject.keys(d)) if (k !=="code") o[k] = d[k] ===""?null:+d[k];return o;})
tierRows = rawRows.map(d => {const r = regionByCode.get(d.code);returnObject.assign({name: r?.name?? d.code, parent: r?.parent??"",kind: r?.kind??"admin"}, d); }).filter(d => within ==="all"|| d.parent=== within)
formats =Object.fromEntries(shownIndicators.map(d => [d.indicator, v => v ==null?"":fmtInt(v)]))
tableNote = search.length+" of "+ tierRows.length+" "+ (levelLabel.get(tier) ?? tier).toLowerCase()+ (tierRows.length===1?"":"s") +" for fiscal year "+ fyLabel.get(fy)+", "+ shownIndicators.length+" target populations. Click a column heading to sort; click a row for its card."
cards = picked ?html`<div class="cards">${cardGroups.map(g =>html`<section class="card-group"> <h3>${g.label}</h3> <dl>${g.items.map(i =>html`<div class="card-row" title="${i.definition}"> <dt>${i.label}<span class="tp">${i.note&& i.note.startsWith("TP") ? i.note.split(" ")[0] :""}</span></dt> <dd>${picked[i.indicator] ==null?"":fmtInt(picked[i.indicator])}</dd> </div>`)}</dl></section>`)}</div>`:html`<p class="muted">The card lists every target population for one area, grouped by programme, for the fiscal year chosen above.</p>`
// A trend for the picked area across every fiscal year. Cheap for the upper// tiers (30 small files); for municipalities and wards the files are large, so// the trend is offered only from district upward.trendTiers = ["national","province","district"]
Reference date. The projection is a stock at 8 Asar, about 22 June. Each fiscal year’s figures are the stock moved to 1 Magh, about 15 January, by linear interpolation between the two surrounding projection years. Births are the live births over the projection year whose midpoint is 1 Magh, so they are already the annual figure. This is the rule the HMIS target-population spreadsheets have used since 2023.
Month windows. A window in months, such as 6-23 months, takes an even share of each year of age: half of the under-ones plus all the one-year-olds. Two rows differ deliberately from the earlier spreadsheets, which took 5/12 of the under-ones for 6-11 months and 2/12 for 6-8 months; here they are 6/12 and 3/12, which is what the month counts say.
Institutional population. Each district has one row for its institutional population, listed among the municipalities with “(institutional population)” in the name. It has no wards. District, province and national totals include it.
Totals. Every tier is the sum of its wards. The national figure summed from wards runs between 17,000 and 35,000 people above the national projection file, about 0.1 percent, because the ward and national projections are run separately and are reported as they are rather than rescaled. The difference for each fiscal year is in the page’s data (data/meta.json).
The scenario, and updating it. These figures follow the National Statistics Office’s medium scenario of the 2021-based projection, taken as supplied. The scenario is an input, not a fixture: the same calculation runs on any projection in the PopSyM format. When newer evidence arrives, such as the births, deaths and immunisation registers HMIS itself collects, the fertility and mortality assumptions can be updated and every target population on this page recomputed for every fiscal year, with the earlier vintage kept for comparison.
DHS-based rows. Married women of reproductive age (TP18) are women by five-year age group times the proportion married in the 2022 Demographic and Health Survey, by district. Expected pregnancies (TP19) are births by five-year age of mother times the DHS pregnancies-per-birth multiplier, by district. Women with a direct obstetric complication (TP30) are 15 percent of expected live births. The district coefficients are applied to every ward of the district; the coefficient files themselves are country data and are not in this repository.