| Type: | Package | 
| Title: | Design Complex Light Regimes | 
| Version: | 1.0.0 | 
| Description: | A system for accurately designing complex light regimes using LEDs. Takes calibration data and user-defined target irradiances and it tells you what intensities to use. For more details see Vong et al. (2025) <doi:10.1101/2025.06.06.658293>. | 
| License: | GPL (≥ 3) | 
| Encoding: | UTF-8 | 
| URL: | https://github.com/ginavong/LightFitR/ | 
| BugReports: | https://github.com/ginavong/LightFitR/issues | 
| LazyData: | true | 
| Depends: | R (≥ 3.5) | 
| Imports: | utils, graphics, lubridate, nnls, stringr | 
| RoxygenNote: | 7.3.2 | 
| Suggests: | knitr, rmarkdown, testthat (≥ 3.0.0) | 
| Config/testthat/edition: | 3 | 
| VignetteBuilder: | knitr | 
| NeedsCompilation: | no | 
| Packaged: | 2025-07-24 15:27:11 UTC; Gina Vong | 
| Author: | Gina Vong | 
| Maintainer: | Gina Vong <gywv500@york.ac.uk> | 
| Repository: | CRAN | 
| Date/Publication: | 2025-07-25 16:30:14 UTC | 
calibration data
Description
Example calibration data
Usage
calibration
Format
A data frame with 12 columns:
- filename
- File that the raw data came from 
- time
- The time when a given measurement was taken 
- led
- LED channel being calibrated at that timepoint 
- intensity
- Intensity the light is set to 
- wavelength
- The wavelength this row describes 
- irradiance
- The irradiance measured at that wavelength by the spectrometer 
Source
<https://github.com/ginavong/2024_LightFitR_MethodsPaper/blob/master/data/heliospectra_measurements/calibration/Apollo_Calib_20240827/Apollo_calibration_annotated_20240827.Rda>
Check that the intended irradiances are acheivable by the lights
Description
Check that the intended irradiances are acheivable by the lights
Usage
checkRange(
  intended_irradiance,
  calibration_leds,
  calibration_wavelengths,
  calibration_intensities,
  calibration_irradiances
)
Arguments
| intended_irradiance | Matrix of intended irradiances to be checked. Each row corresponds to an LED channel. | 
| calibration_leds | A numeric vector of LED values from calibration, mapping to intensities and irradiances (i.e. the same length) | 
| calibration_wavelengths | A numeric vector of wavelengths from calibration, corresponding to intensities and irradiances | 
| calibration_intensities | A numeric vector of intensities (heliospectra units) from calibration | 
| calibration_irradiances | A numeric vector of measured irradiances (any units, as long as it is consistently used) from calibration | 
Value
Boolean: TRUE = pass, FALSE = fail
Examples
calib <- LightFitR::calibration
irradiances <- LightFitR::target_irradiance
checkRange(irradiances, calib$led, calib$wavelength, calib$intensity, calib$irradiance)
closest intensities
Description
Matrix of closest intensities for example purposes. Generated from 'target_irradiance'
Usage
example_closest
Format
A matrix with 9 rows and 10 columns: each row represents an LED channel and each column represents an event
example intensities
Description
Matrix of random intensities for example purposes
Usage
example_intensities
Format
A matrix with 9 rows and 10 columns: each row represents an LED channel and each column represents an event
regime matrix
Description
Example regime matrix
Usage
example_regime
Format
A matrix with 13 rows and 10 columns:
- time
- time in HH:MM:SS format 
- hour
- The hour of the event 
- minute
- The minute of the event 
- second
- The second of the event 
- 380nm
- Intensity at 380nm LED channel 
- 400nm
- Intensity at 400nm LED channel 
- etc.
Check formatting of the heliospectra matrices
Description
Heliospectra DYNA matrices should have 9 rows (1 for each LED channel) and up to 150 columns (max number of events that Heliospectra DYNA can store)
Usage
helio.checkFormat(check_matrix)
Arguments
| check_matrix | Matrix to be checked. Rows correspond to LEDs and columns are events / timepoints. | 
Value
Vector of booleans: TRUE = pass, FALSE = fail
Examples
matrix_to_check <- LightFitR::target_irradiance
helio.checkFormat(target_irradiance)
Check that the 9th white channel is set to 0
Description
We currently cannot support programming the white (5700k) LED channel.
Usage
helio.checkWhite(irradiance_matrix)
Arguments
| irradiance_matrix | Matrix of intended irradiances. rows = leds and columns = events | 
Value
Boolean: TRUE = pass, FALSE = fail
Format regime_matrix for csv output that Heliospectra lights can parse
Description
Format regime_matrix for csv output that Heliospectra lights can parse
Usage
helio.csv_schedule(regime_matrix, filename)
Arguments
| regime_matrix | Matrix containing light regime, as generated by makeRegime | 
| filename | Character. Filename to export to | 
Value
Matrix formatted for Heliospectra lights csv
Examples
tempfile_name = tempfile(fileext='.csv')
helio.csv_schedule(LightFitR::example_regime, tempfile_name)
Turn Heliospectra into disco lights
Description
Congratulations! You've found the easter egg function!
Usage
helio.disco(filename, format = c("csv", "json"))
Arguments
| filename | Character. Filename to export to | 
| format | Character. Which format to export to? csv or json. Use extensions '.csv' or '.txt' | 
Details
This writes a schedule for Heliospectra DYNA lights which randomly changes colour every second for a fun disco effect. The disco will last until the Heliospectra runs out of memory (150 events), so you can get 2 min 30s of disco out of your expensive lights... Enjoy!
Value
Disco schedule file for the heliospectra
Examples
tempfile_name = tempfile(fileext='.txt')
helio.disco(tempfile_name, format='json')
heliospectra DYNA LEDs
Description
Data about the heliospectra DYNA LED channels
Usage
helio.dyna.leds
Format
A data frame with 9 rows and 3 columns:
- name
- Name of the LED channel 
- wavelength
- Wavelength of the LED channel 
- colour
- Colour of the LED channel 
Source
<https://heliospectra.com/led-grow-lights/dyna/>
Maximum number of events
Description
Maximum number of events programmable onto heliospectra
Usage
helio.eventLimit
Format
Integer representing maximum allowable events
Format regime_matrix for json output that Heliospectra lights can parse
Description
Format regime_matrix for json output that Heliospectra lights can parse
Usage
helio.json_schedule(regime_matrix, filename)
Arguments
| regime_matrix | Matrix containing light regime, as generated by makeRegime | 
| filename | Character. Filename to export to | 
Value
Character in json format that Heliospectra can parse
Examples
tempfile_name = tempfile(fileext='.txt')
helio.csv_schedule(LightFitR::example_regime, tempfile_name)
Add white (5700k) LED to intensities matricies after calculations
Description
Add white (5700k) LED to intensities matricies after calculations
Usage
internal.addWhiteZero(intensities_matrix)
Arguments
| intensities_matrix | Matrix of intensities with 8 rows | 
Value
Matrix of intensities with 9 rows
Internal function to make a calibration dataframe from user-supplied vectors of calibration data
Description
Internal function to make a calibration dataframe from user-supplied vectors of calibration data
Usage
internal.calibCombine(
  calibration_leds,
  calibration_wavelengths,
  calibration_intensities,
  calibration_irradiances
)
Arguments
| calibration_leds | A numeric vector of LED values from calibration, mapping to intensities and irradiances (i.e. the same length) | 
| calibration_wavelengths | A numeric vector of wavelengths from calibration, corresponding to intensities and irradiances | 
| calibration_intensities | A numeric vector of intensities (heliospectra units) from calibration | 
| calibration_irradiances | A numeric vector of measured irradiances (any units, as long as it is consistently used) from calibration | 
Value
Correctly formatted dataframe of calibration data, for use in other functions
Internal function to check matrix for NAs
Description
Internal function to check matrix for NAs
Usage
internal.checkNAs(check_matrix)
Arguments
| check_matrix | Matrix to be checked. Rows correspond to LEDs and columns are events / timepoints. | 
Value
Boolean: TRUE = pass, FALSE = fail
Internal function. Find the intensities corresponding to the closest irradiance match between intended and calibration.
Description
Internal function. Find the intensities corresponding to the closest irradiance match between intended and calibration.
Usage
internal.closestIntensities(
  irradiance_matrix,
  calibration_df,
  peaks = LightFitR::helio.dyna.leds$wavelength
)
Arguments
| irradiance_matrix | Matrix of intended irradiances. rows = leds and columns = events | 
| calibration_df | Dataframe of calibration data generated by internal.calibCombine | 
| peaks | Vector of length 8 or 9. Containing wavelengths at which each LED peaks. | 
Value
Matrix of closest intensities, in the same format as 'irradiance_matrix'
Examples
# Format calibration data correctly
calib <- LightFitR::calibration[, c(3, 5, 4, 6)]
# Run function
internal.closestIntensities(LightFitR::target_irradiance, calib)
Internal function. Find the closest wavelengths to the stated peaks
Description
Internal function. Find the closest wavelengths to the stated peaks
Usage
internal.closestWavelength(wavelength_vec, peak_wavelengths)
Arguments
| wavelength_vec | Vector of wavelengths that we have spectrometry data for | 
| peak_wavelengths | Vector of stated LED peaks | 
Value
Vector of wavelengths closest to the stated peaks
Internal function. Takes vector of timepoints (POSICxt format) and converts into format readable by heliospectra.
Description
Internal function. Takes vector of timepoints (POSICxt format) and converts into format readable by heliospectra.
Usage
internal.makeTimes(timeVector_POSIXct)
Arguments
| timeVector_POSIXct | Vector of schedule timepoints in POSICxt format | 
Value
Matrix of times. Each row corresponds to hours, minutes, seconds
Remove empty white (5700k) LED from calculations
Description
Remove empty white (5700k) LED from calculations
Usage
internal.rmWhite(irradiance_matrix)
Arguments
| irradiance_matrix | Matrix of intended irradiances. rows = leds and columns = events | 
Value
Matrix of irradiances, with 9th row removed as we currently don't support 5700k LED channel
Tidy intensities generated by algorithm so that lights can accept them
Description
Tidy intensities generated by algorithm so that lights can accept them
Usage
internal.tidyIntensities(intensities_matrix, calibration_intensities)
Arguments
| intensities_matrix | Matrix of predicted intensities | 
| calibration_intensities | A numeric vector of intensities (heliospectra units) from calibration | 
Value
Maxtrix of intensities which are integers and capped at the maximum possible intensity
Create a regime (matrix) to program lights to achieve intended irradiances
Description
This is a wrapper function that carries out multiple steps:
1. Calculate closest intensities
2. Predict the intensities to use to achieve the target irradiance (via a system of linear equations or non-negative least squares)
3. Tidy the intensities (rounding to integer, keep within the range of intensities that the lights can be set to)
4. Format the intensities and timestamps into a human-readable regime matrix
Usage
makeRegime(
  timeVector_POSIXct,
  irradiance_matrix,
  calibration_leds,
  calibration_wavelengths,
  calibration_intensities,
  calibration_irradiances,
  peaks = LightFitR::helio.dyna.leds$wavelength,
  method = "nnls"
)
Arguments
| timeVector_POSIXct | Vector of schedule timepoints in POSICxt format | 
| irradiance_matrix | Matrix of intended irradiances. rows = leds and columns = events | 
| calibration_leds | A numeric vector of LED values from calibration, mapping to intensities and irradiances (i.e. the same length) | 
| calibration_wavelengths | A numeric vector of wavelengths from calibration, corresponding to intensities and irradiances | 
| calibration_intensities | A numeric vector of intensities (heliospectra units) from calibration | 
| calibration_irradiances | A numeric vector of measured irradiances (any units, as long as it is consistently used) from calibration | 
| peaks | Vector of length 8 or 9. Containing wavelengths at which each LED peaks. | 
| method | Use 'nnls' (non-negative least squares) or 'sle' (system of linear equations) | 
Value
Matrix with light regime needed to program the lights
NNLS vs SLE
NNLS and SLE largely predict the same intensities, except in outlier cases. The default is NNLS, but if your predicted intensities end up being very far off, try SLE.
Examples
# Prep variables
calib <- LightFitR::calibration
times <- LightFitR::time_vector
target_irradiance <- LightFitR::target_irradiance
# Run function
makeRegime(times, target_irradiance, calib$led, calib$wavelength, calib$intensity, calib$irradiance)
Use non-linear least squares to interpolate intensities
Description
Use non-linear least squares to interpolate intensities
Usage
nnls_intensities(
  irradiance_matrix,
  closest_intensities,
  calibration_leds,
  calibration_wavelengths,
  calibration_intensities,
  calibration_irradiances,
  peaks = LightFitR::helio.dyna.leds$wavelength
)
Arguments
| irradiance_matrix | Matrix of intended irradiances. rows = leds and columns = events | 
| closest_intensities | Matrix of closest intensities, generated by 'internal.closestIntensities'. Same format as 'irradiance_matrix' | 
| calibration_leds | A numeric vector of LED values from calibration, mapping to intensities and irradiances (i.e. the same length) | 
| calibration_wavelengths | A numeric vector of wavelengths from calibration, corresponding to intensities and irradiances | 
| calibration_intensities | A numeric vector of intensities (heliospectra units) from calibration | 
| calibration_irradiances | A numeric vector of measured irradiances (any units, as long as it is consistently used) from calibration | 
| peaks | Vector of length 8 or 9. Containing wavelengths at which each LED peaks. | 
Value
Matrix of intensities to set the lights to, to achieve desired irradiances
Examples
# Prep variables
target_irradiance = LightFitR::target_irradiance
closest = LightFitR::example_closest
calib = LightFitR::calibration
# Run the function
nnls_intensities(target_irradiance, closest,
  calib$led, calib$wavelength, calib$intensity, calib$irradiance)
