cell_count data produced
by the diatom chain counter (Groves et al. 2026, doi:10.1093/plankt/fbaf064)
through the ifcb-pytorch-classify
pipeline and stored in .mat, .h5 and
.csv classification files. Abundance can now be reported in
cells rather than images, so a chain of eight cells counts as eight.
ifcb_summarize_cell_counts() reports cell abundance
and chain-length statistics (n_counted, mean,
median, max, sd) per sample and
class, and abundance per liter when given an hdr_folder.
n_counted is the number of ROIs the chain counter measured,
including those it found to hold a single cell.ifcb_extract_biovolumes() and
ifcb_summarize_biovolumes() gain a
use_cell_counts argument. When TRUE,
ifcb_summarize_biovolumes() adds a cell_counts
column, and cell_counts_per_liter when an
hdr_folder is supplied.single_cell_values (default c(-1, 0)) sets
which cell_count values are read as one cell: by default
the ROIs the counter skipped (-1) and those where it found
no cells (0). Any other value is used as it stands.cell_counts is NA rather than
0 for a sample whose classification file carries no
cell_count data, since a zero would look the same as a
taxon that was genuinely absent. counts still reports the
images, and a warning says how many files were affected. A missing value
inside a file that does carry cell_count data, such as a
blank CSV cell, also makes the affected sample’s
cell_counts NA, and is likewise reported with
a warning naming the samples and how many ROIs were missing a
value.ifcb_get_shark_colnames()
and ifcb_get_shark_example()) gains an
IMAGE_COUNT column after COUNT. Dividing
COUNT by IMAGE_COUNT gives the average cells
per image. That is not the same as mean_chain_length, which
averages only over the images the counter actually measured, whereas the
ratio includes the images it never looked at.ifcb_extract_biovolumes() and
ifcb_summarize_biovolumes() gain two arguments controlling
how the Menden-Deuer and Lessard (2000) carbon equations are applied.
Both keep the previous behavior by default, so carbon values do not
change unless you set one.
diatom_equation chooses the diatom equation.
"large" (the default) uses the large-diatom equation, as
ifcb-analysis does; "all" uses the all-sizes
equation, which gives small cells more carbon; "auto"
chooses per ROI by volume, keeping each equation inside the size range
it was fitted for. The two disagree at the 3000 micron^3 boundary,
predicting about 190 against 135 pgC, so "auto" makes
carbon fall as a cell grows past it. That is why it is not the default.
New helpers vol2C_diatom() and
vol2C_diatom_auto() are exported.carbon_conversion chooses the volume the equation is
applied to. The equations are fitted per cell, but an IFCB biovolume
covers a whole image, which for a chain-forming diatom is the whole
chain, so converting the chain volume in one go under-reports carbon.
"cell" converts per cell and sums over the chain, and
requires use_cell_counts = TRUE. See
?ifcb_extract_biovolumes for how large the difference
gets.ifcb_qc_sample(), which checks raw IFCB samples
(the .hdr, .adc and .roi triplet)
and returns one row of QC metrics and flags per sample. It looks for
missing files, ROI counts that disagree with the header, truncated
.roi files, run times that contradict the ADC, implausible
analyzed volumes, and ROI dimensions that failed to parse. Bead runs,
empty samples, oversized .roi files and high recorded
humidity or temperature are reported as advisory flags and do not fail
qc_pass. A check that cannot be run on a sample is reported
as NA and does not fail it either, so legacy headers
without a roiCount field are not penalized for a check that
could never apply. The function accepts a directory, sample names with a
data_folder, or explicit file paths, and needs no
Python.ifcb_extract_features() gains a multiblob
argument. With multiblob = TRUE it additionally writes
multiblob/<bin>_multiblob_v4.csv files inside the
features folder, holding the per-blob features of every blob in a region
of interest with more than one blob (the slim table describes only the
largest, plus summed* totals), one row per blob with
roi_number, blob_number and 18 morphological
columns. This is the sidecar output ifcb-features
introduced in v1.2.0, which is also the minimum version required; the
function stops with a clear error on older releases, since they never
compute per-blob features. As upstream, a bin in which no ROI has more
than one blob gets no sidecar file, so the file’s presence means the bin
genuinely holds multi-blob ROIs; the skip logic reads the
numBlobs column of a bin’s existing feature CSV to tell
whether a sidecar is expected, so a re-run with
multiblob = TRUE over a directory extracted without it
re-extracts only the bins that actually need one, without
overwrite = TRUE. ifcb_read_features() reads
these files as it stands, with multiblob = TRUE; its
multiblob filter now matches on the file name rather than the whole
path, so a feature folder located somewhere under a directory with
multiblob in its name no longer reads as all-multiblob (or,
with the default multiblob = FALSE, as empty).ifcb_save_classification() now reports a missing
roi_file before requiring hdf5r. Its tests no
longer depend on the suggested hdf5r package, fixing the
CRAN check failures on platforms without it.use_python = TRUE now skip when
scipy is unavailable, instead of letting
reticulate download an ephemeral Python environment
mid-check.memDecompress() grows its buffer
indefinitely instead of erroring. Such sections now fall through to the
incremental recovery path as intended.ifcb_classify_images(),
ifcb_classify_sample() and
ifcb_classify_models() now retry transient network failures
(dropped connections and HTTP 429/5xx responses) up to four times with
exponential backoff. A brief server outage, such as the hosted
SciLifeLab Serve instance restarting, used to fail every image it
touched with Couldn't connect to server, leaving a run of
NA rows mid-sample. Set
options(iRfcb.gradio_max_tries = ) to change the number of
attempts; a malformed value for either retry option is reported by name
rather than surfacing as a cryptic error elsewhere.ifcb_extract_biovolumes(),
ifcb_summarize_biovolumes() and
ifcb_summarize_cell_counts() now stop with an error when
one sample resolves to more than one classification file, for example a
folder holding both a .mat and an .h5 for the
same sample, and name the samples involved. Previously both files were
read and joined, which silently doubled that sample’s counts, biovolume
and carbon..csv files in a class directory. An IFCB Dashboard
class_scores export ({sample}_class.csv) could
be picked up and then fail with a confusing
Unknown or uninitialised column: 'class' error followed by
a WoRMS 400 response. Such files are now skipped with a warning naming
the missing columns when a folder is supplied, and raise a clear error
when passed explicitly. A valid label file named
{sample}_class.csv now resolves to the same sample as
{sample}.csv, so it joins under the right sample instead of
appearing as a phantom {sample}_class sample no HDR file
could match. Relatedly, an hdr_folder whose files match
none of the classified samples now warns and reports NA
per-liter values instead of aborting with an unexplained join error, and
the classifier column read from .mat files is
a plain character vector rather than a one-column matrix.ifcb_is_diatom() gains a details argument.
When TRUE it returns a data frame with the WoRMS class
resolved for each taxon instead of a logical vector. Use it to find
genus homonyms, that is diatom genera such as Navicula or
Actinocyclus that share a name with an animal and so
resolve to a non-diatom class, then add those taxa to
diatom_include. A class list in which nothing resolves in
WoRMS at all, such as one holding only labels like
unclassified or detritus, returns
NA classes instead of failing.ifcb_extract_biovolumes() and
ifcb_summarize_biovolumes() report the diatom
classification more clearly when verbose = TRUE. The
classes treated as diatoms are listed in full, classes missing from
WoRMS are listed separately, and the long list of non-diatoms is reduced
to a count. Previously that list was printed and truncated, making it
hard to see whether a class you expected to be a diatom had been
recognized as one.ifcb-analysis manual
classification files no longer requires Python.
ifcb_create_class2use(),
ifcb_create_manual_file(),
ifcb_adjust_classes(),
ifcb_correct_annotation(),
ifcb_replace_mat_values() and the
format = "mat" output of
ifcb_save_classification() write .mat files
with a native R implementation, producing the same output as the
previous scipy.io.savemat approach. The wrapper functions
that call them are Python-free as a result, so scipy and
numpy are no longer needed for annotation work.R.matlab as a dependency. Reading
.mat files without Python now uses the native R reader as
well, which decodes MATLAB UTF-16 text correctly, so accented class or
path names survive where R.matlab::readMat() could mangle
them. It reads every numeric storage type MATLAB uses to hold an array
compactly (int8 through uint32,
single and double), preserving each across a
read-write round-trip, including values at the signed and unsigned
32-bit limits that R cannot hold in an integer. Multi-row character
matrices, such as the filelistTB sample list that
ifcb-analysis summary files hold as one fixed-width row per
sample, are read as one string per row, so
ifcb_read_summary() handles multi-sample summaries the same
way with either reader. The reader also refuses input it cannot
represent faithfully, naming the variable and the reason, reports a
truncated file instead of reading it back quietly padded with zeros, and
rejects declared dimensions that disagree with the data carried rather
than recycling values to fill them out. The writer applies the same
standard: a value that does not fit the storage type a variable was read
with is refused rather than silently wrapped, and
ifcb_correct_annotation() and
ifcb_replace_mat_values() widen a classlist to double when
a new class id outgrows the compact integer type MATLAB stored it in.
All of this matters because ifcb_adjust_classes() and
ifcb_correct_annotation() write what they read back over
the same file. One thing it tolerates rather than refuses: a compressed
section that ends without its stream terminator, which some
classification files written by MATLAB contain. The data in those is
intact, so it is decoded incrementally and read, with a warning naming
the file. R.matlab has moved to Suggests.
R.matlab would
read a .mat containing a struct, an object, a sparse or
complex array, a logical array, more than two dimensions, or a MATLAB
string array (as saved by class2use = ["a" "b"] in a recent
MATLAB release), and iRfcb would then quietly write back something that
was not what it read. Those files are now named and refused instead. The
formats iRfcb itself deals with are unaffected: manual files,
class2use files and classifier output written by MATLAB
ifcb-analysis or the Python pipelines all read as before.
If you do have a third-party file that no longer opens,
ifcb_get_mat_names() and
ifcb_get_mat_variable() read it with
use_python = TRUE, which goes through SciPy
instead, once a Python environment has been set up with
ifcb_py_install().ifcb_extract_features() now works with both raw-data
readers used by WHOI ifcb-features.
Release v1.1.0 swapped pyifcb for the lighter ifcbkit,
which broke iRfcb against v1.1.0 and later, and since
ifcb_py_install(features = TRUE) installs the newest
release by default this affected new installations. Either reader now
works, and a new backend argument (or the
IRFCB_IFCB_BACKEND environment variable) pins one.
Measurements are unaffected for the D-style bins current instruments
produce. The readers differ only on older I-style bins and on ROIs with
zero height, so pin a reader if you need results comparable to an
earlier I-style run. Installing v1.1.0 or later also drops the
h5py dependency, which had restricted which Python versions
could be used.ifcb_extract_features() now works with
ifcb-features v1.2.0, which changed what
compute_features returns to carry the new multiblob output.
Without this change every ROI failed to unpack, and because a failed ROI
is skipped rather than fatal, the extraction would report success while
writing feature files holding only roi_number and no blob
images. All earlier ifcb-features releases still work, and
the extracted measurements are unchanged. The per-blob multiblob rows
themselves are not used, since they are not part of the slim feature
set.ifcb_extract_features() writing text instead of
numbers into the Eccentricity, MajorAxisLength
and MinorAxisLength columns of
<bin>_features_v4.csv. On numpy 2.3 and
later these values arrived as complex numbers and were written as
strings such as (0.797+0j), quietly turning three numeric
columns into text. They are numeric again and the values are unchanged,
with one exception worth knowing about for size spectra and biovolume
sums: a degenerate, one-pixel-wide blob is now measured as
0 rather than NaN, so it contributes a zero
instead of a missing value you could filter out. That matches upstream
ifcb-features and the summed* columns. To
reproduce an earlier run, pin ifcb-features v1.0.0 or
numpy < 2.3; see ?ifcb_py_install.ifcb_extract_features() no longer prints a
FutureWarning for every region of interest from recent
scikit-image releases, which had been breaking up the
progress bar. ifcb_py_install(features = TRUE) also holds
scikit-image below 0.28, the release that removes the
deprecated functions ifcb_features calls.ifcb_extract_features() no longer discards a whole
sequential run when one bin cannot be read. A corrupt or truncated
.roi used to escape as a Python traceback, taking every bin
already processed with it. Such a bin is now reported as a per-bin error
like any other.ifcb_extract_features() gains a
feature_tag argument controlling the feature file name. The
default ("features") writes
<bin>_features_v4.csv as before; "fea"
writes <bin>_fea_v4.csv, the name the IFCB Dashboard
serves.ifcb_volume_analyzed_from_adc() failing when
given more than one ADC file, or a URL. The existence check was not
vectorized, so a vector of files stopped with
the condition has length > 1 even though the rest of the
function already looped over them, and it rejected URLs outright even
though the rest of the function handles remote files. Local paths are
now checked one by one, with every missing path reported at once, and
URLs pass straight through.ifcb_get_runtime() and
ifcb_volume_analyzed_from_adc() with their MATLAB
ifcb-analysis counterparts (IFCBxxx_readhdr.m,
IFCB_volume_analyzed_fromADC.m), fixing five places where
the R port had drifted from the reference.
run time and
inhibit time on a single line, were read with the inhibit
time set to a copy of the run time, so every legacy sample reported a
look time of zero and an analyzed volume of zero. The two values are now
read from their own positions on the line, as the reference does.strmatch does. A header holding an extra key that merely
ends in runtime: used to make
ifcb_get_runtime() return two values, which
ifcb_qc_sample() then recycled into a duplicated, failing
row for that sample.mode(), which in R is
base::mode() and not the statistical mode the MATLAB
reference computes, so the correction always failed with
non-numeric argument to binary operator on exactly the
instruments it was written for.NA with a warning instead
of a silent 0, matching the NaN the reference
returns. A zero looked exactly like an instrument that analyzed no
water, and made ifcb_qc_sample() fail such samples for an
implausible volume.ifcb_correct_annotation() and
ifcb_replace_mat_values() now check their inputs and fail
with a message you can act on. An out-of-range ROI number or
column_index reports the value and the valid range instead
of subscript out of bounds, a classlist with fewer than two
columns is reported as such, and a missing input file or a
.mat file without a classlist variable is
named explicitly. ifcb_adjust_classes() likewise passes the
reader’s own refusal message through when it skips a file, instead of
relabeling every problem “empty or corrupted”.use_python = TRUE being ignored when Python and
SciPy were in fact available.
ifcb_get_mat_names(), ifcb_get_mat_variable(),
ifcb_read_summary(),
ifcb_count_mat_annotations(),
ifcb_extract_annotated_images() and
ifcb_adjust_classes() decided whether they could use Python
by looking for scipy in
reticulate::py_list_packages(), and fell back to the R
reader without saying so when it was not listed. Two things went wrong
with that: on a conda environment the listing reports
conda’s own base packages, so an installed and perfectly importable
scipy was absent from it; and the check did not initialize
Python, so in a fresh session it failed whatever the environment held.
Availability is now settled by asking Python to import the module, and
when use_python = TRUE is requested but Python with
scipy is genuinely unavailable, the fallback to the R
reader is announced with a warning (once per session) instead of
happening silently. This matters most when a .mat file
cannot be read by the R reader, since use_python = TRUE is
the documented way to read it.ifcb_read_hdr_data(hdr_folder = ) and
ifcb_annotate_batch(adc_folder = ). Both read as though the
package had renamed hdr_folder and adc_folder
everywhere, which it has not: those two functions were changed to accept
a vector of file paths, so their argument was renamed to match.
Functions that genuinely take a single directory, such as
ifcb_psd(), ifcb_summarize_biovolumes(),
ifcb_summarize_cell_counts() and
ifcb_annotate_samples(), keep hdr_folder and
adc_folder and are not deprecated.vol2C_lgdiatom() documentation, which
said the relationship applied to diatoms above 2000 micron^3. The
Menden-Deuer and Lessard (2000) large-diatom equation is for cells above
3000 micron^3.ifcb_download_dashboard_data(),
ifcb_download_dashboard_metadata(),
ifcb_match_taxa_names() and ifcb_is_diatom())
are now wrapped in try() so they fail gracefully when the
service is unreachable.ifcb_extract_features(), which computes the slim
feature set (version 4) and blob masks from raw IFCB data by calling the
WHOI ifcb-features
Python package. Features (<bin>_features_v4.csv) and
blobs (<bin>_blobs_v4.zip) are written to separate,
user-specified folders, existing outputs are skipped unless
overwrite = TRUE, and bins can be processed in parallel via
parallel = TRUE / n_cores. A cli
progress bar advances as each bin is processed (for both sequential and
parallel runs), and interrupting the function (e.g. ESC / Stop) reliably
terminates the parallel worker processes instead of leaving them writing
files in the background.features and features_ref arguments
to ifcb_py_install() to optionally install the WHOI
ifcb-features package (and its dependencies) from GitHub,
as required by ifcb_extract_features(). By default the
latest published release is installed; features_ref can pin
a specific tag or install the development branch. When installing into
an existing virtual environment, the install is skipped if
ifcb-features already imports successfully (unless
features_ref is supplied), avoiding a slow repeated
download.dataset_name argument to
ifcb_list_dashboard_bins() to optionally restrict the
listing to bins from a specific dataset. This argument remains useful
for self-hosted dashboard instances that have not yet updated to remove
the api/list_bins endpoint.IRFCB_PYTHON_VENV environment
variable. When USE_IRFCB_PYTHON = "TRUE", you can now set
IRFCB_PYTHON_VENV to either a named virtualenv or a full
path to a venv directory to control which Python environment is
activated on package load. If unset, the previous behavior of
auto-discovering a venv named iRfcb is retained.ifcb_list_dashboard_bins() is deprecated. The upstream
IFCB Dashboard removed the api/list_bins endpoint on
2026-03-08 (WHOIGit/ifcbdb@8c5839f1),
so the function no longer works against the WHOI dashboard and other
deployments tracking upstream. Use
ifcb_download_dashboard_metadata() instead, which retrieves
the same per-bin information from the still-supported
api/export_metadata endpoint.ifcb_py_install() are now installed with a
clean dependency resolution (no longer using pip
--ignore-installed). Previously, installing packages with
pinned, compiled dependencies (such as
ifcb-features/pyifcb, which pin exact
numpy/scipy/pandas versions)
could layer incompatible builds on top of existing ones and corrupt the
environment
(e.g. ImportError: cannot import name '_spropack').gradio_url for
ifcb_classify_images(),
ifcb_classify_sample(),
ifcb_classify_models(), and
ifcb_save_classification() has changed from the Hugging
Face example Space (https://irfcb-classify.hf.space) to a
more stable instance hosted on SciLifeLab Serve
(https://ifcb.serve.scilifelab.se). The default
model_name has correspondingly been updated to
"SMHI NIVA SYKE SAMS SZN ResNet 50 V6". The Hugging Face
Space remains documented as a free alternative for testing and
demonstration.stop(),
warning(), message()) and
utils::txtProgressBar to the cli package.
Errors, warnings, and informational messages now use semantic inline
markup (file paths, argument names, function names, values) and
pluralization. Progress bars are rendered via
cli::cli_progress_bar(). cli is now an
Imports dependency.adc_get_roi_columns() failing to detect ROI
dimension columns for older IFCB instruments (e.g. IFCB110) where HDR
files use different column name casing
(ROIwidth/ROIheight/start_byte)
compared to newer instruments
(RoiWidth/RoiHeight/StartByte).
Column matching is now case-insensitive and positional fallback uses
column indices instead of V-prefixed names (#77).ifcb_classify_images() to classify one or
more pre-extracted IFCB PNG images through a CNN model served by a
Gradio application, returning a data frame of predicted class names and
confidence scores. Per-class thresholds are applied automatically.ifcb_classify_sample() to classify all
images in a raw IFCB sample (.roi file) without prior PNG
extraction. Internally extracts images to a temporary directory and
delegates to ifcb_classify_images().ifcb_save_classification() to classify
IFCB samples via Gradio API and save results as HDF5 (.h5),
MAT (.mat), or CSV (.csv) files.ifcb_classify_models() to list available
CNN models from a Gradio classification server..h5) and CSV (.csv)
classification file support to ifcb_extract_biovolumes(),
ifcb_extract_classified_images(),
ifcb_summarize_class_counts(),
ifcb_summarize_biovolumes(), and
summarize_TBclass(), in addition to existing
.mat support.ifcb_extract_pngs(),
ifcb_extract_annotated_images(), and
ifcb_extract_classified_images()) now preserve raw pixel
values by default (normalize = FALSE), producing images
comparable to IFCB Dashboard and other standard IFCB software.
Previously, pixel values were stretched to the full 0-255 range using
min-max normalization. This change can affect classifier training
results. Set normalize = TRUE to restore the previous
behavior (#75).ifcb_create_manual_file() now writes
class2use_auto as a numeric matrix, matching the format
produced by ifcb-analysis (#74).micron_factor in
ifcb_psd() and ifcb_extract_biovolumes().skip_class in
ifcb_extract_annotated_images().ifcb_run_image_gallery() is deprecated in favor of
ClassiPyR::run_app(). See https://europeanifcbgroup.github.io/ClassiPyR/ for more
information.old_adc in ifcb_extract_pngs(),
ifcb_extract_annotated_images(), and
ifcb_extract_classified_images(). ADC format (old IFCB1-6
vs new) is now auto-detected from the HDR file’s
ADCFileFormat parameter and the ADC column count.mat_files in ifcb_extract_biovolumes() and
ifcb_summarize_biovolumes() (replaced by
class_files).mat_recursive in ifcb_extract_biovolumes()
and ifcb_summarize_biovolumes() (replaced by
class_recursive).ifcb_annotate_samples() to create manual
classification .mat files compatible with the
ifcb-analysis MATLAB repository, using PNG images organized
in class named subfolders and a class2use.mat file.ifcb_zip_images_by_class() to zip each PNG
subfolder with optional random sampling. Useful for preparing
class-specific image archives for submission.diatom_include argument to
ifcb_extract_biovolumes() and ifcb_is_diatom()
for manually forcing specific taxa to be treated as diatoms (overrides
WoRMS classification).timestamp_param argument to
ifcb_get_ferrybox_data() allowing the Ferrybox timestamp
column to be specified dynamically instead of being hard coded.max_time_diff_min argument to
ifcb_get_ferrybox_data() controlling the maximum allowed
time difference in minutes when matching Ferrybox data to requested
timestamps.biovolume_only argument to
ifcb_read_features() to allow reading only biovolume
related columns, improving performance for large feature tables.add_trailing_numbers argument to
ifcb_extract_annotated_images() to control whether a
zero-padded numeric suffix based on the manual class index is appended
to class names in the output filenames.include_classes argument to
ifcb_prepare_whoi_plankton() to allow explicit selection of
classes to include during processing.\donttest{}
instead of \dontrun{}.ifcb_get_ferrybox_data() is now
more flexible and can fall back to the closest available Ferrybox
observation within the specified time window when no exact or rounded
match is found.ifcb_summarize_biovolumes() and
ifcb_extract_biovolumes() are now more flexible and accept
individual .mat files in addition to folders.ifcb_extract_biovolumes() and
ifcb_summarize_biovolumes().ifcb_get_ecotaxa_example().ifcb_create_manual_file() and
ifcb_create_empty_manual_file() now correctly handles
NaN values in the classlist.ifcb_create_empty_manual_file() has been renamed to
ifcb_create_manual_file().ifcb_match_taxa_names() is now superseded by
SHARK4R::match_worms_taxa().mat_folder in ifcb_summarize_biovolumes()
and ifcb_extract_biovolumes() (replaced by
mat_files).expected_checksum in
ifcb_download_test_data().ifcb_download_dashboard_metadata() and
ifcb_list_dashboard_bins().diatom_include parameter to
ifcb_extract_biovolumes() and
ifcb_summarize_biovolumes() for manually forcing specific
taxa to be treated as diatoms (overrides WoRMS classification)
(#65).bins parameter to ifcb_psd() for
selecting which bins to process.fea_v parameter to ifcb_psd() for
selecting feature-file version.use_plot_subfolders parameter to
ifcb_psd() to optionally save plots in subdirectories of
plot_folder based on flag status.flags parameter to ifcb_psd_plot()
to optionally add the quality flag annotation to the plot.ifcb_extract_biovolumes() now support both filename
formats _fea_v*.csv and _features_v*.csv,
increasing compatibility with legacy and new output formats (#61).ifcb_read_features(),
ifcb_summarize_png_metadata(),
ifcb_summarize_biovolumes(), and
ifcb_extract_biovolumes() now include an optional parameter
to select specific feature file versions (e.g., _v2,
_v4), allowing finer control over which feature data are
read and processed.$data, $fits and $flags
data frames returned by ifcb_psd() now use full bin names
(<sample>_<ifcb>) as sample names, improving
uniqueness and consistency with downstream workflows.$data and $fits data frames returned
by ifcb_psd() now preserves the original column names,
including names starting with numbers or containing special
characters.ifcb_psd() has
been replaced by u in $data headers.$flags headers in ifcb_psd() to
use sample instead of file, ensuring
consistent naming across all outputs.ifcb_psd() when plot_folder is specified,
improving processing speed.ifcb_download_test_data() gains checksum validation,
keep_zip option, and improved retry logic.ifcb_extract_biovolumes() and
ifcb_summarize_biovolumes() gain a
drop_zero_volume option to exclude artifacts with zero
biovolumeifcb_read_features() and
ifcb_extract_biovolumes() now handles single
feature_files correctly.ifcb_download_dashboard_data()
and ifcb_download_whoi_plankton().NEWS.md to track package changes.ifcb_download_dashboard_data() for fetching data from
the WHOI IFCB Dashboard.ifcb_download_whoi_plankton() for downloading
WHOI-Plankton PNG datasets.ifcb_prepare_whoi_plankton() to process WHOI data for
integration.vignette("whoi-plankton-data-integration").USE_IRFCB_PYTHON environment variable when
loading the package.ifcb_extract_pngs()ifcb_extract_classified_images()ifcb_extract_annotated_images()gamma argument to
ifcb_extract_annotated_images () and
ifcb_extract_classified_images() for gamma correction.ifcb_is_near_land():
plot = TRUE.source.utm_zone, which is now
determined automatically from longitude.ifcb_read_hdr_data() now correctly handles files from
IFCB Acquire 1.x.x.x (#41).ifcb_convert_filenames() is more efficient and now
correctly parses filenames like "IFCB1_2010_309_192918"
(#40).ifcb_py_install() has changed to
“~/.virtualenvs/iRfcb”..adc file format (IFCB1-6) by
argument old_adc in:
ifcb_extract_pngs()ifcb_extract_classified_images()ifcb_extract_annotated_images()ifcb_read_mat() now returns consistent data structures
aligned with R.matlab::readMat() (#50).ifcb_summarize_png_data() is now defunct (previously
deprecated in version 0.3.11).adc_folder in ifcb_annotate_batch()
(replaced by adc_files).unclassified_id in
ifcb_create_empty_manual_file() (replaced by
classlist).utm_zone in ifcb_is_near_land() (now
determined automatically from longitude).ifcb_create_empty_manual_file() now accepts a complete
class list via classlist, replacing the older
unclassified_id.ifcb_summarize_biovolumes() now handles custom class
lists.fs and
shinytest.imager (replaced by png) in
ifcb_extract_pngs() and base64enc
dependencies.gamma argument to
ifcb_extract_pngs().verbose argument to functions:
ifcb_download_test_data()ifcb_extract_biovolumes()ifcb_is_diatom()ifcb_read_features()ifcb_summarize_biovolumes()iRfcb:::retrieve_worms_records()) to top-level function:
ifcb_match_taxa_names().ifcb_get_ferrybox_data() where multiple
close ferrybox timestamps caused duplicate rows. Now returns only the
nearest match.ifcb_get_shark_example() and
ifcb_get_shark_colnames() for testing and
documentation.ifcb_merge_manual() to merge manual
.mat datasets.ifcb_adjust_classes() to adjust classes in manual
data.ifcb_create_class2use() to generate a class2use
file.ifcb_create_empty_manual_file() to create new
manual .mat files.ifcb_annotate_batch() to annotate multiple
.mat files in a batch based on .png
images..mat files to save space using
do_compression argument in:
ifcb_correct_annotation()ifcb_replace_mat_values()ifcb_summarize_png_metadata() to summarize
EcoTaxa metadata.ifcb_get_ecotaxa_example() to extract EcoTaxa
headers and example data.iRfcb:::split_large_zip() in
ifcb_zip_pngs().ifcb_summarize_png_data() (replaced by
ifcb_summarize_png_counts()).ifcb_get_svea_position().iRfcb:::handle_missing_positions().manual_folder,
feature_folder, and class_folder in several
functions (ifcb_count_mat_annotations(),
ifcb_extract_biovolumes(),
ifcb_read_features(),
ifcb_summarize_biovolumes().nrow(taxa_list) == 0 in
ifcb_count_mat_annotations().mat_recursive option to
ifcb_count_mat_annotations().manual_recursive option to
ifcb_extract_annotated_images() and
ifcb_zip_matlab().roi_recursive option to
ifcb_extract_annotated_images().data_recursive option to
ifcb_zip_matlab().feature_recursive option to
ifcb_zip_matlab().marine_only to ifcb_is_diatom(),
iRfcb:::retrieve_worms_records(),
ifcb_summarize_biovolumes() and
ifcb_extract_biovolumes().feature_recursive to
ifcb_extract_biovolumes() and
ifcb_summarize_biovolumes().mat_recursive to
ifcb_extract_biovolumes() and
ifcb_summarize_biovolumes().hdr_recursive to
ifcb_summarize_biovolumes().ifcb_is_diatom().ifcb_summarize_biovolumes().ifcb_is_in_basin().ifcb_get_shark_example() and
ifcb_get_shark_colnames().iRfcb:::retrieve_worms_records().ifcb_get_svea_position() (replaced by
ifcb_get_ferrybox_data()).ifcb_summarize_biovolumes().sleep_time parameter for
ifcb_download_test_data()..mat count edge case.curl for downloads.ifcb_psd() with
argument micron_factor.testthat for improved
stability.verbose argument to several functions to provide
detailed progress messages during execution.ifcb_replace_mat_values() now only handles
.mat files in the manual_folder.ifcb_is_near_land() now returns NA if
coordinates passed to the function contain NA values.ifcb_get_trophic_type() to assign trophic
strategy to taxa.ifcb_get_shark_colnames():
WADEP, PDMET,
METFP, IFCBNO, TRPHY,
ABUND, and BIOVOL.SAMPLE_TIME,
ABUND_UNITS_PER_LITER, BIOVOL_PER_SAMPLE,
BIOVOL_PER_LITER, C_CONC_PER_LITER, and
SEA_BASIN.extract_aphia_id(): Extract AphiaID from WoRMS
record.extract_class(): Extract taxonomic class from WoRMS
record.handle_missing_positions(): Handle missing positions by
rounding timestamps.ifcb_extract_biovolumes(): Compute biovolumes and
carbon from IFCB data.ifcb_get_shark_colnames(): Retrieve column names for
SHARK submission.ifcb_get_svea_position(): Extract GPS coordinates from
ferrybox data.ifcb_is_diatom(): Identify diatoms in a taxa list.ifcb_is_in_basin(): Check whether points fall inside a
sea basin.ifcb_psd_plot(): Create particle size distribution
plots from IFCB data.ifcb_read_features(): Read IFCB feature files from a
specified folder.ifcb_summarize_biovolumes(): Summarize biovolumes and
carbon content.ifcb_summarize_class_counts(): Count TreeBagger
classifier outputs.ifcb_which_basin(): Return name of sea basin a point
belongs to.summarize_TBclass(): Summarize TreeBagger classifier
results.vol2C_lgdiatom(): Convert biovolume to carbon for large
diatoms.vol2C_nondiatom(): Convert biovolume to carbon for
non-diatom protists.ifcb_read_hdr_data() where
gps_only filtering could fail.ifcb_volume_analyzed() when
inhibition time == 0 (#2).ifcb_is_near_land() by applying
sf::st_wrap_dateline() only when the CRS is
geographic.Initial development release of iRfcb.
ifcb_convert_filenames()ifcb_correct_annotation()ifcb_count_mat_annotations()ifcb_create_manifest()ifcb_download_test_data()ifcb_extract_annotated_images()ifcb_extract_classified_images()ifcb_extract_pngs()ifcb_get_mat_names()ifcb_get_mat_variables()ifcb_get_runtime()ifcb_is_near_land()ifcb_psd()ifcb_py_install()ifcb_read_hdr_data()ifcb_read_summary()ifcb_replace_mat_values()ifcb_run_image_gallery()ifcb_summarize_png_data()ifcb_volume_analyzed_from_adc()ifcb_volume_analyzed()ifcb_zip_matlab()ifcb_zip_pngs()