From 4a5aabc494a02f9ddded9647c174637e0d84d017 Mon Sep 17 00:00:00 2001 From: Tobias Koch Date: Thu, 17 Oct 2024 15:06:18 +0200 Subject: [PATCH] Fix measurement registration (#854) * Fix measurement registration * Fix mandatory property for ngs measurements * fix column header names * Separate register from edit case * Fix analysisMethod storage to use the enum name again * fix wrong method call Co-authored-by: steffengreiner * fix inverted boolean flag --------- Co-authored-by: steffengreiner --- .../sample/AnalysisMethodConverter.java | 4 +- .../domain/model/sample/Sample.java | 3 + .../parser/MeasurementMetadataConverter.java | 7 +- .../datamanager/parser/MetadataConverter.java | 172 +++++++++++++++--- .../measurement/NGSMeasurementEditColumn.java | 46 +++-- .../NGSMeasurementRegisterColumn.java | 67 ++++++- .../ProteomicsMeasurementEditColumn.java | 51 +++--- .../ProteomicsMeasurementRegisterColumn.java | 48 +++++ .../SampleInformationExtractor.java | 5 +- .../NGSMeasurementEditTemplate.java | 10 +- .../ProteomicsMeasurementEditTemplate.java | 11 +- .../MeasurementMetadataUploadDialog.java | 11 +- .../batch/EditSampleBatchDialog.java | 4 +- .../batch/RegisterSampleBatchDialog.java | 4 +- 14 files changed, 355 insertions(+), 88 deletions(-) rename user-interface/src/main/java/life/qbic/datamanager/parser/{ => sample}/SampleInformationExtractor.java (96%) diff --git a/project-management/src/main/java/life/qbic/projectmanagement/application/sample/AnalysisMethodConverter.java b/project-management/src/main/java/life/qbic/projectmanagement/application/sample/AnalysisMethodConverter.java index 16118c627..4ea37b772 100644 --- a/project-management/src/main/java/life/qbic/projectmanagement/application/sample/AnalysisMethodConverter.java +++ b/project-management/src/main/java/life/qbic/projectmanagement/application/sample/AnalysisMethodConverter.java @@ -12,7 +12,7 @@ public String convertToDatabaseColumn(AnalysisMethod attribute) { if (attribute == null) { return null; } - return attribute.abbreviation(); + return attribute.name(); } @Override @@ -20,7 +20,7 @@ public AnalysisMethod convertToEntityAttribute(String dbData) { if (dbData == null) { return null; } - return AnalysisMethod.forAbbreviation(dbData).orElse(null); + return AnalysisMethod.valueOf(dbData); } } diff --git a/project-management/src/main/java/life/qbic/projectmanagement/domain/model/sample/Sample.java b/project-management/src/main/java/life/qbic/projectmanagement/domain/model/sample/Sample.java index 2c20ea509..798a57414 100644 --- a/project-management/src/main/java/life/qbic/projectmanagement/domain/model/sample/Sample.java +++ b/project-management/src/main/java/life/qbic/projectmanagement/domain/model/sample/Sample.java @@ -178,6 +178,9 @@ static class AnalysisMethodConverter implements AttributeConverter * * @param parsingResult the parsing result to take as input for the conversion. - * @param ignoreMeasurementId weather to ignore the measurement identifier or not * @return a list of converted implementations of {@link MeasurementMetadata}. * @throws UnknownMetadataTypeException if no matching implementation of * {@link MeasurementMetadata} can be associated from the * provided {@link ParsingResult#columnMap()}. * @since 1.4.0 */ - List convert(ParsingResult parsingResult, - boolean ignoreMeasurementId) + List convertRegister(ParsingResult parsingResult) throws UnknownMetadataTypeException; + List convertEdit(ParsingResult parsingResult) + throws UnknownMetadataTypeException, MissingSampleIdException; + class UnknownMetadataTypeException extends RuntimeException { public UnknownMetadataTypeException(String message) { diff --git a/user-interface/src/main/java/life/qbic/datamanager/parser/MetadataConverter.java b/user-interface/src/main/java/life/qbic/datamanager/parser/MetadataConverter.java index 4e48c42f1..0e7993cf9 100644 --- a/user-interface/src/main/java/life/qbic/datamanager/parser/MetadataConverter.java +++ b/user-interface/src/main/java/life/qbic/datamanager/parser/MetadataConverter.java @@ -14,7 +14,9 @@ import java.util.function.Function; import java.util.stream.Collectors; import life.qbic.datamanager.parser.measurement.NGSMeasurementEditColumn; +import life.qbic.datamanager.parser.measurement.NGSMeasurementRegisterColumn; import life.qbic.datamanager.parser.measurement.ProteomicsMeasurementEditColumn; +import life.qbic.datamanager.parser.measurement.ProteomicsMeasurementRegisterColumn; import life.qbic.logging.api.Logger; import life.qbic.projectmanagement.application.measurement.Labeling; import life.qbic.projectmanagement.application.measurement.MeasurementMetadata; @@ -82,14 +84,30 @@ private static Map countHits(Collection target, Set convert(ParsingResult parsingResult, boolean ignoreMeasurementId) + public List convertRegister(ParsingResult parsingResult) throws UnknownMetadataTypeException, MissingSampleIdException { Objects.requireNonNull(parsingResult); var properties = parsingResult.columnMap().keySet(); - if (looksLikeNgsMeasurement(properties, ignoreMeasurementId)) { - return tryConversion(this::convertNGSMeasurement, parsingResult); - } else if (looksLikeProteomicsMeasurement(properties, ignoreMeasurementId)) { - return tryConversion(this::convertProteomicsMeasurement, parsingResult); + if (looksLikeNgsMeasurement(properties, true)) { + return tryConversion(this::convertNewNGSMeasurement, parsingResult); + } else if (looksLikeProteomicsMeasurement(properties, true)) { + return tryConversion(this::convertNewProteomicsMeasurement, parsingResult); + } else { + throw new UnknownMetadataTypeException( + "Unknown metadata type: cannot match properties to any known metadata type. Provided [%s]".formatted( + String.join(", ", properties))); + } + } + + @Override + public List convertEdit(ParsingResult parsingResult) + throws UnknownMetadataTypeException, MissingSampleIdException { + Objects.requireNonNull(parsingResult); + var properties = parsingResult.columnMap().keySet(); + if (looksLikeNgsMeasurement(properties, false)) { + return tryConversion(this::convertExistingNGSMeasurement, parsingResult); + } else if (looksLikeProteomicsMeasurement(properties, false)) { + return tryConversion(this::convertExistingProteomicsMeasurement, parsingResult); } else { throw new UnknownMetadataTypeException( "Unknown metadata type: cannot match properties to any known metadata type. Provided [%s]".formatted( @@ -106,7 +124,65 @@ private List tryConversion( } } - private List convertProteomicsMeasurement(ParsingResult parsingResult) { + private List convertNewProteomicsMeasurement(ParsingResult parsingResult) { + var result = new ArrayList(); + for (int i = 0; i < parsingResult.rows().size(); i++) { + var sampleCode = SampleCode.create(parsingResult.getValueOrDefault(i, + ProteomicsMeasurementRegisterColumn.SAMPLE_ID.headerName(), "")); + var technicalReplicateName = parsingResult.getValueOrDefault(i, + ProteomicsMeasurementRegisterColumn.TECHNICAL_REPLICATE_NAME.headerName(), ""); + var organisationId = parsingResult.getValueOrDefault(i, + ProteomicsMeasurementRegisterColumn.ORGANISATION_ID.headerName(), ""); + var msDevice = parsingResult.getValueOrDefault(i, + ProteomicsMeasurementRegisterColumn.MS_DEVICE.headerName(), ""); + var samplePoolGroup = parsingResult.getValueOrDefault(i, + ProteomicsMeasurementRegisterColumn.POOL_GROUP.headerName(), ""); + var facility = parsingResult.getValueOrDefault(i, + ProteomicsMeasurementRegisterColumn.FACILITY.headerName(), ""); + var fractionName = parsingResult.getValueOrDefault(i, + ProteomicsMeasurementRegisterColumn.CYCLE_FRACTION_NAME.headerName(), ""); + var digestionEnzyme = parsingResult.getValueOrDefault(i, + ProteomicsMeasurementRegisterColumn.DIGESTION_ENZYME.headerName(), ""); + var digestionMethod = parsingResult.getValueOrDefault(i, + ProteomicsMeasurementRegisterColumn.DIGESTION_METHOD.headerName(), ""); + var enrichmentMethod = parsingResult.getValueOrDefault(i, + ProteomicsMeasurementRegisterColumn.ENRICHMENT_METHOD.headerName(), ""); + var injectionVolume = parsingResult.getValueOrDefault(i, + ProteomicsMeasurementRegisterColumn.INJECTION_VOLUME.headerName(), ""); + var lcColumn = parsingResult.getValueOrDefault(i, + ProteomicsMeasurementRegisterColumn.LC_COLUMN.headerName(), ""); + var lcmsMethod = parsingResult.getValueOrDefault(i, + ProteomicsMeasurementRegisterColumn.LCMS_METHOD.headerName(), ""); + var labelingType = parsingResult.getValueOrDefault(i, + ProteomicsMeasurementRegisterColumn.LABELING_TYPE.headerName(), ""); + var label = parsingResult.getValueOrDefault(i, + ProteomicsMeasurementRegisterColumn.LABEL.headerName(), ""); + var comment = parsingResult.getValueOrDefault(i, + ProteomicsMeasurementRegisterColumn.COMMENT.headerName(), ""); + var pxpMetaDaturm = new ProteomicsMeasurementMetadata( + "", + sampleCode, + technicalReplicateName, + organisationId, + msDevice, + samplePoolGroup, + facility, + fractionName, + digestionEnzyme, + digestionMethod, + enrichmentMethod, + injectionVolume, + lcColumn, + lcmsMethod, + new Labeling(labelingType, label), + comment); + result.add(pxpMetaDaturm); + } + return result; + } + + private List convertExistingProteomicsMeasurement( + ParsingResult parsingResult) { var result = new ArrayList(); for (int i = 0; i < parsingResult.rows().size(); i++) { var measurementId = parsingResult.getValueOrDefault(i, @@ -164,7 +240,7 @@ private List convertProteomicsMeasurement(ParsingResult par return result; } - private List convertNGSMeasurement(ParsingResult parsingResult) { + private List convertExistingNGSMeasurement(ParsingResult parsingResult) { var result = new ArrayList(); for (int i = 0; i < parsingResult.rows().size(); i++) { @@ -182,7 +258,7 @@ private List convertNGSMeasurement(ParsingResult parsingRes var facility = parsingResult.getValueOrDefault(i, NGSMeasurementEditColumn.FACILITY.headerName(), ""); var sequencingReadType = parsingResult.getValueOrDefault(i, - NGSMeasurementEditColumn.SEQUENCING_RUN_PROTOCOL.headerName(), ""); + NGSMeasurementEditColumn.SEQUENCING_READ_TYPE.headerName(), ""); var libraryKit = parsingResult.getValueOrDefault(i, NGSMeasurementEditColumn.LIBRARY_KIT.headerName(), ""); var flowCell = parsingResult.getValueOrDefault(i, @@ -217,22 +293,74 @@ private List convertNGSMeasurement(ParsingResult parsingRes return result; } + private List convertNewNGSMeasurement(ParsingResult parsingResult) { + var result = new ArrayList(); + + for (int i = 0; i < parsingResult.rows().size(); i++) { + var sampleCodes = List.of( + SampleCode.create( + parsingResult.getValueOrDefault(i, + NGSMeasurementRegisterColumn.SAMPLE_ID.headerName(), + "")) + ); + var organisationId = parsingResult.getValueOrDefault(i, + NGSMeasurementRegisterColumn.ORGANISATION_ID.headerName(), ""); + var instrument = parsingResult.getValueOrDefault(i, + NGSMeasurementRegisterColumn.INSTRUMENT.headerName(), ""); + var facility = parsingResult.getValueOrDefault(i, + NGSMeasurementRegisterColumn.FACILITY.headerName(), ""); + var sequencingReadType = parsingResult.getValueOrDefault(i, + NGSMeasurementRegisterColumn.SEQUENCING_READ_TYPE.headerName(), ""); + var libraryKit = parsingResult.getValueOrDefault(i, + NGSMeasurementRegisterColumn.LIBRARY_KIT.headerName(), ""); + var flowCell = parsingResult.getValueOrDefault(i, + NGSMeasurementRegisterColumn.FLOW_CELL.headerName(), ""); + var runProtocol = parsingResult.getValueOrDefault(i, + NGSMeasurementRegisterColumn.SEQUENCING_RUN_PROTOCOL.headerName(), ""); + var poolGroup = parsingResult.getValueOrDefault(i, + NGSMeasurementRegisterColumn.POOL_GROUP.headerName(), ""); + var indexI7 = parsingResult.getValueOrDefault(i, + NGSMeasurementRegisterColumn.INDEX_I7.headerName(), ""); + var indexI5 = parsingResult.getValueOrDefault(i, + NGSMeasurementRegisterColumn.INDEX_I5.headerName(), ""); + var comment = parsingResult.getValueOrDefault(i, + NGSMeasurementRegisterColumn.COMMENT.headerName(), ""); + var metadatum = new NGSMeasurementMetadata( + "", + sampleCodes, + organisationId, + instrument, + facility, + sequencingReadType, + libraryKit, + flowCell, + runProtocol, + poolGroup, + indexI7, + indexI5, + comment + ); + result.add(metadatum); + } + return result; + } + private boolean looksLikeNgsMeasurement(Collection properties, boolean ignoreID) { var formattedProperties = properties.stream().map(String::toLowerCase) .collect(Collectors.toList()); Map hitMap; if (ignoreID) { - formattedProperties.remove(NGSMeasurementEditColumn.MEASUREMENT_ID.headerName()); hitMap = countHits(formattedProperties, - Arrays.stream(NGSMeasurementEditColumn.values()) - .map(NGSMeasurementEditColumn::headerName) - .collect( - Collectors.toSet()), NGSMeasurementEditColumn.MEASUREMENT_ID.headerName()); + Arrays.stream(NGSMeasurementRegisterColumn.values()) + .map(NGSMeasurementRegisterColumn::headerName) + .map(Sanitizer::headerEncoder) + .collect(Collectors.toSet()), NGSMeasurementEditColumn.MEASUREMENT_ID.headerName()); } else { hitMap = countHits(formattedProperties, Arrays.stream(NGSMeasurementEditColumn.values()) - .map(NGSMeasurementEditColumn::headerName).collect( - Collectors.toSet())); + .map(NGSMeasurementEditColumn::headerName) + .map(Sanitizer::headerEncoder) + .collect(Collectors.toSet())); } var missingProperties = new ArrayList<>(); for (Entry entry : hitMap.entrySet()) { @@ -253,16 +381,18 @@ private boolean looksLikeProteomicsMeasurement(Collection properties, bo .collect(Collectors.toList()); Map hitMap; if (ignoreID) { - formattedProperties.remove(ProteomicsMeasurementEditColumn.MEASUREMENT_ID.headerName()); hitMap = countHits(formattedProperties, - Arrays.stream(ProteomicsMeasurementEditColumn.values()) - .map(ProteomicsMeasurementEditColumn::headerName).collect( - Collectors.toSet()), ProteomicsMeasurementEditColumn.MEASUREMENT_ID.headerName()); + Arrays.stream(ProteomicsMeasurementRegisterColumn.values()) + .map(ProteomicsMeasurementRegisterColumn::headerName) + .map(Sanitizer::headerEncoder) + .collect(Collectors.toSet()), + ProteomicsMeasurementEditColumn.MEASUREMENT_ID.headerName()); } else { hitMap = countHits(formattedProperties, Arrays.stream(ProteomicsMeasurementEditColumn.values()) - .map(ProteomicsMeasurementEditColumn::headerName).collect( - Collectors.toSet())); + .map(ProteomicsMeasurementEditColumn::headerName) + .map(Sanitizer::headerEncoder) + .collect(Collectors.toSet())); } var missingProperties = new ArrayList<>(); for (Entry entry : hitMap.entrySet()) { diff --git a/user-interface/src/main/java/life/qbic/datamanager/parser/measurement/NGSMeasurementEditColumn.java b/user-interface/src/main/java/life/qbic/datamanager/parser/measurement/NGSMeasurementEditColumn.java index 9115cf367..5fef50044 100644 --- a/user-interface/src/main/java/life/qbic/datamanager/parser/measurement/NGSMeasurementEditColumn.java +++ b/user-interface/src/main/java/life/qbic/datamanager/parser/measurement/NGSMeasurementEditColumn.java @@ -5,34 +5,35 @@ /** * NGS Measurement Columns * - *

Enumeration of the columns shown in the file used for NGS measurement registration and edit + *

Enumeration of the columns shown in the file used for NGS measurement edit * in the context of measurement file based upload. Provides the name of the header column, the * column index and if the column should be set to readOnly in the generated sheet *

*/ public enum NGSMeasurementEditColumn { - MEASUREMENT_ID("Measurement ID", 0, true), - SAMPLE_ID("QBiC Sample Id", 1, true), - SAMPLE_NAME("Sample Name", 2, true), - POOL_GROUP("Sample Pool Group", 3, true), - ORGANISATION_ID("Organisation ID", 4, false), - ORGANISATION_NAME("Organisation Name", 5, true), - FACILITY("Facility", 6, false), - INSTRUMENT("Instrument", 7, false), - INSTRUMENT_NAME("Instrument Name", 8, true), - SEQUENCING_READ_TYPE("Sequencing Read Type", 9, false), - LIBRARY_KIT("Library Kit", 10, false), - FLOW_CELL("Flow Cell", 11, false), - SEQUENCING_RUN_PROTOCOL("Sequencing Run Protocol", 12, false), - INDEX_I7("Index i7", 13, false), - INDEX_I5("Index i5", 14, false), - COMMENT("Comment", 15, false), + MEASUREMENT_ID("Measurement ID", 0, true, true), + SAMPLE_ID("QBiC Sample Id", 1, true, true), + SAMPLE_NAME("Sample Name", 2, true, false), + POOL_GROUP("Sample Pool Group", 3, true, false), + ORGANISATION_ID("Organisation ID", 4, false, true), + ORGANISATION_NAME("Organisation Name", 5, true, false), + FACILITY("Facility", 6, false, true), + INSTRUMENT("Instrument", 7, false, true), + INSTRUMENT_NAME("Instrument Name", 8, true, false), + SEQUENCING_READ_TYPE("Sequencing Read Type", 9, false, true), + LIBRARY_KIT("Library Kit", 10, false, false), + FLOW_CELL("Flow Cell", 11, false, false), + SEQUENCING_RUN_PROTOCOL("Sequencing Run Protocol", 12, false, false), + INDEX_I7("Index i7", 13, false, false), + INDEX_I5("Index i5", 14, false, false), + COMMENT("Comment", 15, false, false), ; private final String headerName; private final int columnIndex; private final boolean readOnly; + private final boolean mandatory; static int maxColumnIndex() { return Arrays.stream(values()) @@ -44,11 +45,14 @@ static int maxColumnIndex() { * @param headerName the name in the header * @param columnIndex the index of the column this property is in * @param readOnly is the property read only + * @param mandatory */ - NGSMeasurementEditColumn(String headerName, int columnIndex, boolean readOnly) { + NGSMeasurementEditColumn(String headerName, int columnIndex, boolean readOnly, + boolean mandatory) { this.headerName = headerName; this.columnIndex = columnIndex; this.readOnly = readOnly; + this.mandatory = mandatory; } public String headerName() { @@ -59,8 +63,12 @@ public int columnIndex() { return columnIndex; } - public boolean readOnly() { + public boolean isReadOnly() { return readOnly; } + public boolean isMandatory() { + return mandatory; + } + } diff --git a/user-interface/src/main/java/life/qbic/datamanager/parser/measurement/NGSMeasurementRegisterColumn.java b/user-interface/src/main/java/life/qbic/datamanager/parser/measurement/NGSMeasurementRegisterColumn.java index be928dcc3..283e91f3a 100644 --- a/user-interface/src/main/java/life/qbic/datamanager/parser/measurement/NGSMeasurementRegisterColumn.java +++ b/user-interface/src/main/java/life/qbic/datamanager/parser/measurement/NGSMeasurementRegisterColumn.java @@ -1,13 +1,70 @@ package life.qbic.datamanager.parser.measurement; +import java.util.Arrays; + /** - * TODO! - * short description - * - *

detailed description

+ * NGS Measurement Columns * - * @since + *

Enumeration of the columns shown in the file used for NGS measurement registration + * in the context of measurement file based upload. Provides the name of the header column, the + * column index and if the column should be set to readOnly in the generated sheet + *

*/ public enum NGSMeasurementRegisterColumn { + SAMPLE_ID("QBiC Sample Id", 0, false, true), + SAMPLE_NAME("Sample Name", 1, false, false), + POOL_GROUP("Sample Pool Group", 2, false, false), + ORGANISATION_ID("Organisation ID", 3, false, true), + FACILITY("Facility", 4, false, true), + INSTRUMENT("Instrument", 5, false, true), + SEQUENCING_READ_TYPE("Sequencing Read Type", 6, false, true), + LIBRARY_KIT("Library Kit", 7, false, false), + FLOW_CELL("Flow Cell", 8, false, false), + SEQUENCING_RUN_PROTOCOL("Sequencing Run Protocol", 11, false, false), + INDEX_I7("Index i7", 9, false, false), + INDEX_I5("Index i5", 10, false, false), + COMMENT("Comment", 11, false, false), + ; + + private final String headerName; + private final int columnIndex; + private final boolean readOnly; + private final boolean mandatory; + + static int maxColumnIndex() { + return Arrays.stream(values()) + .mapToInt(NGSMeasurementRegisterColumn::columnIndex) + .max().orElse(0); + } + + /** + * @param headerName the name in the header + * @param columnIndex the index of the column this property is in + * @param readOnly is the property read only + * @param mandatory + */ + NGSMeasurementRegisterColumn(String headerName, int columnIndex, boolean readOnly, + boolean mandatory) { + this.headerName = headerName; + this.columnIndex = columnIndex; + this.readOnly = readOnly; + this.mandatory = mandatory; + } + + public String headerName() { + return headerName; + } + + public int columnIndex() { + return columnIndex; + } + + public boolean readOnly() { + return readOnly; + } + + public boolean isMandatory() { + return mandatory; + } } diff --git a/user-interface/src/main/java/life/qbic/datamanager/parser/measurement/ProteomicsMeasurementEditColumn.java b/user-interface/src/main/java/life/qbic/datamanager/parser/measurement/ProteomicsMeasurementEditColumn.java index b36701c8f..db45d76b8 100644 --- a/user-interface/src/main/java/life/qbic/datamanager/parser/measurement/ProteomicsMeasurementEditColumn.java +++ b/user-interface/src/main/java/life/qbic/datamanager/parser/measurement/ProteomicsMeasurementEditColumn.java @@ -10,36 +10,39 @@ */ public enum ProteomicsMeasurementEditColumn { - MEASUREMENT_ID("Measurement ID", 0, true), - SAMPLE_ID("QBiC Sample Id", 1, true), + MEASUREMENT_ID("Measurement ID", 0, true, true), + SAMPLE_ID("QBiC Sample Id", 1, true, true), SAMPLE_NAME( - "Sample Name", 2, true), - POOL_GROUP("Sample Pool Group", 3, true), - TECHNICAL_REPLICATE_NAME("Technical Replicate", 4, false), - ORGANISATION_ID("Organisation ID", 5, false), - ORGANISATION_NAME("Organisation Name", 6, true), - FACILITY("Facility", 7, false), - MS_DEVICE("MS Device", 8, false), - MS_DEVICE_NAME("MS Device Name", 9, true), - CYCLE_FRACTION_NAME("Cycle/Fraction Name", 10, false), - DIGESTION_METHOD("Digestion Method", 11, false), - DIGESTION_ENZYME("Digestion Enzyme", 12, false), - ENRICHMENT_METHOD("Enrichment Method", 13, false), - INJECTION_VOLUME("Injection Volume (µL)", 14, false), - LC_COLUMN("LC Column", 15, false), - LCMS_METHOD("LCMS Method", 16, false), - LABELING_TYPE("Labeling Type", 17, false), - LABEL("Label", 18, false), - COMMENT("Comment", 19, false), + "Sample Name", 2, true, false), + POOL_GROUP("Sample Pool Group", 3, true, false), + TECHNICAL_REPLICATE_NAME("Technical Replicate", 4, false, false), + ORGANISATION_ID("Organisation ID", 5, false, true), + ORGANISATION_NAME("Organisation Name", 6, true, false), + FACILITY("Facility", 7, false, true), + MS_DEVICE("MS Device", 8, false, true), + MS_DEVICE_NAME("MS Device Name", 9, true, true), + CYCLE_FRACTION_NAME("Cycle/Fraction Name", 10, false, false), + DIGESTION_METHOD("Digestion Method", 11, false, true), + DIGESTION_ENZYME("Digestion Enzyme", 12, false, true), + ENRICHMENT_METHOD("Enrichment Method", 13, false, false), + INJECTION_VOLUME("Injection Volume (µL)", 14, false, false), + LC_COLUMN("LC Column", 15, false, true), + LCMS_METHOD("LCMS Method", 16, false, false), + LABELING_TYPE("Labeling Type", 17, false, false), + LABEL("Label", 18, false, false), + COMMENT("Comment", 19, false, false), ; private final String headerName; private final int columnIndex; private final boolean readOnly; + private final boolean mandatory; - ProteomicsMeasurementEditColumn(String headerName, int columnIndex, boolean readOnly) { + ProteomicsMeasurementEditColumn(String headerName, int columnIndex, boolean readOnly, + boolean mandatory) { this.headerName = headerName; this.columnIndex = columnIndex; this.readOnly = readOnly; + this.mandatory = mandatory; } public String headerName() { @@ -50,7 +53,11 @@ public int columnIndex() { return columnIndex; } - public boolean readOnly() { + public boolean isReadOnly() { return readOnly; } + + public boolean isMandatory() { + return mandatory; + } } diff --git a/user-interface/src/main/java/life/qbic/datamanager/parser/measurement/ProteomicsMeasurementRegisterColumn.java b/user-interface/src/main/java/life/qbic/datamanager/parser/measurement/ProteomicsMeasurementRegisterColumn.java index 17a13d0c9..12fdcaadb 100644 --- a/user-interface/src/main/java/life/qbic/datamanager/parser/measurement/ProteomicsMeasurementRegisterColumn.java +++ b/user-interface/src/main/java/life/qbic/datamanager/parser/measurement/ProteomicsMeasurementRegisterColumn.java @@ -9,4 +9,52 @@ * @since */ public enum ProteomicsMeasurementRegisterColumn { + + SAMPLE_ID("QBiC Sample Id", 0, true, true), + SAMPLE_NAME( + "Sample Name", 1, true, false), + POOL_GROUP("Sample Pool Group", 2, true, false), + TECHNICAL_REPLICATE_NAME("Technical Replicate", 3, false, false), + CYCLE_FRACTION_NAME("Cycle/Fraction Name", 4, false, false), + ORGANISATION_ID("Organisation ID", 5, false, true), + FACILITY("Facility", 6, false, true), + LC_COLUMN("LC Column", 7, false, true), + MS_DEVICE("MS Device", 8, false, true), + LCMS_METHOD("LCMS Method", 9, false, false), + DIGESTION_METHOD("Digestion Method", 10, false, true), + DIGESTION_ENZYME("Digestion Enzyme", 11, false, true), + ENRICHMENT_METHOD("Enrichment Method", 12, false, false), + LABELING_TYPE("Labeling Type", 13, false, false), + LABEL("Label", 14, false, false), + INJECTION_VOLUME("Injection Volume (µL)", 15, false, false), + COMMENT("Comment", 16, false, false), + ; + private final String headerName; + private final int columnIndex; + private final boolean readOnly; + private final boolean mandatory; + + ProteomicsMeasurementRegisterColumn(String headerName, int columnIndex, boolean readOnly, + boolean mandatory) { + this.headerName = headerName; + this.columnIndex = columnIndex; + this.readOnly = readOnly; + this.mandatory = mandatory; + } + + public String headerName() { + return headerName; + } + + public int columnIndex() { + return columnIndex; + } + + public boolean isReadOnly() { + return readOnly; + } + + public boolean isMandatory() { + return mandatory; + } } diff --git a/user-interface/src/main/java/life/qbic/datamanager/parser/SampleInformationExtractor.java b/user-interface/src/main/java/life/qbic/datamanager/parser/sample/SampleInformationExtractor.java similarity index 96% rename from user-interface/src/main/java/life/qbic/datamanager/parser/SampleInformationExtractor.java rename to user-interface/src/main/java/life/qbic/datamanager/parser/sample/SampleInformationExtractor.java index 6eaca56c1..104230d7c 100644 --- a/user-interface/src/main/java/life/qbic/datamanager/parser/SampleInformationExtractor.java +++ b/user-interface/src/main/java/life/qbic/datamanager/parser/sample/SampleInformationExtractor.java @@ -1,9 +1,8 @@ -package life.qbic.datamanager.parser; +package life.qbic.datamanager.parser.sample; import java.util.ArrayList; import java.util.List; -import life.qbic.datamanager.parser.sample.EditColumn; -import life.qbic.datamanager.parser.sample.RegisterColumn; +import life.qbic.datamanager.parser.ParsingResult; /** * Extracts sample information from a parsing result. diff --git a/user-interface/src/main/java/life/qbic/datamanager/templates/measurement/NGSMeasurementEditTemplate.java b/user-interface/src/main/java/life/qbic/datamanager/templates/measurement/NGSMeasurementEditTemplate.java index 53497314b..b75de213e 100644 --- a/user-interface/src/main/java/life/qbic/datamanager/templates/measurement/NGSMeasurementEditTemplate.java +++ b/user-interface/src/main/java/life/qbic/datamanager/templates/measurement/NGSMeasurementEditTemplate.java @@ -91,7 +91,7 @@ private static void writeMeasurementIntoRow(NGSMeasurementEntry ngsMeasurementEn }; var cell = getOrCreateCell(entryRow, measurementColumn.columnIndex()); cell.setCellValue(value); - if (measurementColumn.readOnly()) { + if (measurementColumn.isReadOnly()) { cell.setCellStyle(readOnlyCellStyle); } } @@ -123,9 +123,13 @@ public byte[] getContent() { Row header = getOrCreateRow(sheet, 0); for (NGSMeasurementEditColumn value : NGSMeasurementEditColumn.values()) { var cell = getOrCreateCell(header, value.columnIndex()); - cell.setCellValue(value.headerName()); + if (value.isMandatory()) { + cell.setCellValue(value.headerName() + "*"); + } else { + cell.setCellValue(value.headerName()); + } cell.setCellStyle(boldStyle); - if (value.readOnly()) { + if (value.isReadOnly()) { cell.setCellStyle(readOnlyHeaderStyle); } } diff --git a/user-interface/src/main/java/life/qbic/datamanager/templates/measurement/ProteomicsMeasurementEditTemplate.java b/user-interface/src/main/java/life/qbic/datamanager/templates/measurement/ProteomicsMeasurementEditTemplate.java index 502f4dba2..7fce85779 100644 --- a/user-interface/src/main/java/life/qbic/datamanager/templates/measurement/ProteomicsMeasurementEditTemplate.java +++ b/user-interface/src/main/java/life/qbic/datamanager/templates/measurement/ProteomicsMeasurementEditTemplate.java @@ -81,7 +81,8 @@ private static void createMeasurementEntry(ProteomicsMeasurementEntry pxpEntry, }; var cell = getOrCreateCell(entryRow, measurementColumn.columnIndex()); cell.setCellValue(value); - if (measurementColumn.readOnly()) { + cell.setCellValue(value); + if (measurementColumn.isReadOnly()) { cell.setCellStyle(readOnlyStyle); } } @@ -110,8 +111,12 @@ public byte[] getContent() { Row header = getOrCreateRow(sheet, 0); for (ProteomicsMeasurementEditColumn measurementColumn : ProteomicsMeasurementEditColumn.values()) { var cell = getOrCreateCell(header, measurementColumn.columnIndex()); - cell.setCellValue(measurementColumn.headerName()); - if (measurementColumn.readOnly()) { + if (measurementColumn.isMandatory()) { + cell.setCellValue(measurementColumn.headerName() + "*"); + } else { + cell.setCellValue(measurementColumn.headerName()); + } + if (measurementColumn.isReadOnly()) { cell.setCellStyle(readOnlyHeaderStyle); } else { cell.setCellStyle(boldStyle); diff --git a/user-interface/src/main/java/life/qbic/datamanager/views/projects/project/measurements/MeasurementMetadataUploadDialog.java b/user-interface/src/main/java/life/qbic/datamanager/views/projects/project/measurements/MeasurementMetadataUploadDialog.java index f301c4605..6a17c423b 100644 --- a/user-interface/src/main/java/life/qbic/datamanager/views/projects/project/measurements/MeasurementMetadataUploadDialog.java +++ b/user-interface/src/main/java/life/qbic/datamanager/views/projects/project/measurements/MeasurementMetadataUploadDialog.java @@ -9,6 +9,7 @@ import com.vaadin.flow.component.html.Div; import com.vaadin.flow.component.html.ListItem; import com.vaadin.flow.component.html.OrderedList; +import com.vaadin.flow.component.html.OrderedList.NumberingType; import com.vaadin.flow.component.html.Span; import com.vaadin.flow.component.icon.Icon; import com.vaadin.flow.component.icon.VaadinIcon; @@ -210,8 +211,12 @@ private void onUploadSucceeded(SucceededEvent succeededEvent) { }; List result; try { - result = MetadataConverter.measurementConverter() - .convert(parsingResult, mode.equals(MODE.ADD)); + result = switch (mode) { + case ADD -> MetadataConverter.measurementConverter() + .convertRegister(parsingResult); + case EDIT -> MetadataConverter.measurementConverter() + .convertEdit(parsingResult); + }; } catch ( UnknownMetadataTypeException e) { // we want to display this in the dialog, not via the notification system displayError(succeededEvent.getFileName(), @@ -477,7 +482,7 @@ private Div createInvalidDisplayBox(Collection invalidMeasurements) { OrderedList invalidMeasurementsList = new OrderedList( invalidMeasurements.stream().map(ListItem::new).toArray(ListItem[]::new)); invalidMeasurementsList.addClassName("invalid-measurement-list"); - invalidMeasurementsList.setType(OrderedList.NumberingType.NUMBER); + invalidMeasurementsList.setType(NumberingType.NUMBER); validationDetails.add(invalidMeasurementsList); box.add(header, validationDetails, instruction); return box; diff --git a/user-interface/src/main/java/life/qbic/datamanager/views/projects/project/samples/registration/batch/EditSampleBatchDialog.java b/user-interface/src/main/java/life/qbic/datamanager/views/projects/project/samples/registration/batch/EditSampleBatchDialog.java index 13c5a9810..0bbfaf5d9 100644 --- a/user-interface/src/main/java/life/qbic/datamanager/views/projects/project/samples/registration/batch/EditSampleBatchDialog.java +++ b/user-interface/src/main/java/life/qbic/datamanager/views/projects/project/samples/registration/batch/EditSampleBatchDialog.java @@ -25,8 +25,8 @@ import life.qbic.datamanager.download.DownloadContentProvider.XLSXDownloadContentProvider; import life.qbic.datamanager.download.DownloadProvider; import life.qbic.datamanager.parser.ParsingResult; -import life.qbic.datamanager.parser.SampleInformationExtractor; -import life.qbic.datamanager.parser.SampleInformationExtractor.SampleInformationForExistingSample; +import life.qbic.datamanager.parser.sample.SampleInformationExtractor; +import life.qbic.datamanager.parser.sample.SampleInformationExtractor.SampleInformationForExistingSample; import life.qbic.datamanager.parser.xlsx.XLSXParser; import life.qbic.datamanager.templates.TemplateService; import life.qbic.datamanager.views.general.WizardDialogWindow; diff --git a/user-interface/src/main/java/life/qbic/datamanager/views/projects/project/samples/registration/batch/RegisterSampleBatchDialog.java b/user-interface/src/main/java/life/qbic/datamanager/views/projects/project/samples/registration/batch/RegisterSampleBatchDialog.java index 4fa142dd8..07904bbb0 100644 --- a/user-interface/src/main/java/life/qbic/datamanager/views/projects/project/samples/registration/batch/RegisterSampleBatchDialog.java +++ b/user-interface/src/main/java/life/qbic/datamanager/views/projects/project/samples/registration/batch/RegisterSampleBatchDialog.java @@ -24,8 +24,8 @@ import life.qbic.datamanager.download.DownloadContentProvider.XLSXDownloadContentProvider; import life.qbic.datamanager.download.DownloadProvider; import life.qbic.datamanager.parser.ParsingResult; -import life.qbic.datamanager.parser.SampleInformationExtractor; -import life.qbic.datamanager.parser.SampleInformationExtractor.SampleInformationForNewSample; +import life.qbic.datamanager.parser.sample.SampleInformationExtractor; +import life.qbic.datamanager.parser.sample.SampleInformationExtractor.SampleInformationForNewSample; import life.qbic.datamanager.parser.xlsx.XLSXParser; import life.qbic.datamanager.templates.TemplateService; import life.qbic.datamanager.views.general.WizardDialogWindow;