SpectraDx
pectraDx
SpectraDxlight to insight
← Back to blog
Raman

Raman Clinical Integration: Horiba, Renishaw, and Handheld APIs

Raman clinical integration across Horiba, Renishaw, and handheld devices - vendor APIs, data formats, fluorescence handling, and point-of-care challenges.

Raman Clinical Integration: Horiba, Renishaw, and Handheld APIs

Raman spectroscopy is crossing the threshold from research curiosity to clinical tool. SERS-based pathogen detection panels that return results in minutes. Handheld devices that identify unknown pills at the bedside. Intraoperative probes that distinguish tumor margin from healthy tissue in real time. The clinical applications are real, the instruments are shipping, and the question is no longer "does Raman work for diagnostics?" It is "how do we connect these instruments to the rest of the clinical workflow?"

That question is harder than it sounds. The Raman vendor ecosystem is more fragmented than FTIR. There is no single dominant instrument platform (the way Bruker dominates FTIR). Data formats vary by vendor. Fluorescence - the bane of biological Raman measurements - requires aggressive preprocessing that must be built into the software pipeline. And the newest generation of handheld devices introduces connectivity, battery, and ruggedization challenges that bench-top systems never had to consider.

This article is a practical guide for teams building clinical software around Raman spectrometers. We cover the vendor landscape, data format differences, fluorescence handling, SERS considerations, handheld device challenges, and the overall clinical workflow architecture.


Why Raman for Clinical Diagnostics

Before diving into integration, it is worth understanding why Raman is compelling for clinical applications - and where it fits relative to FTIR and NIR. For a detailed comparison of all three modalities, see our spectroscopy comparison guide.

Non-contact, non-destructive measurement. Raman requires no sample preparation. Point the laser at the sample, collect scattered light, extract the spectrum. The sample is not consumed or altered. For clinical specimens that need to be preserved for histology or other downstream tests, this matters.

Works through packaging. Raman photons pass through glass, many plastics, and water with minimal interference. You can measure a blood sample through the wall of a sealed collection tube. You can identify a pharmaceutical tablet inside its blister pack. FTIR cannot do this - ATR requires direct contact, and transmission requires thin films. This through-barrier capability is why Raman dominates pharmaceutical identity verification and is gaining ground in clinical microbiology.

Water is nearly invisible. Water is a weak Raman scatterer. Biological samples - blood, serum, urine, tissue - are mostly water. In FTIR, water absorption dominates the mid-IR spectrum and must be aggressively subtracted. In Raman, water is a minor background contributor. This makes Raman particularly suitable for aqueous biological specimens.

Complementary to FTIR. The selection rules for Raman and IR activity are different. Vibrations that produce strong IR absorption (polar bond stretching) are often weak in Raman, and vice versa. Symmetric, non-polar vibrations - C=C stretches in lipids, aromatic ring breathing modes - are strong Raman scatterers but weak IR absorbers. Using both modalities together gives a more complete molecular fingerprint.

SERS enables trace detection. Surface-Enhanced Raman Spectroscopy (SERS) uses metallic nanostructures (typically gold or silver) to amplify the Raman signal by factors of 10^6 to 10^10. This transforms Raman from a technique that requires high concentrations into one that can detect single molecules in principle, and nanomolar concentrations in practice. SERS-based diagnostic panels for bacterial identification and antimicrobial susceptibility testing, viral detection, and biomarker quantification are now in clinical validation.

Handheld devices enable point-of-care. Miniaturized Raman spectrometers - some smaller than a smartphone - are commercially available. They bring molecular identification to the bedside, the ambulance, and the field clinic, not just the centralized laboratory. One high-impact application is rapid drug identification in the emergency department.


The Vendor Landscape

The Raman instrument market is more fragmented than FTIR. There is no single player with 60%+ market share the way Bruker dominates FTIR. Instead, you have a mix of research-grade confocal systems, industrial analyzers, handheld devices, and OEM spectrometer modules - each with different software stacks and integration approaches.

Horiba (LabSpec / LabRAM)

Horiba Scientific manufactures the LabRAM series of confocal Raman microscopes - high-end instruments used in research and advanced clinical applications like cancer tissue mapping. The software is LabSpec 6.

