Difference between revisions of "MediaWiki:Gadget-calculator-neuro.js"
From WikiAnesthesia
Chris Rishel (talk | contribs) |
Chris Rishel (talk | contribs) |
||
Line 404: | Line 404: | ||
data: { | data: { | ||
variables: { | variables: { | ||
required: [ 'age', 'avmRupturedPresentation', ' | required: [ 'age', 'avmRupturedPresentation', 'avmNidusCompactness' ] | ||
} | } | ||
}, | }, |
Revision as of 00:00, 6 April 2022
( function() { mw.calculators.addUnitsBases( { temperature: { toString: function( units ) { units = units.replace( 'deg', '°' ); return units; } } } ); var avmEloquenceOfAdjacentBrainOptions = [ 'Non-eloquent', 'Eloquent' ]; var avmVenousDrainageOptions = [ 'Superficial veins only', 'Deep veins' ]; var avmRupturedPresentationOptions = [ 'Unruptured', 'Ruptured' ]; var avmNidusCompactnessOptions = [ 'Compact', 'Diffuse' ]; mw.calculators.addVariables( { paCO2: { name: 'PaCO<sub>2</sub>', type: 'number', abbreviation: 'PaCO<sub>2</sub>', minValue: '20 mmHg', defaultValue: '40 mmHg', maxLength: 3, units: [ 'mmHg' ] }, temperature: { name: 'Temperature', type: 'number', abbreviation: 'Temp', minValue: '20 degC', maxValue: '44 degC', defaultValue: '37 degC', maxLength: 5, units: [ 'degC', 'degF' ] }, avmSize: { name: 'AVM Size', type: 'number', minValue: '0.1 cm', maxValue: '20 cm', abbreviation: 'AVM size', defaultValue: '1 cm', units: [ 'cm' ] }, avmEloquenceOfAdjacentBrain: { name: 'Eloquence of adjacent brain', type: 'string', abbreviation: 'Eloquence', defaultValue: 'Non-eloquent', options: avmEloquenceOfAdjacentBrainOptions }, avmVenousDrainage: { name: 'Venous drainage', type: 'string', abbreviation: 'Venous drainage', defaultValue: 'Superficial veins only', options: avmVenousDrainageOptions }, avmRupturedPresentation: { name: 'Ruptured presentation', type: 'string', abbreviation: 'Ruptured', defaultValue: 'No', options: avmRupturedPresentationOptions }, avmNidusCompactness: { name: 'Nidus compactness', type: 'string', abbreviation: 'Nidus', defaultValue: 'No', options: avmNidusCompactnessOptions } } ); // Neuro mw.calculators.addCalculations( { brainMass: { name: 'Brain mass', data: { variables: { optional: [ 'age', 'gender' ] } }, digits: 0, units: 'gwt', description: 'This calculation will give a more precise estimate of brain mass if age and/or gender are provided.', references: [ 'Dekaban AS. Changes in brain weights during the span of human life: relation of brain weights to body heights and body weights. Ann Neurol. 1978 Oct;4(4):345-56. doi: 10.1002/ana.410040410. PMID: 727739.' ], calculate: function( data ) { var age = data.age ? data.age.toNumber( 'yr' ) : null; var gender = data.gender ? data.gender : null; var brainMassFemale = 1290; var brainMassMale = 1450; if( age !== null ) { if( age <= 10 / 365 ) { // <=10 days brainMassFemale = 360; brainMassMale = 380; } else if( age <= 4 * 30 / 365 ) { // Less than 4 months. This is a gap in the reported data of the paper, so linearly interpolate? var ageFactor = 1 - ( 4 * 30 / 365 - age ) / ( 4 * 30 / 365 - 10 / 365 ); brainMassFemale = 360 + ageFactor * ( 580 - 360 ); brainMassMale = 380 + ageFactor * ( 640 - 380 ); } else if( age <= 8 * 30 / 365 ) { // <=8 months brainMassFemale = 580; brainMassMale = 640; } else if( age <= 18 * 30 / 365 ) { // <=18 months brainMassFemale = 940; brainMassMale = 970; } else if( age <= 30 * 30 / 365 ) { // <=30 months brainMassFemale = 1040; brainMassMale = 1120; } else if( age <= 43 * 30 / 365 ) { // <=43 months brainMassFemale = 1090; brainMassMale = 1270; } else if( age <= 5 ) { brainMassFemale = 1150; brainMassMale = 1300; } else if( age <= 7 ) { brainMassFemale = 1210; brainMassMale = 1330; } else if( age <= 9 ) { brainMassFemale = 1180; brainMassMale = 1370; } else if( age <= 12 ) { brainMassFemale = 1260; brainMassMale = 1440; } else if( age <= 15 ) { brainMassFemale = 1280; brainMassMale = 1410; } else if( age <= 18 ) { brainMassFemale = 1340; brainMassMale = 1440; } else if( age <= 21 ) { brainMassFemale = 1310; brainMassMale = 1450; } else if( age <= 30 ) { brainMassFemale = 1300; brainMassMale = 1440; } else if( age <= 40 ) { brainMassFemale = 1290; brainMassMale = 1440; } else if( age <= 50 ) { brainMassFemale = 1290; brainMassMale = 1430; } else if( age <= 55 ) { brainMassFemale = 1280; brainMassMale = 1410; } else if( age <= 60 ) { brainMassFemale = 1250; brainMassMale = 1370; } else if( age <= 65 ) { brainMassFemale = 1240; brainMassMale = 1370; } else if( age <= 70 ) { brainMassFemale = 1240; brainMassMale = 1360; } else if( age <= 75 ) { brainMassFemale = 1230; brainMassMale = 1350; } else if( age <= 80 ) { brainMassFemale = 1190; brainMassMale = 1330; } else if( age <= 85 ) { brainMassFemale = 1170; brainMassMale = 1310; } else { brainMassFemale = 1140; brainMassMale = 1290; } } if( gender === 'F' ) { return brainMassFemale; } else if( gender === 'M' ) { return brainMassMale; } else { return ( brainMassFemale + brainMassMale ) / 2; } } }, cerebralBloodVolume: { name: 'Cerebral blood volume', abbreviation: 'CBV', data: { calculations: { required: [ 'brainMass' ] } }, units: 'mL', description: '4 mL per 100g of brain mass', references: [ 'Tameem A, Krovvidi H, Cerebral physiology, Continuing Education in Anaesthesia Critical Care & Pain, Volume 13, Issue 4, August 2013, Pages 113–118, https://doi.org/10.1093/bjaceaccp/mkt001' ], calculate: function( data ) { var brainMass = data.brainMass.toNumber( 'gwt' ); return 4 * brainMass / 100; } }, cerebralMetabolicRateFactor: { name: 'Cerebral metabolic rate factor', abbreviation: '%CMR', data: { variables: { optional: [ 'temperature' ] } }, description: '7% change in CMR for every 1 °C change in temperature', references: [ 'Tameem A, Krovvidi H, Cerebral physiology, Continuing Education in Anaesthesia Critical Care & Pain, Volume 13, Issue 4, August 2013, Pages 113–118, https://doi.org/10.1093/bjaceaccp/mkt001' ], calculate: function( data ) { var temperature = data.temperature ? data.temperature.toNumber( 'degC' ) : null; var cerebralMetabolicRateFactor = 1; if( temperature ) { cerebralMetabolicRateFactor += 0.07 * ( temperature - 37 ); } return cerebralMetabolicRateFactor; } }, cerebralMetabolicRateO2: { name: 'Cerebral metabolic rate (O<sub>2</sub>)', abbreviation: 'CMRO<sub>2</sub>', data: { calculations: { required: [ 'brainMass', 'cerebralMetabolicRateFactor' ] }, variables: { optional: [ 'temperature' ] } }, units: 'mL/min', description: '<ul><li>3 mL O<sub>2</sub>/min per 100g of brain mass</li><li>If temperature is provided, adjusts estimate using 7% change in CMR for every 1 °C change in temperature</li></ul>', references: [ 'Tameem A, Krovvidi H, Cerebral physiology, Continuing Education in Anaesthesia Critical Care & Pain, Volume 13, Issue 4, August 2013, Pages 113–118, https://doi.org/10.1093/bjaceaccp/mkt001' ], searchData: 'cmro2', calculate: function( data ) { // Temperature is included as an optional variable to generate the input. // It is used by cerebralMetabolicRateFactor, which is an internal calculation not typically shown. var brainMass = data.brainMass.toNumber( 'gwt' ); var cerebralMetabolicRateFactor = data.cerebralMetabolicRateFactor.toNumber(); return cerebralMetabolicRateFactor * 3 * brainMass / 100; } }, cerebralMetabolicRateGlucose: { name: 'Cerebral metabolic rate (Glucose)', abbreviation: 'CMR<sub>glu</sub>', data: { calculations: { required: [ 'brainMass', 'cerebralMetabolicRateFactor' ] } }, units: 'mg/min', description: '<ul><li>5 mg glucose/min per 100g of brain mass</li><li>7% change in CMR for every 1 °C change in temperature</li></ul>', references: [ 'Tameem A, Krovvidi H, Cerebral physiology, Continuing Education in Anaesthesia Critical Care & Pain, Volume 13, Issue 4, August 2013, Pages 113–118, https://doi.org/10.1093/bjaceaccp/mkt001' ], calculate: function( data ) { var brainMass = data.brainMass.toNumber( 'gwt' ); var cerebralMetabolicRateFactor = data.cerebralMetabolicRateFactor.toNumber(); return cerebralMetabolicRateFactor * 5 * brainMass / 100; } }, cerebralBloodFlow: { name: 'Cerebral blood flow', abbreviation: 'CBF', data: { calculations: { required: [ 'brainMass', 'cerebralMetabolicRateFactor' ] }, variables: { optional: [ 'paCO2' ] } }, units: 'mL/min', description: '<ul><li>50 mL/min per 100g of brain mass.</li><li>Every mmHg in PaCO2 changes CBF by 1.5 mL/min per 100g of brain mass.</li><li>Cerebral blood flow and cerebral metabolic rate are coupled. Factors that alter CMR (e.g. temperature) will proportionally alter CBF.</li>', references: [ 'Tameem A, Krovvidi H, Cerebral physiology, Continuing Education in Anaesthesia Critical Care & Pain, Volume 13, Issue 4, August 2013, Pages 113–118, https://doi.org/10.1093/bjaceaccp/mkt001', 'Brian JE Jr. Carbon dioxide and the cerebral circulation. Anesthesiology. 1998 May;88(5):1365-86. doi: 10.1097/00000542-199805000-00029. PMID: 9605698.' ], calculate: function( data ) { var brainMass = data.brainMass.toNumber( 'gwt' ); var cerebralMetabolicRateFactor = data.cerebralMetabolicRateFactor.toNumber(); var paCO2 = data.paCO2.toNumber( 'mmHg' ); var cerebralBloodFlow = cerebralMetabolicRateFactor * 50 * brainMass / 100; if( paCO2 ) { // CO2 reductions don't reduce CBF more than 50% var minCerebralBloodFlow = cerebralBloodFlow / 2; cerebralBloodFlow += 1.5 * brainMass / 100 * ( paCO2 - 40 ); cerebralBloodFlow = math.max( cerebralBloodFlow, minCerebralBloodFlow ); } return cerebralBloodFlow; } }, avmSpetlzerMartinGrade: { name: 'Spetlzer-Martin AVM grading scale', abbreviation: 'Spetzler-Martin grade', data: { variables: { required: [ 'avmSize', 'avmEloquenceOfAdjacentBrain', 'avmVenousDrainage' ] } }, type: 'number', calculate: function( data ) { var avmSize = data.avmSize.toNumber( 'cm' ); var avmEloquenceOfAdjacentBrain = data.avmEloquenceOfAdjacentBrain; var avmVenousDrainage = data.avmVenousDrainage; var spetzlerMartinGrade = 0; // AVM size if( avmSize < 3 ) { spetzlerMartinGrade += 1; } else if( avmSize <= 6 ) { spetzlerMartinGrade += 2; } else { spetzlerMartinGrade += 3; } // Eloquence of adjacent brain // 0 no, 1 yes spetzlerMartinGrade += avmEloquenceOfAdjacentBrainOptions.indexOf( avmEloquenceOfAdjacentBrain ); // Venous drainage // 0 superficial, 1 deep spetzlerMartinGrade += avmVenousDrainageOptions.indexOf( avmVenousDrainage ); return spetzlerMartinGrade; } }, avmSpetzlerMartinGradeRisk: { name: 'Spetlzer-Martin AVM grading scale', abbreviation: 'Spetzler-Martin AVM grade', data: { calculations: { required: [ 'avmSpetlzerMartinGrade' ] } }, type: 'string', description: '<p>The Spetzler-Martin AVM grading system predicts the morbidity/mortality risk of surgery using angiographic features</p><ul><li>Size of nidus<ul><li>0: Small (<3 cm)</li><li>1: Medium (3-6 cm)</li><li>2: Large (>6 cm)</li></ul></li><li>Eloquence of adjacent brain area<ul><li>0: Non-eloquent</li><li>1: Eloquent</li></ul></li><li>Venous drainage<ul><li>0: Superficial veins only</li><li>1: Deep veins</li></ul></li></ul>', references: [ 'Spetzler RF, Martin NA. A proposed grading system for arteriovenous malformations. J Neurosurg. 1986 Oct;65(4):476-83. doi: 10.3171/jns.1986.65.4.0476. PMID: 3760956.' ], calculate: function( data ) { var spetzlerMartinGrade = data.spetzlerMartinGrade; var spetzlerMartinGradeRisk = math.roman( spetzlerMartinGrade ); if( spetzlerMartinGrade <= 3 ) { spetzlerMartinGradeRisk += ' (low-to-moderate risk)'; } else { spetzlerMartinGradeRisk += ' (high-risk)'; } return spetzlerMartinGradeRisk; } }, avmSupplementalGrade: { name: 'Supplemental AVM grading scale', abbreviation: 'Supplemental AVM grade', data: { variables: { required: [ 'age', 'avmRupturedPresentation', 'avmNidusCompactness' ] } }, type: 'number', calculate: function( data ) { var age = data.age ? data.age.toNumber( 'yr' ) : 0; var avmRupturedPresentation = data.avmRupturedPresentation ? data.avmRupturedPresentation : null; var avmNidusCompactness = data.avmNidusCompactness ? data.avmNidusCompactness : null; var supplementalGrade = 0; // Age if( age < 20 ) { supplementalGrade += 1; } else if( age <= 40 ) { supplementalGrade += 2; } else { supplementalGrade += 3; } // Ruptured presentation // 0 unruptured, 1 ruptured supplementalGrade += avmRupturedPresentationOptions.indexOf( avmRupturedPresentation ); // Diffuse nidus // 0 compact, 1 diffuse supplementalGrade += avmNidusCompactnessOptions.indexOf( avmNidusCompactness ); return supplementalGrade; } }, avmSupplementalGradeRisk: { name: 'Supplemental AVM grading scale', abbreviation: 'Supplemental AVM grade', data: { calculations: { required: [ 'avmSupplementalGrade' ] } }, type: 'string', description: '<p>The Supplemental AVM grading system provides additional surgical risk stratification in addition to the Spetzler-Martin grade.</p><ul><li>Age<ul><li>1: <20 yo</li><li>2: 20-40 yo</li><li>3: >40 yo</li></ul></li><li>Ruptured presentation<ul><li>0: Unruptured</li><li>1: Ruptured</li></ul></li><li>Nidus compactness<ul><li>0: Compact</li><li>1: Diffuse</li></ul></li></ul>', references: [ 'Lawton MT, Kim H, McCulloch CE, Mikhak B, Young WL. A supplementary grading scale for selecting patients with brain arteriovenous malformations for surgery. Neurosurgery. 2010 Apr;66(4):702-13; discussion 713. doi: 10.1227/01.NEU.0000367555.16733.E1. PMID: 20190666; PMCID: PMC2847513.' ], calculate: function( data ) { var supplementalGrade = data.supplementalGrade; var supplementalGradeRisk = math.roman( supplementalGrade ); if( supplementalGrade <= 3 ) { supplementalGradeRisk += ' (low-to-moderate risk)'; } else { supplementalGradeRisk += ' (high-risk)'; } return supplementalGradeRisk; } } } ); }() );