Class ExpressionExperimentValueObject

All Implemented Interfaces:
Serializable, Securable, SecureValueObject, Describable, Identifiable, BioAssaySetValueObject
Direct Known Subclasses:
ExpressionExperimentDetailsValueObject

public class ExpressionExperimentValueObject extends AbstractCuratableValueObject<ExpressionExperiment> implements BioAssaySetValueObject
See Also:
  • Field Details

    • numberOfBioAssays

      protected Integer numberOfBioAssays
    • description

      protected String description
    • name

      protected String name
  • Constructor Details

  • Method Details

    • populateAclInfo

      public static void populateAclInfo(ExpressionExperimentValueObject vo, @Nullable AclObjectIdentity aoi, @Nullable AclSid sid)
      Apply ACL-derived flags (isPublic, userCanWrite, isShared, userOwned) onto an existing VO.

      Extracted from the (ExpressionExperiment, AclObjectIdentity, AclSid) constructor so that the EXISTS-rewritten filtering query path can post-fetch ACL info and inject it onto a VO that was constructed without the aoi/sid pair available at projection time. Public so DAOs in other packages (e.g. ExpressionExperimentDaoImpl) can reach it.

    • getBioAssayCount

      @Deprecated public int getBioAssayCount()
      Deprecated.
      Obtain the number of BioAssay in this experiment.
    • getIsSingleCell

      public boolean getIsSingleCell()
      Lombok would name these isSingleCell / setSingleCell; the wire name and the convention these flags follow in this class is getIsX / setIsX (see getIsPublic()).
    • setIsSingleCell

      public void setIsSingleCell(boolean isSingleCell)
    • getIsPublic

      public boolean getIsPublic()
      Description copied from interface: SecureValueObject
      Indicate if the object is public.
      Specified by:
      getIsPublic in interface SecureValueObject
    • getIsShared

      public boolean getIsShared()
      Description copied from interface: SecureValueObject
      Indicate if the object is shared.
      Specified by:
      getIsShared in interface SecureValueObject
    • getTaxon

      public String getTaxon()
    • getTaxonId

      @Deprecated public Long getTaxonId()
      Deprecated.
      use getTaxonObject() instead
    • getSecurableClass

      public Class<? extends Securable> getSecurableClass()
      Specified by:
      getSecurableClass in interface SecureValueObject
      Returns:
      the securable Class of the represented entity.
    • getUserCanWrite

      public boolean getUserCanWrite()
      Description copied from interface: SecureValueObject
      Indicate if the current user can modify this object.
      Specified by:
      getUserCanWrite in interface SecureValueObject
    • getUserOwned

      public boolean getUserOwned()
      Description copied from interface: SecureValueObject
      Indicate if the current user owns the object.
      Specified by:
      getUserOwned in interface SecureValueObject
    • setIsPublic

      public void setIsPublic(boolean b)
      Specified by:
      setIsPublic in interface SecureValueObject
    • setIsShared

      public void setIsShared(boolean b)
      Specified by:
      setIsShared in interface SecureValueObject
    • setUserCanWrite

      public void setUserCanWrite(boolean userCanWrite)
      Specified by:
      setUserCanWrite in interface SecureValueObject
    • setUserOwned

      public void setUserOwned(boolean isUserOwned)
      Specified by:
      setUserOwned in interface SecureValueObject
    • getCurrentUserHasWritePermission

      public boolean getCurrentUserHasWritePermission()
    • getCurrentUserIsOwner

      public boolean getCurrentUserIsOwner()
    • toString

      public String toString()
      Overrides:
      toString in class IdentifiableValueObject<ExpressionExperiment>
    • getNumberOfBioAssays

      public Integer getNumberOfBioAssays()
      Description copied from interface: BioAssaySetValueObject
      Obtain the number of assays in this set.
      Specified by:
      getNumberOfBioAssays in interface BioAssaySetValueObject
    • getDescription

      public String getDescription()
      Description copied from interface: Describable
      Obtain a human-readable description of the object
      Specified by:
      getDescription in interface Describable
    • getName

      public String getName()
      Description copied from interface: Describable
      Obtain the name of the object.

      It may be human-readable.

      It is case-insensitive and usually unique within a certain context (e.g. in a collection).

      It is non-null by default, but implementation may override this with a Nullable annotation. If null, it should not be treated as equal to other Describable objects (i.e. there can be multiple null-named describable within a given set).

      Specified by:
      getName in interface Describable
    • getAccession

      @Nullable public String getAccession()
      Description copied from interface: BioAssaySetValueObject
      Obtain the accession of this set if one exists.
      Specified by:
      getAccession in interface BioAssaySetValueObject
      See Also:
    • getExternalUri

      @Nullable public String getExternalUri()
      See Also:
    • getExternalLabel

      @Nullable public String getExternalLabel()
      See Also:
    • getExternalDatabase

      @Nullable public String getExternalDatabase()
      See Also:
    • getExternalDatabaseUri

      @Nullable public String getExternalDatabaseUri()
      See Also:
    • getPubmedId

      @Nullable public String getPubmedId()
      PubMed ID of the primary publication, when it is indexed by PubMed. Mutually exclusive with doi: the primary publication carries a single accession, so a PubMed-indexed paper populates this and a preprint (bioRxiv/arXiv/CrossRef DOI) populates doi.
    • getDoi

      @Nullable public String getDoi()
      DOI of the primary publication, when it is a preprint or otherwise identified by a DOI rather than a PubMed ID. See pubmedId.
    • getArrayDesignCount

      public Long getArrayDesignCount()
    • getPlatforms

      public List<ArrayDesignReferenceValueObject> getPlatforms()
      The platforms this dataset's assays were run on, as accession + full name.

      A list because a dataset may use more than one; arrayDesignCount is the size of this list and is kept because clients read it. Populated on every filtered read out of the same query that produces the count — the join to the platform was already being paid for.

    • getOriginalPlatforms

      public List<ArrayDesignReferenceValueObject> getOriginalPlatforms()
      The platforms this dataset's assays were run on BEFORE a platform switch, when one happened.

      Empty for the great majority of datasets. A no-op switch — an original platform that is also a platform in use — is left out, so a non-empty list here means the dataset really was moved.

    • getDateCreated

      public Date getDateCreated()
      When the dataset was created in Gemma — loaded, not published.

      Read from the C audit event, which is the only record of it: there is no creation column on the dataset (a CURATION_DETAILS.CREATED backfill was proposed and deferred, 2026-08-21). Measured universal — 200 of 200 sampled datasets carry the event — but null is still possible and means the event is missing, never "created just now".

      🛑 Not filterable or sortable. AbstractCuratableDao unregisters auditTrail.* from the dataset filter surface, so this is a projection for display. Filtering on it is what the deferred migration was for.

    • getBatchConfound

      public String getBatchConfound()
    • getBatchEffect

      public String getBatchEffect()
      Batch effect type. See BatchEffectType enum for possible values.
    • getBatchEffectStatistics

      @Nullable public String getBatchEffectStatistics()
      Summary statistics of a batch effect is present.
    • getBioMaterialCount

      public Integer getBioMaterialCount()
    • getExperimentalDesign

      public Long getExperimentalDesign()
    • getGeeq

      public GeeqValueObject getGeeq()
    • getMetadata

      public String getMetadata()
    • getProcessedExpressionVectorCount

      public Integer getProcessedExpressionVectorCount()
    • getShortName

      public String getShortName()
    • getSource

      public String getSource()
    • getSuitableForDEA

      public Boolean getSuitableForDEA()
    • getTaxonObject

      @Nullable public TaxonValueObject getTaxonObject()
      FIXME: this should be named simply "taxon", but that field is already taken for Gemma Web, see getTaxon().
    • getTechnologyType

      public String getTechnologyType()
    • getNumberOfCells

      @Nullable public Integer getNumberOfCells()
      Total number of cells, or null when this is not a single-cell experiment or the count has not been computed. Denormalized on the experiment itself, so it costs nothing to serve.

      🛑 Not a substitute for isSingleCell: 63 of the 546 single-cell datasets on prod have no count.

    • getNumberOfCellIds

      @Nullable public Integer getNumberOfCellIds()
      Number of cell IDs in the preferred single-cell dimension, or null when there is none.
    • getOtherParts

      The other parts of the study this dataset was split off from, empty when it was not split.

      Gemma splits an experiment by a factor — usually organism part for single-cell data — and names each part Split part N of: … [organism part = …]. That title tells a reader siblings exist and gives them no way to reach one: 52 of 100 sampled single-cell datasets are split parts over 32 parent studies, and neither the curation UI nor the browser could follow the link, because the field lived on a VO only /experiment-sets/{id}/datasets serves (uib, 2026-09-03).

      References rather than whole VOs: a sibling is rendered as a name and a link, and the previous full-VO form cost a loadValueObjectsByIds per split experiment.

    • getCharacteristics

      @Nullable public Set<CharacteristicValueObject> getCharacteristics()
      Specified by:
      getCharacteristics in interface BioAssaySetValueObject
    • getMinPvalue

      @Nullable public Double getMinPvalue()
    • setNumberOfBioAssays

      public void setNumberOfBioAssays(Integer numberOfBioAssays)
    • setDescription

      public void setDescription(String description)
    • setName

      public void setName(String name)
    • setAccession

      public void setAccession(@Nullable String accession)
      See Also:
    • setExternalUri

      public void setExternalUri(@Nullable String externalUri)
      See Also:
    • setExternalLabel

      public void setExternalLabel(@Nullable String externalLabel)
      See Also:
    • setExternalDatabase

      public void setExternalDatabase(@Nullable String externalDatabase)
      See Also:
    • setExternalDatabaseUri

      public void setExternalDatabaseUri(@Nullable String externalDatabaseUri)
      See Also:
    • setPubmedId

      public void setPubmedId(@Nullable String pubmedId)
      PubMed ID of the primary publication, when it is indexed by PubMed. Mutually exclusive with doi: the primary publication carries a single accession, so a PubMed-indexed paper populates this and a preprint (bioRxiv/arXiv/CrossRef DOI) populates doi.
    • setDoi

      public void setDoi(@Nullable String doi)
      DOI of the primary publication, when it is a preprint or otherwise identified by a DOI rather than a PubMed ID. See pubmedId.
    • setArrayDesignCount

      public void setArrayDesignCount(Long arrayDesignCount)
    • setPlatforms

      public void setPlatforms(List<ArrayDesignReferenceValueObject> platforms)
      The platforms this dataset's assays were run on, as accession + full name.

      A list because a dataset may use more than one; arrayDesignCount is the size of this list and is kept because clients read it. Populated on every filtered read out of the same query that produces the count — the join to the platform was already being paid for.

    • setOriginalPlatforms

      public void setOriginalPlatforms(List<ArrayDesignReferenceValueObject> originalPlatforms)
      The platforms this dataset's assays were run on BEFORE a platform switch, when one happened.

      Empty for the great majority of datasets. A no-op switch — an original platform that is also a platform in use — is left out, so a non-empty list here means the dataset really was moved.

    • setDateCreated

      public void setDateCreated(Date dateCreated)
      When the dataset was created in Gemma — loaded, not published.

      Read from the C audit event, which is the only record of it: there is no creation column on the dataset (a CURATION_DETAILS.CREATED backfill was proposed and deferred, 2026-08-21). Measured universal — 200 of 200 sampled datasets carry the event — but null is still possible and means the event is missing, never "created just now".

      🛑 Not filterable or sortable. AbstractCuratableDao unregisters auditTrail.* from the dataset filter surface, so this is a projection for display. Filtering on it is what the deferred migration was for.

    • setBatchConfound

      public void setBatchConfound(String batchConfound)
    • setBatchEffect

      public void setBatchEffect(String batchEffect)
      Batch effect type. See BatchEffectType enum for possible values.
    • setBatchEffectStatistics

      public void setBatchEffectStatistics(@Nullable String batchEffectStatistics)
      Summary statistics of a batch effect is present.
    • setBioMaterialCount

      public void setBioMaterialCount(Integer bioMaterialCount)
    • setExperimentalDesign

      public void setExperimentalDesign(Long experimentalDesign)
    • setGeeq

      public void setGeeq(GeeqValueObject geeq)
    • setMetadata

      public void setMetadata(String metadata)
    • setProcessedExpressionVectorCount

      public void setProcessedExpressionVectorCount(Integer processedExpressionVectorCount)
    • setShortName

      public void setShortName(String shortName)
    • setSource

      public void setSource(String source)
    • setSuitableForDEA

      public void setSuitableForDEA(Boolean suitableForDEA)
    • setTaxonObject

      public void setTaxonObject(@Nullable TaxonValueObject taxonObject)
      FIXME: this should be named simply "taxon", but that field is already taken for Gemma Web, see getTaxon().
    • setTechnologyType

      public void setTechnologyType(String technologyType)
    • setNumberOfCells

      public void setNumberOfCells(@Nullable Integer numberOfCells)
      Total number of cells, or null when this is not a single-cell experiment or the count has not been computed. Denormalized on the experiment itself, so it costs nothing to serve.

      🛑 Not a substitute for isSingleCell: 63 of the 546 single-cell datasets on prod have no count.

    • setNumberOfCellIds

      public void setNumberOfCellIds(@Nullable Integer numberOfCellIds)
      Number of cell IDs in the preferred single-cell dimension, or null when there is none.
    • setOtherParts

      public void setOtherParts(List<ExpressionExperimentReferenceValueObject> otherParts)
      The other parts of the study this dataset was split off from, empty when it was not split.

      Gemma splits an experiment by a factor — usually organism part for single-cell data — and names each part Split part N of: … [organism part = …]. That title tells a reader siblings exist and gives them no way to reach one: 52 of 100 sampled single-cell datasets are split parts over 32 parent studies, and neither the curation UI nor the browser could follow the link, because the field lived on a VO only /experiment-sets/{id}/datasets serves (uib, 2026-09-03).

      References rather than whole VOs: a sibling is rendered as a name and a link, and the previous full-VO form cost a loadValueObjectsByIds per split experiment.

    • setCharacteristics

      public void setCharacteristics(@Nullable Set<CharacteristicValueObject> characteristics)
    • setMinPvalue

      public void setMinPvalue(@Nullable Double minPvalue)