OSCR

STARCall integrates image stitching, alignment, and read calling to enable scalable analysis of in situ sequencing data.

Code ↔ Paper

1 match between paragraphs of the paper and lines of its authors' code, computed by the harvester (lexical-v1). Click a colored paragraph or line to see its counterpart.

The 1 match
  1. [1] § Methods › Stitching and alignment of images across cycles ↔ ashlar/utils.py, lines 100–146 · score 0.64 · shift theorem, fourier, iFFT, matrix, zero, match

Paper

Loaded from Europe PMC by your browser, not stored by OSCR: doi.org · Europe PMC

The paper is loaded when this pane is shown.

The authors' code

Python · 267 lines · 10 KB · MIT · 1 match

  1. import functools
  2. import itertools
  3. import warnings
  4. import skimage
  5. import skimage.restoration.uft
  6. import scipy.ndimage
  7. import numpy as np
  8. # Pre-calculate the Laplacian operator kernel. We'll always be using 2D images.
  9. _laplace_kernel = skimage.restoration.uft.laplacian(2, (3, 3))[1]
  10. def whiten(img, sigma):
  11. img = skimage.img_as_float32(img)
  12. if sigma == 0:
  13. output = scipy.ndimage.convolve(img, _laplace_kernel)
  14. else:
  15. output = scipy.ndimage.gaussian_laplace(img, sigma)
  16. return output
  17. @functools.lru_cache
  18. def get_window(shape):
  19. # Build a 2D Hann window by taking the outer product of two 1-D windows.
  20. wy = np.hanning(shape[0]).astype(np.float32)
  21. wx = np.hanning(shape[1]).astype(np.float32)
  22. window = np.outer(wy, wx)
  23. return window
  24. def window(img):
  25. assert img.ndim == 2
  26. return img * get_window(img.shape)
  27. def register(img1, img2, sigma, upsample=10):
  28. img1w = window(whiten(img1, sigma))
  29. img2w = window(whiten(img2, sigma))
  30. shift = skimage.registration.phase_cross_correlation(
  31. img1w,
  32. img2w,
  33. upsample_factor=upsample,
  34. normalization=None
  35. )[0]
  36. # At this point we may have a shift in the wrong quadrant since the FFT
  37. # assumes the signal is periodic. We test all four possibilities and return
  38. # the shift that gives the highest direct correlation (sum of products).
  39. shape = np.array(img1.shape)
  40. shift_pos = (shift + shape) % shape
  41. shift_neg = shift_pos - shape
  42. shifts = list(itertools.product(*zip(shift_pos, shift_neg)))
  43. correlations = [
  44. np.abs(np.sum(img1w * scipy.ndimage.shift(img2w, s, order=0)))
  45. for s in shifts
  46. ]
  47. idx = np.argmax(correlations)
  48. shift = shifts[idx]
  49. correlation = correlations[idx]
  50. total_amplitude = np.linalg.norm(img1w) * np.linalg.norm(img2w)
  51. if correlation > 0 and total_amplitude > 0:
  52. error = -np.log(correlation / total_amplitude)
  53. else:
  54. error = np.inf
  55. return shift, error
  56. def nccw(img1, img2, sigma):
  57. img1w = whiten(img1, sigma)
  58. img2w = whiten(img2, sigma)
  59. correlation = np.abs(np.sum(img1w * img2w))
  60. total_amplitude = np.linalg.norm(img1w) * np.linalg.norm(img2w)
  61. if correlation > 0 and total_amplitude > 0:
  62. diff = correlation - total_amplitude
  63. if diff <= 0:
  64. error = -np.log(correlation / total_amplitude)
  65. elif diff < 1e-5:
  66. # This situation can occur due to numerical precision issues when
  67. # img1 and img2 are very nearly or exactly identical. If the
  68. # difference is small enough, let it slide.
  69. error = 0
  70. else:
  71. raise RuntimeError(
  72. f"correlation > total_amplitude (diff={diff})"
  73. )
  74. else:
  75. error = np.inf
  76. return error
  77. def crop(img, offset, shape):
  78. # Note that this only crops to the nearest whole-pixel offset.
  79. start = offset.round().astype(int)
  80. end = start + shape
  81. img = img[start[0]:end[0], start[1]:end[1]]
  82. return img
  83. # TODO:
  84. # - Deal with ringing from high-frequency elements. The wrapped edges of the
  85. # image are especially bad, where the wrapping introduces sharp
  86. # discontinuities. The edge artifacts could be dealt with in several ways
  87. # (extend the trailing image edge via mirroring, throw away some of the
  88. # trailing edge of the shifted result) but edges in the "true" image content
  89. # would require proper pre-filtering. What filter to use, and how to apply it
  90. # quickly?
  91. # - Can we use real FFT for a ~50% overall speedup? Fourier-space matrices will
  92. # all be half-size in the last dimension, so FFT is around 50% faster and our
  93. # fshift calculations will be too.
  94. # - Trailing edge pixels should be zeroed to match the behavior of
  95. # scipy.ndimage.shift, which we rely on in our maximum-intensity projection.
  96. def fourier_shift(img, shift):
  97. # Ensure properly aligned complex64 data (fft requires complex to avoid
  98. # reallocation and copying).
  99. img = skimage.util.img_as_float32(img)
  100. img = pyfftw.byte_align(img, dtype=np.complex64)
  101. # Compute per-axis frequency values according to the Fourier shift theorem.
  102. # (Read "w" here as "omega".) We pre-multiply as many scalar values as
  103. # possible on these vectors to avoid operations on the full w matrix below.
  104. v = np.fft.fftfreq(img.shape[0])
  105. wy = (2 * np.pi * v * shift[0]).astype(np.float32).reshape(-1, 1)
  106. u = np.fft.fftfreq(img.shape[1])
  107. wx = (2 * np.pi * u * shift[1]).astype(np.float32)
  108. # Add column and row vector to get full expanded matrix of frequencies.
  109. w = wy + wx
  110. # We perform an explicit application of Euler's formula with careful
  111. # management of output arrays to avoid extra memory allocations and copies,
  112. # squeezing out some speed over the obvious np.exp(-1j*w).
  113. fshift = np.empty_like(img, dtype=np.complex64)
  114. np.cos(w, out=fshift.real)
  115. np.sin(w, out=fshift.imag)
  116. np.negative(fshift.imag, out=fshift.imag)
  117. # Perform the FFT, multiply in-place by the shift matrix, then IFFT.
  118. freq = pyfftw.builders.fft2(img, planner_effort='FFTW_ESTIMATE',
  119. avoid_copy=True, auto_align_input=True,
  120. auto_contiguous=True)()
  121. freq *= fshift
  122. img_s = pyfftw.builders.ifft2(freq, planner_effort='FFTW_ESTIMATE',
  123. avoid_copy=True, auto_align_input=True,
  124. auto_contiguous=True)()
  125. # Any non-zero imaginary component of the resulting array is due to
  126. # numerical error, so we can just return the real part.
  127. # FIXME need to zero out row(s) and column(s) we shifted away from,
  128. # since at this point we have a cyclic rotation rather than a shift.
  129. return img_s.real
  130. def paste(target, img, pos, func=None, subpixel_shift=True):
  131. """Composite img into target.
  132. Interpolation of images can be disabled with subpixel_shift=False, otherwise
  133. images with non integer positions will be shifted with scipy.ndimage.shift
  134. """
  135. pos = np.array(pos)
  136. # Bail out if destination region is out of bounds.
  137. if np.any(pos >= target.shape[:2]) or np.any(pos + img.shape[:2] < 0):
  138. return
  139. if not subpixel_shift:
  140. pos = np.round(pos)
  141. pos_f, pos_i = np.modf(pos)
  142. yi, xi = pos_i.astype('i8')
  143. # Clip img to the edges of the mosaic.
  144. if yi < 0:
  145. img = img[-yi:]
  146. yi = 0
  147. if xi < 0:
  148. img = img[:, -xi:]
  149. xi = 0
  150. target_slice = target[yi:yi+img.shape[0], xi:xi+img.shape[1]]
  151. img = crop_like(img, target_slice)
  152. # Skip expensive sub-pixel shift if fractional position is zero.
  153. if subpixel_shift and pos_f.any():
  154. if img.ndim == 2:
  155. img = scipy.ndimage.shift(img, pos_f)
  156. else:
  157. for c in range(img.shape[2]):
  158. img[...,c] = scipy.ndimage.shift(img[...,c], pos_f)
  159. # For any axis where there is a non-zero subpixel shift, crop out the
  160. # last row or column of pixels on the "losing" side. These pixels will
  161. # be darker than normal and will introduce artifacts in most blending
  162. # modes.
  163. y1 = None if pos_f[0] <= 0 else 1
  164. y2 = None if pos_f[0] >= 0 else -1
  165. x1 = None if pos_f[1] <= 0 else 1
  166. x2 = None if pos_f[1] >= 0 else -1
  167. img = img[y1:y2, x1:x2]
  168. target_slice = target_slice[y1:y2, x1:x2]
  169. # Exit if image area is zero after subpixel shift.
  170. if not np.all(img.shape):
  171. return
  172. if np.issubdtype(img.dtype, np.floating):
  173. np.clip(img, 0, 1, img)
  174. img = dtype_convert(img, target.dtype)
  175. if func is None:
  176. target_slice[:] = img
  177. elif isinstance(func, np.ufunc):
  178. func(target_slice, img, out=target_slice)
  179. else:
  180. target_slice[:] = func(target_slice, img)
  181. def pastefunc_blend(target, img):
  182. """Linear blend based on distance to unfilled space in target."""
  183. # This should catch actual holes but not the actual unfilled space.
  184. # FIXME Should generate mask from tile boundaries instead.
  185. hole_threshold = np.mean(target.shape)
  186. mask = skimage.morphology.remove_small_holes(target != 0, hole_threshold)
  187. dist = scipy.ndimage.distance_transform_cdt(mask)
  188. dmax = dist.max()
  189. if dmax == 0:
  190. alpha = 0
  191. else:
  192. alpha = dist / dmax
  193. # Keep target pixel values where img has value 0 (with a 1-pixel
  194. # dilation to clean up the edge). This is a temporary hack to support
  195. # image corrections that leave regions of zero pixels around the edge of
  196. # img, such as barrel correction and rotation.
  197. # FIXME Should compute the geometry of the source image mask more
  198. # deliberately and precisely.
  199. alpha[skimage.morphology.binary_dilation(img == 0)] = 1
  200. return target * alpha + img * (1 - alpha)
  201. def crop_like(img, target):
  202. if (img.shape[0] > target.shape[0]):
  203. img = img[:target.shape[0], :]
  204. if (img.shape[1] > target.shape[1]):
  205. img = img[:, :target.shape[1]]
  206. return img
  207. def dtype_convert(img, dtype):
  208. """Convert an image to the requested data-type.
  209. This is just a wrapper around skimage.util.dtype.convert that silences its
  210. FutureWarning, as Ashlar pins skimage to a version before that planned
  211. deprecation.
  212. """
  213. with warnings.catch_warnings():
  214. warnings.filterwarnings("ignore", r".*scikit-image 1\.0", FutureWarning)
  215. return skimage.util.dtype.convert(img, dtype)
  216. def imsave(fname, arr, **kwargs):
  217. """Save an image to file.
  218. This is a wrapper around skimage.io.imsave to force check_contrast=False
  219. since the contrast check kills us on the huge images we create.
  220. """
  221. if "check_contrast" in kwargs:
  222. warnings.warn("ignoring check_contrast argument -- forcing to False")
  223. kwargs["check_contrast"] = False
  224. # We use scikit-image's vendored copy of tifffile directly rather than allow
  225. # scikit-image to optimistically use a separately-installed copy of tifffile
  226. # due to bugs and API inconsistencies in the latest pypi-hosted version:
  227. # * Use of "centimeter" for resolution units instead of "cm"
  228. # * A bug in writing single-tile planes -- issue #3 on GitHub
  229. # FIXME Once scikit-image un-vendors tifffile (#4235) AND tifffile fixes #3
  230. # we can remove this block and use `skimage.io.imsave` directly again. Or we
  231. # might just want to switch to tifffile.imsave.
  232. del kwargs["check_contrast"]
  233. import skimage.external.tifffile
  234. skimage.external.tifffile.imsave(fname, arr, **kwargs)

