diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/family/qc/FamilyVariantQcAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/family/qc/FamilyVariantQcAnalysis.java index 7fd0c5c86e..9b9fdf5438 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/family/qc/FamilyVariantQcAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/family/qc/FamilyVariantQcAnalysis.java @@ -52,6 +52,7 @@ import java.util.stream.Collectors; import static org.opencb.opencga.core.models.common.InternalStatus.READY; +import static org.opencb.opencga.core.models.common.QualityControlStatus.COMPUTING; import static org.opencb.opencga.core.models.common.QualityControlStatus.NONE; import static org.opencb.opencga.core.models.study.StudyPermissions.Permissions.WRITE_FAMILIES; import static org.opencb.opencga.storage.core.variant.io.VariantWriterFactory.VariantOutputFormat.JSON; @@ -102,7 +103,8 @@ protected void run() throws ToolException { // Set quality control status to COMPUTING to prevent multiple family QCs from running simultaneously // for the same family - if (!setComputingStatus(family.getId(), FAMILY_QC_TYPE)) { + QualityControlStatus qcStatus = new QualityControlStatus(COMPUTING, "Performing " + FAMILY_QC_TYPE + " QC"); + if (!setQualityControlStatus(qcStatus, family.getId(), FAMILY_QC_TYPE)) { continue; } @@ -223,7 +225,6 @@ public static void checkParameters(FamilyQcAnalysisParams params, String studyId } private void updateFamilyQualityControl(List families) throws ToolException { - final String extension = ".qc.json"; ObjectMapper objectMapper = JacksonUtils.getDefaultObjectMapper(); objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); ObjectReader objectReader = JacksonUtils.getDefaultObjectMapper().readerFor(FamilyQualityControl.class); @@ -234,21 +235,21 @@ private void updateFamilyQualityControl(List families) throws ToolExcept // Check output file String msg; - Path qcPath = getOutDir().resolve(family.getId()).resolve(family.getId() + extension); + Path qcPath = getOutDir().resolve(family.getId()).resolve(family.getId() + QC_JSON_EXTENSION); if (!Files.exists(qcPath)) { - msg = "Quality control error for family " + family.getId() + ": file " + qcPath.getFileName() + " not found"; + msg = "Failure: file " + qcPath.getFileName() + " not found"; familyQc = new FamilyQualityControl(); qcStatus = new QualityControlStatus(NONE, msg); addError(new ToolException(msg)); logger.error(msg); } else { try { - msg = "Computed successfully for family " + family.getId(); + msg = "Success"; familyQc = objectReader.readValue(qcPath.toFile()); qcStatus = new QualityControlStatus(READY, msg); logger.info(msg); } catch (IOException e) { - msg = "Quality control error for family " + family.getId() + ": error parsing JSON file " + qcPath.getFileName(); + msg = "Failure: error parsing JSON file " + qcPath.getFileName(); familyQc = new FamilyQualityControl(); qcStatus = new QualityControlStatus(NONE, msg); addError(e); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/individual/qc/IndividualVariantQcAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/individual/qc/IndividualVariantQcAnalysis.java index 49be094537..aefb69d6c6 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/individual/qc/IndividualVariantQcAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/individual/qc/IndividualVariantQcAnalysis.java @@ -23,6 +23,9 @@ import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; +import org.opencb.biodata.models.clinical.qc.InferredSexReport; +import org.opencb.biodata.models.clinical.qc.MendelianErrorReport; +import org.opencb.biodata.models.clinical.qc.RelatednessReport; import org.opencb.biodata.models.variant.avro.VariantType; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; @@ -36,6 +39,7 @@ import org.opencb.opencga.core.models.family.FamilyQualityControl; import org.opencb.opencga.core.models.individual.Individual; import org.opencb.opencga.core.models.individual.IndividualQualityControl; +import org.opencb.opencga.core.models.individual.IndividualQualityControlStatus; import org.opencb.opencga.core.models.individual.IndividualUpdateParams; import org.opencb.opencga.core.models.variant.IndividualQcAnalysisParams; import org.opencb.opencga.core.response.OpenCGAResult; @@ -45,6 +49,7 @@ import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam; +import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -52,9 +57,10 @@ import java.util.*; import java.util.stream.Collectors; -import static org.opencb.opencga.analysis.utils.VariantQcAnalysisExecutorUtils.QC_JSON_EXTENSION; import static org.opencb.opencga.core.models.common.InternalStatus.READY; +import static org.opencb.opencga.core.models.common.QualityControlStatus.COMPUTING; import static org.opencb.opencga.core.models.common.QualityControlStatus.NONE; +import static org.opencb.opencga.core.models.individual.IndividualQualityControlStatus.*; import static org.opencb.opencga.core.models.study.StudyPermissions.Permissions.WRITE_INDIVIDUALS; import static org.opencb.opencga.storage.core.variant.io.VariantWriterFactory.VariantOutputFormat.JSON; import static org.opencb.opencga.storage.core.variant.io.VariantWriterFactory.VariantOutputFormat.VCF_GZ; @@ -117,7 +123,9 @@ protected void run() throws ToolException { // Set quality control status to COMPUTING to prevent multiple individual QCs from running simultaneously // for the same individual - if (!setComputingStatus(individual.getId(), INDIVIDUAL_QC_TYPE)) { + IndividualQualityControlStatus qcStatus = new IndividualQualityControlStatus(COMPUTING, + "Performing " + INDIVIDUAL_QC_TYPE + " QC"); + if (!setQualityControlStatus(qcStatus, individual.getId(), INDIVIDUAL_QC_TYPE)) { continue; } @@ -202,46 +210,87 @@ protected void run() throws ToolException { private void updateIndividualQualityControl(List individuals) throws ToolException { ObjectMapper objectMapper = JacksonUtils.getDefaultObjectMapper(); objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); - ObjectReader objectReader = JacksonUtils.getDefaultObjectMapper().readerFor(FamilyQualityControl.class); + ObjectReader inferredSexReportReader = JacksonUtils.getDefaultObjectMapper().readerFor(InferredSexReport.class); + ObjectReader mendelianErrorReportReader = JacksonUtils.getDefaultObjectMapper().readerFor(MendelianErrorReport.class); + ObjectReader relatednessReportReader = JacksonUtils.getDefaultObjectMapper().readerFor(RelatednessReport.class); for (Individual individual : individuals) { - IndividualQualityControl individualQc; - QualityControlStatus qcStatus; - - // Check output file + // Check output files String msg; - Path qcPath = getOutDir().resolve(individual.getId()).resolve(individual.getId() + QC_JSON_EXTENSION); + Path qcPath = getOutDir().resolve(individual.getId()); if (!Files.exists(qcPath)) { - msg = "Quality control error for individual " + individual.getId() + ": file " + qcPath.getFileName() + " not found"; - individualQc = new IndividualQualityControl(); - qcStatus = new QualityControlStatus(NONE, msg); - addError(new ToolException(msg)); + msg = "Quality control error for individual " + individual.getId() + ": folder " + qcPath + " not found." + + " None quality control was performed."; logger.error(msg); + addError(new ToolException(msg)); } else { - try { - msg = "Computed successfully for individual " + individual.getId(); - individualQc = objectReader.readValue(qcPath.toFile()); - qcStatus = new QualityControlStatus(READY, msg); - logger.info(msg); - } catch (IOException e) { - msg = "Quality control error for individual " + individual.getId() + ": error parsing JSON file " + qcPath.getFileName(); - individualQc = new IndividualQualityControl(); - qcStatus = new QualityControlStatus(NONE, msg); - addError(e); - logger.error(msg); + int qcCode = NONE_READY; + IndividualQualityControl individualQc = individual.getQualityControl(); + + // Check inferred sex analysis + if (!analysisParams.getSkip().contains(INFERRED_SEX_ANALYSIS_ID)) { + File qcFile = qcPath.resolve(INFERRED_SEX_ANALYSIS_ID).resolve(individual.getId() + QC_JSON_EXTENSION).toFile(); + try { + InferredSexReport inferredSexReport = inferredSexReportReader.readValue(qcFile); + if (inferredSexReport != null) { + qcCode |= INFERRED_SEX_READY; + individualQc.getInferredSexReports().add(inferredSexReport); + } + } catch (IOException e) { + msg = "Failure: error parsing inferred sex report (JSON file: " + qcFile.getName() + " )"; + logger.error(msg, e); + addError(new ToolException(msg, e)); + } + } + + // Check Mendelian error analysis + if (!analysisParams.getSkip().contains(MENDELIAN_ERROR_ANALYSIS_ID)) { + File qcFile = qcPath.resolve(MENDELIAN_ERROR_ANALYSIS_ID).resolve(individual.getId() + QC_JSON_EXTENSION).toFile(); + try { + MendelianErrorReport mendelianErrorReport = mendelianErrorReportReader.readValue(qcFile); + if (mendelianErrorReport != null) { + qcCode |= MENDELIAN_ERROR_READY; + individualQc.getMendelianErrorReports().add(mendelianErrorReport); + } + } catch (IOException e) { + msg = "Failure: error parsing Mendelian error report (JSON file: " + qcFile.getName() + " )"; + logger.error(msg, e); + addError(new ToolException(msg, e)); + } + } + + // Check relatedness analysis + if (!analysisParams.getSkip().contains(RELATEDNESS_ANALYSIS_ID)) { + File qcFile = qcPath.resolve(RELATEDNESS_ANALYSIS_ID).resolve(individual.getId() + QC_JSON_EXTENSION).toFile(); + try { + RelatednessReport relatednessReport = relatednessReportReader.readValue(qcFile); + if (relatednessReport != null) { + qcCode |= RELATEDNESS_READY; + // individualQc.getRelatednessReports().add(relatednessReport); + individualQc.setSampleRelatednessReport(null); + } + } catch (IOException e) { + msg = "Failure: error parsing relatedness report (JSON file: " + qcFile.getName() + " )"; + logger.error(msg, e); + addError(new ToolException(msg, e)); + } } - } - try { // Update catalog: quality control and status - IndividualUpdateParams updateParams = new IndividualUpdateParams() - .setQualityControl(individualQc) - .setQualityControlStatus(qcStatus); - catalogManager.getIndividualManager().update(getStudy(), individual.getId(), updateParams, null, token); - } catch (CatalogException e) { - logger.error("Could not update quality control in OpenCGA catalog for individual {}: {}", individual.getId(), - e.getMessage()); - addError(e); + if (qcCode != NONE_READY) { + // Update the individual QC code with the current one + IndividualQualityControlStatus qcStatus = new IndividualQualityControlStatus( + qcCode | individual.getInternal().getQualityControlStatus().getCode(), ""); + try { + IndividualUpdateParams updateParams = new IndividualUpdateParams() + .setQualityControl(individualQc) + .setQualityControlStatus(qcStatus); + catalogManager.getIndividualManager().update(getStudy(), individual.getId(), updateParams, null, token); + } catch (CatalogException e) { + logger.error("Could not update quality control in OpenCGA catalog for individual " + individual.getId(), e); + addError(e); + } + } } } } @@ -272,9 +321,8 @@ public static void checkParameters(IndividualQcAnalysisParams params, String stu // Check number of samples List sampleIds = getNoSomaticSampleIds(individual); - if (sampleIds.size() < 1) { - errors.put(individualId, "Too few samples found (" + sampleIds.size() + ") for that individual; minimum is 1" - + " sample"); + if (CollectionUtils.isEmpty(sampleIds)) { + errors.put(individualId, "No samples found"); } } } catch (CatalogException e) { diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/models/IndividualPrivateUpdateParams.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/models/IndividualPrivateUpdateParams.java index d40725f610..fc75802d45 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/models/IndividualPrivateUpdateParams.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/models/IndividualPrivateUpdateParams.java @@ -6,7 +6,6 @@ import org.opencb.biodata.models.core.SexOntologyTermAnnotation; import org.opencb.biodata.models.pedigree.IndividualProperty; import org.opencb.opencga.core.models.common.AnnotationSet; -import org.opencb.opencga.core.models.common.QualityControlStatus; import org.opencb.opencga.core.models.common.StatusParams; import org.opencb.opencga.core.models.individual.*; import org.opencb.opencga.core.models.sample.SampleReferenceParam; @@ -28,7 +27,7 @@ public IndividualPrivateUpdateParams(String id, String name, IndividualReference IndividualProperty.LifeStatus lifeStatus, List samples, List annotationSets, List phenotypes, List disorders, StatusParams status, IndividualQualityControl qualityControl, - QualityControlStatus qualityControlStatus, Map attributes, + IndividualQualityControlStatus qualityControlStatus, Map attributes, IndividualInternal internal) { super(id, name, father, mother, creationDate, modificationDate, parentalConsanguinity, location, sex, ethnicity, population, dateOfBirth, karyotypicSex, lifeStatus, samples, annotationSets, phenotypes, disorders, status, qualityControl, diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/qc/VariantQcAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/qc/VariantQcAnalysis.java index c5884e3cc5..a76217e274 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/qc/VariantQcAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/qc/VariantQcAnalysis.java @@ -35,6 +35,7 @@ import org.opencb.opencga.core.models.family.FamilyUpdateParams; import org.opencb.opencga.core.models.file.File; import org.opencb.opencga.core.models.individual.Individual; +import org.opencb.opencga.core.models.individual.IndividualQualityControlStatus; import org.opencb.opencga.core.models.individual.IndividualUpdateParams; import org.opencb.opencga.core.models.sample.Sample; import org.opencb.opencga.core.models.study.Study; @@ -66,6 +67,8 @@ public class VariantQcAnalysis extends OpenCgaToolScopeStudy { public static final String RESOURCES_FOLDER = "resources/"; public static final String QC_RESOURCES_FOLDER = QC_FOLDER + RESOURCES_FOLDER; + public static final String QC_JSON_EXTENSION = ".qc.json"; + // Data type public static final String FAMILY_QC_TYPE = "family"; public static final String INDIVIDUAL_QC_TYPE = "individual"; @@ -86,7 +89,7 @@ public class VariantQcAnalysis extends OpenCgaToolScopeStudy { protected static final String INFERRED_SEX_THRESHOLDS_FILE_MSG = "Karyotypic sex thresholds file"; // For mendelian errors sex analysis - public static final String MENDELIAN_ERRORS_ANALYSIS_ID = "mendelian-errors"; + public static final String MENDELIAN_ERROR_ANALYSIS_ID = "mendelian-errors"; @Override protected void check() throws Exception { @@ -231,9 +234,8 @@ protected static Path checkFileParameter(String fileId, String msg, String study return path; } - protected boolean setComputingStatus(String id, String qcType) throws ToolException { + protected boolean setQualityControlStatus(QualityControlStatus qcStatus, String id, String qcType) throws ToolException { try { - QualityControlStatus qcStatus = new QualityControlStatus(COMPUTING, "Performing " + qcType + " QC"); switch (qcType) { case FAMILY_QC_TYPE: { FamilyUpdateParams updateParams = new FamilyUpdateParams().setQualityControlStatus(qcStatus); @@ -241,7 +243,8 @@ protected boolean setComputingStatus(String id, String qcType) throws ToolExcept break; } case INDIVIDUAL_QC_TYPE: { - IndividualUpdateParams updateParams = new IndividualUpdateParams().setQualityControlStatus(qcStatus); + IndividualUpdateParams updateParams = new IndividualUpdateParams() + .setQualityControlStatus((IndividualQualityControlStatus) qcStatus); catalogManager.getIndividualManager().update(getStudy(), id, updateParams, null, token); break; } diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/IndividualsCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/IndividualsCommandExecutor.java index ab3e85c66e..0857f907d7 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/IndividualsCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/IndividualsCommandExecutor.java @@ -20,7 +20,6 @@ import org.opencb.opencga.catalog.utils.ParamUtils.CompleteUpdateAction; import org.opencb.opencga.client.exceptions.ClientException; import org.opencb.opencga.core.common.JacksonUtils; -import org.opencb.opencga.core.models.common.QualityControlStatus; import org.opencb.opencga.core.models.common.StatusParams; import org.opencb.opencga.core.models.common.TsvAnnotationParams; import org.opencb.opencga.core.models.individual.Individual; @@ -29,6 +28,7 @@ import org.opencb.opencga.core.models.individual.IndividualCreateParams; import org.opencb.opencga.core.models.individual.IndividualPopulation; import org.opencb.opencga.core.models.individual.IndividualQualityControl; +import org.opencb.opencga.core.models.individual.IndividualQualityControlStatus; import org.opencb.opencga.core.models.individual.IndividualReferenceParam; import org.opencb.opencga.core.models.individual.IndividualUpdateParams; import org.opencb.opencga.core.models.individual.Location; @@ -454,6 +454,7 @@ private RestResponse update() throws Exception { putNestedIfNotEmpty(beanParams, "qualityControlStatus.date",commandOptions.qualityControlStatusDate, true); putNestedIfNotEmpty(beanParams, "qualityControlStatus.version",commandOptions.qualityControlStatusVersion, true); putNestedIfNotEmpty(beanParams, "qualityControlStatus.commit",commandOptions.qualityControlStatusCommit, true); + putNestedIfNotNull(beanParams, "qualityControlStatus.code",commandOptions.qualityControlStatusCode, true); putNestedIfNotNull(beanParams, "attributes",commandOptions.attributes, true); individualUpdateParams = JacksonUtils.getDefaultObjectMapper().copy() diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/options/IndividualsCommandOptions.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/options/IndividualsCommandOptions.java index 0a49adc560..cba0c05faf 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/options/IndividualsCommandOptions.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/options/IndividualsCommandOptions.java @@ -680,6 +680,9 @@ public class UpdateCommandOptions { @Parameter(names = {"--quality-control-status-commit"}, description = "The body web service commit parameter", required = false, arity = 1) public String qualityControlStatusCommit; + @Parameter(names = {"--quality-control-status-code"}, description = "The body web service code parameter", required = false, arity = 1) + public Integer qualityControlStatusCode; + @DynamicParameter(names = {"--attributes"}, description = "The body web service attributes parameter. Use: --attributes key=value", required = false) public java.util.Map attributes = new HashMap<>(); //Dynamic parameters must be initialized; diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/common/QualityControlStatus.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/common/QualityControlStatus.java index a457664a50..1072d75e09 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/common/QualityControlStatus.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/common/QualityControlStatus.java @@ -31,7 +31,7 @@ public class QualityControlStatus extends InternalStatus { public static final String COMPUTING = "COMPUTING"; public static final String INCOMPLETE = "INCOMPLETE"; - public static final List STATUS_LIST = Arrays.asList(READY, DELETED, NONE, COMPUTING, INCOMPLETE); + protected static final List STATUS_LIST = Arrays.asList(READY, DELETED, NONE, COMPUTING, INCOMPLETE); public QualityControlStatus(String status, String message) { if (isValid(status)) { @@ -49,18 +49,8 @@ public QualityControlStatus() { this(NONE, ""); } - @Override - public String getId() { - return super.getId(); - } - - @Override - public String getName() { - return super.getName(); - } - - public static IndexStatus init() { - return new IndexStatus(); + public static QualityControlStatus init() { + return new QualityControlStatus(); } public static boolean isValid(String status) { diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/individual/IndividualInternal.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/individual/IndividualInternal.java index 02565eaa8d..2c6c1f7f72 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/individual/IndividualInternal.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/individual/IndividualInternal.java @@ -23,20 +23,20 @@ public class IndividualInternal extends Internal { - private QualityControlStatus qualityControlStatus; + private IndividualQualityControlStatus qualityControlStatus; public IndividualInternal() { } public IndividualInternal(InternalStatus status, String registrationDate, String modificationDate, - QualityControlStatus qualityControlStatus) { + IndividualQualityControlStatus qualityControlStatus) { super(status, registrationDate, modificationDate); this.qualityControlStatus = qualityControlStatus; } public static IndividualInternal init() { String time = TimeUtils.getTime(); - return new IndividualInternal(new InternalStatus(InternalStatus.READY), time, time, new QualityControlStatus()); + return new IndividualInternal(new InternalStatus(InternalStatus.READY), time, time, new IndividualQualityControlStatus()); } @Override @@ -77,11 +77,11 @@ public IndividualInternal setLastModified(String lastModified) { return this; } - public QualityControlStatus getQualityControlStatus() { + public IndividualQualityControlStatus getQualityControlStatus() { return qualityControlStatus; } - public IndividualInternal setQualityControlStatus(QualityControlStatus qualityControlStatus) { + public IndividualInternal setQualityControlStatus(IndividualQualityControlStatus qualityControlStatus) { this.qualityControlStatus = qualityControlStatus; return this; } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/individual/IndividualQualityControlStatus.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/individual/IndividualQualityControlStatus.java new file mode 100644 index 0000000000..a1668dfdb9 --- /dev/null +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/individual/IndividualQualityControlStatus.java @@ -0,0 +1,103 @@ +/* + * Copyright 2015-2020 OpenCB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.opencb.opencga.core.models.individual; + +import org.opencb.opencga.core.models.common.QualityControlStatus; + +import java.util.Objects; + +public class IndividualQualityControlStatus extends QualityControlStatus { + + private int code; + + public static final int NONE_READY = 0; + public static final int INFERRED_SEX_READY = 1; + public static final int MENDELIAN_ERROR_READY = 2; + public static final int RELATEDNESS_READY = 4; + + public IndividualQualityControlStatus(int code, String message) { + String status; + switch (code) { + case NONE_READY: + status = NONE; + break; + case INFERRED_SEX_READY + MENDELIAN_ERROR_READY + RELATEDNESS_READY: + status = READY; + break; + default: + status = INCOMPLETE; + break; + } + this.code = code; + init(status, status, message); + } + + public IndividualQualityControlStatus(int code) { + this(code, ""); + } + + public IndividualQualityControlStatus() { + this(NONE_READY, ""); + } + + public IndividualQualityControlStatus(String status, String message) { + super(status, message); + } + + public static IndividualQualityControlStatus init() { + return new IndividualQualityControlStatus(); + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("IndividualQualityControlStatus{"); + sb.append("code=").append(code); + sb.append(", id='").append(id).append('\''); + sb.append(", name='").append(name).append('\''); + sb.append(", description='").append(description).append('\''); + sb.append(", date='").append(date).append('\''); + sb.append('}'); + return sb.toString(); + } + + public int getCode() { + return code; + } + + public IndividualQualityControlStatus setCode(int code) { + this.code = code; + return this; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof IndividualQualityControlStatus)) return false; + if (!super.equals(o)) return false; + + IndividualQualityControlStatus that = (IndividualQualityControlStatus) o; + + return Objects.equals(code, that.code); + } + + @Override + public int hashCode() { + int result = super.hashCode(); + result = 31 * result + code; + return result; + } +} diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/individual/IndividualUpdateParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/individual/IndividualUpdateParams.java index b8ba37f0f4..c35a2373f7 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/individual/IndividualUpdateParams.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/individual/IndividualUpdateParams.java @@ -25,7 +25,6 @@ import org.opencb.biodata.models.pedigree.IndividualProperty; import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.opencga.core.models.common.AnnotationSet; -import org.opencb.opencga.core.models.common.QualityControlStatus; import org.opencb.opencga.core.models.common.StatusParams; import org.opencb.opencga.core.models.sample.Sample; import org.opencb.opencga.core.models.sample.SampleReferenceParam; @@ -60,9 +59,12 @@ public class IndividualUpdateParams { private List disorders; private StatusParams status; private IndividualQualityControl qualityControl; - private QualityControlStatus qualityControlStatus; + private IndividualQualityControlStatus qualityControlStatus; private Map attributes; + private static final String QUALITY_CONTROL_STATUS_KEY = "qualityControlStatus"; + private static final String INTERNAL_QUALITY_CONTROL_STATUS_KEY = "internal.qualityControlStatus"; + public IndividualUpdateParams() { } @@ -72,8 +74,8 @@ public IndividualUpdateParams(String id, String name, IndividualReferenceParam f String dateOfBirth, IndividualProperty.KaryotypicSex karyotypicSex, IndividualProperty.LifeStatus lifeStatus, List samples, List annotationSets, List phenotypes, List disorders, - StatusParams status, IndividualQualityControl qualityControl, QualityControlStatus qualityControlStatus, - Map attributes) { + StatusParams status, IndividualQualityControl qualityControl, + IndividualQualityControlStatus qualityControlStatus, Map attributes) { this.id = id; this.name = name; this.father = father; @@ -104,9 +106,9 @@ public ObjectMap getUpdateMap() throws JsonProcessingException { this.annotationSets = null; ObjectMap params = new ObjectMap(getUpdateObjectMapper().writeValueAsString(this)); - if (params.containsKey("qualityControlStatus")) { - params.put("internal.qualityControlStatus", params.get("qualityControlStatus")); - params.remove("qualityControlStatus"); + if (params.containsKey(QUALITY_CONTROL_STATUS_KEY)) { + params.put(INTERNAL_QUALITY_CONTROL_STATUS_KEY, params.get(QUALITY_CONTROL_STATUS_KEY)); + params.remove(QUALITY_CONTROL_STATUS_KEY); } this.annotationSets = annotationSetList; @@ -341,11 +343,11 @@ public IndividualUpdateParams setQualityControl(IndividualQualityControl quality return this; } - public QualityControlStatus getQualityControlStatus() { + public IndividualQualityControlStatus getQualityControlStatus() { return qualityControlStatus; } - public IndividualUpdateParams setQualityControlStatus(QualityControlStatus qualityControlStatus) { + public IndividualUpdateParams setQualityControlStatus(IndividualQualityControlStatus qualityControlStatus) { this.qualityControlStatus = qualityControlStatus; return this; }