Integration approach: LabSpec 6 includes an SDK for automation. The API is COM-based (similar to Bruker's VBToolkit Pro approach), running on Windows. You can control the motorized stage, set laser parameters, trigger acquisitions, and retrieve spectral data programmatically.

import win32com.client
 
# Connect to LabSpec 6 COM server
labspec = win32com.client.Dispatch("LabSpec6.Application")
 
# Set acquisition parameters
labspec.SetAcquisitionTime(10)      # 10 second exposure
labspec.SetAccumulations(3)          # 3 accumulations averaged
labspec.SetLaserWavelength(785)      # 785nm laser
 
# Trigger acquisition
labspec.Acquire()
 
# Retrieve spectrum
x_data = labspec.GetXData()          # Raman shift (cm-1)
y_data = labspec.GetYData()          # Intensity (counts)

Data export formats: .spc (Galactic/Thermo), .txt, .csv. LabSpec also uses its own .labspec project files, but these are not useful for external integration - export to .spc or .txt instead.

Clinical relevance: Horiba confocal systems are research-grade instruments with price tags starting around $150K. They appear in clinical research settings (tissue diagnostics, cell imaging) rather than routine clinical workflows. If your deployment uses a Horiba, it is likely a specialized application.

Renishaw (WiRE)

Renishaw builds high-performance Raman systems (inVia series) with their WiRE (Windows-based Raman Environment) software. Renishaw has a strong presence in industrial and materials science applications and is increasingly active in pharmaceutical and biomedical markets.

Integration approach: WiRE has an automation API accessible via COM/ActiveX. Renishaw also provides StreamLine and LiveTrack capabilities for rapid mapping and surface-following, which are relevant for tissue scanning applications.

Data export formats: .wdf (Renishaw's proprietary format), .spc, .txt. The .wdf format is well-documented relative to many proprietary spectral formats, and open-source parsers exist:

# Using the renishawWiRE Python library to read .wdf files
from renishawWiRE import WDFReader
 
reader = WDFReader("tissue_map.wdf")
 
# Access spectral data
wavenumbers = reader.xdata            # Raman shift axis
spectra = reader.spectra              # 2D array: (n_points, n_wavenumbers)
 
# For mapping data, get spatial coordinates
x_coords = reader.xpos
y_coords = reader.ypos
 
print(f"Map size: {len(x_coords)} x {len(y_coords)} points")
print(f"Spectral range: {wavenumbers[0]:.0f} - {wavenumbers[-1]:.0f} cm-1")

Clinical relevance: Renishaw systems are used in research settings for tissue Raman mapping and are involved in clinical trials for cancer diagnostics. The instruments are research-grade in terms of price and complexity.

Wasatch Photonics (Enlighten)

Wasatch Photonics deserves special attention because their integration approach is radically different from the major vendors. Their spectroscopy software, Enlighten, is open source (GPLv3), written in Python, and designed for OEM integration.

Integration approach: Because Enlighten is open-source Python, you can fork it, embed it, or use it as a reference implementation. Wasatch also provides wasatch-python, a lower-level Python driver for direct spectrometer control:

from wasatch.WasatchDevice import WasatchDevice
from wasatch.WasatchDeviceWrapper import WasatchDeviceWrapper
 
# Connect to the spectrometer via USB
device = WasatchDeviceWrapper(WasatchDevice())
if not device.connect():
    raise ConnectionError("No Wasatch spectrometer found")
 
# Configure acquisition
device.hardware.set_integration_time_ms(100)
device.hardware.set_laser_enable(True)
 
# Acquire spectrum
reading = device.acquire_spectrum()
spectrum = reading.spectrum          # intensity array
wavelengths = device.wavelengths     # wavelength axis (nm)
wavenumbers = device.wavenumbers     # Raman shift axis (cm-1)
 
# Cleanup
device.hardware.set_laser_enable(False)
device.disconnect()

Clinical relevance: Wasatch spectrometers are affordable OEM modules ($3K-$15K) used as building blocks inside custom devices. If you are building a point-of-care Raman device - a handheld probe, a benchtop analyzer, a flow-cell based system - Wasatch modules with the open-source software stack are a strong starting point.

Ocean Insight (formerly Ocean Optics)

Ocean Insight manufactures modular USB spectrometers and offers Raman-capable systems. Their OceanDirect SDK provides Python bindings for direct spectrometer control.

Integration approach: OceanDirect is a C-based SDK with Python wrappers. The API is straightforward - connect, configure, acquire:

from oceandirect import OceanDirect
 
od = OceanDirect()
device_count = od.find_devices()
device = od.open_device(0)
 
# Configure
device.set_integration_time_micros(50000)  # 50ms
 
# Acquire
spectrum = device.get_formatted_spectrum()
wavelengths = device.get_wavelengths()
 
device.close()
od.close()

Clinical relevance: Ocean Insight spectrometers are the smallest and most affordable option. They appear inside custom handheld and embedded devices rather than as standalone instruments.

Metrohm (B&W Tek)

Metrohm acquired B&W Tek and sells handheld Raman devices - NanoRam for pharmaceutical raw material verification and TacticID for hazmat/narcotics identification. These are purpose-built devices with locked-down software, not general-purpose spectrometers.

Integration approach: Limited. These devices are designed as self-contained analyzers with their own onboard libraries. Key constraints:

  • Data can be exported as reports or CSV files, but real-time programmatic control is restricted
  • Integration typically happens at the results level - pulling classification results out of the device - rather than at the spectral data level

Cobalt Light / Agilent (SORS)

Spatially Offset Raman Spectroscopy (SORS) is a specialized technique for through-barrier measurement - identifying contents of opaque containers without opening them. Agilent (which acquired Cobalt Light Systems) sells SORS instruments for pharmaceutical and security applications. Integration is similar to the Metrohm model: results-level export rather than raw spectral control.


Data Format Differences from FTIR

If you are coming from the FTIR world, Raman data requires a mental model adjustment.

Raman Shift vs. Absolute Wavenumber

FTIR spectra use absolute wavenumber (cm^-1) - a direct measure of the photon's energy. Raman spectra use Raman shift (also in cm^-1), which is the difference between the laser photon energy and the scattered photon energy. A peak at 1600 cm^-1 in a Raman spectrum means the scattered photon lost 1600 cm^-1 of energy relative to the excitation laser, regardless of which laser you used.

This distinction matters for data pipelines. An FTIR peak at 1650 cm^-1 always corresponds to the same photon energy. A Raman peak at 1650 cm^-1 shift corresponds to different absolute photon energies depending on the laser:

def raman_shift_to_absolute(shift_cm1, laser_nm):
    """Convert Raman shift (cm-1) to absolute wavenumber (cm-1)."""
    laser_cm1 = 1e7 / laser_nm
    return laser_cm1 - shift_cm1
 
# Same Raman shift, different absolute wavenumbers
print(raman_shift_to_absolute(1650, 532))   # 17159 cm-1 (green laser)
print(raman_shift_to_absolute(1650, 785))   # 11089 cm-1 (NIR laser)
print(raman_shift_to_absolute(1650, 1064))  # 7752 cm-1  (IR laser)

Your data pipeline must track the laser wavelength as metadata and standardize on Raman shift for any cross-instrument comparisons.

File Formats

There is no universal standard for Raman data files. In practice, you will encounter:

FormatDescriptionPython support
.spc (Galactic/Thermo)The closest thing to a standard. Binary format with header, x-data, y-dataspc_io, spectrochempy
.wdf (Renishaw)Proprietary but parseablerenishawWiRE
.txt / .csvTab or comma-delimited columns of (wavenumber, intensity). Universally readable but loses metadataBuilt-in
JCAMP-DX (.dx, .jdx)ISO standard for spectral data. Less prevalent in Raman than IRjcamp

A clinical integration layer must accept all of these. Our approach is to normalize everything into a common internal representation immediately upon ingest:

import numpy as np
from dataclasses import dataclass
from typing import Optional
 
@dataclass
class RamanSpectrum:
    """Normalized internal representation of a Raman spectrum."""
    raman_shift: np.ndarray       # cm-1, ascending order
    intensity: np.ndarray         # counts or arbitrary units
    laser_wavelength_nm: float    # excitation wavelength
    exposure_time_s: float        # integration time
    accumulations: int            # number of co-added scans
    source_format: str            # original file format
    instrument_id: str            # unique instrument identifier
    timestamp: str                # ISO 8601 acquisition time
    metadata: Optional[dict] = None
 
def load_raman_spectrum(filepath: str, **kwargs) -> RamanSpectrum:
    """Load a Raman spectrum from any supported format."""
    ext = filepath.lower().rsplit('.', 1)[-1]
 
    if ext == 'spc':
        return _load_spc(filepath, **kwargs)
    elif ext == 'wdf':
        return _load_wdf(filepath, **kwargs)
    elif ext in ('txt', 'csv'):
        return _load_delimited(filepath, **kwargs)
    elif ext in ('dx', 'jdx'):
        return _load_jcamp(filepath, **kwargs)
    else:
        raise ValueError(f"Unsupported format: {ext}")

The Fluorescence Problem

Fluorescence is the single biggest obstacle to clinical Raman spectroscopy. It is not a minor inconvenience - in biological samples, fluorescence can produce a background signal 100x to 10,000x stronger than the Raman signal. If your software cannot handle fluorescence, your Raman clinical integration will fail on real samples.

Why Biological Samples Fluoresce

When a laser photon strikes a molecule, three things can happen: elastic scattering (Rayleigh), inelastic scattering (Raman), or absorption followed by fluorescence emission. Fluorescence is far more probable than Raman scattering. Biological samples contain multiple fluorophores - proteins (tryptophan, tyrosine), porphyrins in blood, melanin in skin, collagen, elastin, NADH, flavins. All of these fluoresce when hit with visible or near-IR excitation.

The result is a broad, featureless hump that overwhelms the sharp Raman peaks. A raw spectrum from a tissue sample measured with a 532nm laser is typically 95% fluorescence and 5% Raman signal.

Software Solutions: Baseline Correction

The most common software approach is to estimate the fluorescence background and subtract it. Several algorithms work:

Asymmetric Least Squares (ALS) - fits a smooth baseline to the spectrum, penalizing deviations below the baseline more heavily than above. This forces the baseline to follow the fluorescence envelope while the Raman peaks stick up above it:

import numpy as np
from scipy import sparse
from scipy.sparse.linalg import spsolve
 
def als_baseline(y, lam=1e6, p=0.01, niter=10):
    """
    Asymmetric Least Squares baseline estimation.
 
    Parameters:
        y: spectrum intensity array
        lam: smoothness parameter (larger = smoother baseline)
             Typical range for Raman: 1e5 to 1e7
        p: asymmetry parameter (smaller = baseline hugs bottom more)
             Typical range: 0.001 to 0.05
        niter: number of iterations (10 is usually sufficient)
 
    Returns:
        Estimated baseline array (same length as y)
    """
    L = len(y)
    D = sparse.diags([1, -2, 1], [0, -1, -2], shape=(L, L - 2))
    w = np.ones(L)
 
    for _ in range(niter):
        W = sparse.spdiags(w, 0, L, L)
        Z = W + lam * D.dot(D.T)
        baseline = spsolve(Z, w * y)
        w = p * (y > baseline) + (1 - p) * (y <= baseline)
 
    return baseline
 
# Usage
raw_spectrum = np.loadtxt("tissue_sample.txt")
wavenumbers = raw_spectrum[:, 0]
intensity = raw_spectrum[:, 1]
 
baseline = als_baseline(intensity, lam=1e6, p=0.01)
corrected = intensity - baseline

Polynomial baseline correction - simpler but less robust. Fit a polynomial (typically degree 5-8) to manually or automatically selected baseline points:

from scipy.optimize import curve_fit
 
def iterative_poly_baseline(x, y, degree=6, niter=50, threshold=0.5):
    """
    Iterative polynomial baseline fitting.
 
    Points above the fit by more than threshold * std
    are excluded in subsequent iterations.
    """
    mask = np.ones(len(y), dtype=bool)
 
    for _ in range(niter):
        coeffs = np.polyfit(x[mask], y[mask], degree)
        baseline = np.polyval(coeffs, x)
        residual = y - baseline
        std = np.std(residual[mask])
        mask = residual < threshold * std
 
    return np.polyval(np.polyfit(x[mask], y[mask], degree), x)

Hardware Solutions

Software baseline correction works, but it is recovering signal from noise - information has already been lost. Hardware approaches avoid the problem:

  • 1064nm laser excitation. Longer wavelengths excite fewer fluorophores. A 1064nm Nd:YAG laser dramatically reduces fluorescence in most biological samples. The trade-off: Raman scattering intensity scales as lambda^-4, so 1064nm gives roughly 5x weaker Raman signal than 785nm. You compensate with longer exposure times or more sensitive detectors (InGaAs instead of CCD).

  • Time-gated detection. Raman scattering is instantaneous (femtoseconds). Fluorescence has a finite lifetime (nanoseconds). A time-gated detector that only captures photons arriving within the first few picoseconds after the laser pulse can reject most fluorescence. Commercially available from vendors like Timegate Instruments.

  • SERS substrates. Surface-Enhanced Raman amplifies the Raman signal by 10^6 or more while fluorescence remains unamplified. This effectively drowns out the fluorescence with overwhelming Raman signal.

In practice, clinical Raman systems use a combination: 785nm laser (good balance of fluorescence avoidance and Raman intensity), SERS substrates (for trace-level analytes), and ALS baseline correction (for any residual fluorescence).


SERS Integration Considerations

SERS-based diagnostics are the fastest-growing segment of clinical Raman. A SERS diagnostic test typically works like this: patient sample (blood, urine, swab) is applied to a SERS substrate, incubated briefly, then measured with a Raman spectrometer. The SERS substrate amplifies the signal from target analytes while the software classifies the resulting spectrum.

This introduces challenges that pure Raman systems do not have.

Substrate Variability

SERS substrates are manufactured consumables. Every substrate has slightly different nanostructure geometry, which means slightly different enhancement factors. Lot-to-lot variability can shift peak intensities by 15-30%, which is enough to confuse a classification model trained on a different lot.

Your software must include a substrate QC workflow:

  1. Receive reference spectra - each substrate lot ships with reference spectra (typically 4-aminothiophenol or rhodamine 6G)
  2. Scan a reference standard on each new substrate lot before clinical use
  3. Compare the reference spectrum to the expected profile - peak positions, relative intensities, enhancement factor
  4. Accept or reject - if the lot passes QC, calculate a normalization factor; if it fails, reject the lot
  5. Apply normalization to all clinical measurements from that lot

Calibration Transfer

Enhancement factors vary not just between lots but between individual spots on the same substrate. Hot spots (nanogaps where enhancement is extreme) are randomly distributed. This means multiple measurements at different positions on the substrate should be averaged, and outlier spectra (likely from hot spots) should be identified and handled:

def aggregate_sers_spectra(spectra: np.ndarray, 
                           method: str = "median") -> np.ndarray:
    """
    Aggregate multiple SERS measurements from the same sample.
    
    Median is preferred over mean because it is robust to 
    hot-spot outliers that produce anomalously intense spectra.
    
    Parameters:
        spectra: 2D array (n_measurements, n_wavenumbers)
        method: "median" (recommended) or "mean"
    
    Returns:
        1D aggregated spectrum
    """
    if method == "median":
        return np.median(spectra, axis=0)
    elif method == "mean":
        # Remove outliers first (spectra > 3x median total intensity)
        total_intensity = np.sum(spectra, axis=1)
        median_intensity = np.median(total_intensity)
        mask = total_intensity < 3 * median_intensity
        return np.mean(spectra[mask], axis=0)
    else:
        raise ValueError(f"Unknown method: {method}")

Consumable Cost Tracking

Every SERS test consumes a substrate. Substrate costs range from $2 to $50 depending on the technology and manufacturer. Your clinical workflow software needs to track consumable usage - substrates used per shift, per test type, per instrument - for inventory management and cost-per-test accounting. This is a workflow feature, not a spectroscopy feature, but it is essential for clinical deployment.


Handheld Device Challenges

Handheld Raman devices are the most exciting and the most challenging instruments to integrate clinically. They promise point-of-care molecular identification - no lab, no sample prep, no waiting. But they introduce constraints that bench-top systems never face.

Connectivity

Bench-top instruments connect via USB or Ethernet to a dedicated workstation. They have stable, persistent connections. Handheld devices communicate via Bluetooth, WiFi, or USB-C - and those connections are intermittent.

A clinician walks through a hospital with a handheld Raman device. They scan a sample in a patient room (WiFi may be weak), walk to another room (WiFi drops), then return to the nursing station (WiFi reconnects). Your software must handle this gracefully.

The solution is an offline-first architecture:

Handheld Device:
  1. Acquire spectrum → store locally on device
  2. Run on-device preprocessing + classification (if capable)
  3. Queue result for sync
  4. When connected → push to central server
  5. Receive any pending commands (firmware updates, library updates)

Central Server:
  1. Accept results from devices as they connect
  2. Run full classification pipeline (if device only sent raw data)
  3. Push results to EHR via HL7/FHIR
  4. Track device status, battery, last sync time

Battery and Compute Constraints

Handheld devices run on batteries. Laser excitation, detector readout, and wireless transmission all drain power. Your software decisions directly affect battery life:

  • Integration time - shorter exposures mean less signal and more noise, but more scans per charge
  • On-device vs. server preprocessing - CPU usage vs. bandwidth trade-off
  • Bluetooth vs. WiFi - Bluetooth is lower power but lower bandwidth
  • Screen brightness and refresh rate for the clinician UI

If the device runs a classification model on-device, it must be lightweight. A full 1D CNN is feasible on modern ARM processors, but inference time and power consumption must be benchmarked. PLS-DA or SVM models are simpler alternatives that run efficiently on constrained hardware.

Environmental Variability

A bench-top spectrometer lives in a climate-controlled lab. A handheld device goes everywhere. Temperature fluctuations shift the laser wavelength (especially diode lasers), which shifts the entire Raman spectrum. Ambient light leaks into the detector. Vibration from the clinician's hand adds noise.

Your preprocessing pipeline must account for all of these:

  • Laser wavelength calibration - use an internal reference (e.g., polystyrene film) to measure the actual laser wavelength and correct the x-axis
  • Dark current subtraction - acquire a dark frame (laser off) and subtract it to remove ambient light and detector thermal noise
  • Cosmic ray removal - high-energy particle strikes produce single-pixel spikes that must be detected and interpolated over
def remove_cosmic_rays(spectrum: np.ndarray, 
                       threshold: float = 8.0) -> np.ndarray:
    """
    Remove cosmic ray spikes from a Raman spectrum.
    
    Cosmic rays appear as single-pixel spikes that are much
    narrower than any real Raman peak (which span multiple pixels).
    
    Parameters:
        spectrum: intensity array
        threshold: number of standard deviations above the 
                   second derivative mean to flag as cosmic ray
    
    Returns:
        Cleaned spectrum with cosmic rays interpolated over
    """
    # Second derivative amplifies sharp spikes
    d2 = np.diff(spectrum, n=2)
    median_d2 = np.median(np.abs(d2))
 
    # Flag pixels where second derivative exceeds threshold
    spike_mask = np.abs(d2) > threshold * median_d2
 
    # Pad mask to match original spectrum length
    spike_idx = np.where(spike_mask)[0] + 1  # offset for diff
 
    # Interpolate over flagged pixels
    cleaned = spectrum.copy()
    for idx in spike_idx:
        if 1 < idx < len(spectrum) - 2:
            cleaned[idx] = np.mean([spectrum[idx - 2], 
                                     spectrum[idx - 1],
                                     spectrum[idx + 1], 
                                     spectrum[idx + 2]])
 
    return cleaned

Building the Clinical Workflow

The clinical workflow architecture for Raman follows the same pattern we described in our clinical workflow architecture article for FTIR. The layers are:

Clinician UI
    │
    ▼
Instrument Abstraction Layer
    │  (Horiba COM, Wasatch USB, Ocean Direct, handheld BLE...)
    ▼
Spectral Preprocessing
    │  (fluorescence removal, cosmic ray removal, normalization)
    ▼
ML Classification Pipeline
    │  (PLS-DA, SVM, CNN - see /blog/ai-spectral-classification)
    ▼
Result Delivery
    │  (on-screen result + confidence score)
    ▼
EHR Integration
    (HL7v2 ORU^R01, FHIR DiagnosticReport)

The key difference from FTIR is the instrument abstraction layer. In the FTIR world, you are primarily abstracting over different Bruker OPUS interfaces (DDE, HTTP, COM) and different Bruker models (Alpha II, Invenio, Vertex). The underlying data format and measurement workflow are largely the same.

In the Raman world, you are abstracting over fundamentally different vendor architectures:

VendorAPIPlatformCharacteristics
HoribaCOM-basedWindows onlyResearch-grade
WasatchPython USB driverCross-platformOEM module
Ocean InsightC SDK + Python bindingsCross-platformModular
HandheldsBluetooth/WiFiMobileIntermittent connection, battery-constrained

Each of these requires a different driver implementation behind a common interface:

from abc import ABC, abstractmethod
 
class RamanInstrument(ABC):
    """Abstract interface for any Raman spectrometer."""
 
    @abstractmethod
    def connect(self) -> bool:
        """Establish connection to the instrument."""
        pass
 
    @abstractmethod
    def configure(self, exposure_ms: int, 
                  accumulations: int, 
                  laser_power_pct: float) -> None:
        """Set acquisition parameters."""
        pass
 
    @abstractmethod
    def acquire(self) -> RamanSpectrum:
        """Acquire a single spectrum and return normalized data."""
        pass
 
    @abstractmethod
    def get_status(self) -> dict:
        """Return instrument status (connected, laser temp, etc.)."""
        pass
 
    @abstractmethod
    def disconnect(self) -> None:
        """Cleanly disconnect from the instrument."""
        pass

Each vendor gets a concrete implementation: HoribaLabSpec, WasatchRaman, OceanDirectRaman, HandheldBLERaman. The clinical workflow code only touches the abstract interface. When a new instrument vendor needs to be supported, you write a new driver class. The rest of the pipeline - preprocessing, classification, result delivery - remains unchanged.

The Preprocessing Pipeline Differs

Raman preprocessing is more aggressive than FTIR preprocessing because of fluorescence. A typical Raman preprocessing pipeline for clinical samples:

  1. Dark subtraction - remove detector thermal noise and ambient light
  2. Cosmic ray removal - detect and interpolate single-pixel spikes
  3. Fluorescence baseline correction - ALS or iterative polynomial fitting
  4. Smoothing - Savitzky-Golay filter (window 7-11, polynomial order 2-3)
  5. Normalization - SNV or vector normalization for cross-instrument reproducibility
  6. Spectral region cropping - select the fingerprint region relevant to the clinical application (e.g., 400-1800 cm^-1 for tissue diagnostics)

Each step has parameters that must be tuned for the specific clinical application. The parameters that work for SERS-based bacterial identification are different from those for tissue cancer margin detection. Your software must support configurable preprocessing pipelines - not a hardcoded sequence.


Where This Is Going

Raman clinical diagnostics is at an inflection point. The instruments are capable, the clinical evidence is growing, and regulatory pathways (FDA De Novo, 510(k)) are being established for specific applications. The bottleneck is not the spectroscopy - it is the software infrastructure that connects the instrument to the clinician and the EHR.

The integration challenges we have described - vendor fragmentation, fluorescence handling, SERS substrate management, handheld connectivity - are all solvable. They require engineering effort, not scientific breakthroughs. But they require engineering effort from people who understand both spectroscopy and clinical workflow requirements, which is a narrow intersection.

SpectraDx handles the instrument abstraction. Whether your deployment uses a $150K Horiba confocal, a $5K Wasatch OEM module, or a $3K handheld device, the clinical workflow layer - patient context, measurement orchestration, classification pipeline, HL7/FHIR output - remains the same. We have already built the vendor drivers, the fluorescence correction pipeline, the SERS substrate QC workflow, and the offline-first sync architecture for handheld devices.


Further Reading


SpectraDx is clinical workflow software for spectroscopy-based diagnostics. We handle the integration layer between your spectrometer and your clinician. Learn more or get in touch.

Frequently Asked Questions

There are two primary approaches: vendor-specific APIs (such as Horiba's LabSpec SDK or Renishaw's WiRE COM interface) for direct instrument control, or file-based integration where the instrument writes spectral files to a watched directory and your software picks them up. API integration gives real-time control and feedback; file-based integration is simpler but introduces latency and requires robust file-watching logic.

Yes. Handheld Raman devices like the Forward Edge AI Blaise are designed specifically for point-of-care clinical use. They offer the key advantage of requiring no sample preparation — the probe can be applied directly to tissue or placed against a sample container. The trade-off is lower spectral resolution and signal-to-noise compared to benchtop instruments, which may affect classification accuracy for some applications.

For laboratory-based clinical applications, the Horiba LabRAM and Renishaw inVia are the most common research-grade instruments with mature software APIs. For point-of-care use, handheld devices from vendors like Forward Edge AI, Metrohm, and B&W Tek offer portability and fast measurement times. The choice depends on whether the application requires high spectral resolution (benchtop) or portability and speed (handheld).

SpectraDx builds clinical workflow software for spectroscopy-based diagnostics.

The layer between the spectrometer and the clinician. Instrument control, patient workflow, ML classification, HL7/FHIR output, and billing — in one platform.

Get articles like this in your inbox.

Monthly technical resources for spectroscopy professionals. No marketing fluff.