utils.py at commit fc1d70b, under MIT · at the source

Overview

Authors: Nicholas J Bradley1, Sriram Pendyala1,2, Katie Partington1,3, Douglas M Fowler1,3,4
  1. Department of Genome Sciences, University of Washington, Seattle, Washington, United States of America
  2. Medical Scientist Training Program, University of Washington, Seattle, Washington, United States of America
  3. Department of Bioengineering, University of Washington, Seattle, Washington, United States of America
  4. Brotman Baty Institute for Precision Medicine, Seattle, Washington, United States of America
Institutions: University of Washington (United States); Brotman Baty Institute (United States)
Journal: PLoS computational biology, volume 22, issue 4, article e1013689
Dates: received 30 October 2025; accepted 10 April 2026; published online 27 April 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.1371/journal.pcbi.1013689 · PMID 42044152 · PMCID PMC13160441 · OpenAlex W4415758415
Open access: gold, a free copy (OpenAlex)
Status: code verified
Categories: genetics / omics (modality), human (organism)
Methods: Connectivity, Statistics, Machine learning, Preprocessing, Spectral & time-frequency
MeSH: High-Throughput Nucleotide Sequencing*, Image Processing, Computer-Assisted*, Sequence Analysis, DNA*, Software*, Algorithms, Animals, Computational Biology, Humans, Induced Pluripotent Stem Cells, Sequence Alignment (* major topic)
Topic: Single-cell and spatial transcriptomics (Molecular Biology, Biochemistry, Genetics and Molecular Biology), according to OpenAlex
Funding: Chan Zuckerberg Initiative (CZIF2024-010284); National Institutes of Health (RM1HG010461); NHGRI NIH HHS (RM1 HG010461)
Citations: cited by 1 paper (Europe PMC); 22 references in the paper

