MediaWiki:Gadget-calculator-neuro.js
From WikiAnesthesia
Revision as of 18:43, 5 April 2022 by Chris Rishel (talk | contribs)
Note: After publishing, you may have to bypass your browser's cache to see the changes.
- Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
- Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
- Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
- Opera: Press Ctrl-F5.
( function() {
mw.calculators.addUnitsBases( {
temperature: {
toString: function( units ) {
units = units.replace( 'deg', '°' );
return units;
}
}
} );
var avmSizeOfNidusOptions = [
'Small',
'Medium',
'Large'
];
var avmEloquenceOfAdjacentBrainOptions = [
'Non-eloquent',
'Eloquent'
];
var avmVenousDrainageOptions = [
'Superficial veins only',
'Deep veins'
];
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'
]
},
avmSizeOfNidus: {
name: 'Size of nidus',
type: 'string',
abbreviation: 'Nidus size',
defaultValue: 'Small',
options: avmSizeOfNidusOptions
},
avmEloquenceOfAdjacentBrain: {
name: 'Eloquence of adjacent brain',
type: 'string',
abbreviation: 'Adj. brain eloquence',
defaultValue: 'Non-eloquent',
options: avmEloquenceOfAdjacentBrainOptions
},
avmVenousDrainage: {
name: 'Venous drainage',
type: 'string',
abbreviation: 'Venous drainage',
defaultValue: 'Superficial veins only',
options: avmVenousDrainageOptions
}
} );
// 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;
}
},
spetzlerMartin: {
name: 'Spetzler-Martin AVM grading scale',
abbreviation: 'Spetzler-Martin AVM scale',
data: {
variables: {
required: [ 'avmSizeOfNidus', 'avmEloquenceOfAdjacentBrain', 'avmVenousDrainage' ]
}
},
type: 'string',
description: 'The Spetzler-Martin AVM grading system predicts the morbidity/mortality risk of surgery using angiographic features',
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 avmSizeOfNidus = data.avmSizeOfNidus;
var avmEloquenceOfAdjacentBrain = data.avmEloquenceOfAdjacentBrain;
var avmVenousDrainage = data.avmVenousDrainage;
var grade = 0;
grade = grade + avmSizeOfNidusOptions.indexOf( avmSizeOfNidus ) + 1;
grade = grade + avmEloquenceOfAdjacentBrainOptions.indexOf( avmEloquenceOfAdjacentBrain );
grade = grade + avmVenousDrainageOptions.indexOf( avmVenousDrainage );
grade = math.roman( grade );
return grade;
}
}
} );
}() );