diff --git a/public/js/src_modules/calculateTemperatureDiff.mjs b/public/js/src_modules/calculateTemperatureDiff.mjs index dde16c2c4b11654fecfa119867ea63fd6f817fee..c661ba89eda7836de500cc1bbc2c7c0a8545ba4e 100644 --- a/public/js/src_modules/calculateTemperatureDiff.mjs +++ b/public/js/src_modules/calculateTemperatureDiff.mjs @@ -6,6 +6,69 @@ import { getMetadataPlusObservationsFromSingleOrMultipleDatastreams } from "./fe import { extractPhenomenonNameFromDatastreamName } from "./fetchedDataProcessing.mjs"; +/** + * Calculate the temperature difference, dT, between Vorlauf temperature [VL] and + * RÞcklauf temperature [RL] (i.e., dT = VL - RL) for a single building + * + * @param {Array} observationsPlusMetadataArr A 1*2 array, where the first element is an array made up of two arrays of observations and the second element is an array of two metadata objects + * @returns {Array} An array made up of timestamps + values for dT + */ +const calculateVorlaufMinusRuecklaufTemperatureObservations = function ( + observationsPlusMetadataArr +) { + // Extract Vorlauf temperature, Ruecklauf temperature; first element of array + const [[vorlaufTemperatureObsArr, ruecklaufTemperatureObsArr]] = + observationsPlusMetadataArr; + + // Compare the lengths of the observations arrays for VL and RL, + // delete the unique observation(s), if necessary + const [vorlaufTemperatureObsFinalArr, ruecklaufTemperatureObsFinalArr] = + vorlaufTemperatureObsArr.length === ruecklaufTemperatureObsArr.length + ? [vorlaufTemperatureObsArr, ruecklaufTemperatureObsArr] + : checkForAndDeleteUniqueObservationsFromLargerArray( + vorlaufTemperatureObsArr, + ruecklaufTemperatureObsArr + ); + + // Extract the temperature values + const vorlaufTemperatureValues = vorlaufTemperatureObsFinalArr.map( + (vlTempObs) => vlTempObs[1] + ); + const ruecklaufTemperatureValues = ruecklaufTemperatureObsFinalArr.map( + (rlTempObs) => rlTempObs[1] + ); + + // Check that the final observation arrays have equal lengths + if ( + vorlaufTemperatureObsFinalArr.length !== + ruecklaufTemperatureObsFinalArr.length + ) { + throw new Error( + "The two observations arrays (VL and RL) have different lengths" + ); + } + // The final observation arrays now have equal length, we need only use one of them for looping + // Resulting array contains the following pairs (timestamp + dT) + else { + return vorlaufTemperatureObsFinalArr.map((vlTempObsFinal, i) => { + // Use timestamp from VL, since is equal to that of RL + const timestamp = vlTempObsFinal[0]; + + // Case 1: One of the observation values is `null`, + // no need to calculate temperature difference + // Case 2: Neither of the observation values is `null`, + // calculate temperature difference + return vorlaufTemperatureValues[i] === null || + ruecklaufTemperatureValues[i] === null + ? [timestamp, null] + : [ + timestamp, + vorlaufTemperatureValues[i] - ruecklaufTemperatureValues[i], + ]; + }); + } +}; + /** * Calculate the temperature difference, dT, between Vorlauf temperature [VL] and * RÞcklauf temperature [RL] (i.e., dT = VL - RL). In addition, create synthetic metadata @@ -51,55 +114,13 @@ export const calculateVorlaufMinusRuecklaufTemperature = async function ( bldgDataPtSamplingRateNestedArr ); - // Extract Vorlauf temperature, Ruecklauf temperature and metadata - const [ - [vorlaufTemperatureObsArr, ruecklaufTemperatureObsArr], - [metadataVorlauf, metadataRuecklauf], - ] = observationsPlusMetadata; - - // Compare the lengths of the observations arrays for VL and RL, - // delete the unique observation(s), if necessary - const [vorlaufTemperatureObsFinalArr, ruecklaufTemperatureObsFinalArr] = - vorlaufTemperatureObsArr.length === ruecklaufTemperatureObsArr.length - ? [vorlaufTemperatureObsArr, ruecklaufTemperatureObsArr] - : checkForAndDeleteUniqueObservationsFromLargerArray( - vorlaufTemperatureObsArr, - ruecklaufTemperatureObsArr - ); - - // Extract the temperature values - const vorlaufTemperatureValues = vorlaufTemperatureObsFinalArr.map( - (vlTempObs) => vlTempObs[1] - ); - const ruecklaufTemperatureValues = ruecklaufTemperatureObsFinalArr.map( - (rlTempObs) => rlTempObs[1] - ); - - // The final observation arrays now have equal length, we need only use one of them for looping - // Resulting array contains the following pairs (timestamp + dT) const vorlaufMinusRuecklaufTemperatureObs = - vorlaufTemperatureObsFinalArr.map((vlTempObsFinal, i) => { - // Use timestamp from VL, since is equal to that of RL - const timestamp = vlTempObsFinal[0]; - - // Case 1: One of the observation values is `null`, - // no need to calculate temperature difference - // Case 2: Neither of the observation values is `null`, - // calculate temperature difference - return vorlaufTemperatureValues[i] === null || - ruecklaufTemperatureValues[i] === null - ? [timestamp, null] - : [ - timestamp, - vorlaufTemperatureValues[i] - ruecklaufTemperatureValues[i], - ]; - }); - - // From Vorlauf metadata, extract `name` and `unitOfMeasurement` - const { - name: datastreamNameVorlauf, - unitOfMeasurement: unitOfMeasurementVorlauf, - } = metadataVorlauf; + calculateVorlaufMinusRuecklaufTemperatureObservations( + observationsPlusMetadata + ); + + // Extract Vorlauf temperature, Ruecklauf temperature and metadata + const [, [metadataVorlauf, metadataRuecklauf]] = observationsPlusMetadata; // From Ruecklauf metadata, extract `name` const { name: datastreamNameRuecklauf } = metadataRuecklauf;