Abstract

Fluorescent in situ sequencing involves imaging-based sequencing by synthesis in intact cells or tissues to reveal target nucleotide sequences inside each cell. Often, the target sequences are barcodes that indicate a perturbation (e.g., CRISPR guide or genetic variant) delivered to the cell. However, processing in situ sequencing data presents a considerable challenge, requiring stitching and aligning tens of thousands of images with millions of cells, detecting small amplicon colonies across sequencing cycles, and calling reads. To address these challenges, we introduce STARCall: STitching, Alignment and Read Calling for in situ sequencing, a software package that analyzes raw in situ sequencing images to produce a genotype-to-phenotype mapping for each cell. STARCall improves upon previous solutions by combining stitching and alignment of images into a single step that minimizes both inter-cycle and intra-cycle alignment error. STARCall also improves detection and extraction of sequencing reads, incorporating filters and normalization to combat background fluorophore signal. We compare STARCall to other methods using a diverse set of images that include commonly encountered imaging problems such as variable intensity across channels and cycles and high levels of background. Specifically, this comprises ~250,000 images from a pooled screen of ~3,500 barcoded LMNA variants expressed in U2OS cells and ~1,200 barcoded PTEN variants in induced pluripotent stem cells (iPSC) and iPSC-derived neurons. Overall, STARCall aligned more than 50% of tiles with <1 pixel residual misalignment on all nine image sets, outperforming alternative packages by 14–35%. STARCall also yielded an 8–40% increase in genotyped cells due to improved filtering and normalization methods that address background fluorescence. STARCall can call tools like CellPose to segment cells and CellProfiler to compute cell features from the phenotyping images. STARcall is open-source and freely available, providing a robust solution for the analysis of in situ sequencing data.

