Important
You may use IPSS-M API, the underlying content, and any output therefrom for personal for academic and research and noncommercial purposes only. See LICENSE for more details.
API and CLI of the Molecular International Prognostic Scoring System (IPSS-M) for Myelodysplastic Syndromes.
β‘οΈ API Reference Available at: https://api.mds-risk-model.com
- For the R package, see https://github.com/papaemmelab/ipssm.
- For the Online Web Calculator, visit https://mds-risk-model.com.
- π IPSS-M Publication
- ποΈ Input Variables Definition
- π API Usage
- π€ CLI Usage
- π¨π»βπ» Development
- β Question
Bernard E, Tuechler H, Greenberg PL, Hasserjian RP, Arango Ossa JE et al. Molecular International Prognostic Scoring System for Myelodysplastic Syndromes, NEJM Evidence 2022.
https://evidence.nejm.org/doi/full/10.1056/EVIDoa2200008
Note: Values for mutations:
0means wild-type (non-mutated)1means mutated, andNAmeans 'Not Asssesed'.
| Category | Variable Explanation | Variable | type, and Unit | Possible Value |
|---|---|---|---|---|
| clinical | Hemoglobin | HB | float, in g/dL | [4-20] |
| clinical | Platelets | PLT | float, in Giga/L | [0-2000] |
| clinical | Bone Marrow Blasts | BM_BLAST | float, in % | [0-30] |
| clinical (only for IPSS-R) | Absolute Neutrophil Count | ANC | float, in Giga/L | [0-15] |
| clinical (only for IPSS-RA) | Bone Marrow Blasts | AGE | float, in years | [18-120] |
| cytogenetics | Presence of del(5q) | del5q | integer | 0/1 |
| cytogenetics | Presence of -7/del(7q) | del7_7q | integer | 0/1 |
| cytogenetics | Presence of -17/del(17p) | del17_17p | integer | 0/1 |
| cytogenetics | Complex karyotype | complex | integer | 0/1 |
| cytogenetics | Cytogenetics Category | CYTO_IPSSR | string | Very Good/Good/Intermediate/Poor/Very Poor |
| TP53 locus | Number of TP53 mutations | TP53mut | string | 0/1/2 or more |
| TP53 locus | Maximum TP53 VAF | TP53maxvaf | float, between 0 and 1 | [0-1] |
| TP53 locus | Loss of heterozygosity at TP53 | TP53loh | integer: 0 or 1, string 'NA' | 0/1 |
| MLL and FLT3 mutations | MLL PTD | MLL_PTD | integer: 0 or 1, string 'NA' | 0/1 / NA |
| MLL and FLT3 mutations | FLT3 ITD or TKD | FLT3 | integer: 0 or 1, string 'NA' | 0/1 |
| gene main effect | ASXL1 | ASXL1 | integer: 0 or 1, string 'NA' | 0/1/NA |
| gene main effect | CBL | CBL | integer: 0 or 1, string 'NA' | 0/1/NA |
| gene main effect | DNMT3A | DNMT3A | integer: 0 or 1, string 'NA' | 0/1/NA |
| gene main effect | ETV6 | ETV6 | integer: 0 or 1, string 'NA' | 0/1/NA |
| gene main effect | EZH2 | EZH2 | integer: 0 or 1, string 'NA' | 0/1/NA |
| gene main effect | IDH2 | IDH2 | integer: 0 or 1, string 'NA' | 0/1/NA |
| gene main effect | KRAS | KRAS | integer: 0 or 1, string 'NA' | 0/1/NA |
| gene main effect | NPM1 | NPM1 | integer: 0 or 1, string 'NA' | 0/1/NA |
| gene main effect | NRAS | NRAS | integer: 0 or 1, string 'NA' | 0/1/NA |
| gene main effect | RUNX1 | RUNX1 | integer: 0 or 1, string 'NA' | 0/1/NA |
| gene main effect | SF3B1 | SF3B1 | integer: 0 or 1, string 'NA' | 0/1/NA |
| gene main effect | SRSF2 | SRSF2 | integer: 0 or 1, string 'NA' | 0/1/NA |
| gene main effect | U2AF1 | U2AF1 | integer: 0 or 1, string 'NA' | 0/1/NA |
| gene residual | BCOR | BCOR | integer: 0 or 1, string 'NA' | 0/1/NA |
| gene residual | BCORL1 | BCORL1 | integer: 0 or 1, string 'NA' | 0/1/NA |
| gene residual | CEBPA | CEBPA | integer: 0 or 1, string 'NA' | 0/1/NA |
| gene residual | ETNK1 | ETNK1 | integer: 0 or 1, string 'NA' | 0/1/NA |
| gene residual | GATA2 | GATA2 | integer: 0 or 1, string 'NA' | 0/1/NA |
| gene residual | GNB1 | GNB1 | integer: 0 or 1, string 'NA' | 0/1/NA |
| gene residual | IDH1 | IDH1 | integer: 0 or 1, string 'NA' | 0/1/NA |
| gene residual | NF1 | NF1 | integer: 0 or 1, string 'NA' | 0/1/NA |
| gene residual | PHF6 | PHF6 | integer: 0 or 1, string 'NA' | 0/1/NA |
| gene residual | PPM1D | PPM1D | integer: 0 or 1, string 'NA' | 0/1/NA |
| gene residual | PTPN11 | PTPN11 | integer: 0 or 1, string 'NA' | 0/1/NA |
| gene residual | PRPF8 | PRPF8 | integer: 0 or 1, string 'NA' | 0/1/NA |
| gene residual | SETBP1 | SETBP1 | integer: 0 or 1, string 'NA' | 0/1/NA |
| gene residual | STAG2 | STAG2 | integer: 0 or 1, string 'NA' | 0/1/NA |
| gene residual | WT1 | WT1 | integer: 0 or 1, string 'NA' | 0/1/NA |
The API is available at: https://api.mds-risk-model.com
Endpoint: POST /ipssm
curl \ -X POST \ -H "Content-Type: application/json" \ -d '{"HB": 10, "PLT":150, "BM_BLAST":2, "CYTO_IPSSR": "Poor"}' \ https://api.mds-risk-model.com/ipssm # example response { "patient": { "HB": 10, "PLT": 150, "BM_BLAST": 2, "CYTO_IPSSR": "Poor", "del5q": 0, "del7_7q": 0, "del17_17p": 0, "complex": 0, "TP53mut": "0", "TP53maxvaf": 0, "TP53loh": 0, "MLL_PTD": 0, "FLT3": 0, "ASXL1": 0, "CBL": 0, "DNMT3A": 0, "ETV6": 0, "EZH2": 0, "IDH2": 0, "KRAS": 0, "NPM1": 0, "NRAS": 0, "RUNX1": 0, "SF3B1": 0, "SRSF2": 0, "U2AF1": 0, "BCOR": 0, "BCORL1": 0, "CEBPA": 0, "ETNK1": 0, "GATA2": 0, "GNB1": 0, "IDH1": 0, "NF1": 0, "PHF6": 0, "PPM1D": 0, "PRPF8": 0, "PTPN11": 0, "SETBP1": 0, "STAG2": 0, "WT1": 0 }, "ipssm": { "means": { "riskScore": -0.35, "riskCat": "Moderate Low" }, "worst": { "riskScore": -0.35, "riskCat": "Moderate Low" }, "best": { "riskScore": -0.35, "riskCat": "Moderate Low" } }Endpoint: POST /ipssr
$ curl \ -X POST \ -H "Content-Type: application/json" \ -d '{"HB": 10, "ANC": 1.8, "PLT": 150, "BM_BLAST": 2, "CYTO_IPSSR": "Poor", "AGE": 28}' \ https://api.mds-risk-model.com/ipssr # example response { "patient": { "HB": 10, "ANC": 1.8, "PLT": 150, "BM_BLAST": 2, "CYTO_IPSSR": "Poor", "AGE": 28 }, "ipssr": { "IPSSR_SCORE": 3, "IPSSR_CAT": "Low", "IPSSRA_SCORE": 1.53, "IPSSRA_CAT": "Low" } }You can use the command line interface to annotate a file with patients, where each row is a patient and each column is a variable.
# Without installing it using npx npx ipssm --help# With local installation using npm npm install ipssm ipssm --help$ ipssm --help Annotate a file of patients with IPSS-M and IPSS-R risk scores and categories. It supports .csv, .tsv, .xlsx files. Usage: ipssm <inputFile> <outputFile> Positionals: inputFile File to be annotated (rows: patients, columns: variables).[string] outputFile Path for the annotated output file. [string] Options: --version Show version number [boolean] -h, --help Show help [boolean] Having a patient's data in a dictionary, you can compute the IPSS-M.
const { ipssm } from 'ipssm' // Add patient data to an object with the following fields const patientFields = { // Clinical Data BM_BLAST: 0, HB: 8.2, PLT: 239, // Optional IPSS-R fields ANC: 0.72, AGE: 63.5, // Cytogenetic Data del5q: 0, del7_7q: 0, del17_17p: 0, complex: 0, CYTO_IPSSR: 'Good', // Molecular Data TP53mut: 0, TP53maxvaf: 0, TP53loh: 0, MLL_PTD: 0, FLT3: 0, ASXL1: 1, CBL: 0, DNMT3A: 0, ETV6: 0, EZH2: 1, IDH2: 0, KRAS: 0, NPM1: 0, NRAS: 0, RUNX1: 1, SF3B1: 0, SRSF2: 0, U2AF1: 0, BCOR: 0, BCORL1: 0, CEBPA: 0, ETNK1: 0, GATA2: 0, GNB1: 0, IDH1: 0, NF1: 0, PHF6: 0, PPM1D: 0, PRPF8: 0, PTPN11: 0, SETBP1: 0, STAG2: 0, WT1: 0, } const ipssmResult = ipssm(patientFields) console.log(ipssmResult)// Result { means: { riskScore: 0.09, riskCat: 'Moderate High', contributions: {...} }, best: { riskScore: 0.09, riskCat: 'Moderate High', contributions: {...} }, worst: { riskScore: 0.09, riskCat: 'Moderate High', contributions: {...} }, }Additionally, you may find an implementation to compute the IPPS-R and IPSS-R (Age adjusted) in this module:
import { ipssr } from 'ipssm' // using the same patient data patientFields = { HB: 8.2, ANC: 0.72, PLT: 239, BM_BLAST: 0, CYTOVEC: 1, AGE: 63.5, ... } const ipssrResult = ipssr({ hb: patientFields.HB, anc: patientFields.ANC, plt: patientFields.PLT, bmblast: patientFields.BM_BLAST, cytovec: patientFields.CYTOVEC, age: patientFields.AGE, }) console.log(ipssrResult)Which outputs a risk score (means), with a best and worst scenario risk score to account for missing genetic data.
// Result { IPSSR_SCORE: 2.5, IPSSR: 'Low', IPSSRA_SCORE: 2.2563, IPSSRA: 'Low', }The following code will annotate a CSV file with the IPSS-M and IPSS-M Risks.
import { annotateFile } from 'ipssm' const inputFile = './test/data/IPSSMexample.csv' const outputFile = 'IPSSMexample.annotated.csv' await annotateFile(inputFile, outputFile)or with an excel file:
import { annotateFile } from 'ipssm' const inputFile = './test/data/IPSSMexample.xlsx' const outputFile = 'IPSSMexample.annotated.xlsx' await annotateFile(inputFile, outputFile)Any questions feel free to add an issue to this repo or to contact ElsaB.
# Install dependencies npm install # Run the development server npm run serve # Run tests npm test