Calculate specific growth rate (SGR) and doubling time based on volumetric data.
cm³, mm³, or mL
Must use same unit as V1
Analysis Results
Time Interval:0 days
Volume Change:0%
Specific Growth Rate (SGR):0% / day
Doubling Time:0 days
Understanding Tumor Growth Kinetics
Tumor growth rate is a critical metric in oncology for assessing the aggressiveness of a neoplasm and evaluating the response to therapy. By measuring the change in tumor volume over a specific time interval, clinicians can estimate how fast the tumor cells are dividing.
How the Calculation Works
This calculator utilizes the exponential growth model, which assumes that the rate of growth is proportional to the current size of the tumor. While biological systems are complex, this model provides a standard approximation for clinical doubling times.
Formulas Used:
Specific Growth Rate (SGR): This represents the percentage increase in tumor volume per day. The formula is: SGR = (ln(V2) - ln(V1)) / (t2 - t1) * 100
Doubling Time (DT): This is the time required for the tumor volume to double in size. DT = ln(2) / (SGR / 100)
Interpreting the Results
Short Doubling Time: A small number of days implies a rapidly growing, aggressive tumor. This is often seen in high-grade malignancies.
Long Doubling Time: A large number suggests an indolent or slow-growing lesion.
Negative Growth: If the volume decreases (V2 < V1), the calculator will display a "Regression Rate" and "Halving Time," indicating a positive response to treatment.
Clinical Relevance (RECIST)
While volume is a precise 3D measure, standard RECIST (Response Evaluation Criteria in Solid Tumors) criteria often use 1D measurements (longest diameter). However, volumetric analysis is increasingly used in clinical trials and advanced radiology to detect subtle changes in tumor burden earlier than linear measurements.
function calculateGrowth() {
// 1. Get DOM elements
var v1Input = document.getElementById('initialVolume');
var v2Input = document.getElementById('finalVolume');
var d1Input = document.getElementById('date1');
var d2Input = document.getElementById('date2');
var errorDiv = document.getElementById('errorMsg');
var resultBox = document.getElementById('resultBox');
// Output elements
var daysDiffSpan = document.getElementById('daysDiff');
var volChangeSpan = document.getElementById('volChange');
var sgrSpan = document.getElementById('sgrResult');
var dtSpan = document.getElementById('dtResult');
var dtLabel = document.getElementById('dtLabel');
// 2. Parse Values
var v1 = parseFloat(v1Input.value);
var v2 = parseFloat(v2Input.value);
var date1 = new Date(d1Input.value);
var date2 = new Date(d2Input.value);
// 3. Validation Logic
errorDiv.style.display = 'none';
resultBox.style.display = 'none';
if (isNaN(v1) || isNaN(v2)) {
errorDiv.innerHTML = "Please enter valid numbers for both initial and final volumes.";
errorDiv.style.display = 'block';
return;
}
if (v1 <= 0 || v2 <= 0) {
errorDiv.innerHTML = "Tumor volumes must be greater than zero.";
errorDiv.style.display = 'block';
return;
}
if (d1Input.value === "" || d2Input.value === "") {
errorDiv.innerHTML = "Please select both dates.";
errorDiv.style.display = 'block';
return;
}
// Calculate time difference in days
var timeDiffMs = date2 – date1;
var days = timeDiffMs / (1000 * 60 * 60 * 24);
if (days 0) {
volChangeSpan.innerText = "+" + totalChange.toFixed(2) + "%";
volChangeSpan.style.color = "#e74c3c"; // Red indicates growth
} else {
volChangeSpan.innerText = totalChange.toFixed(2) + "%";
volChangeSpan.style.color = "#27ae60"; // Green indicates shrinkage
}
// Handle Growth vs Regression
if (sgr > 0) {
sgrSpan.innerText = sgrPercent.toFixed(3) + "% / day";
dtLabel.innerText = "Doubling Time:";
dtSpan.innerText = doublingTime.toFixed(1) + " days";
} else if (sgr < 0) {
sgrSpan.innerText = sgrPercent.toFixed(3) + "% / day (Regression)";
dtLabel.innerText = "Halving Time:";
// Halving time is ln(0.5) / sgr, or effectively abs value of doubling calc
var halvingTime = Math.abs(Math.log(0.5) / sgr);
dtSpan.innerText = halvingTime.toFixed(1) + " days";
} else {
sgrSpan.innerText = "0% / day";
dtLabel.innerText = "Doubling Time:";
dtSpan.innerText = "Infinite (Stable)";
}
resultBox.style.display = 'block';
}