Reproduced under the paper's license (CC BY), from the paper cited above.

Repositories

Its files are read in the Code ↔ Paper reader above, with 1 match between paragraphs and lines of code.

njbradley/ashlar

License: MIT
State: the link answers, verified on 30 September 2026
Evidence: files inventoried
Commit: fc1d70be2d9b5cc1243cefb1727b2df0c34fd981, 3 October 2025
Languages: Python (16)
Size: 64 files, 16 scripts
Software Heritage: not archived
Found in: the text, “Execution of ASHLAR”
Holds: README, license file, environment (Dockerfile, setup.cfg, setup.py), continuous integration, documentation
Not found: CITATION.cff, tests
Tools: NumPy (10 files), scikit-image (9 files), Matplotlib (2 files), NetworkX (2 files), SciPy (2 files), tifffile (2 files), napari (1 file), scikit-learn (1 file), seaborn (1 file)
Availability: 1 check, the latest on 30 September 2026: the link answers
  • 30 September 2026: the link answers
18 files

fowlerlab.github.io/starcall-docs

License: none: the authors keep all their rights
State: the link answers, verified on 30 September 2026
Evidence: the link answers
Software Heritage: not checked
Found in: “Data Availability”
Not found: README, license file, CITATION.cff, environment file, tests, continuous integration, documentation
Availability: 1 check, the latest on 30 September 2026: the link answers (HTTP 200)
  • 30 September 2026: the link answers (HTTP 200)