Read a heliospectra script (json format) into a matrix.
Description
Read a heliospectra script (json format) into a matrix.
Usage
read.helio_json(helio_script)
Arguments
| helio_script | File (.txt or .json) containing heliospectra regime script | 
Value
Matrix containing the regime encoded by the Heliospectra script
Examples
example_file <- system.file("extdata", "example_json_schedule.txt",
  package = "LightFitR", mustWork = TRUE)
read.helio_json(example_file)
Use a system of linear equations to calculate intensities
Description
Use a system of linear equations to calculate intensities
Usage
sle_intensities(
  irradiance_matrix,
  closest_intensities,
  calibration_leds,
  calibration_wavelengths,
  calibration_intensities,
  calibration_irradiances,
  peaks = LightFitR::helio.dyna.leds$wavelength
)
Arguments
| irradiance_matrix | Matrix of intended irradiances. rows = leds and columns = events | 
| closest_intensities | Matrix of closest intensities, generated by 'internal.closestIntensities'. Same format as 'irradiance_matrix' | 
| calibration_leds | A numeric vector of LED values from calibration, mapping to intensities and irradiances (i.e. the same length) | 
| calibration_wavelengths | A numeric vector of wavelengths from calibration, corresponding to intensities and irradiances | 
| calibration_intensities | A numeric vector of intensities (heliospectra units) from calibration | 
| calibration_irradiances | A numeric vector of measured irradiances (any units, as long as it is consistently used) from calibration | 
| peaks | Vector of length 8 or 9. Containing wavelengths at which each LED peaks. | 
Value
Matrix of intensities to set the lights to, to achieve desired irradiances
Examples
#' # Prep variables
target_irradiance = LightFitR::target_irradiance
closest = LightFitR::example_closest
calib = LightFitR::calibration
# Run the function
sle_intensities(target_irradiance, closest,
  calib$led, calib$wavelength, calib$intensity, calib$irradiance)
target irradiances
Description
Matrix of random target irradiances for example purposes
Usage
target_irradiance
Format
A matrix with 9 rows and 10 columns: each row represents an LED channel and each column represents an event
time vector
Description
Example timepoints for events
Usage
time_vector
Format
A vector of length 10 with timepoints in POSIXct format
Write the schedule to file that Heliospectra can parse
Description
Writes to json or csv format
Usage
write.helioSchedule(regime_matrix, filename, format = c("csv", "json"))
Arguments
| regime_matrix | Matrix containing light regime, as generated by makeRegime | 
| filename | Character. Filename to export to | 
| format | Character. Which format to export to? csv or json. Use extensions '.csv' or '.txt' | 
Value
Heliospectra schedule file in either the csv or json format
Examples
tempcsv_name = tempfile(fileext='.csv')
write.helioSchedule(LightFitR::example_regime, tempcsv_name, format='csv')
temptxt_name = tempfile(fileext='.txt')
write.helioSchedule(LightFitR::example_regime, temptxt_name, format='json')