Skip to content

Commit

Permalink
Merge pull request #238 from AUS-DOH-Safety-and-Quality/grouping-high…
Browse files Browse the repository at this point in the history
…lighting

Update outlier highlighting to check each group separately
  • Loading branch information
andrjohns authored Jan 30, 2024
2 parents 64dc089 + f55ec84 commit b9b7d61
Show file tree
Hide file tree
Showing 7 changed files with 62 additions and 50 deletions.
10 changes: 5 additions & 5 deletions capabilities.json
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@
"type" : { "bool" : true }
},
"astronomical": {
"displayName": "Astronomical Points",
"displayName": "Highlight Astronomical Points",
"type" : { "bool" : true }
},
"ast_colour_improvement":{
Expand All @@ -134,7 +134,7 @@
"type": { "fill": { "solid": { "color": true } } }
},
"shift": {
"displayName": "Shifts",
"displayName": "Highlight Shifts",
"type" : { "bool" : true }
},
"shift_n": {
Expand All @@ -158,7 +158,7 @@
"type": { "fill": { "solid": { "color": true } } }
},
"trend": {
"displayName": "Trends",
"displayName": "Highlight Trends",
"type" : { "bool" : true }
},
"trend_n": {
Expand All @@ -182,7 +182,7 @@
"type": { "fill": { "solid": { "color": true } } }
},
"two_in_three": {
"displayName": "Two-in-Three",
"displayName": "Highlight Two-in-Three",
"type" : { "bool" : true }
},
"twointhree_colour_improvement":{
Expand Down Expand Up @@ -210,7 +210,7 @@
"displayName": "Show Variation Icons",
"type" : { "bool" : true }
},
"flag_variation_last": {
"flag_last_point": {
"displayName": "Flag Only Last Point",
"type" : { "bool" : true }
},
Expand Down
86 changes: 51 additions & 35 deletions src/Classes/viewModelClass.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ export default class viewModelClass {
tickLabels: { x: number; label: string; }[];
plotProperties: plotPropertiesClass;
splitIndexes: number[];
groupStartEndIndexes: number[][];
firstRun: boolean;

constructor() {
Expand All @@ -88,6 +89,18 @@ export default class viewModelClass {
this.splitIndexes = JSON.parse(split_indexes);
this.inputData = extractInputData(options.dataViews[0].categorical, this.inputSettings.settings);

const allIndexes: number[] = this.splitIndexes
.concat([-1])
.concat(this.inputData.groupingIndexes)
.concat([this.inputData.limitInputArgs.keys.length - 1])
.filter((d, idx, arr) => arr.indexOf(d) === idx)
.sort((a,b) => a - b);

this.groupStartEndIndexes = new Array<number[]>();
for (let i: number = 0; i < allIndexes.length - 1; i++) {
this.groupStartEndIndexes.push([allIndexes[i] + 1, allIndexes[i + 1] + 1])
}

this.calculateLimits();
this.scaleAndTruncateLimits();
this.flagOutliers();
Expand All @@ -113,24 +126,13 @@ export default class viewModelClass {
const limitFunction: (args: controlLimitsArgs) => controlLimitsObject
= limitFunctions[this.inputSettings.settings.spc.chart_type];

if (this.splitIndexes.length > 0 || this.inputData.groupingIndexes.length > 0) {
const indexes: number[] = this.splitIndexes
.concat(this.inputData.groupingIndexes)
.concat([this.inputData.limitInputArgs.keys.length - 1])
.filter((d, idx, arr) => arr.indexOf(d) === idx)
.sort((a,b) => a - b);
const groupedData: dataObject[] = indexes.map((d, idx) => {
if (this.groupStartEndIndexes.length > 1) {
const groupedData: dataObject[] = this.groupStartEndIndexes.map((indexes) => {
// Force a deep copy
const data: dataObject = JSON.parse(JSON.stringify(this.inputData));
if(idx === 0) {
data.limitInputArgs.denominators = data.limitInputArgs.denominators.slice(0, d + 1)
data.limitInputArgs.numerators = data.limitInputArgs.numerators.slice(0, d + 1)
data.limitInputArgs.keys = data.limitInputArgs.keys.slice(0, d + 1)
} else {
data.limitInputArgs.denominators = data.limitInputArgs.denominators.slice(indexes[idx - 1] + 1, d + 1)
data.limitInputArgs.numerators = data.limitInputArgs.numerators.slice(indexes[idx - 1] + 1, d + 1)
data.limitInputArgs.keys = data.limitInputArgs.keys.slice(indexes[idx - 1] + 1, d + 1)
}
data.limitInputArgs.denominators = data.limitInputArgs.denominators.slice(indexes[0], indexes[1])
data.limitInputArgs.numerators = data.limitInputArgs.numerators.slice(indexes[0], indexes[1])
data.limitInputArgs.keys = data.limitInputArgs.keys.slice(indexes[0], indexes[1])
return data;
})

Expand Down Expand Up @@ -278,33 +280,47 @@ export default class viewModelClass {
flagOutliers() {
const process_flag_type: string = this.inputSettings.settings.outliers.process_flag_type;
const improvement_direction: string = this.inputSettings.settings.outliers.improvement_direction;
const flag_series: boolean = this.inputSettings.settings.outliers.flag_series;
const trend_n: number = this.inputSettings.settings.outliers.trend_n;
const shift_n: number = this.inputSettings.settings.outliers.shift_n;
this.outliers = {
astpoint: rep("none", this.inputData.limitInputArgs.keys.length),
two_in_three: rep("none", this.inputData.limitInputArgs.keys.length),
trend: rep("none", this.inputData.limitInputArgs.keys.length),
shift: rep("none", this.inputData.limitInputArgs.keys.length)
}
if (this.inputSettings.settings.spc.chart_type !== "run") {
if (this.inputSettings.settings.outliers.astronomical) {
this.outliers.astpoint = checkFlagDirection(
astronomical(this.controlLimits.values, this.controlLimits.ll99, this.controlLimits.ul99),
{ process_flag_type, improvement_direction });
for (let i: number = 0; i < this.groupStartEndIndexes.length; i++) {
const start: number = this.groupStartEndIndexes[i][0];
const end: number = this.groupStartEndIndexes[i][1];
const group_values: number[] = this.controlLimits.values.slice(start, end);
const group_targets: number[] = this.controlLimits.targets.slice(start, end);
const group_ll99: number[] = this.controlLimits?.ll99?.slice(start, end);
const group_ll95: number[] = this.controlLimits?.ll95?.slice(start, end);
const group_ul95: number[] = this.controlLimits?.ul95?.slice(start, end);
const group_ul99: number[] = this.controlLimits?.ul99?.slice(start, end);

if (this.inputSettings.settings.spc.chart_type !== "run") {
if (this.inputSettings.settings.outliers.astronomical) {
astronomical(group_values, group_ll99, group_ul99)
.forEach((flag, idx) => this.outliers.astpoint[start + idx] = flag)
}
if (this.inputSettings.settings.outliers.two_in_three) {
twoInThree(group_values, group_ll95, group_ul95, flag_series)
.forEach((flag, idx) => this.outliers.two_in_three[start + idx] = flag)
}
}
if (this.inputSettings.settings.outliers.two_in_three) {
this.outliers.two_in_three = checkFlagDirection(
twoInThree(this.controlLimits.values, this.controlLimits.ll95, this.controlLimits.ul95, this.inputSettings.settings.outliers.flag_series),
{ process_flag_type, improvement_direction });
if (this.inputSettings.settings.outliers.trend) {
trend(group_values, trend_n, flag_series)
.forEach((flag, idx) => this.outliers.trend[start + idx] = flag)
}
if (this.inputSettings.settings.outliers.shift) {
shift(group_values, group_targets, shift_n, flag_series)
.forEach((flag, idx) => this.outliers.shift[start + idx] = flag)
}
}
if (this.inputSettings.settings.outliers.trend) {
this.outliers.trend = checkFlagDirection(
trend(this.controlLimits.values, this.inputSettings.settings.outliers.trend_n, this.inputSettings.settings.outliers.flag_series),
{ process_flag_type, improvement_direction });
}
if (this.inputSettings.settings.outliers.shift) {
this.outliers.shift = checkFlagDirection(
shift(this.controlLimits.values, this.controlLimits.targets, this.inputSettings.settings.outliers.shift_n, this.inputSettings.settings.outliers.flag_series),
{ process_flag_type, improvement_direction });
}
Object.keys(this.outliers).forEach(key => {
this.outliers[key] = checkFlagDirection(this.outliers[key],
{ process_flag_type, improvement_direction });
})
}
}
6 changes: 3 additions & 3 deletions src/Functions/index.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
export { default as assuranceIconToDraw } from "./assuranceIconToDraw"
export { default as assuranceIconToDraw } from "../Outlier Flagging/assuranceIconToDraw"
export { default as between } from "./between"
export { default as broadcastBinary, pow, add, subtract, divide, multiply } from "./broadcastBinary"
export { default as broadcastUnary, sqrt, abs, exp, lgamma, square } from "./broadcastUnary"
export { default as buildTooltip } from "./buildTooltip"
export { default as checkFlagDirection } from "./checkFlagDirection"
export { default as checkFlagDirection } from "../Outlier Flagging/checkFlagDirection"
export { c4, c5, a3, b3, b4 } from "./Constants"
export { default as diff } from "./diff"
export { default as extractConditionalFormatting } from "./extractConditionalFormatting"
Expand All @@ -15,7 +15,7 @@ export { default as getAesthetic } from "./getAesthetic"
export { default as rep } from "./rep"
export { default as repIfScalar } from "./repIfScalar"
export { default as truncate, type truncateInputs } from "./truncate"
export { default as variationIconsToDraw } from "./variationIconsToDraw"
export { default as variationIconsToDraw } from "../Outlier Flagging/variationIconsToDraw"
export { mean, median, sum, max, min } from "d3-array"
export { default as validateDataView } from "./validateDataView"
export { default as validateInputData } from "./validateInputData"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { viewModelClass } from "../Classes/";
import type { viewModelClass } from "../Classes";

export default function assuranceIconToDraw(viewModel: viewModelClass): string {
const imp_direction: string = viewModel.inputSettings.settings.outliers.improvement_direction;
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ export default function variationIconsToDraw(viewModel: viewModelClass): string[
"" : ""
}
const suffix: string = suffix_map[imp_direction];
const flag_last: boolean = viewModel.inputSettings.settings.nhs_icons.flag_variation_last;
const flag_last: boolean = viewModel.inputSettings.settings.nhs_icons.flag_last_point;
let allFlags: string[];
if (flag_last) {
const N: number = currLimits.astpoint.length - 1;
Expand Down
6 changes: 1 addition & 5 deletions src/defaultSettings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,8 @@ const defaultSettings = {
twointhree_colour_neutral_high: "#490092"
},
nhs_icons: {
flag_last_point: true,
show_variation_icons: false,
flag_variation_last: true,
variation_icons_locations: "Top Right",
variation_icons_scaling: 1,
show_assurance_icons: false,
Expand Down Expand Up @@ -142,10 +142,6 @@ export const settingsPaneGroupings = {
"Trends": ["process_flag_type", "improvement_direction", "flag_series", "trend", "trend_n", "trend_colour_improvement", "trend_colour_deterioration", "trend_colour_neutral_low", "trend_colour_neutral_high"],
"Two-In-Three": ["process_flag_type", "improvement_direction", "flag_series", "two_in_three", "twointhree_colour_improvement", "twointhree_colour_deterioration", "twointhree_colour_neutral_low", "twointhree_colour_neutral_high"]
},
nhs_icons: {
"Variation": ["show_variation_icons", "flag_variation_last", "variation_icons_locations", "variation_icons_scaling"],
"Assurance": ["show_assurance_icons", "assurance_icons_locations", "assurance_icons_scaling"]
},
lines: {
"Main": ["show_main", "width_main", "type_main", "colour_main"],
"Target": ["show_target", "width_target", "type_target", "colour_target", "ttip_show_target", "ttip_label_target"],
Expand Down

0 comments on commit b9b7d61

Please sign in to comment.