The paper's code and data availability statement is in the Data section.

Tracing map

Proposed by the machine: these links were found in the paper and verified at the source, without human review. The map will receive a Zenodo DOI once one of the paper's authors has validated it with their ORCID.

What the map holds:

  • 2 repositories of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
  • 16 scripts, each with its path and the digest of its content;
  • 1 match between paragraphs of the paper and lines of the code (method lexical-v1);
  • neither the text of the paper nor the code itself.

Its JSON (tracing-map.json) is deposited on Zenodo with its DOI once the map is validated.

Data

Datasets cited

Data Availability

STARCall is freely available under the MIT licence. STARCall can be found at https://github.com/FowlerLab/starcall-workflow. Instructions on installation and running STARCall, as well as a small example dataset are available at this repository. Documentation for the two Python libraries is available at https://fowlerlab.github.io/starcall-docs/constitch.html for ConStitch and https://fowlerlab.github.io/starcall-docs/starcall.html for STARCall. The image sets used to measure stitching and read calling performance are available for download through this link: https://g-e16ca0.7067fc.8443.data.globus.org/nobackup/public/starcall-testing-datasets-20250925/index.html. In addition, data tables of values used to create the figures of this paper and values behind all summary statistics are hosted on Zenodo at https://doi.org/10.5281/zenodo.19027452.

Reproduced under the paper's license (CC BY), from the paper cited above.

Versions

The history of this record: each version stored by the harvester or made by a correction of its authors or of the maintainers of its code, and what changed in its facts. The texts of the paper (its abstract, its availability statements) are not part of it; versions that changed only those are not listed.

Version 1, 30 September 2026: the first record

Recorded: type, language, journal, volume, issue, pages, dates, 4 authors, 10 MeSH terms, 3 funders, 20 references.

Cite

This paper

Bradley, N. J., Pendyala, S., Partington, K., & Fowler, D. M. (2026). STARCall integrates image stitching, alignment, and read calling to enable scalable analysis of in situ sequencing data. PLoS computational biology, 22(4), e1013689. https://doi.org/10.1371/journal.pcbi.1013689

BibTeX

@article{bradley2026starcall,
author = {Bradley, Nicholas J and Pendyala, Sriram and Partington, Katie and Fowler, Douglas M},
title = {{STARCall integrates image stitching, alignment, and read calling to enable scalable analysis of in situ sequencing data}},
journal = {PLoS computational biology},
year = {2026},
month = apr,
volume = {22},
number = {4},
pages = {e1013689},
publisher = {PLOS},
issn = {1553-734X},
doi = {10.1371/journal.pcbi.1013689},
url = {https://doi.org/10.1371/journal.pcbi.1013689},
pmid = {42044152},
pmcid = {PMC13160441}
}

RIS

TY - JOUR
AU - Bradley, Nicholas J
AU - Pendyala, Sriram
AU - Partington, Katie
AU - Fowler, Douglas M
TI - STARCall integrates image stitching, alignment, and read calling to enable scalable analysis of in situ sequencing data
T2 - PLoS computational biology
J2 - PLoS Comput Biol
PY - 2026
DA - 2026/04/27
VL - 22
IS - 4
SP - e1013689
SN - 1553-734X
PB - PLOS
DO - 10.1371/journal.pcbi.1013689
UR - https://doi.org/10.1371/journal.pcbi.1013689
LA - en
ER -

CSL-JSON

{
"id": "10.1371/journal.pcbi.1013689",
"type": "article-journal",
"title": "STARCall integrates image stitching, alignment, and read calling to enable scalable analysis of in situ sequencing data",
"container-title": "PLoS computational biology",
"author": [
{
"family": "Bradley",
"given": "Nicholas J"
},
{
"family": "Pendyala",
"given": "Sriram"
},
{
"family": "Partington",
"given": "Katie"
},
{
"family": "Fowler",
"given": "Douglas M"
}
],
"container-title-short": "PLoS Comput Biol",
"volume": "22",
"issue": "4",
"page": "e1013689",
"DOI": "10.1371/journal.pcbi.1013689",
"PMID": "42044152",
"PMCID": "PMC13160441",
"ISSN": "1553-734X",
"publisher": "PLOS",
"URL": "https://doi.org/10.1371/journal.pcbi.1013689",
"language": "en",
"issued": {
"date-parts": [
[
2026,
4,
27
]
]
}
}

The tracing map gets a citation of its own once an author has validated it and it has a DOI.

Similar papers

The papers with a page that share the most with this one: the tools found in their code, their categories, datasets, cited references and authors, the rarest counting most.

[1] doi:10.1371/journal.pcbi.1014571 [code]
SynAPSeg: A novel dataset and image analysis framework for deep learning-based synapse detection and quantification.
Journal: PLoS computational biology
In common: napari, tifffile, NetworkX, 6 other tools, 1 reference
[2] doi:10.7554/elife.100880 [code]
An applicable and efficient retrograde monosynaptic circuit mapping tool for larval zebrafish.
Journal: eLife
In common: tifffile, NetworkX, scikit-image, 5 other tools, 1 reference
[3] doi:10.1038/s42003-026-10063-9 [code]
Conserved Kir channel mechanisms governing intrinsic excitability in human and rodent parvalbumin neurons.
Journal: Communications biology
In common: napari, tifffile, scikit-image, 4 other tools, 1 reference
[4] doi: [code]
Real-time closed-loop feedback system for mouse mesoscale cortical signal and movement control
Journal: eLife
In common: napari, tifffile, scikit-image, 5 other tools
[5] doi:10.1016/j.celrep.2026.117420 [code]
Neural population dynamics of direct electrical stimulation of neocortex.
Journal: Cell reports
In common: napari, NetworkX, scikit-image, 5 other tools
[6] doi:10.1016/j.xcrm.2026.102766 [code]
A longitudinal single-cell and spatial multiomic atlas of pediatric high-grade glioma.
Journal: Cell reports. Medicine
In common: tifffile, NetworkX, scikit-image, 5 other tools, genetics / omics
[7] doi:10.1093/neuonc/noag128 [code]
Spatially-resolved single-cell imaging of melanoma brain metastases identifies localized immune patterns predictive of immune checkpoint blockade response.
Journal: Neuro-oncology
In common: napari, tifffile, NetworkX, 3 other tools, genetics / omics
[8] doi:10.1038/s41467-026-75352-7 [code]
Mechanosensory encoding of surface mechanics optimizes locomotion.
Journal: Nature communications
In common: napari, tifffile, scikit-image, 4 other tools
[9] doi:10.1038/s41467-026-76569-2 [code]
Self-organization of vascularized muscle from bovine embryonic stem cells.
Journal: Nature communications
In common: tifffile, NetworkX, scikit-image, 5 other tools
[10] doi:10.1016/j.isci.2026.116206 [code]
Gut distension evokes rapid neural dynamics in vagal and hindbrain populations of larval zebrafish.
Journal: iScience
In common: tifffile, NetworkX, scikit-image, 5 other tools

Contribute

The authors of this paper can claim it, correct its record and validate its tracing map, and the maintainers of its code (its owner, or a public member of its organization) correct what it says of their repository; anyone signed in can ask for its removal. Every request goes to OSCR's own machine, which answers it; your account page follows them.

Sign in with ORCID to claim this paper as one of its authors, correct its record or validate its tracing map: when the paper's metadata lists your ORCID iD, you are recognized at once. Maintainers of its code: sign in with GitHub, then claim the repository on your account page.

Request its removal

To ask OSCR to remove this record, the copies of its authors' scripts or its tracing map, use the removal request page: signed in, you say who you are, what to remove and why, then review and confirm the request. Published rules decide every request (how).

Discussion, reproductions, activity

Discussion: questions and error reports about this paper and its code, from signed-in readers and its authors. It opens with sign-in.

Reproductions: reports from readers who ran the authors' code: what they reproduced, with which environment, commit and data. It opens with sign-in.

Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.