From 81c5572f97da78e6230e21a50cb38864a7c3efee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Fri, 27 Oct 2023 16:39:42 +0200 Subject: [PATCH] Add read support for older RDML versions. --- .../META-INF/MANIFEST.MF | 3 +- .../v10/model/CdnaSynthesisMethodType.java | 71 +++++++ .../v10/model/CommercialAssayType.java | 51 +++++ .../v10/model/CqDetectionMethodType.java | 52 +++++ .../v10/model/DataCollectionSoftwareType.java | 50 +++++ .../rdml/internal/v10/model/DataType.java | 125 ++++++++++++ .../internal/v10/model/DocumentationType.java | 50 +++++ .../internal/v10/model/DpAmpCurveType.java | 58 ++++++ .../v10/model/DpMeltingCurveType.java | 47 +++++ .../internal/v10/model/ExperimentType.java | 70 +++++++ .../internal/v10/model/ExperimenterType.java | 96 ++++++++++ .../rdml/internal/v10/model/GradientType.java | 109 +++++++++++ .../internal/v10/model/IdReferencesType.java | 70 +++++++ .../rdml/internal/v10/model/LidOpenType.java | 27 +++ .../rdml/internal/v10/model/LoopType.java | 57 ++++++ .../rdml/internal/v10/model/MeasureType.java | 47 +++++ .../internal/v10/model/ObjectFactory.java | 167 ++++++++++++++++ .../rdml/internal/v10/model/OligoType.java | 57 ++++++ .../rdml/internal/v10/model/PauseType.java | 37 ++++ .../internal/v10/model/PrimingMethodType.java | 52 +++++ .../rdml/internal/v10/model/QuantityType.java | 51 +++++ .../internal/v10/model/QuantityUnitType.java | 56 ++++++ .../rdml/internal/v10/model/Rdml.java | 145 ++++++++++++++ .../rdml/internal/v10/model/RdmlIdType.java | 62 ++++++ .../rdml/internal/v10/model/ReactType.java | 66 +++++++ .../rdml/internal/v10/model/RunType.java | 164 ++++++++++++++++ .../rdml/internal/v10/model/SampleType.java | 180 +++++++++++++++++ .../internal/v10/model/SampleTypeType.java | 54 ++++++ .../internal/v10/model/SequencesType.java | 77 ++++++++ .../rdml/internal/v10/model/StepType.java | 105 ++++++++++ .../rdml/internal/v10/model/TargetType.java | 141 ++++++++++++++ .../internal/v10/model/TargetTypeType.java | 48 +++++ .../internal/v10/model/TemperatureType.java | 98 ++++++++++ .../v10/model/TemplateQualityType.java | 46 +++++ .../model/ThermalCyclingConditionsType.java | 92 +++++++++ .../v10/model/ThirdPartyExtensionsType.java | 41 ++++ .../rdml/internal/v10/model/XRefType.java | 44 +++++ .../v11/model/CdnaSynthesisMethodType.java | 71 +++++++ .../v11/model/CommercialAssayType.java | 51 +++++ .../v11/model/CqDetectionMethodType.java | 52 +++++ .../v11/model/DataCollectionSoftwareType.java | 50 +++++ .../rdml/internal/v11/model/DataType.java | 114 +++++++++++ .../internal/v11/model/DocumentationType.java | 50 +++++ .../internal/v11/model/DpAmpCurveType.java | 58 ++++++ .../v11/model/DpMeltingCurveType.java | 47 +++++ .../rdml/internal/v11/model/DyeType.java | 49 +++++ .../internal/v11/model/ExperimentType.java | 70 +++++++ .../internal/v11/model/ExperimenterType.java | 96 ++++++++++ .../rdml/internal/v11/model/GradientType.java | 109 +++++++++++ .../internal/v11/model/IdReferencesType.java | 35 ++++ .../rdml/internal/v11/model/LidOpenType.java | 27 +++ .../rdml/internal/v11/model/LoopType.java | 57 ++++++ .../rdml/internal/v11/model/MeasureType.java | 48 +++++ .../internal/v11/model/ObjectFactory.java | 172 +++++++++++++++++ .../rdml/internal/v11/model/OligoType.java | 57 ++++++ .../rdml/internal/v11/model/PauseType.java | 37 ++++ .../internal/v11/model/PcrFormatType.java | 98 ++++++++++ .../internal/v11/model/PrimingMethodType.java | 54 ++++++ .../rdml/internal/v11/model/QuantityType.java | 51 +++++ .../internal/v11/model/QuantityUnitType.java | 56 ++++++ .../rdml/internal/v11/model/Rdml.java | 143 ++++++++++++++ .../rdml/internal/v11/model/RdmlIdType.java | 62 ++++++ .../rdml/internal/v11/model/ReactType.java | 69 +++++++ .../rdml/internal/v11/model/RunType.java | 164 ++++++++++++++++ .../rdml/internal/v11/model/SampleType.java | 181 ++++++++++++++++++ .../internal/v11/model/SampleTypeType.java | 60 ++++++ .../internal/v11/model/SequencesType.java | 77 ++++++++ .../rdml/internal/v11/model/StepType.java | 105 ++++++++++ .../rdml/internal/v11/model/TargetType.java | 153 +++++++++++++++ .../internal/v11/model/TargetTypeType.java | 48 +++++ .../internal/v11/model/TemperatureType.java | 98 ++++++++++ .../v11/model/TemplateQualityType.java | 46 +++++ .../model/ThermalCyclingConditionsType.java | 92 +++++++++ .../rdml/internal/v11/model/XRefType.java | 44 +++++ .../internal/v12/model/AnnotationType.java | 51 +++++ .../v12/model/CdnaSynthesisMethodType.java | 71 +++++++ .../v12/model/CommercialAssayType.java | 51 +++++ .../v12/model/CqDetectionMethodType.java | 52 +++++ .../v12/model/DataCollectionSoftwareType.java | 50 +++++ .../rdml/internal/v12/model/DataType.java | 125 ++++++++++++ .../internal/v12/model/DocumentationType.java | 50 +++++ .../internal/v12/model/DpAmpCurveType.java | 58 ++++++ .../v12/model/DpMeltingCurveType.java | 47 +++++ .../rdml/internal/v12/model/DyeType.java | 49 +++++ .../internal/v12/model/ExperimentType.java | 70 +++++++ .../internal/v12/model/ExperimenterType.java | 96 ++++++++++ .../rdml/internal/v12/model/GradientType.java | 109 +++++++++++ .../internal/v12/model/IdReferencesType.java | 35 ++++ .../rdml/internal/v12/model/LidOpenType.java | 27 +++ .../rdml/internal/v12/model/LoopType.java | 57 ++++++ .../rdml/internal/v12/model/MeasureType.java | 47 +++++ .../internal/v12/model/NucleotideType.java | 50 +++++ .../internal/v12/model/ObjectFactory.java | 173 +++++++++++++++++ .../rdml/internal/v12/model/OligoType.java | 57 ++++++ .../rdml/internal/v12/model/PauseType.java | 37 ++++ .../internal/v12/model/PcrFormatType.java | 98 ++++++++++ .../internal/v12/model/PrimingMethodType.java | 54 ++++++ .../rdml/internal/v12/model/QuantityType.java | 51 +++++ .../internal/v12/model/QuantityUnitType.java | 56 ++++++ .../rdml/internal/v12/model/Rdml.java | 143 ++++++++++++++ .../rdml/internal/v12/model/RdmlIdType.java | 62 ++++++ .../rdml/internal/v12/model/ReactType.java | 69 +++++++ .../rdml/internal/v12/model/RunType.java | 164 ++++++++++++++++ .../rdml/internal/v12/model/SampleType.java | 157 +++++++++++++++ .../internal/v12/model/SampleTypeType.java | 60 ++++++ .../internal/v12/model/SequencesType.java | 77 ++++++++ .../rdml/internal/v12/model/StepType.java | 105 ++++++++++ .../rdml/internal/v12/model/TargetType.java | 164 ++++++++++++++++ .../internal/v12/model/TargetTypeType.java | 48 +++++ .../internal/v12/model/TemperatureType.java | 98 ++++++++++ .../v12/model/TemplateQuantityType.java | 48 +++++ .../model/ThermalCyclingConditionsType.java | 92 +++++++++ .../rdml/internal/v12/model/XRefType.java | 44 +++++ .../internal/v13/model/PcrFormatType.java | 55 +++--- .../converter/supplier/rdml/io/PCRReader.java | 136 ++----------- .../supplier/rdml/io/PCRReaderVersion11.java | 146 ++++++++++++++ .../supplier/rdml/io/PCRReaderVersion12.java | 146 ++++++++++++++ .../supplier/rdml/io/PCRReaderVersion13.java | 146 ++++++++++++++ .../supplier/rdml/model/IPCRReader.java | 28 +++ .../test/io/Test_Example_11_ITest.java | 69 +++++++ .../test/io/Test_Example_12_ITest.java | 69 +++++++ .../test/io/Test_Example_13_ITest.java | 69 +++++++ .../rdml/fragment/test/TestPathHelper.java | 4 + .../testdata/example_1_1.rdml | Bin 0 -> 75794 bytes .../testdata/example_1_2.rdml | Bin 0 -> 75810 bytes .../testdata/example_1_3.rdml | Bin 0 -> 75841 bytes 126 files changed, 9292 insertions(+), 145 deletions(-) create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/CdnaSynthesisMethodType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/CommercialAssayType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/CqDetectionMethodType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/DataCollectionSoftwareType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/DataType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/DocumentationType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/DpAmpCurveType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/DpMeltingCurveType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/ExperimentType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/ExperimenterType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/GradientType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/IdReferencesType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/LidOpenType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/LoopType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/MeasureType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/ObjectFactory.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/OligoType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/PauseType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/PrimingMethodType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/QuantityType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/QuantityUnitType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/Rdml.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/RdmlIdType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/ReactType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/RunType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/SampleType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/SampleTypeType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/SequencesType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/StepType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/TargetType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/TargetTypeType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/TemperatureType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/TemplateQualityType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/ThermalCyclingConditionsType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/ThirdPartyExtensionsType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/XRefType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/CdnaSynthesisMethodType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/CommercialAssayType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/CqDetectionMethodType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/DataCollectionSoftwareType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/DataType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/DocumentationType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/DpAmpCurveType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/DpMeltingCurveType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/DyeType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/ExperimentType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/ExperimenterType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/GradientType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/IdReferencesType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/LidOpenType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/LoopType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/MeasureType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/ObjectFactory.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/OligoType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/PauseType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/PcrFormatType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/PrimingMethodType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/QuantityType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/QuantityUnitType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/Rdml.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/RdmlIdType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/ReactType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/RunType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/SampleType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/SampleTypeType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/SequencesType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/StepType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/TargetType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/TargetTypeType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/TemperatureType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/TemplateQualityType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/ThermalCyclingConditionsType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/XRefType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/AnnotationType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/CdnaSynthesisMethodType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/CommercialAssayType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/CqDetectionMethodType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/DataCollectionSoftwareType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/DataType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/DocumentationType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/DpAmpCurveType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/DpMeltingCurveType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/DyeType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/ExperimentType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/ExperimenterType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/GradientType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/IdReferencesType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/LidOpenType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/LoopType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/MeasureType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/NucleotideType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/ObjectFactory.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/OligoType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/PauseType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/PcrFormatType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/PrimingMethodType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/QuantityType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/QuantityUnitType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/Rdml.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/RdmlIdType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/ReactType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/RunType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/SampleType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/SampleTypeType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/SequencesType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/StepType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/TargetType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/TargetTypeType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/TemperatureType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/TemplateQuantityType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/ThermalCyclingConditionsType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/XRefType.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/io/PCRReaderVersion11.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/io/PCRReaderVersion12.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/io/PCRReaderVersion13.java create mode 100644 chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/model/IPCRReader.java create mode 100644 chemclipse/tests/org.eclipse.chemclipse.pcr.converter.supplier.rdml.fragment.test/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/fragement/test/io/Test_Example_11_ITest.java create mode 100644 chemclipse/tests/org.eclipse.chemclipse.pcr.converter.supplier.rdml.fragment.test/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/fragement/test/io/Test_Example_12_ITest.java create mode 100644 chemclipse/tests/org.eclipse.chemclipse.pcr.converter.supplier.rdml.fragment.test/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/fragement/test/io/Test_Example_13_ITest.java create mode 100644 chemclipse/tests/org.eclipse.chemclipse.pcr.converter.supplier.rdml.fragment.test/testdata/example_1_1.rdml create mode 100644 chemclipse/tests/org.eclipse.chemclipse.pcr.converter.supplier.rdml.fragment.test/testdata/example_1_2.rdml create mode 100644 chemclipse/tests/org.eclipse.chemclipse.pcr.converter.supplier.rdml.fragment.test/testdata/example_1_3.rdml diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/META-INF/MANIFEST.MF b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/META-INF/MANIFEST.MF index 8f09c9adeb..c0a93e51b8 100644 --- a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/META-INF/MANIFEST.MF +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/META-INF/MANIFEST.MF @@ -14,7 +14,8 @@ Require-Bundle: org.eclipse.core.runtime, org.eclipse.chemclipse.logging;bundle-version="0.8.0", org.eclipse.chemclipse.processing;bundle-version="0.8.0", org.eclipse.chemclipse.support;bundle-version="0.8.0", - jakarta.xml.bind-api;bundle-version="4.0.0" + jakarta.xml.bind-api;bundle-version="4.0.0", + org.eclipse.chemclipse.xxd.converter.supplier.chemclipse;bundle-version="0.9.0" Bundle-RequiredExecutionEnvironment: JavaSE-17 Bundle-ActivationPolicy: lazy Import-Package: jakarta.xml.bind, diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/CdnaSynthesisMethodType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/CdnaSynthesisMethodType.java new file mode 100644 index 0000000000..cd2b65f06d --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/CdnaSynthesisMethodType.java @@ -0,0 +1,71 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v10.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlSchemaType; +import jakarta.xml.bind.annotation.XmlType; + +/** + * Description of the cDNA synthesis method. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "cdnaSynthesisMethodType", propOrder = {"enzyme", "primingMethod", "dnaseTreatment", "thermalCyclingConditions"}) +public class CdnaSynthesisMethodType { + + protected String enzyme; + @XmlSchemaType(name = "string") + protected PrimingMethodType primingMethod; + protected Boolean dnaseTreatment; + protected IdReferencesType thermalCyclingConditions; + + public String getEnzyme() { + + return enzyme; + } + + public void setEnzyme(String value) { + + this.enzyme = value; + } + + public PrimingMethodType getPrimingMethod() { + + return primingMethod; + } + + public void setPrimingMethod(PrimingMethodType value) { + + this.primingMethod = value; + } + + public Boolean isDnaseTreatment() { + + return dnaseTreatment; + } + + public void setDnaseTreatment(Boolean value) { + + this.dnaseTreatment = value; + } + + public IdReferencesType getThermalCyclingConditions() { + + return thermalCyclingConditions; + } + + public void setThermalCyclingConditions(IdReferencesType value) { + + this.thermalCyclingConditions = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/CommercialAssayType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/CommercialAssayType.java new file mode 100644 index 0000000000..616fedfd33 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/CommercialAssayType.java @@ -0,0 +1,51 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v10.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlType; + +/** + * For some commercial assays the primer sequences may be unknown. This element + * allows to describe commercial assays. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "commercialAssayType", propOrder = {"company", "orderNumber"}) +public class CommercialAssayType { + + @XmlElement(required = true) + protected String company; + @XmlElement(required = true) + protected String orderNumber; + + public String getCompany() { + + return company; + } + + public void setCompany(String value) { + + this.company = value; + } + + public String getOrderNumber() { + + return orderNumber; + } + + public void setOrderNumber(String value) { + + this.orderNumber = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/CqDetectionMethodType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/CqDetectionMethodType.java new file mode 100644 index 0000000000..1265ebeb73 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/CqDetectionMethodType.java @@ -0,0 +1,52 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v10.model; + +import jakarta.xml.bind.annotation.XmlEnum; +import jakarta.xml.bind.annotation.XmlEnumValue; +import jakarta.xml.bind.annotation.XmlType; + +@XmlType(name = "cqDetectionMethodType") +@XmlEnum +public enum CqDetectionMethodType { + + @XmlEnumValue("automated threshold and baseline settings") + AUTOMATED_THRESHOLD_AND_BASELINE_SETTINGS("automated threshold and baseline settings"), // + @XmlEnumValue("manual threshold and baseline settings") + MANUAL_THRESHOLD_AND_BASELINE_SETTINGS("manual threshold and baseline settings"), // + @XmlEnumValue("second derivative maximum") + SECOND_DERIVATIVE_MAXIMUM("second derivative maximum"), // + @XmlEnumValue("other") + OTHER("other"); + + private final String value; + + CqDetectionMethodType(String v) { + + value = v; + } + + public String value() { + + return value; + } + + public static CqDetectionMethodType fromValue(String v) { + + for(CqDetectionMethodType c : CqDetectionMethodType.values()) { + if(c.value.equals(v)) { + return c; + } + } + throw new IllegalArgumentException(v); + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/DataCollectionSoftwareType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/DataCollectionSoftwareType.java new file mode 100644 index 0000000000..8635e81ee9 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/DataCollectionSoftwareType.java @@ -0,0 +1,50 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v10.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlType; + +/** + * Software name and version used to collect the data. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "dataCollectionSoftwareType", propOrder = {"name", "version"}) +public class DataCollectionSoftwareType { + + @XmlElement(required = true) + protected String name; + @XmlElement(required = true) + protected String version; + + public String getName() { + + return name; + } + + public void setName(String value) { + + this.name = value; + } + + public String getVersion() { + + return version; + } + + public void setVersion(String value) { + + this.version = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/DataType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/DataType.java new file mode 100644 index 0000000000..bb545dc686 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/DataType.java @@ -0,0 +1,125 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v10.model; + +import java.util.ArrayList; +import java.util.List; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlType; + +/** + * Due to the high numbers of this elements names are kept short. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "dataType", propOrder = {"tar", "cq", "quantity", "excl", "adp", "mdp", "endPt", "bgFluor", "quantFluor"}) +public class DataType { + + @XmlElement(required = true) + protected IdReferencesType tar; + protected Float cq; + protected QuantityType quantity; + protected String excl; + protected List adp; + protected List mdp; + protected Float endPt; + protected Float bgFluor; + protected Float quantFluor; + + public IdReferencesType getTar() { + + return tar; + } + + public void setTar(IdReferencesType value) { + + this.tar = value; + } + + public Float getCq() { + + return cq; + } + + public void setCq(Float value) { + + this.cq = value; + } + + public QuantityType getQuantity() { + + return quantity; + } + + public void setQuantity(QuantityType value) { + + this.quantity = value; + } + + public String getExcl() { + + return excl; + } + + public void setExcl(String value) { + + this.excl = value; + } + + public List getAdp() { + + if(adp == null) { + adp = new ArrayList<>(); + } + return this.adp; + } + + public List getMdp() { + + if(mdp == null) { + mdp = new ArrayList<>(); + } + return this.mdp; + } + + public Float getEndPt() { + + return endPt; + } + + public void setEndPt(Float value) { + + this.endPt = value; + } + + public Float getBgFluor() { + + return bgFluor; + } + + public void setBgFluor(Float value) { + + this.bgFluor = value; + } + + public Float getQuantFluor() { + + return quantFluor; + } + + public void setQuantFluor(Float value) { + + this.quantFluor = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/DocumentationType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/DocumentationType.java new file mode 100644 index 0000000000..84c3948cb3 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/DocumentationType.java @@ -0,0 +1,50 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v10.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlType; + +/** + * These elements should be used if the same description applies to many samples, + * targets or experiments. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "documentationType", propOrder = {}) +public class DocumentationType { + + protected String text; + @XmlAttribute(name = "id", required = true) + protected String id; + + public String getText() { + + return text; + } + + public void setText(String value) { + + this.text = value; + } + + public String getId() { + + return id; + } + + public void setId(String value) { + + this.id = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/DpAmpCurveType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/DpAmpCurveType.java new file mode 100644 index 0000000000..b4ccaedf63 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/DpAmpCurveType.java @@ -0,0 +1,58 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v10.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlType; + +/** + * Due to the high numbers of this element, names are kept short. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "dpAmpCurveType", propOrder = {"cyc", "tmp", "fluor"}) +public class DpAmpCurveType { + + protected float cyc; + protected Float tmp; + protected float fluor; + + public float getCyc() { + + return cyc; + } + + public void setCyc(float value) { + + this.cyc = value; + } + + public Float getTmp() { + + return tmp; + } + + public void setTmp(Float value) { + + this.tmp = value; + } + + public float getFluor() { + + return fluor; + } + + public void setFluor(float value) { + + this.fluor = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/DpMeltingCurveType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/DpMeltingCurveType.java new file mode 100644 index 0000000000..0cdd3d2059 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/DpMeltingCurveType.java @@ -0,0 +1,47 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v10.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlType; + +/** + * Due to the high numbers of this element, names are kept short. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "dpMeltingCurveType", propOrder = {"tmp", "fluor"}) +public class DpMeltingCurveType { + + protected float tmp; + protected float fluor; + + public float getTmp() { + + return tmp; + } + + public void setTmp(float value) { + + this.tmp = value; + } + + public float getFluor() { + + return fluor; + } + + public void setFluor(float value) { + + this.fluor = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/ExperimentType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/ExperimentType.java new file mode 100644 index 0000000000..b46945e188 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/ExperimentType.java @@ -0,0 +1,70 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v10.model; + +import java.util.ArrayList; +import java.util.List; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlType; + +/** + * An experiment can contain several independent runs. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "experimentType", propOrder = {"description", "documentation", "run"}) +public class ExperimentType { + + protected String description; + protected List documentation; + protected List run; + @XmlAttribute(name = "id", required = true) + protected String id; + + public String getDescription() { + + return description; + } + + public void setDescription(String value) { + + this.description = value; + } + + public List getDocumentation() { + + if(documentation == null) { + documentation = new ArrayList<>(); + } + return this.documentation; + } + + public List getRun() { + + if(run == null) { + run = new ArrayList<>(); + } + return this.run; + } + + public String getId() { + + return id; + } + + public void setId(String value) { + + this.id = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/ExperimenterType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/ExperimenterType.java new file mode 100644 index 0000000000..92a532e2ed --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/ExperimenterType.java @@ -0,0 +1,96 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v10.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlType; + +/** + * Contact details of an experimenter. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "experimenterType", propOrder = {"firstName", "lastName", "email", "labName", "labAddress"}) +public class ExperimenterType { + + @XmlElement(required = true) + protected String firstName; + @XmlElement(required = true) + protected String lastName; + protected String email; + protected String labName; + protected String labAddress; + @XmlAttribute(name = "id", required = true) + protected String id; + + public String getFirstName() { + + return firstName; + } + + public void setFirstName(String value) { + + this.firstName = value; + } + + public String getLastName() { + + return lastName; + } + + public void setLastName(String value) { + + this.lastName = value; + } + + public String getEmail() { + + return email; + } + + public void setEmail(String value) { + + this.email = value; + } + + public String getLabName() { + + return labName; + } + + public void setLabName(String value) { + + this.labName = value; + } + + public String getLabAddress() { + + return labAddress; + } + + public void setLabAddress(String value) { + + this.labAddress = value; + } + + public String getId() { + + return id; + } + + public void setId(String value) { + + this.id = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/GradientType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/GradientType.java new file mode 100644 index 0000000000..7ae9e594c5 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/GradientType.java @@ -0,0 +1,109 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v10.model; + +import java.math.BigInteger; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlSchemaType; +import jakarta.xml.bind.annotation.XmlType; + +/** + * This step forms a temperature gradient on the heat block. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "gradientType", propOrder = {"highTemperature", "lowTemperature", "duration", "temperatureChange", "durationChange", "measure", "ramp"}) +public class GradientType { + + protected float highTemperature; + protected float lowTemperature; + @XmlElement(required = true) + @XmlSchemaType(name = "positiveInteger") + protected BigInteger duration; + protected Float temperatureChange; + protected Integer durationChange; + @XmlSchemaType(name = "string") + protected MeasureType measure; + protected Float ramp; + + public float getHighTemperature() { + + return highTemperature; + } + + public void setHighTemperature(float value) { + + this.highTemperature = value; + } + + public float getLowTemperature() { + + return lowTemperature; + } + + public void setLowTemperature(float value) { + + this.lowTemperature = value; + } + + public BigInteger getDuration() { + + return duration; + } + + public void setDuration(BigInteger value) { + + this.duration = value; + } + + public Float getTemperatureChange() { + + return temperatureChange; + } + + public void setTemperatureChange(Float value) { + + this.temperatureChange = value; + } + + public Integer getDurationChange() { + + return durationChange; + } + + public void setDurationChange(Integer value) { + + this.durationChange = value; + } + + public MeasureType getMeasure() { + + return measure; + } + + public void setMeasure(MeasureType value) { + + this.measure = value; + } + + public Float getRamp() { + + return ramp; + } + + public void setRamp(Float value) { + + this.ramp = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/IdReferencesType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/IdReferencesType.java new file mode 100644 index 0000000000..b80ed3e93e --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/IdReferencesType.java @@ -0,0 +1,70 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v10.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlType; + +/** + *

+ * Java-Klasse für idReferencesType complex type. + * + *

+ * Das folgende Schemafragment gibt den erwarteten Content an, der in dieser Klasse enthalten ist. + * + *

+ * <complexType name="idReferencesType">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <attribute name="id" use="required" type="{http://www.rdml.org}idType" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "idReferencesType") +public class IdReferencesType { + + @XmlAttribute(name = "id", required = true) + protected String id; + + /** + * Ruft den Wert der id-Eigenschaft ab. + * + * @return + * possible object is + * {@link String } + * + */ + public String getId() { + + return id; + } + + /** + * Legt den Wert der id-Eigenschaft fest. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setId(String value) { + + this.id = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/LidOpenType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/LidOpenType.java new file mode 100644 index 0000000000..fecbf8f272 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/LidOpenType.java @@ -0,0 +1,27 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v10.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlType; + +/** + * This step waits for the user to open the lid and continues after. It + * allows to stop the program and to wait for the user to add for example + * enzymes and continue the program after. The temperature of the previous + * step is maintained. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "lidOpenType") +public class LidOpenType { +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/LoopType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/LoopType.java new file mode 100644 index 0000000000..eee4346c6c --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/LoopType.java @@ -0,0 +1,57 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v10.model; + +import java.math.BigInteger; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlSchemaType; +import jakarta.xml.bind.annotation.XmlType; + +/** + * This step allows to form a loop or to exclude some steps. It allows to + * jump to a certain "goto" step for "repeat" times. If the "goto" step is + * higher than the step of the loop, "repeat" must be "0". + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "loopType", propOrder = {"gotoStep", "repeat"}) +public class LoopType { + + @XmlElement(name = "goto", required = true) + @XmlSchemaType(name = "positiveInteger") + protected BigInteger gotoStep; + @XmlElement(required = true) + @XmlSchemaType(name = "positiveInteger") + protected BigInteger repeat; + + public BigInteger getGoto() { + + return gotoStep; + } + + public void setGoto(BigInteger value) { + + this.gotoStep = value; + } + + public BigInteger getRepeat() { + + return repeat; + } + + public void setRepeat(BigInteger value) { + + this.repeat = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/MeasureType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/MeasureType.java new file mode 100644 index 0000000000..339ab3806a --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/MeasureType.java @@ -0,0 +1,47 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v10.model; + +import jakarta.xml.bind.annotation.XmlEnum; +import jakarta.xml.bind.annotation.XmlEnumValue; +import jakarta.xml.bind.annotation.XmlType; + +@XmlType(name = "measureType") +@XmlEnum +public enum MeasureType { + + @XmlEnumValue("real time") + REAL_TIME("real time"), @XmlEnumValue("meltcurve") + MELTCURVE("meltcurve"); + + private final String value; + + MeasureType(String v) { + + value = v; + } + + public String value() { + + return value; + } + + public static MeasureType fromValue(String v) { + + for(MeasureType c : MeasureType.values()) { + if(c.value.equals(v)) { + return c; + } + } + throw new IllegalArgumentException(v); + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/ObjectFactory.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/ObjectFactory.java new file mode 100644 index 0000000000..10945969fb --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/ObjectFactory.java @@ -0,0 +1,167 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v10.model; + +import jakarta.xml.bind.annotation.XmlRegistry; + +@XmlRegistry +public class ObjectFactory { + + public ObjectFactory() { + + } + + public Rdml createRdml() { + + return new Rdml(); + } + + public RdmlIdType createRdmlIdType() { + + return new RdmlIdType(); + } + + public ExperimenterType createExperimenterType() { + + return new ExperimenterType(); + } + + public DocumentationType createDocumentationType() { + + return new DocumentationType(); + } + + public SampleType createSampleType() { + + return new SampleType(); + } + + public TargetType createTargetType() { + + return new TargetType(); + } + + public ThermalCyclingConditionsType createThermalCyclingConditionsType() { + + return new ThermalCyclingConditionsType(); + } + + public ExperimentType createExperimentType() { + + return new ExperimentType(); + } + + public ThirdPartyExtensionsType createThirdPartyExtensionsType() { + + return new ThirdPartyExtensionsType(); + } + + public QuantityType createQuantityType() { + + return new QuantityType(); + } + + public IdReferencesType createIdReferencesType() { + + return new IdReferencesType(); + } + + public TemperatureType createTemperatureType() { + + return new TemperatureType(); + } + + public StepType createStepType() { + + return new StepType(); + } + + public RunType createRunType() { + + return new RunType(); + } + + public OligoType createOligoType() { + + return new OligoType(); + } + + public LidOpenType createLidOpenType() { + + return new LidOpenType(); + } + + public GradientType createGradientType() { + + return new GradientType(); + } + + public DpMeltingCurveType createDpMeltingCurveType() { + + return new DpMeltingCurveType(); + } + + public ReactType createReactType() { + + return new ReactType(); + } + + public PauseType createPauseType() { + + return new PauseType(); + } + + public DataCollectionSoftwareType createDataCollectionSoftwareType() { + + return new DataCollectionSoftwareType(); + } + + public DataType createDataType() { + + return new DataType(); + } + + public CdnaSynthesisMethodType createCdnaSynthesisMethodType() { + + return new CdnaSynthesisMethodType(); + } + + public DpAmpCurveType createDpAmpCurveType() { + + return new DpAmpCurveType(); + } + + public LoopType createLoopType() { + + return new LoopType(); + } + + public CommercialAssayType createCommercialAssayType() { + + return new CommercialAssayType(); + } + + public SequencesType createSequencesType() { + + return new SequencesType(); + } + + public TemplateQualityType createTemplateQualityType() { + + return new TemplateQualityType(); + } + + public XRefType createXRefType() { + + return new XRefType(); + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/OligoType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/OligoType.java new file mode 100644 index 0000000000..2d181aef41 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/OligoType.java @@ -0,0 +1,57 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v10.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlType; + +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "oligoType", propOrder = {"threePrimeTag", "fivePrimeTag", "sequence"}) +public class OligoType { + + protected String threePrimeTag; + protected String fivePrimeTag; + @XmlElement(required = true) + protected String sequence; + + public String getThreePrimeTag() { + + return threePrimeTag; + } + + public void setThreePrimeTag(String value) { + + this.threePrimeTag = value; + } + + public String getFivePrimeTag() { + + return fivePrimeTag; + } + + public void setFivePrimeTag(String value) { + + this.fivePrimeTag = value; + } + + public String getSequence() { + + return sequence; + } + + public void setSequence(String value) { + + this.sequence = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/PauseType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/PauseType.java new file mode 100644 index 0000000000..1cb2a4c8bc --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/PauseType.java @@ -0,0 +1,37 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v10.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlType; + +/** + * This step allows to pause at a certain temperature. It is typically the + * last step in an amplification protocol. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "pauseType", propOrder = {"temperature"}) +public class PauseType { + + protected float temperature; + + public float getTemperature() { + + return temperature; + } + + public void setTemperature(float value) { + + this.temperature = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/PrimingMethodType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/PrimingMethodType.java new file mode 100644 index 0000000000..7290a99c65 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/PrimingMethodType.java @@ -0,0 +1,52 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v10.model; + +import jakarta.xml.bind.annotation.XmlEnum; +import jakarta.xml.bind.annotation.XmlEnumValue; +import jakarta.xml.bind.annotation.XmlType; + +@XmlType(name = "primingMethodType") +@XmlEnum +public enum PrimingMethodType { + + @XmlEnumValue("oligo-dt") + OLIGO_DT("oligo-dt"), // + @XmlEnumValue("random") + RANDOM("random"), // + @XmlEnumValue("target-specific") + TARGET_SPECIFIC("target-specific"), // + @XmlEnumValue("oligo-dt and random") + OLIGO_DT_AND_RANDOM("oligo-dt and random"); + + private final String value; + + PrimingMethodType(String v) { + + value = v; + } + + public String value() { + + return value; + } + + public static PrimingMethodType fromValue(String v) { + + for(PrimingMethodType c : PrimingMethodType.values()) { + if(c.value.equals(v)) { + return c; + } + } + throw new IllegalArgumentException(v); + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/QuantityType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/QuantityType.java new file mode 100644 index 0000000000..43bd662019 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/QuantityType.java @@ -0,0 +1,51 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v10.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlSchemaType; +import jakarta.xml.bind.annotation.XmlType; + +/** + * A quantity is always defined by its value and its unit. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "quantityType", propOrder = {"value", "unit"}) +public class QuantityType { + + protected float value; + @XmlElement(required = true) + @XmlSchemaType(name = "string") + protected QuantityUnitType unit; + + public float getValue() { + + return value; + } + + public void setValue(float value) { + + this.value = value; + } + + public QuantityUnitType getUnit() { + + return unit; + } + + public void setUnit(QuantityUnitType value) { + + this.unit = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/QuantityUnitType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/QuantityUnitType.java new file mode 100644 index 0000000000..4e3cbf78cb --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/QuantityUnitType.java @@ -0,0 +1,56 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v10.model; + +import jakarta.xml.bind.annotation.XmlEnum; +import jakarta.xml.bind.annotation.XmlEnumValue; +import jakarta.xml.bind.annotation.XmlType; + +@XmlType(name = "quantityUnitType") +@XmlEnum +public enum QuantityUnitType { + + @XmlEnumValue("cop") + COP("cop"), // + @XmlEnumValue("fold") + FOLD("fold"), // + @XmlEnumValue("dil") + DIL("dil"), // + @XmlEnumValue("ng") + NG("ng"), // + @XmlEnumValue("nMol") + N_MOL("nMol"), // + @XmlEnumValue("other") + OTHER("other"); + + private final String value; + + QuantityUnitType(String v) { + + value = v; + } + + public String value() { + + return value; + } + + public static QuantityUnitType fromValue(String v) { + + for(QuantityUnitType c : QuantityUnitType.values()) { + if(c.value.equals(v)) { + return c; + } + } + throw new IllegalArgumentException(v); + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/Rdml.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/Rdml.java new file mode 100644 index 0000000000..d3e015fa6d --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/Rdml.java @@ -0,0 +1,145 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v10.model; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.datatype.XMLGregorianCalendar; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlSchemaType; +import jakarta.xml.bind.annotation.XmlType; + +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = {"dateMade", "dateUpdated", "id", "experimenter", "documentation", "sample", "target", "thermalCyclingConditions", "experiment", "thirdPartyExtensions"}) +@XmlRootElement(name = "rdml") +public class Rdml { + + @XmlSchemaType(name = "dateTime") + protected XMLGregorianCalendar dateMade; + @XmlSchemaType(name = "dateTime") + protected XMLGregorianCalendar dateUpdated; + protected List id; + protected List experimenter; + protected List documentation; + protected List sample; + protected List target; + protected List thermalCyclingConditions; + protected List experiment; + protected ThirdPartyExtensionsType thirdPartyExtensions; + @XmlAttribute(name = "version", required = true) + protected String version; + + public XMLGregorianCalendar getDateMade() { + + return dateMade; + } + + public void setDateMade(XMLGregorianCalendar value) { + + this.dateMade = value; + } + + public XMLGregorianCalendar getDateUpdated() { + + return dateUpdated; + } + + public void setDateUpdated(XMLGregorianCalendar value) { + + this.dateUpdated = value; + } + + public List getId() { + + if(id == null) { + id = new ArrayList<>(); + } + return this.id; + } + + public List getExperimenter() { + + if(experimenter == null) { + experimenter = new ArrayList<>(); + } + return this.experimenter; + } + + public List getDocumentation() { + + if(documentation == null) { + documentation = new ArrayList<>(); + } + return this.documentation; + } + + public List getSample() { + + if(sample == null) { + sample = new ArrayList<>(); + } + return this.sample; + } + + public List getTarget() { + + if(target == null) { + target = new ArrayList<>(); + } + return this.target; + } + + public List getThermalCyclingConditions() { + + if(thermalCyclingConditions == null) { + thermalCyclingConditions = new ArrayList<>(); + } + return this.thermalCyclingConditions; + } + + public List getExperiment() { + + if(experiment == null) { + experiment = new ArrayList<>(); + } + return this.experiment; + } + + public ThirdPartyExtensionsType getThirdPartyExtensions() { + + return thirdPartyExtensions; + } + + public void setThirdPartyExtensions(ThirdPartyExtensionsType value) { + + this.thirdPartyExtensions = value; + } + + public String getVersion() { + + if(version == null) { + return "1.0"; + } else { + return version; + } + } + + public void setVersion(String value) { + + this.version = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/RdmlIdType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/RdmlIdType.java new file mode 100644 index 0000000000..c9ae90f0f7 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/RdmlIdType.java @@ -0,0 +1,62 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v10.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlType; + +/** + * This element can be used to assign an publisher and id to the RDML file. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "rdmlIdType", propOrder = {"publisher", "serialNumber", "md5Hash"}) +public class RdmlIdType { + + @XmlElement(required = true) + protected String publisher; + @XmlElement(required = true) + protected String serialNumber; + @XmlElement(name = "MD5Hash") + protected String md5Hash; + + public String getPublisher() { + + return publisher; + } + + public void setPublisher(String value) { + + this.publisher = value; + } + + public String getSerialNumber() { + + return serialNumber; + } + + public void setSerialNumber(String value) { + + this.serialNumber = value; + } + + public String getMD5Hash() { + + return md5Hash; + } + + public void setMD5Hash(String value) { + + this.md5Hash = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/ReactType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/ReactType.java new file mode 100644 index 0000000000..0ced9e6e6f --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/ReactType.java @@ -0,0 +1,66 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v10.model; + +import java.util.ArrayList; +import java.util.List; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlType; + +/** + * A reaction is an independent chemical reaction corresponding for example + * to a well in a 96 well plate, a capillary in a rotor or a droplet on the + * biotrophe slides. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "reactType", propOrder = {"sample", "data"}) +public class ReactType { + + @XmlElement(required = true) + protected IdReferencesType sample; + @XmlElement(required = true) + protected List data; + @XmlAttribute(name = "id", required = true) + protected String id; + + public IdReferencesType getSample() { + + return sample; + } + + public void setSample(IdReferencesType value) { + + this.sample = value; + } + + public List getData() { + + if(data == null) { + data = new ArrayList<>(); + } + return this.data; + } + + public String getId() { + + return id; + } + + public void setId(String value) { + + this.id = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/RunType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/RunType.java new file mode 100644 index 0000000000..815420d75b --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/RunType.java @@ -0,0 +1,164 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v10.model; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.datatype.XMLGregorianCalendar; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlSchemaType; +import jakarta.xml.bind.annotation.XmlType; + +/** + * A run is a set of reactions performed in one "run", for example + * one plate, a slide in a biotrophe or one rotor. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "runType", propOrder = {"description", "documentation", "experimenter", "instrument", "dataCollectionSoftware", "backgroundDeterminationMethod", "cqDetectionMethod", "thermalCyclingConditions", "pcrFormat", "runDate", "react"}) +public class RunType { + + protected String description; + protected List documentation; + protected List experimenter; + protected String instrument; + protected DataCollectionSoftwareType dataCollectionSoftware; + protected String backgroundDeterminationMethod; + @XmlSchemaType(name = "string") + protected CqDetectionMethodType cqDetectionMethod; + protected IdReferencesType thermalCyclingConditions; + @XmlElement(required = true) + protected String pcrFormat; + @XmlSchemaType(name = "dateTime") + protected XMLGregorianCalendar runDate; + protected List react; + @XmlAttribute(name = "id", required = true) + protected String id; + + public String getDescription() { + + return description; + } + + public void setDescription(String value) { + + this.description = value; + } + + public List getDocumentation() { + + if(documentation == null) { + documentation = new ArrayList<>(); + } + return this.documentation; + } + + public List getExperimenter() { + + if(experimenter == null) { + experimenter = new ArrayList<>(); + } + return this.experimenter; + } + + public String getInstrument() { + + return instrument; + } + + public void setInstrument(String value) { + + this.instrument = value; + } + + public DataCollectionSoftwareType getDataCollectionSoftware() { + + return dataCollectionSoftware; + } + + public void setDataCollectionSoftware(DataCollectionSoftwareType value) { + + this.dataCollectionSoftware = value; + } + + public String getBackgroundDeterminationMethod() { + + return backgroundDeterminationMethod; + } + + public void setBackgroundDeterminationMethod(String value) { + + this.backgroundDeterminationMethod = value; + } + + public CqDetectionMethodType getCqDetectionMethod() { + + return cqDetectionMethod; + } + + public void setCqDetectionMethod(CqDetectionMethodType value) { + + this.cqDetectionMethod = value; + } + + public IdReferencesType getThermalCyclingConditions() { + + return thermalCyclingConditions; + } + + public void setThermalCyclingConditions(IdReferencesType value) { + + this.thermalCyclingConditions = value; + } + + public String getPcrFormat() { + + return pcrFormat; + } + + public void setPcrFormat(String value) { + + this.pcrFormat = value; + } + + public XMLGregorianCalendar getRunDate() { + + return runDate; + } + + public void setRunDate(XMLGregorianCalendar value) { + + this.runDate = value; + } + + public List getReact() { + + if(react == null) { + react = new ArrayList<>(); + } + return this.react; + } + + public String getId() { + + return id; + } + + public void setId(String value) { + + this.id = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/SampleType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/SampleType.java new file mode 100644 index 0000000000..1ce1122f59 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/SampleType.java @@ -0,0 +1,180 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v10.model; + +import java.util.ArrayList; +import java.util.List; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlSchemaType; +import jakarta.xml.bind.annotation.XmlType; + +/** + * A sample is a defined template solution. Dilutions of the same stock + * material differ in concentration and are considered different samples. + * A technical replicate samples should contain the same name (reactions + * are performed on the same material), and biological replicates should + * contain different names (the nucleic acids derived from the different + * biological replicates are not the same). + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "sampleType", propOrder = {"description", "documentation", "xRef", "type", "interRunCalibrator", "quantity", "calibratorSample", "cdnaSynthesisMethod", "templateRNAQuantity", "templateRNAQuality", "templateDNAQuantity", "templateDNAQuality"}) +public class SampleType { + + protected String description; + protected List documentation; + protected List xRef; + @XmlElement(required = true, defaultValue = "unkn") + @XmlSchemaType(name = "string") + protected SampleTypeType type; + @XmlElement(defaultValue = "false") + protected Boolean interRunCalibrator; + protected QuantityType quantity; + @XmlElement(defaultValue = "false") + protected Boolean calibratorSample; + protected CdnaSynthesisMethodType cdnaSynthesisMethod; + protected Double templateRNAQuantity; + protected TemplateQualityType templateRNAQuality; + protected Double templateDNAQuantity; + protected TemplateQualityType templateDNAQuality; + @XmlAttribute(name = "id", required = true) + protected String id; + + public String getDescription() { + + return description; + } + + public void setDescription(String value) { + + this.description = value; + } + + public List getDocumentation() { + + if(documentation == null) { + documentation = new ArrayList(); + } + return this.documentation; + } + + public List getXRef() { + + if(xRef == null) { + xRef = new ArrayList<>(); + } + return this.xRef; + } + + public SampleTypeType getType() { + + return type; + } + + public void setType(SampleTypeType value) { + + this.type = value; + } + + public Boolean isInterRunCalibrator() { + + return interRunCalibrator; + } + + public void setInterRunCalibrator(Boolean value) { + + this.interRunCalibrator = value; + } + + public QuantityType getQuantity() { + + return quantity; + } + + public void setQuantity(QuantityType value) { + + this.quantity = value; + } + + public Boolean isCalibratorSample() { + + return calibratorSample; + } + + public void setCalibratorSample(Boolean value) { + + this.calibratorSample = value; + } + + public CdnaSynthesisMethodType getCdnaSynthesisMethod() { + + return cdnaSynthesisMethod; + } + + public void setCdnaSynthesisMethod(CdnaSynthesisMethodType value) { + + this.cdnaSynthesisMethod = value; + } + + public Double getTemplateRNAQuantity() { + + return templateRNAQuantity; + } + + public void setTemplateRNAQuantity(Double value) { + + this.templateRNAQuantity = value; + } + + public TemplateQualityType getTemplateRNAQuality() { + + return templateRNAQuality; + } + + public void setTemplateRNAQuality(TemplateQualityType value) { + + this.templateRNAQuality = value; + } + + public Double getTemplateDNAQuantity() { + + return templateDNAQuantity; + } + + public void setTemplateDNAQuantity(Double value) { + + this.templateDNAQuantity = value; + } + + public TemplateQualityType getTemplateDNAQuality() { + + return templateDNAQuality; + } + + public void setTemplateDNAQuality(TemplateQualityType value) { + + this.templateDNAQuality = value; + } + + public String getId() { + + return id; + } + + public void setId(String value) { + + this.id = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/SampleTypeType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/SampleTypeType.java new file mode 100644 index 0000000000..296884c2b2 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/SampleTypeType.java @@ -0,0 +1,54 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v10.model; + +import jakarta.xml.bind.annotation.XmlEnum; +import jakarta.xml.bind.annotation.XmlEnumValue; +import jakarta.xml.bind.annotation.XmlType; + +@XmlType(name = "sampleTypeType") +@XmlEnum +public enum SampleTypeType { + + @XmlEnumValue("unkn") + UNKN("unkn"), // + @XmlEnumValue("ntc") + NTC("ntc"), // + @XmlEnumValue("nac") + NAC("nac"), // + @XmlEnumValue("std") + STD("std"), // + @XmlEnumValue("opt") + OPT("opt"); + + private final String value; + + SampleTypeType(String v) { + + value = v; + } + + public String value() { + + return value; + } + + public static SampleTypeType fromValue(String v) { + + for(SampleTypeType c : SampleTypeType.values()) { + if(c.value.equals(v)) { + return c; + } + } + throw new IllegalArgumentException(v); + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/SequencesType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/SequencesType.java new file mode 100644 index 0000000000..057efccdd9 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/SequencesType.java @@ -0,0 +1,77 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v10.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlType; + +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "sequencesType", propOrder = {"forwardPrimer", "reversePrimer", "probe1", "probe2", "amplicon"}) +public class SequencesType { + + protected OligoType forwardPrimer; + protected OligoType reversePrimer; + protected OligoType probe1; + protected OligoType probe2; + protected OligoType amplicon; + + public OligoType getForwardPrimer() { + + return forwardPrimer; + } + + public void setForwardPrimer(OligoType value) { + + this.forwardPrimer = value; + } + + public OligoType getReversePrimer() { + + return reversePrimer; + } + + public void setReversePrimer(OligoType value) { + + this.reversePrimer = value; + } + + public OligoType getProbe1() { + + return probe1; + } + + public void setProbe1(OligoType value) { + + this.probe1 = value; + } + + public OligoType getProbe2() { + + return probe2; + } + + public void setProbe2(OligoType value) { + + this.probe2 = value; + } + + public OligoType getAmplicon() { + + return amplicon; + } + + public void setAmplicon(OligoType value) { + + this.amplicon = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/StepType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/StepType.java new file mode 100644 index 0000000000..1b3ed98050 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/StepType.java @@ -0,0 +1,105 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v10.model; + +import java.math.BigInteger; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlSchemaType; +import jakarta.xml.bind.annotation.XmlType; + +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "stepType", propOrder = {"nr", "description", "temperature", "gradient", "loop", "pause", "lidOpen"}) +public class StepType { + + @XmlElement(required = true) + @XmlSchemaType(name = "positiveInteger") + protected BigInteger nr; + protected String description; + protected TemperatureType temperature; + protected GradientType gradient; + protected LoopType loop; + protected PauseType pause; + protected LidOpenType lidOpen; + + public BigInteger getNr() { + + return nr; + } + + public void setNr(BigInteger value) { + + this.nr = value; + } + + public String getDescription() { + + return description; + } + + public void setDescription(String value) { + + this.description = value; + } + + public TemperatureType getTemperature() { + + return temperature; + } + + public void setTemperature(TemperatureType value) { + + this.temperature = value; + } + + public GradientType getGradient() { + + return gradient; + } + + public void setGradient(GradientType value) { + + this.gradient = value; + } + + public LoopType getLoop() { + + return loop; + } + + public void setLoop(LoopType value) { + + this.loop = value; + } + + public PauseType getPause() { + + return pause; + } + + public void setPause(PauseType value) { + + this.pause = value; + } + + public LidOpenType getLidOpen() { + + return lidOpen; + } + + public void setLidOpen(LidOpenType value) { + + this.lidOpen = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/TargetType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/TargetType.java new file mode 100644 index 0000000000..594b4ab063 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/TargetType.java @@ -0,0 +1,141 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v10.model; + +import java.util.ArrayList; +import java.util.List; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlSchemaType; +import jakarta.xml.bind.annotation.XmlType; + +/** + * A target is a defined PCR reaction. PCR reactions at the same gene + * which differ in primer sequences are considered different samples. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "targetType", propOrder = {"description", "documentation", "xRef", "type", "amplificationEfficiency", "detectionLimit", "dyeId", "sequences", "commercialAssay"}) +public class TargetType { + + protected String description; + protected List documentation; + protected List xRef; + @XmlElement(required = true) + @XmlSchemaType(name = "string") + protected TargetTypeType type; + protected Float amplificationEfficiency; + protected Float detectionLimit; + protected String dyeId; + protected SequencesType sequences; + protected CommercialAssayType commercialAssay; + @XmlAttribute(name = "id", required = true) + protected String id; + + public String getDescription() { + + return description; + } + + public void setDescription(String value) { + + this.description = value; + } + + public List getDocumentation() { + + if(documentation == null) { + documentation = new ArrayList<>(); + } + return this.documentation; + } + + public List getXRef() { + + if(xRef == null) { + xRef = new ArrayList<>(); + } + return this.xRef; + } + + public TargetTypeType getType() { + + return type; + } + + public void setType(TargetTypeType value) { + + this.type = value; + } + + public Float getAmplificationEfficiency() { + + return amplificationEfficiency; + } + + public void setAmplificationEfficiency(Float value) { + + this.amplificationEfficiency = value; + } + + public Float getDetectionLimit() { + + return detectionLimit; + } + + public void setDetectionLimit(Float value) { + + this.detectionLimit = value; + } + + public String getDyeId() { + + return dyeId; + } + + public void setDyeId(String value) { + + this.dyeId = value; + } + + public SequencesType getSequences() { + + return sequences; + } + + public void setSequences(SequencesType value) { + + this.sequences = value; + } + + public CommercialAssayType getCommercialAssay() { + + return commercialAssay; + } + + public void setCommercialAssay(CommercialAssayType value) { + + this.commercialAssay = value; + } + + public String getId() { + + return id; + } + + public void setId(String value) { + + this.id = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/TargetTypeType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/TargetTypeType.java new file mode 100644 index 0000000000..3b8d8c4555 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/TargetTypeType.java @@ -0,0 +1,48 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v10.model; + +import jakarta.xml.bind.annotation.XmlEnum; +import jakarta.xml.bind.annotation.XmlEnumValue; +import jakarta.xml.bind.annotation.XmlType; + +@XmlType(name = "targetTypeType") +@XmlEnum +public enum TargetTypeType { + + @XmlEnumValue("ref") + REF("ref"), // + @XmlEnumValue("toi") + TOI("toi"); + + private final String value; + + TargetTypeType(String v) { + + value = v; + } + + public String value() { + + return value; + } + + public static TargetTypeType fromValue(String v) { + + for(TargetTypeType c : TargetTypeType.values()) { + if(c.value.equals(v)) { + return c; + } + } + throw new IllegalArgumentException(v); + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/TemperatureType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/TemperatureType.java new file mode 100644 index 0000000000..f909069b08 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/TemperatureType.java @@ -0,0 +1,98 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v10.model; + +import java.math.BigInteger; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlSchemaType; +import jakarta.xml.bind.annotation.XmlType; + +/** + * This step keeps a constant temperature on the heat block. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "temperatureType", propOrder = {"temperature", "duration", "temperatureChange", "durationChange", "measure", "ramp"}) +public class TemperatureType { + + protected float temperature; + @XmlElement(required = true) + @XmlSchemaType(name = "positiveInteger") + protected BigInteger duration; + protected Float temperatureChange; + protected Integer durationChange; + @XmlSchemaType(name = "string") + protected MeasureType measure; + protected Float ramp; + + public float getTemperature() { + + return temperature; + } + + public void setTemperature(float value) { + + this.temperature = value; + } + + public BigInteger getDuration() { + + return duration; + } + + public void setDuration(BigInteger value) { + + this.duration = value; + } + + public Float getTemperatureChange() { + + return temperatureChange; + } + + public void setTemperatureChange(Float value) { + + this.temperatureChange = value; + } + + public Integer getDurationChange() { + + return durationChange; + } + + public void setDurationChange(Integer value) { + + this.durationChange = value; + } + + public MeasureType getMeasure() { + + return measure; + } + + public void setMeasure(MeasureType value) { + + this.measure = value; + } + + public Float getRamp() { + + return ramp; + } + + public void setRamp(Float value) { + + this.ramp = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/TemplateQualityType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/TemplateQualityType.java new file mode 100644 index 0000000000..b175c21799 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/TemplateQualityType.java @@ -0,0 +1,46 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v10.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlType; + +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "templateQualityType", propOrder = {"method", "result"}) +public class TemplateQualityType { + + @XmlElement(required = true) + protected String method; + protected float result; + + public String getMethod() { + + return method; + } + + public void setMethod(String value) { + + this.method = value; + } + + public float getResult() { + + return result; + } + + public void setResult(float value) { + + this.result = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/ThermalCyclingConditionsType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/ThermalCyclingConditionsType.java new file mode 100644 index 0000000000..84357188e1 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/ThermalCyclingConditionsType.java @@ -0,0 +1,92 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v10.model; + +import java.util.ArrayList; +import java.util.List; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlType; + +/** + * A cycling program for PCR or to amplify cDNA. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "thermalCyclingConditionsType", propOrder = {"description", "documentation", "lidTemperature", "experimenter", "step"}) +public class ThermalCyclingConditionsType { + + protected String description; + protected List documentation; + protected Float lidTemperature; + protected List experimenter; + @XmlElement(required = true) + protected List step; + @XmlAttribute(name = "id", required = true) + protected String id; + + public String getDescription() { + + return description; + } + + public void setDescription(String value) { + + this.description = value; + } + + public List getDocumentation() { + + if(documentation == null) { + documentation = new ArrayList<>(); + } + return this.documentation; + } + + public Float getLidTemperature() { + + return lidTemperature; + } + + public void setLidTemperature(Float value) { + + this.lidTemperature = value; + } + + public List getExperimenter() { + + if(experimenter == null) { + experimenter = new ArrayList<>(); + } + return this.experimenter; + } + + public List getStep() { + + if(step == null) { + step = new ArrayList<>(); + } + return this.step; + } + + public String getId() { + + return id; + } + + public void setId(String value) { + + this.id = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/ThirdPartyExtensionsType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/ThirdPartyExtensionsType.java new file mode 100644 index 0000000000..ea476f01a8 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/ThirdPartyExtensionsType.java @@ -0,0 +1,41 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v10.model; + +import java.util.ArrayList; +import java.util.List; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAnyElement; +import jakarta.xml.bind.annotation.XmlType; + +/** + * This is the place to insert extensions not supported by RDML. Please use + * a descriptive and unique root element to avoid interference with other + * third party extensions. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "thirdPartyExtensionsType", propOrder = {"any"}) +public class ThirdPartyExtensionsType { + + @XmlAnyElement(lax = true) + protected List any; + + public List getAny() { + + if(any == null) { + any = new ArrayList<>(); + } + return this.any; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/XRefType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/XRefType.java new file mode 100644 index 0000000000..96a7a5361e --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v10/model/XRefType.java @@ -0,0 +1,44 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v10.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlType; + +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "xRefType", propOrder = {"name", "id"}) +public class XRefType { + + protected String name; + protected String id; + + public String getName() { + + return name; + } + + public void setName(String value) { + + this.name = value; + } + + public String getId() { + + return id; + } + + public void setId(String value) { + + this.id = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/CdnaSynthesisMethodType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/CdnaSynthesisMethodType.java new file mode 100644 index 0000000000..e634e0cb2a --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/CdnaSynthesisMethodType.java @@ -0,0 +1,71 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v11.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlSchemaType; +import jakarta.xml.bind.annotation.XmlType; + +/** + * Description of the cDNA synthesis method. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "cdnaSynthesisMethodType", propOrder = {"enzyme", "primingMethod", "dnaseTreatment", "thermalCyclingConditions"}) +public class CdnaSynthesisMethodType { + + protected String enzyme; + @XmlSchemaType(name = "string") + protected PrimingMethodType primingMethod; + protected Boolean dnaseTreatment; + protected IdReferencesType thermalCyclingConditions; + + public String getEnzyme() { + + return enzyme; + } + + public void setEnzyme(String value) { + + this.enzyme = value; + } + + public PrimingMethodType getPrimingMethod() { + + return primingMethod; + } + + public void setPrimingMethod(PrimingMethodType value) { + + this.primingMethod = value; + } + + public Boolean isDnaseTreatment() { + + return dnaseTreatment; + } + + public void setDnaseTreatment(Boolean value) { + + this.dnaseTreatment = value; + } + + public IdReferencesType getThermalCyclingConditions() { + + return thermalCyclingConditions; + } + + public void setThermalCyclingConditions(IdReferencesType value) { + + this.thermalCyclingConditions = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/CommercialAssayType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/CommercialAssayType.java new file mode 100644 index 0000000000..3ab105b582 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/CommercialAssayType.java @@ -0,0 +1,51 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v11.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlType; + +/** + * For some commercial assays, the primer sequences may be unknown. This element + * allows to describe commercial assays. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "commercialAssayType", propOrder = {"company", "orderNumber"}) +public class CommercialAssayType { + + @XmlElement(required = true) + protected String company; + @XmlElement(required = true) + protected String orderNumber; + + public String getCompany() { + + return company; + } + + public void setCompany(String value) { + + this.company = value; + } + + public String getOrderNumber() { + + return orderNumber; + } + + public void setOrderNumber(String value) { + + this.orderNumber = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/CqDetectionMethodType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/CqDetectionMethodType.java new file mode 100644 index 0000000000..b75b8803d5 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/CqDetectionMethodType.java @@ -0,0 +1,52 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v11.model; + +import jakarta.xml.bind.annotation.XmlEnum; +import jakarta.xml.bind.annotation.XmlEnumValue; +import jakarta.xml.bind.annotation.XmlType; + +@XmlType(name = "cqDetectionMethodType") +@XmlEnum +public enum CqDetectionMethodType { + + @XmlEnumValue("automated threshold and baseline settings") + AUTOMATED_THRESHOLD_AND_BASELINE_SETTINGS("automated threshold and baseline settings"), // + @XmlEnumValue("manual threshold and baseline settings") + MANUAL_THRESHOLD_AND_BASELINE_SETTINGS("manual threshold and baseline settings"), // + @XmlEnumValue("second derivative maximum") + SECOND_DERIVATIVE_MAXIMUM("second derivative maximum"), // + @XmlEnumValue("other") + OTHER("other"); + + private final String value; + + CqDetectionMethodType(String v) { + + value = v; + } + + public String value() { + + return value; + } + + public static CqDetectionMethodType fromValue(String v) { + + for(CqDetectionMethodType c : CqDetectionMethodType.values()) { + if(c.value.equals(v)) { + return c; + } + } + throw new IllegalArgumentException(v); + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/DataCollectionSoftwareType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/DataCollectionSoftwareType.java new file mode 100644 index 0000000000..a153f21cff --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/DataCollectionSoftwareType.java @@ -0,0 +1,50 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v11.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlType; + +/** + * Software name and version used to collect and analyze the data. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "dataCollectionSoftwareType", propOrder = {"name", "version"}) +public class DataCollectionSoftwareType { + + @XmlElement(required = true) + protected String name; + @XmlElement(required = true) + protected String version; + + public String getName() { + + return name; + } + + public void setName(String value) { + + this.name = value; + } + + public String getVersion() { + + return version; + } + + public void setVersion(String value) { + + this.version = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/DataType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/DataType.java new file mode 100644 index 0000000000..61fefa011e --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/DataType.java @@ -0,0 +1,114 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v11.model; + +import java.util.ArrayList; +import java.util.List; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlType; + +/** + * Due to the frequent occurrence of this element, names are kept short. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "dataType", propOrder = {"tar", "cq", "excl", "adp", "mdp", "endPt", "bgFluor", "quantFluor"}) +public class DataType { + + @XmlElement(required = true) + protected IdReferencesType tar; + protected Float cq; + protected String excl; + protected List adp; + protected List mdp; + protected Float endPt; + protected Float bgFluor; + protected Float quantFluor; + + public IdReferencesType getTar() { + + return tar; + } + + public void setTar(IdReferencesType value) { + + this.tar = value; + } + + public Float getCq() { + + return cq; + } + + public void setCq(Float value) { + + this.cq = value; + } + + public String getExcl() { + + return excl; + } + + public void setExcl(String value) { + + this.excl = value; + } + + public List getAdp() { + + if(adp == null) { + adp = new ArrayList<>(); + } + return this.adp; + } + + public List getMdp() { + + if(mdp == null) { + mdp = new ArrayList<>(); + } + return this.mdp; + } + + public Float getEndPt() { + + return endPt; + } + + public void setEndPt(Float value) { + + this.endPt = value; + } + + public Float getBgFluor() { + + return bgFluor; + } + + public void setBgFluor(Float value) { + + this.bgFluor = value; + } + + public Float getQuantFluor() { + + return quantFluor; + } + + public void setQuantFluor(Float value) { + + this.quantFluor = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/DocumentationType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/DocumentationType.java new file mode 100644 index 0000000000..d1fc443c53 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/DocumentationType.java @@ -0,0 +1,50 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v11.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlType; + +/** + * These elements should be used if the same description applies to many samples, + * targets or experiments. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "documentationType", propOrder = {}) +public class DocumentationType { + + protected String text; + @XmlAttribute(name = "id", required = true) + protected String id; + + public String getText() { + + return text; + } + + public void setText(String value) { + + this.text = value; + } + + public String getId() { + + return id; + } + + public void setId(String value) { + + this.id = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/DpAmpCurveType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/DpAmpCurveType.java new file mode 100644 index 0000000000..6b90f77219 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/DpAmpCurveType.java @@ -0,0 +1,58 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v11.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlType; + +/** + * Due to the frequent occurrence of this element, names are kept short. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "dpAmpCurveType", propOrder = {"cyc", "tmp", "fluor"}) +public class DpAmpCurveType { + + protected float cyc; + protected Float tmp; + protected float fluor; + + public float getCyc() { + + return cyc; + } + + public void setCyc(float value) { + + this.cyc = value; + } + + public Float getTmp() { + + return tmp; + } + + public void setTmp(Float value) { + + this.tmp = value; + } + + public float getFluor() { + + return fluor; + } + + public void setFluor(float value) { + + this.fluor = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/DpMeltingCurveType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/DpMeltingCurveType.java new file mode 100644 index 0000000000..dda969a15f --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/DpMeltingCurveType.java @@ -0,0 +1,47 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v11.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlType; + +/** + * Due to the frequent occurrence of this element, names are kept short. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "dpMeltingCurveType", propOrder = {"tmp", "fluor"}) +public class DpMeltingCurveType { + + protected float tmp; + protected float fluor; + + public float getTmp() { + + return tmp; + } + + public void setTmp(float value) { + + this.tmp = value; + } + + public float getFluor() { + + return fluor; + } + + public void setFluor(float value) { + + this.fluor = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/DyeType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/DyeType.java new file mode 100644 index 0000000000..7c34e60b1b --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/DyeType.java @@ -0,0 +1,49 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v11.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlType; + +/** + * Information on a dye. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "dyeType", propOrder = {"description"}) +public class DyeType { + + protected String description; + @XmlAttribute(name = "id", required = true) + protected String id; + + public String getDescription() { + + return description; + } + + public void setDescription(String value) { + + this.description = value; + } + + public String getId() { + + return id; + } + + public void setId(String value) { + + this.id = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/ExperimentType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/ExperimentType.java new file mode 100644 index 0000000000..2494f61b57 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/ExperimentType.java @@ -0,0 +1,70 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v11.model; + +import java.util.ArrayList; +import java.util.List; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlType; + +/** + * An experiment can contain several runs. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "experimentType", propOrder = {"description", "documentation", "run"}) +public class ExperimentType { + + protected String description; + protected List documentation; + protected List run; + @XmlAttribute(name = "id", required = true) + protected String id; + + public String getDescription() { + + return description; + } + + public void setDescription(String value) { + + this.description = value; + } + + public List getDocumentation() { + + if(documentation == null) { + documentation = new ArrayList<>(); + } + return this.documentation; + } + + public List getRun() { + + if(run == null) { + run = new ArrayList<>(); + } + return this.run; + } + + public String getId() { + + return id; + } + + public void setId(String value) { + + this.id = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/ExperimenterType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/ExperimenterType.java new file mode 100644 index 0000000000..2c13e87dbb --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/ExperimenterType.java @@ -0,0 +1,96 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v11.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlType; + +/** + * Contact details of the experimenter. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "experimenterType", propOrder = {"firstName", "lastName", "email", "labName", "labAddress"}) +public class ExperimenterType { + + @XmlElement(required = true) + protected String firstName; + @XmlElement(required = true) + protected String lastName; + protected String email; + protected String labName; + protected String labAddress; + @XmlAttribute(name = "id", required = true) + protected String id; + + public String getFirstName() { + + return firstName; + } + + public void setFirstName(String value) { + + this.firstName = value; + } + + public String getLastName() { + + return lastName; + } + + public void setLastName(String value) { + + this.lastName = value; + } + + public String getEmail() { + + return email; + } + + public void setEmail(String value) { + + this.email = value; + } + + public String getLabName() { + + return labName; + } + + public void setLabName(String value) { + + this.labName = value; + } + + public String getLabAddress() { + + return labAddress; + } + + public void setLabAddress(String value) { + + this.labAddress = value; + } + + public String getId() { + + return id; + } + + public void setId(String value) { + + this.id = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/GradientType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/GradientType.java new file mode 100644 index 0000000000..1e8b924077 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/GradientType.java @@ -0,0 +1,109 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v11.model; + +import java.math.BigInteger; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlSchemaType; +import jakarta.xml.bind.annotation.XmlType; + +/** + * This step forms a temperature gradient across the PCR block. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "gradientType", propOrder = {"highTemperature", "lowTemperature", "duration", "temperatureChange", "durationChange", "measure", "ramp"}) +public class GradientType { + + protected float highTemperature; + protected float lowTemperature; + @XmlElement(required = true) + @XmlSchemaType(name = "positiveInteger") + protected BigInteger duration; + protected Float temperatureChange; + protected Integer durationChange; + @XmlSchemaType(name = "string") + protected MeasureType measure; + protected Float ramp; + + public float getHighTemperature() { + + return highTemperature; + } + + public void setHighTemperature(float value) { + + this.highTemperature = value; + } + + public float getLowTemperature() { + + return lowTemperature; + } + + public void setLowTemperature(float value) { + + this.lowTemperature = value; + } + + public BigInteger getDuration() { + + return duration; + } + + public void setDuration(BigInteger value) { + + this.duration = value; + } + + public Float getTemperatureChange() { + + return temperatureChange; + } + + public void setTemperatureChange(Float value) { + + this.temperatureChange = value; + } + + public Integer getDurationChange() { + + return durationChange; + } + + public void setDurationChange(Integer value) { + + this.durationChange = value; + } + + public MeasureType getMeasure() { + + return measure; + } + + public void setMeasure(MeasureType value) { + + this.measure = value; + } + + public Float getRamp() { + + return ramp; + } + + public void setRamp(Float value) { + + this.ramp = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/IdReferencesType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/IdReferencesType.java new file mode 100644 index 0000000000..91bf5e5680 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/IdReferencesType.java @@ -0,0 +1,35 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v11.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlType; + +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "idReferencesType") +public class IdReferencesType { + + @XmlAttribute(name = "id", required = true) + protected String id; + + public String getId() { + + return id; + } + + public void setId(String value) { + + this.id = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/LidOpenType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/LidOpenType.java new file mode 100644 index 0000000000..df3bbe0398 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/LidOpenType.java @@ -0,0 +1,27 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v11.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlType; + +/** + * This step waits for the user to open the lid and continues afterwards. It + * allows to stop the program and to wait for the user to add for example + * enzymes and continue the program afterwards. The temperature of the previous + * step is maintained. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "lidOpenType") +public class LidOpenType { +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/LoopType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/LoopType.java new file mode 100644 index 0000000000..f984f68a0b --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/LoopType.java @@ -0,0 +1,57 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v11.model; + +import java.math.BigInteger; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlSchemaType; +import jakarta.xml.bind.annotation.XmlType; + +/** + * This step allows to form a loop or to exclude some steps. It allows to + * jump to a certain "goto" step for "repeat" times. If the "goto" step is + * higher than the step of the loop, "repeat" must be "0". + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "loopType", propOrder = {"gotoStep", "repeat"}) +public class LoopType { + + @XmlElement(name = "goto", required = true) + @XmlSchemaType(name = "positiveInteger") + protected BigInteger gotoStep; + @XmlElement(required = true) + @XmlSchemaType(name = "positiveInteger") + protected BigInteger repeat; + + public BigInteger getGoto() { + + return gotoStep; + } + + public void setGoto(BigInteger value) { + + this.gotoStep = value; + } + + public BigInteger getRepeat() { + + return repeat; + } + + public void setRepeat(BigInteger value) { + + this.repeat = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/MeasureType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/MeasureType.java new file mode 100644 index 0000000000..5ab0d60bf1 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/MeasureType.java @@ -0,0 +1,48 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v11.model; + +import jakarta.xml.bind.annotation.XmlEnum; +import jakarta.xml.bind.annotation.XmlEnumValue; +import jakarta.xml.bind.annotation.XmlType; + +@XmlType(name = "measureType") +@XmlEnum +public enum MeasureType { + + @XmlEnumValue("real time") + REAL_TIME("real time"), // + @XmlEnumValue("meltcurve") + MELTCURVE("meltcurve"); + + private final String value; + + MeasureType(String v) { + + value = v; + } + + public String value() { + + return value; + } + + public static MeasureType fromValue(String v) { + + for(MeasureType c : MeasureType.values()) { + if(c.value.equals(v)) { + return c; + } + } + throw new IllegalArgumentException(v); + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/ObjectFactory.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/ObjectFactory.java new file mode 100644 index 0000000000..a1355317e2 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/ObjectFactory.java @@ -0,0 +1,172 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v11.model; + +import jakarta.xml.bind.annotation.XmlRegistry; + +@XmlRegistry +public class ObjectFactory { + + public ObjectFactory() { + + } + + public Rdml createRdml() { + + return new Rdml(); + } + + public RdmlIdType createRdmlIdType() { + + return new RdmlIdType(); + } + + public ExperimenterType createExperimenterType() { + + return new ExperimenterType(); + } + + public DocumentationType createDocumentationType() { + + return new DocumentationType(); + } + + public DyeType createDyeType() { + + return new DyeType(); + } + + public SampleType createSampleType() { + + return new SampleType(); + } + + public TargetType createTargetType() { + + return new TargetType(); + } + + public ThermalCyclingConditionsType createThermalCyclingConditionsType() { + + return new ThermalCyclingConditionsType(); + } + + public ExperimentType createExperimentType() { + + return new ExperimentType(); + } + + public QuantityType createQuantityType() { + + return new QuantityType(); + } + + public IdReferencesType createIdReferencesType() { + + return new IdReferencesType(); + } + + public TemperatureType createTemperatureType() { + + return new TemperatureType(); + } + + public StepType createStepType() { + + return new StepType(); + } + + public RunType createRunType() { + + return new RunType(); + } + + public OligoType createOligoType() { + + return new OligoType(); + } + + public LidOpenType createLidOpenType() { + + return new LidOpenType(); + } + + public GradientType createGradientType() { + + return new GradientType(); + } + + public DpMeltingCurveType createDpMeltingCurveType() { + + return new DpMeltingCurveType(); + } + + public ReactType createReactType() { + + return new ReactType(); + } + + public PauseType createPauseType() { + + return new PauseType(); + } + + public DataCollectionSoftwareType createDataCollectionSoftwareType() { + + return new DataCollectionSoftwareType(); + } + + public DataType createDataType() { + + return new DataType(); + } + + public CdnaSynthesisMethodType createCdnaSynthesisMethodType() { + + return new CdnaSynthesisMethodType(); + } + + public PcrFormatType createPcrFormatType() { + + return new PcrFormatType(); + } + + public DpAmpCurveType createDpAmpCurveType() { + + return new DpAmpCurveType(); + } + + public LoopType createLoopType() { + + return new LoopType(); + } + + public CommercialAssayType createCommercialAssayType() { + + return new CommercialAssayType(); + } + + public SequencesType createSequencesType() { + + return new SequencesType(); + } + + public TemplateQualityType createTemplateQualityType() { + + return new TemplateQualityType(); + } + + public XRefType createXRefType() { + + return new XRefType(); + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/OligoType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/OligoType.java new file mode 100644 index 0000000000..910ccb2128 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/OligoType.java @@ -0,0 +1,57 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v11.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlType; + +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "oligoType", propOrder = {"threePrimeTag", "fivePrimeTag", "sequence"}) +public class OligoType { + + protected String threePrimeTag; + protected String fivePrimeTag; + @XmlElement(required = true) + protected String sequence; + + public String getThreePrimeTag() { + + return threePrimeTag; + } + + public void setThreePrimeTag(String value) { + + this.threePrimeTag = value; + } + + public String getFivePrimeTag() { + + return fivePrimeTag; + } + + public void setFivePrimeTag(String value) { + + this.fivePrimeTag = value; + } + + public String getSequence() { + + return sequence; + } + + public void setSequence(String value) { + + this.sequence = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/PauseType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/PauseType.java new file mode 100644 index 0000000000..830d4b3aa3 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/PauseType.java @@ -0,0 +1,37 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v11.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlType; + +/** + * This step allows to pause at a certain temperature. It is typically the + * last step in an amplification protocol. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "pauseType", propOrder = {"temperature"}) +public class PauseType { + + protected float temperature; + + public float getTemperature() { + + return temperature; + } + + public void setTemperature(float value) { + + this.temperature = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/PcrFormatType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/PcrFormatType.java new file mode 100644 index 0000000000..cdf57e8bf0 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/PcrFormatType.java @@ -0,0 +1,98 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v11.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlType; + +/** + *
+ *        The format of the run - This allows the software to display the data
+ *        according to the qPCR instrument run format.
+ *        Rotor formats always have 1 column; rows correspond to the number
+ *        of places in the rotor.
+ *        
+ *        Values for common formats are:
+ *        
+ *        Format            |    rows    |   columns   |  rowLabel  | columnLabel
+ *        --------------------------------------------------------------------------
+ *        single-well       |     1      |      1      |    123     |     123
+ *        48-well plate     |     6      |      8      |    ABC     |     123
+ *        96-well plate     |     8      |     12      |    ABC     |     123
+ *        384-well plate    |    16      |     24      |    ABC     |     123
+ *        1536-well plate   |    32      |     48      |    ABC     |     123
+ *        3072-well array   |    32      |     96      |   A1a1     |    A1a1
+ *        5184-well chip    |    72      |     72      |    ABC     |     123
+ *        32-well rotor     |    32      |      1      |    123     |     123
+ *        72-well rotor     |    72      |      1      |    123     |     123
+ *        100-well rotor    |   100      |      1      |    123     |     123
+ *        free format       |    -1      |      1      |    123     |     123
+ *        
+ *        If rows are -1 then the software should not try to reconstruct a plate and 
+ *        just display all react data in list (1 column) form.
+ *        
+ *        If columns is 1 then the software should not display a column label.
+ * 
+ */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "pcrFormatType", propOrder = {"rows", "columns", "rowLabel", "columnLabel"}) +public class PcrFormatType { + + protected int rows; + protected int columns; + @XmlElement(required = true) + protected String rowLabel; + @XmlElement(required = true) + protected String columnLabel; + + public int getRows() { + + return rows; + } + + public void setRows(int value) { + + this.rows = value; + } + + public int getColumns() { + + return columns; + } + + public void setColumns(int value) { + + this.columns = value; + } + + public String getRowLabel() { + + return rowLabel; + } + + public void setRowLabel(String value) { + + this.rowLabel = value; + } + + public String getColumnLabel() { + + return columnLabel; + } + + public void setColumnLabel(String value) { + + this.columnLabel = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/PrimingMethodType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/PrimingMethodType.java new file mode 100644 index 0000000000..9f83c7db8b --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/PrimingMethodType.java @@ -0,0 +1,54 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v11.model; + +import jakarta.xml.bind.annotation.XmlEnum; +import jakarta.xml.bind.annotation.XmlEnumValue; +import jakarta.xml.bind.annotation.XmlType; + +@XmlType(name = "primingMethodType") +@XmlEnum +public enum PrimingMethodType { + + @XmlEnumValue("oligo-dt") + OLIGO_DT("oligo-dt"), // + @XmlEnumValue("random") + RANDOM("random"), // + @XmlEnumValue("target-specific") + TARGET_SPECIFIC("target-specific"), // + @XmlEnumValue("oligo-dt and random") + OLIGO_DT_AND_RANDOM("oligo-dt and random"), // + @XmlEnumValue("other") + OTHER("other"); + + private final String value; + + PrimingMethodType(String v) { + + value = v; + } + + public String value() { + + return value; + } + + public static PrimingMethodType fromValue(String v) { + + for(PrimingMethodType c : PrimingMethodType.values()) { + if(c.value.equals(v)) { + return c; + } + } + throw new IllegalArgumentException(v); + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/QuantityType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/QuantityType.java new file mode 100644 index 0000000000..71c4f8867f --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/QuantityType.java @@ -0,0 +1,51 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v11.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlSchemaType; +import jakarta.xml.bind.annotation.XmlType; + +/** + * A quantity is always defined by its value and its unit. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "quantityType", propOrder = {"value", "unit"}) +public class QuantityType { + + protected float value; + @XmlElement(required = true) + @XmlSchemaType(name = "string") + protected QuantityUnitType unit; + + public float getValue() { + + return value; + } + + public void setValue(float value) { + + this.value = value; + } + + public QuantityUnitType getUnit() { + + return unit; + } + + public void setUnit(QuantityUnitType value) { + + this.unit = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/QuantityUnitType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/QuantityUnitType.java new file mode 100644 index 0000000000..a082c7127d --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/QuantityUnitType.java @@ -0,0 +1,56 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v11.model; + +import jakarta.xml.bind.annotation.XmlEnum; +import jakarta.xml.bind.annotation.XmlEnumValue; +import jakarta.xml.bind.annotation.XmlType; + +@XmlType(name = "quantityUnitType") +@XmlEnum +public enum QuantityUnitType { + + @XmlEnumValue("cop") + COP("cop"), // + @XmlEnumValue("fold") + FOLD("fold"), // + @XmlEnumValue("dil") + DIL("dil"), // + @XmlEnumValue("ng") + NG("ng"), // + @XmlEnumValue("nMol") + N_MOL("nMol"), // + @XmlEnumValue("other") + OTHER("other"); + + private final String value; + + QuantityUnitType(String v) { + + value = v; + } + + public String value() { + + return value; + } + + public static QuantityUnitType fromValue(String v) { + + for(QuantityUnitType c : QuantityUnitType.values()) { + if(c.value.equals(v)) { + return c; + } + } + throw new IllegalArgumentException(v); + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/Rdml.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/Rdml.java new file mode 100644 index 0000000000..98c861d5c2 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/Rdml.java @@ -0,0 +1,143 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v11.model; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.datatype.XMLGregorianCalendar; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlSchemaType; +import jakarta.xml.bind.annotation.XmlType; + +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = {"dateMade", "dateUpdated", "id", "experimenter", "documentation", "dye", "sample", "target", "thermalCyclingConditions", "experiment"}) +@XmlRootElement(name = "rdml") +public class Rdml { + + @XmlSchemaType(name = "dateTime") + protected XMLGregorianCalendar dateMade; + @XmlSchemaType(name = "dateTime") + protected XMLGregorianCalendar dateUpdated; + protected List id; + protected List experimenter; + protected List documentation; + protected List dye; + protected List sample; + protected List target; + protected List thermalCyclingConditions; + protected List experiment; + @XmlAttribute(name = "version", required = true) + protected String version; + + public XMLGregorianCalendar getDateMade() { + + return dateMade; + } + + public void setDateMade(XMLGregorianCalendar value) { + + this.dateMade = value; + } + + public XMLGregorianCalendar getDateUpdated() { + + return dateUpdated; + } + + public void setDateUpdated(XMLGregorianCalendar value) { + + this.dateUpdated = value; + } + + public List getId() { + + if(id == null) { + id = new ArrayList<>(); + } + return this.id; + } + + public List getExperimenter() { + + if(experimenter == null) { + experimenter = new ArrayList<>(); + } + return this.experimenter; + } + + public List getDocumentation() { + + if(documentation == null) { + documentation = new ArrayList<>(); + } + return this.documentation; + } + + public List getDye() { + + if(dye == null) { + dye = new ArrayList<>(); + } + return this.dye; + } + + public List getSample() { + + if(sample == null) { + sample = new ArrayList<>(); + } + return this.sample; + } + + public List getTarget() { + + if(target == null) { + target = new ArrayList<>(); + } + return this.target; + } + + public List getThermalCyclingConditions() { + + if(thermalCyclingConditions == null) { + thermalCyclingConditions = new ArrayList<>(); + } + return this.thermalCyclingConditions; + } + + public List getExperiment() { + + if(experiment == null) { + experiment = new ArrayList<>(); + } + return this.experiment; + } + + public String getVersion() { + + if(version == null) { + return "1.1"; + } else { + return version; + } + } + + public void setVersion(String value) { + + this.version = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/RdmlIdType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/RdmlIdType.java new file mode 100644 index 0000000000..ba4e0fc836 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/RdmlIdType.java @@ -0,0 +1,62 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v11.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlType; + +/** + * This element can be used to assign a publisher and id to the RDML file. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "rdmlIdType", propOrder = {"publisher", "serialNumber", "md5Hash"}) +public class RdmlIdType { + + @XmlElement(required = true) + protected String publisher; + @XmlElement(required = true) + protected String serialNumber; + @XmlElement(name = "MD5Hash") + protected String md5Hash; + + public String getPublisher() { + + return publisher; + } + + public void setPublisher(String value) { + + this.publisher = value; + } + + public String getSerialNumber() { + + return serialNumber; + } + + public void setSerialNumber(String value) { + + this.serialNumber = value; + } + + public String getMD5Hash() { + + return md5Hash; + } + + public void setMD5Hash(String value) { + + this.md5Hash = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/ReactType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/ReactType.java new file mode 100644 index 0000000000..29b9e29ee1 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/ReactType.java @@ -0,0 +1,69 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v11.model; + +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.List; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlSchemaType; +import jakarta.xml.bind.annotation.XmlType; + +/** + * A reaction is an independent chemical reaction corresponding for example + * to a well in a 96 well plate, a capillary in a rotor, a through-hole on + * an array, etc. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "reactType", propOrder = {"sample", "data"}) +public class ReactType { + + @XmlElement(required = true) + protected IdReferencesType sample; + @XmlElement(required = true) + protected List data; + @XmlAttribute(name = "id", required = true) + @XmlSchemaType(name = "positiveInteger") + protected BigInteger id; + + public IdReferencesType getSample() { + + return sample; + } + + public void setSample(IdReferencesType value) { + + this.sample = value; + } + + public List getData() { + + if(data == null) { + data = new ArrayList<>(); + } + return this.data; + } + + public BigInteger getId() { + + return id; + } + + public void setId(BigInteger value) { + + this.id = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/RunType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/RunType.java new file mode 100644 index 0000000000..c7b2e68ad3 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/RunType.java @@ -0,0 +1,164 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v11.model; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.datatype.XMLGregorianCalendar; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlSchemaType; +import jakarta.xml.bind.annotation.XmlType; + +/** + * A run is a set of reactions performed in one "run", for example + * one plate, one rotor, one array, one chip. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "runType", propOrder = {"description", "documentation", "experimenter", "instrument", "dataCollectionSoftware", "backgroundDeterminationMethod", "cqDetectionMethod", "thermalCyclingConditions", "pcrFormat", "runDate", "react"}) +public class RunType { + + protected String description; + protected List documentation; + protected List experimenter; + protected String instrument; + protected DataCollectionSoftwareType dataCollectionSoftware; + protected String backgroundDeterminationMethod; + @XmlSchemaType(name = "string") + protected CqDetectionMethodType cqDetectionMethod; + protected IdReferencesType thermalCyclingConditions; + @XmlElement(required = true) + protected PcrFormatType pcrFormat; + @XmlSchemaType(name = "dateTime") + protected XMLGregorianCalendar runDate; + protected List react; + @XmlAttribute(name = "id", required = true) + protected String id; + + public String getDescription() { + + return description; + } + + public void setDescription(String value) { + + this.description = value; + } + + public List getDocumentation() { + + if(documentation == null) { + documentation = new ArrayList<>(); + } + return this.documentation; + } + + public List getExperimenter() { + + if(experimenter == null) { + experimenter = new ArrayList<>(); + } + return this.experimenter; + } + + public String getInstrument() { + + return instrument; + } + + public void setInstrument(String value) { + + this.instrument = value; + } + + public DataCollectionSoftwareType getDataCollectionSoftware() { + + return dataCollectionSoftware; + } + + public void setDataCollectionSoftware(DataCollectionSoftwareType value) { + + this.dataCollectionSoftware = value; + } + + public String getBackgroundDeterminationMethod() { + + return backgroundDeterminationMethod; + } + + public void setBackgroundDeterminationMethod(String value) { + + this.backgroundDeterminationMethod = value; + } + + public CqDetectionMethodType getCqDetectionMethod() { + + return cqDetectionMethod; + } + + public void setCqDetectionMethod(CqDetectionMethodType value) { + + this.cqDetectionMethod = value; + } + + public IdReferencesType getThermalCyclingConditions() { + + return thermalCyclingConditions; + } + + public void setThermalCyclingConditions(IdReferencesType value) { + + this.thermalCyclingConditions = value; + } + + public PcrFormatType getPcrFormat() { + + return pcrFormat; + } + + public void setPcrFormat(PcrFormatType value) { + + this.pcrFormat = value; + } + + public XMLGregorianCalendar getRunDate() { + + return runDate; + } + + public void setRunDate(XMLGregorianCalendar value) { + + this.runDate = value; + } + + public List getReact() { + + if(react == null) { + react = new ArrayList<>(); + } + return this.react; + } + + public String getId() { + + return id; + } + + public void setId(String value) { + + this.id = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/SampleType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/SampleType.java new file mode 100644 index 0000000000..831633b558 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/SampleType.java @@ -0,0 +1,181 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v11.model; + +import java.util.ArrayList; +import java.util.List; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlSchemaType; +import jakarta.xml.bind.annotation.XmlType; + +/** + * A sample is a defined template solution. Dilutions of the same + * material differ in concentration and are considered different samples. + * A technical replicate samples should contain the same name (reactions + * are performed on the same material), and biological replicates should + * contain different names (the nucleic acids derived from the different + * biological replicates are not the same). Serial dilutions in a standard + * curve must have a different name. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "sampleType", propOrder = {"description", "documentation", "xRef", "type", "interRunCalibrator", "quantity", "calibratorSample", "cdnaSynthesisMethod", "templateRNAQuantity", "templateRNAQuality", "templateDNAQuantity", "templateDNAQuality"}) +public class SampleType { + + protected String description; + protected List documentation; + protected List xRef; + @XmlElement(required = true, defaultValue = "unkn") + @XmlSchemaType(name = "string") + protected SampleTypeType type; + @XmlElement(defaultValue = "false") + protected Boolean interRunCalibrator; + protected QuantityType quantity; + @XmlElement(defaultValue = "false") + protected Boolean calibratorSample; + protected CdnaSynthesisMethodType cdnaSynthesisMethod; + protected QuantityType templateRNAQuantity; + protected TemplateQualityType templateRNAQuality; + protected QuantityType templateDNAQuantity; + protected TemplateQualityType templateDNAQuality; + @XmlAttribute(name = "id", required = true) + protected String id; + + public String getDescription() { + + return description; + } + + public void setDescription(String value) { + + this.description = value; + } + + public List getDocumentation() { + + if(documentation == null) { + documentation = new ArrayList<>(); + } + return this.documentation; + } + + public List getXRef() { + + if(xRef == null) { + xRef = new ArrayList<>(); + } + return this.xRef; + } + + public SampleTypeType getType() { + + return type; + } + + public void setType(SampleTypeType value) { + + this.type = value; + } + + public Boolean isInterRunCalibrator() { + + return interRunCalibrator; + } + + public void setInterRunCalibrator(Boolean value) { + + this.interRunCalibrator = value; + } + + public QuantityType getQuantity() { + + return quantity; + } + + public void setQuantity(QuantityType value) { + + this.quantity = value; + } + + public Boolean isCalibratorSample() { + + return calibratorSample; + } + + public void setCalibratorSample(Boolean value) { + + this.calibratorSample = value; + } + + public CdnaSynthesisMethodType getCdnaSynthesisMethod() { + + return cdnaSynthesisMethod; + } + + public void setCdnaSynthesisMethod(CdnaSynthesisMethodType value) { + + this.cdnaSynthesisMethod = value; + } + + public QuantityType getTemplateRNAQuantity() { + + return templateRNAQuantity; + } + + public void setTemplateRNAQuantity(QuantityType value) { + + this.templateRNAQuantity = value; + } + + public TemplateQualityType getTemplateRNAQuality() { + + return templateRNAQuality; + } + + public void setTemplateRNAQuality(TemplateQualityType value) { + + this.templateRNAQuality = value; + } + + public QuantityType getTemplateDNAQuantity() { + + return templateDNAQuantity; + } + + public void setTemplateDNAQuantity(QuantityType value) { + + this.templateDNAQuantity = value; + } + + public TemplateQualityType getTemplateDNAQuality() { + + return templateDNAQuality; + } + + public void setTemplateDNAQuality(TemplateQualityType value) { + + this.templateDNAQuality = value; + } + + public String getId() { + + return id; + } + + public void setId(String value) { + + this.id = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/SampleTypeType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/SampleTypeType.java new file mode 100644 index 0000000000..d701b37f14 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/SampleTypeType.java @@ -0,0 +1,60 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v11.model; + +import jakarta.xml.bind.annotation.XmlEnum; +import jakarta.xml.bind.annotation.XmlEnumValue; +import jakarta.xml.bind.annotation.XmlType; + +@XmlType(name = "sampleTypeType") +@XmlEnum +public enum SampleTypeType { + + @XmlEnumValue("unkn") + UNKN("unkn"), // + @XmlEnumValue("ntc") + NTC("ntc"), // + @XmlEnumValue("nac") + NAC("nac"), // + @XmlEnumValue("std") + STD("std"), // + @XmlEnumValue("ntp") + NTP("ntp"), // + @XmlEnumValue("nrt") + NRT("nrt"), // + @XmlEnumValue("pos") + POS("pos"), // + @XmlEnumValue("opt") + OPT("opt"); + + private final String value; + + SampleTypeType(String v) { + + value = v; + } + + public String value() { + + return value; + } + + public static SampleTypeType fromValue(String v) { + + for(SampleTypeType c : SampleTypeType.values()) { + if(c.value.equals(v)) { + return c; + } + } + throw new IllegalArgumentException(v); + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/SequencesType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/SequencesType.java new file mode 100644 index 0000000000..3762e1004f --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/SequencesType.java @@ -0,0 +1,77 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v11.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlType; + +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "sequencesType", propOrder = {"forwardPrimer", "reversePrimer", "probe1", "probe2", "amplicon"}) +public class SequencesType { + + protected OligoType forwardPrimer; + protected OligoType reversePrimer; + protected OligoType probe1; + protected OligoType probe2; + protected OligoType amplicon; + + public OligoType getForwardPrimer() { + + return forwardPrimer; + } + + public void setForwardPrimer(OligoType value) { + + this.forwardPrimer = value; + } + + public OligoType getReversePrimer() { + + return reversePrimer; + } + + public void setReversePrimer(OligoType value) { + + this.reversePrimer = value; + } + + public OligoType getProbe1() { + + return probe1; + } + + public void setProbe1(OligoType value) { + + this.probe1 = value; + } + + public OligoType getProbe2() { + + return probe2; + } + + public void setProbe2(OligoType value) { + + this.probe2 = value; + } + + public OligoType getAmplicon() { + + return amplicon; + } + + public void setAmplicon(OligoType value) { + + this.amplicon = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/StepType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/StepType.java new file mode 100644 index 0000000000..4c7e1a5bc3 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/StepType.java @@ -0,0 +1,105 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v11.model; + +import java.math.BigInteger; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlSchemaType; +import jakarta.xml.bind.annotation.XmlType; + +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "stepType", propOrder = {"nr", "description", "temperature", "gradient", "loop", "pause", "lidOpen"}) +public class StepType { + + @XmlElement(required = true) + @XmlSchemaType(name = "positiveInteger") + protected BigInteger nr; + protected String description; + protected TemperatureType temperature; + protected GradientType gradient; + protected LoopType loop; + protected PauseType pause; + protected LidOpenType lidOpen; + + public BigInteger getNr() { + + return nr; + } + + public void setNr(BigInteger value) { + + this.nr = value; + } + + public String getDescription() { + + return description; + } + + public void setDescription(String value) { + + this.description = value; + } + + public TemperatureType getTemperature() { + + return temperature; + } + + public void setTemperature(TemperatureType value) { + + this.temperature = value; + } + + public GradientType getGradient() { + + return gradient; + } + + public void setGradient(GradientType value) { + + this.gradient = value; + } + + public LoopType getLoop() { + + return loop; + } + + public void setLoop(LoopType value) { + + this.loop = value; + } + + public PauseType getPause() { + + return pause; + } + + public void setPause(PauseType value) { + + this.pause = value; + } + + public LidOpenType getLidOpen() { + + return lidOpen; + } + + public void setLidOpen(LidOpenType value) { + + this.lidOpen = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/TargetType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/TargetType.java new file mode 100644 index 0000000000..d00b670d94 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/TargetType.java @@ -0,0 +1,153 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v11.model; + +import java.util.ArrayList; +import java.util.List; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlSchemaType; +import jakarta.xml.bind.annotation.XmlType; + +/** + * A target is a defined PCR reaction. PCR reactions for the same gene + * which differ in primer sequences are considered different samples. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "targetType", propOrder = {"description", "documentation", "xRef", "type", "amplificationEfficiencyMethod", "amplificationEfficiency", "detectionLimit", "dyeId", "sequences", "commercialAssay"}) +public class TargetType { + + protected String description; + protected List documentation; + protected List xRef; + @XmlElement(required = true) + @XmlSchemaType(name = "string") + protected TargetTypeType type; + protected String amplificationEfficiencyMethod; + protected Float amplificationEfficiency; + protected Float detectionLimit; + @XmlElement(required = true) + protected IdReferencesType dyeId; + protected SequencesType sequences; + protected CommercialAssayType commercialAssay; + @XmlAttribute(name = "id", required = true) + protected String id; + + public String getDescription() { + + return description; + } + + public void setDescription(String value) { + + this.description = value; + } + + public List getDocumentation() { + + if(documentation == null) { + documentation = new ArrayList<>(); + } + return this.documentation; + } + + public List getXRef() { + + if(xRef == null) { + xRef = new ArrayList<>(); + } + return this.xRef; + } + + public TargetTypeType getType() { + + return type; + } + + public void setType(TargetTypeType value) { + + this.type = value; + } + + public String getAmplificationEfficiencyMethod() { + + return amplificationEfficiencyMethod; + } + + public void setAmplificationEfficiencyMethod(String value) { + + this.amplificationEfficiencyMethod = value; + } + + public Float getAmplificationEfficiency() { + + return amplificationEfficiency; + } + + public void setAmplificationEfficiency(Float value) { + + this.amplificationEfficiency = value; + } + + public Float getDetectionLimit() { + + return detectionLimit; + } + + public void setDetectionLimit(Float value) { + + this.detectionLimit = value; + } + + public IdReferencesType getDyeId() { + + return dyeId; + } + + public void setDyeId(IdReferencesType value) { + + this.dyeId = value; + } + + public SequencesType getSequences() { + + return sequences; + } + + public void setSequences(SequencesType value) { + + this.sequences = value; + } + + public CommercialAssayType getCommercialAssay() { + + return commercialAssay; + } + + public void setCommercialAssay(CommercialAssayType value) { + + this.commercialAssay = value; + } + + public String getId() { + + return id; + } + + public void setId(String value) { + + this.id = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/TargetTypeType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/TargetTypeType.java new file mode 100644 index 0000000000..19ae6a79e9 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/TargetTypeType.java @@ -0,0 +1,48 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v11.model; + +import jakarta.xml.bind.annotation.XmlEnum; +import jakarta.xml.bind.annotation.XmlEnumValue; +import jakarta.xml.bind.annotation.XmlType; + +@XmlType(name = "targetTypeType") +@XmlEnum +public enum TargetTypeType { + + @XmlEnumValue("ref") + REF("ref"), // + @XmlEnumValue("toi") + TOI("toi"); + + private final String value; + + TargetTypeType(String v) { + + value = v; + } + + public String value() { + + return value; + } + + public static TargetTypeType fromValue(String v) { + + for(TargetTypeType c : TargetTypeType.values()) { + if(c.value.equals(v)) { + return c; + } + } + throw new IllegalArgumentException(v); + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/TemperatureType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/TemperatureType.java new file mode 100644 index 0000000000..6446a867aa --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/TemperatureType.java @@ -0,0 +1,98 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v11.model; + +import java.math.BigInteger; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlSchemaType; +import jakarta.xml.bind.annotation.XmlType; + +/** + * This step keeps a constant temperature on the heat block. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "temperatureType", propOrder = {"temperature", "duration", "temperatureChange", "durationChange", "measure", "ramp"}) +public class TemperatureType { + + protected float temperature; + @XmlElement(required = true) + @XmlSchemaType(name = "positiveInteger") + protected BigInteger duration; + protected float temperatureChange; + protected int durationChange; + @XmlSchemaType(name = "string") + protected MeasureType measure; + protected float ramp; + + public float getTemperature() { + + return temperature; + } + + public void setTemperature(float value) { + + this.temperature = value; + } + + public BigInteger getDuration() { + + return duration; + } + + public void setDuration(BigInteger value) { + + this.duration = value; + } + + public float getTemperatureChange() { + + return temperatureChange; + } + + public void setTemperatureChange(float value) { + + this.temperatureChange = value; + } + + public Integer getDurationChange() { + + return durationChange; + } + + public void setDurationChange(int value) { + + this.durationChange = value; + } + + public MeasureType getMeasure() { + + return measure; + } + + public void setMeasure(MeasureType value) { + + this.measure = value; + } + + public float getRamp() { + + return ramp; + } + + public void setRamp(float value) { + + this.ramp = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/TemplateQualityType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/TemplateQualityType.java new file mode 100644 index 0000000000..1add1f832a --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/TemplateQualityType.java @@ -0,0 +1,46 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v11.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlType; + +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "templateQualityType", propOrder = {"method", "result"}) +public class TemplateQualityType { + + @XmlElement(required = true) + protected String method; + protected float result; + + public String getMethod() { + + return method; + } + + public void setMethod(String value) { + + this.method = value; + } + + public float getResult() { + + return result; + } + + public void setResult(float value) { + + this.result = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/ThermalCyclingConditionsType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/ThermalCyclingConditionsType.java new file mode 100644 index 0000000000..cbfd9f32c8 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/ThermalCyclingConditionsType.java @@ -0,0 +1,92 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v11.model; + +import java.util.ArrayList; +import java.util.List; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlType; + +/** + * A cycling program for PCR or to amplify cDNA. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "thermalCyclingConditionsType", propOrder = {"description", "documentation", "lidTemperature", "experimenter", "step"}) +public class ThermalCyclingConditionsType { + + protected String description; + protected List documentation; + protected Float lidTemperature; + protected List experimenter; + @XmlElement(required = true) + protected List step; + @XmlAttribute(name = "id", required = true) + protected String id; + + public String getDescription() { + + return description; + } + + public void setDescription(String value) { + + this.description = value; + } + + public List getDocumentation() { + + if(documentation == null) { + documentation = new ArrayList<>(); + } + return this.documentation; + } + + public Float getLidTemperature() { + + return lidTemperature; + } + + public void setLidTemperature(Float value) { + + this.lidTemperature = value; + } + + public List getExperimenter() { + + if(experimenter == null) { + experimenter = new ArrayList<>(); + } + return this.experimenter; + } + + public List getStep() { + + if(step == null) { + step = new ArrayList<>(); + } + return this.step; + } + + public String getId() { + + return id; + } + + public void setId(String value) { + + this.id = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/XRefType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/XRefType.java new file mode 100644 index 0000000000..650c3c1956 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v11/model/XRefType.java @@ -0,0 +1,44 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v11.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlType; + +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "xRefType", propOrder = {"name", "id"}) +public class XRefType { + + protected String name; + protected String id; + + public String getName() { + + return name; + } + + public void setName(String value) { + + this.name = value; + } + + public String getId() { + + return id; + } + + public void setId(String value) { + + this.id = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/AnnotationType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/AnnotationType.java new file mode 100644 index 0000000000..5cceebab8f --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/AnnotationType.java @@ -0,0 +1,51 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v12.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlType; + +/** + * These elements should be used to annotate samples by setting a + * property and a value. A property could be sex, the value M or F. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "annotationType", propOrder = {}) +public class AnnotationType { + + @XmlElement(required = true) + protected String property; + @XmlElement(required = true) + protected String value; + + public String getProperty() { + + return property; + } + + public void setProperty(String value) { + + this.property = value; + } + + public String getValue() { + + return value; + } + + public void setValue(String value) { + + this.value = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/CdnaSynthesisMethodType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/CdnaSynthesisMethodType.java new file mode 100644 index 0000000000..f410ff3f01 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/CdnaSynthesisMethodType.java @@ -0,0 +1,71 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v12.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlSchemaType; +import jakarta.xml.bind.annotation.XmlType; + +/** + * Description of the cDNA synthesis method. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "cdnaSynthesisMethodType", propOrder = {"enzyme", "primingMethod", "dnaseTreatment", "thermalCyclingConditions"}) +public class CdnaSynthesisMethodType { + + protected String enzyme; + @XmlSchemaType(name = "string") + protected PrimingMethodType primingMethod; + protected Boolean dnaseTreatment; + protected IdReferencesType thermalCyclingConditions; + + public String getEnzyme() { + + return enzyme; + } + + public void setEnzyme(String value) { + + this.enzyme = value; + } + + public PrimingMethodType getPrimingMethod() { + + return primingMethod; + } + + public void setPrimingMethod(PrimingMethodType value) { + + this.primingMethod = value; + } + + public Boolean isDnaseTreatment() { + + return dnaseTreatment; + } + + public void setDnaseTreatment(Boolean value) { + + this.dnaseTreatment = value; + } + + public IdReferencesType getThermalCyclingConditions() { + + return thermalCyclingConditions; + } + + public void setThermalCyclingConditions(IdReferencesType value) { + + this.thermalCyclingConditions = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/CommercialAssayType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/CommercialAssayType.java new file mode 100644 index 0000000000..8b6784a7a0 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/CommercialAssayType.java @@ -0,0 +1,51 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v12.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlType; + +/** + * For some commercial assays, the primer sequences may be unknown. This element + * allows to describe commercial assays. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "commercialAssayType", propOrder = {"company", "orderNumber"}) +public class CommercialAssayType { + + @XmlElement(required = true) + protected String company; + @XmlElement(required = true) + protected String orderNumber; + + public String getCompany() { + + return company; + } + + public void setCompany(String value) { + + this.company = value; + } + + public String getOrderNumber() { + + return orderNumber; + } + + public void setOrderNumber(String value) { + + this.orderNumber = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/CqDetectionMethodType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/CqDetectionMethodType.java new file mode 100644 index 0000000000..0b2ead46d2 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/CqDetectionMethodType.java @@ -0,0 +1,52 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v12.model; + +import jakarta.xml.bind.annotation.XmlEnum; +import jakarta.xml.bind.annotation.XmlEnumValue; +import jakarta.xml.bind.annotation.XmlType; + +@XmlType(name = "cqDetectionMethodType") +@XmlEnum +public enum CqDetectionMethodType { + + @XmlEnumValue("automated threshold and baseline settings") + AUTOMATED_THRESHOLD_AND_BASELINE_SETTINGS("automated threshold and baseline settings"), // + @XmlEnumValue("manual threshold and baseline settings") + MANUAL_THRESHOLD_AND_BASELINE_SETTINGS("manual threshold and baseline settings"), // + @XmlEnumValue("second derivative maximum") + SECOND_DERIVATIVE_MAXIMUM("second derivative maximum"), // + @XmlEnumValue("other") + OTHER("other"); + + private final String value; + + CqDetectionMethodType(String v) { + + value = v; + } + + public String value() { + + return value; + } + + public static CqDetectionMethodType fromValue(String v) { + + for(CqDetectionMethodType c : CqDetectionMethodType.values()) { + if(c.value.equals(v)) { + return c; + } + } + throw new IllegalArgumentException(v); + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/DataCollectionSoftwareType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/DataCollectionSoftwareType.java new file mode 100644 index 0000000000..60b0e725ee --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/DataCollectionSoftwareType.java @@ -0,0 +1,50 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v12.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlType; + +/** + * Software name and version used to collect and analyze the data. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "dataCollectionSoftwareType", propOrder = {"name", "version"}) +public class DataCollectionSoftwareType { + + @XmlElement(required = true) + protected String name; + @XmlElement(required = true) + protected String version; + + public String getName() { + + return name; + } + + public void setName(String value) { + + this.name = value; + } + + public String getVersion() { + + return version; + } + + public void setVersion(String value) { + + this.version = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/DataType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/DataType.java new file mode 100644 index 0000000000..4440c21d03 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/DataType.java @@ -0,0 +1,125 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v12.model; + +import java.util.ArrayList; +import java.util.List; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlType; + +/** + * Due to the frequent occurrence of this element, names are kept short. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "dataType", propOrder = {"tar", "cq", "excl", "adp", "mdp", "endPt", "bgFluor", "bgFluorSlp", "quantFluor"}) +public class DataType { + + @XmlElement(required = true) + protected IdReferencesType tar; + protected float cq; + protected String excl; + protected List adp; + protected List mdp; + protected float endPt; + protected float bgFluor; + protected float bgFluorSlp; + protected float quantFluor; + + public IdReferencesType getTar() { + + return tar; + } + + public void setTar(IdReferencesType value) { + + this.tar = value; + } + + public Float getCq() { + + return cq; + } + + public void setCq(Float value) { + + this.cq = value; + } + + public String getExcl() { + + return excl; + } + + public void setExcl(String value) { + + this.excl = value; + } + + public List getAdp() { + + if(adp == null) { + adp = new ArrayList<>(); + } + return this.adp; + } + + public List getMdp() { + + if(mdp == null) { + mdp = new ArrayList<>(); + } + return this.mdp; + } + + public float getEndPt() { + + return endPt; + } + + public void setEndPt(float value) { + + this.endPt = value; + } + + public float getBgFluor() { + + return bgFluor; + } + + public void setBgFluor(float value) { + + this.bgFluor = value; + } + + public float getBgFluorSlp() { + + return bgFluorSlp; + } + + public void setBgFluorSlp(float value) { + + this.bgFluorSlp = value; + } + + public float getQuantFluor() { + + return quantFluor; + } + + public void setQuantFluor(float value) { + + this.quantFluor = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/DocumentationType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/DocumentationType.java new file mode 100644 index 0000000000..291c61fe45 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/DocumentationType.java @@ -0,0 +1,50 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v12.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlType; + +/** + * These elements should be used if the same description applies to many samples, + * targets or experiments. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "documentationType", propOrder = {}) +public class DocumentationType { + + protected String text; + @XmlAttribute(name = "id", required = true) + protected String id; + + public String getText() { + + return text; + } + + public void setText(String value) { + + this.text = value; + } + + public String getId() { + + return id; + } + + public void setId(String value) { + + this.id = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/DpAmpCurveType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/DpAmpCurveType.java new file mode 100644 index 0000000000..7a037d8239 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/DpAmpCurveType.java @@ -0,0 +1,58 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v12.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlType; + +/** + * Due to the frequent occurrence of this element, names are kept short. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "dpAmpCurveType", propOrder = {"cyc", "tmp", "fluor"}) +public class DpAmpCurveType { + + protected float cyc; + protected float tmp; + protected float fluor; + + public float getCyc() { + + return cyc; + } + + public void setCyc(float value) { + + this.cyc = value; + } + + public float getTmp() { + + return tmp; + } + + public void setTmp(float value) { + + this.tmp = value; + } + + public float getFluor() { + + return fluor; + } + + public void setFluor(float value) { + + this.fluor = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/DpMeltingCurveType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/DpMeltingCurveType.java new file mode 100644 index 0000000000..efbddd11ad --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/DpMeltingCurveType.java @@ -0,0 +1,47 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v12.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlType; + +/** + * Due to the frequent occurrence of this element, names are kept short. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "dpMeltingCurveType", propOrder = {"tmp", "fluor"}) +public class DpMeltingCurveType { + + protected float tmp; + protected float fluor; + + public float getTmp() { + + return tmp; + } + + public void setTmp(float value) { + + this.tmp = value; + } + + public float getFluor() { + + return fluor; + } + + public void setFluor(float value) { + + this.fluor = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/DyeType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/DyeType.java new file mode 100644 index 0000000000..d070e93a0c --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/DyeType.java @@ -0,0 +1,49 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v12.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlType; + +/** + * Information on a dye. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "dyeType", propOrder = {"description"}) +public class DyeType { + + protected String description; + @XmlAttribute(name = "id", required = true) + protected String id; + + public String getDescription() { + + return description; + } + + public void setDescription(String value) { + + this.description = value; + } + + public String getId() { + + return id; + } + + public void setId(String value) { + + this.id = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/ExperimentType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/ExperimentType.java new file mode 100644 index 0000000000..84429b89cd --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/ExperimentType.java @@ -0,0 +1,70 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v12.model; + +import java.util.ArrayList; +import java.util.List; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlType; + +/** + * An experiment can contain several runs. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "experimentType", propOrder = {"description", "documentation", "run"}) +public class ExperimentType { + + protected String description; + protected List documentation; + protected List run; + @XmlAttribute(name = "id", required = true) + protected String id; + + public String getDescription() { + + return description; + } + + public void setDescription(String value) { + + this.description = value; + } + + public List getDocumentation() { + + if(documentation == null) { + documentation = new ArrayList<>(); + } + return this.documentation; + } + + public List getRun() { + + if(run == null) { + run = new ArrayList<>(); + } + return this.run; + } + + public String getId() { + + return id; + } + + public void setId(String value) { + + this.id = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/ExperimenterType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/ExperimenterType.java new file mode 100644 index 0000000000..1dd23259db --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/ExperimenterType.java @@ -0,0 +1,96 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v12.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlType; + +/** + * Contact details of the experimenter. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "experimenterType", propOrder = {"firstName", "lastName", "email", "labName", "labAddress"}) +public class ExperimenterType { + + @XmlElement(required = true) + protected String firstName; + @XmlElement(required = true) + protected String lastName; + protected String email; + protected String labName; + protected String labAddress; + @XmlAttribute(name = "id", required = true) + protected String id; + + public String getFirstName() { + + return firstName; + } + + public void setFirstName(String value) { + + this.firstName = value; + } + + public String getLastName() { + + return lastName; + } + + public void setLastName(String value) { + + this.lastName = value; + } + + public String getEmail() { + + return email; + } + + public void setEmail(String value) { + + this.email = value; + } + + public String getLabName() { + + return labName; + } + + public void setLabName(String value) { + + this.labName = value; + } + + public String getLabAddress() { + + return labAddress; + } + + public void setLabAddress(String value) { + + this.labAddress = value; + } + + public String getId() { + + return id; + } + + public void setId(String value) { + + this.id = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/GradientType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/GradientType.java new file mode 100644 index 0000000000..ca9dbb7ca4 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/GradientType.java @@ -0,0 +1,109 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v12.model; + +import java.math.BigInteger; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlSchemaType; +import jakarta.xml.bind.annotation.XmlType; + +/** + * This step forms a temperature gradient across the PCR block. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "gradientType", propOrder = {"highTemperature", "lowTemperature", "duration", "temperatureChange", "durationChange", "measure", "ramp"}) +public class GradientType { + + protected float highTemperature; + protected float lowTemperature; + @XmlElement(required = true) + @XmlSchemaType(name = "positiveInteger") + protected BigInteger duration; + protected Float temperatureChange; + protected Integer durationChange; + @XmlSchemaType(name = "string") + protected MeasureType measure; + protected Float ramp; + + public float getHighTemperature() { + + return highTemperature; + } + + public void setHighTemperature(float value) { + + this.highTemperature = value; + } + + public float getLowTemperature() { + + return lowTemperature; + } + + public void setLowTemperature(float value) { + + this.lowTemperature = value; + } + + public BigInteger getDuration() { + + return duration; + } + + public void setDuration(BigInteger value) { + + this.duration = value; + } + + public Float getTemperatureChange() { + + return temperatureChange; + } + + public void setTemperatureChange(Float value) { + + this.temperatureChange = value; + } + + public Integer getDurationChange() { + + return durationChange; + } + + public void setDurationChange(Integer value) { + + this.durationChange = value; + } + + public MeasureType getMeasure() { + + return measure; + } + + public void setMeasure(MeasureType value) { + + this.measure = value; + } + + public Float getRamp() { + + return ramp; + } + + public void setRamp(Float value) { + + this.ramp = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/IdReferencesType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/IdReferencesType.java new file mode 100644 index 0000000000..58b6e3696c --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/IdReferencesType.java @@ -0,0 +1,35 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v12.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlType; + +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "idReferencesType") +public class IdReferencesType { + + @XmlAttribute(name = "id", required = true) + protected String id; + + public String getId() { + + return id; + } + + public void setId(String value) { + + this.id = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/LidOpenType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/LidOpenType.java new file mode 100644 index 0000000000..3be0722d78 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/LidOpenType.java @@ -0,0 +1,27 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v12.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlType; + +/** + * This step waits for the user to open the lid and continues afterwards. It + * allows to stop the program and to wait for the user to add for example + * enzymes and continue the program afterwards. The temperature of the previous + * step is maintained. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "lidOpenType") +public class LidOpenType { +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/LoopType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/LoopType.java new file mode 100644 index 0000000000..d95cbcf2b3 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/LoopType.java @@ -0,0 +1,57 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v12.model; + +import java.math.BigInteger; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlSchemaType; +import jakarta.xml.bind.annotation.XmlType; + +/** + * This step allows to form a loop or to exclude some steps. It allows to + * jump to a certain "goto" step for "repeat" times. If the "goto" step is + * higher than the step of the loop, "repeat" must be "0". + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "loopType", propOrder = {"gotoStep", "repeat"}) +public class LoopType { + + @XmlElement(name = "goto", required = true) + @XmlSchemaType(name = "positiveInteger") + protected BigInteger gotoStep; + @XmlElement(required = true) + @XmlSchemaType(name = "positiveInteger") + protected BigInteger repeat; + + public BigInteger getGoto() { + + return gotoStep; + } + + public void setGoto(BigInteger value) { + + this.gotoStep = value; + } + + public BigInteger getRepeat() { + + return repeat; + } + + public void setRepeat(BigInteger value) { + + this.repeat = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/MeasureType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/MeasureType.java new file mode 100644 index 0000000000..af21ae5708 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/MeasureType.java @@ -0,0 +1,47 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v12.model; + +import jakarta.xml.bind.annotation.XmlEnum; +import jakarta.xml.bind.annotation.XmlEnumValue; +import jakarta.xml.bind.annotation.XmlType; + +@XmlType(name = "measureType") +@XmlEnum +public enum MeasureType { + + @XmlEnumValue("real time") + REAL_TIME("real time"), @XmlEnumValue("meltcurve") + MELTCURVE("meltcurve"); + + private final String value; + + MeasureType(String v) { + + value = v; + } + + public String value() { + + return value; + } + + public static MeasureType fromValue(String v) { + + for(MeasureType c : MeasureType.values()) { + if(c.value.equals(v)) { + return c; + } + } + throw new IllegalArgumentException(v); + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/NucleotideType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/NucleotideType.java new file mode 100644 index 0000000000..1024f9c0e2 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/NucleotideType.java @@ -0,0 +1,50 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v12.model; + +import jakarta.xml.bind.annotation.XmlEnum; +import jakarta.xml.bind.annotation.XmlEnumValue; +import jakarta.xml.bind.annotation.XmlType; + +@XmlType(name = "nucleotideType") +@XmlEnum +public enum NucleotideType { + + DNA("DNA"), // + @XmlEnumValue("genomic DNA") + GENOMIC_DNA("genomic DNA"), // + @XmlEnumValue("cDNA") + C_DNA("cDNA"), // + RNA("RNA"); + + private final String value; + + NucleotideType(String v) { + + value = v; + } + + public String value() { + + return value; + } + + public static NucleotideType fromValue(String v) { + + for(NucleotideType c : NucleotideType.values()) { + if(c.value.equals(v)) { + return c; + } + } + throw new IllegalArgumentException(v); + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/ObjectFactory.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/ObjectFactory.java new file mode 100644 index 0000000000..47f2af0f73 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/ObjectFactory.java @@ -0,0 +1,173 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v12.model; + +import jakarta.xml.bind.annotation.XmlRegistry; + +@XmlRegistry +public class ObjectFactory { + + public Rdml createRdml() { + + return new Rdml(); + } + + public RdmlIdType createRdmlIdType() { + + return new RdmlIdType(); + } + + public ExperimenterType createExperimenterType() { + + return new ExperimenterType(); + } + + public DocumentationType createDocumentationType() { + + return new DocumentationType(); + } + + public DyeType createDyeType() { + + return new DyeType(); + } + + public SampleType createSampleType() { + + return new SampleType(); + } + + public TargetType createTargetType() { + + return new TargetType(); + } + + public ThermalCyclingConditionsType createThermalCyclingConditionsType() { + + return new ThermalCyclingConditionsType(); + } + + public ExperimentType createExperimentType() { + + return new ExperimentType(); + } + + public QuantityType createQuantityType() { + + return new QuantityType(); + } + + public IdReferencesType createIdReferencesType() { + + return new IdReferencesType(); + } + + public TemperatureType createTemperatureType() { + + return new TemperatureType(); + } + + public StepType createStepType() { + + return new StepType(); + } + + public RunType createRunType() { + + return new RunType(); + } + + public OligoType createOligoType() { + + return new OligoType(); + } + + public LidOpenType createLidOpenType() { + + return new LidOpenType(); + } + + public GradientType createGradientType() { + + return new GradientType(); + } + + public DpMeltingCurveType createDpMeltingCurveType() { + + return new DpMeltingCurveType(); + } + + public ReactType createReactType() { + + return new ReactType(); + } + + public PauseType createPauseType() { + + return new PauseType(); + } + + public DataCollectionSoftwareType createDataCollectionSoftwareType() { + + return new DataCollectionSoftwareType(); + } + + public DataType createDataType() { + + return new DataType(); + } + + public AnnotationType createAnnotationType() { + + return new AnnotationType(); + } + + public CdnaSynthesisMethodType createCdnaSynthesisMethodType() { + + return new CdnaSynthesisMethodType(); + } + + public PcrFormatType createPcrFormatType() { + + return new PcrFormatType(); + } + + public DpAmpCurveType createDpAmpCurveType() { + + return new DpAmpCurveType(); + } + + public LoopType createLoopType() { + + return new LoopType(); + } + + public TemplateQuantityType createTemplateQuantityType() { + + return new TemplateQuantityType(); + } + + public CommercialAssayType createCommercialAssayType() { + + return new CommercialAssayType(); + } + + public SequencesType createSequencesType() { + + return new SequencesType(); + } + + public XRefType createXRefType() { + + return new XRefType(); + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/OligoType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/OligoType.java new file mode 100644 index 0000000000..32eaa02320 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/OligoType.java @@ -0,0 +1,57 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v12.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlType; + +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "oligoType", propOrder = {"threePrimeTag", "fivePrimeTag", "sequence"}) +public class OligoType { + + protected String threePrimeTag; + protected String fivePrimeTag; + @XmlElement(required = true) + protected String sequence; + + public String getThreePrimeTag() { + + return threePrimeTag; + } + + public void setThreePrimeTag(String value) { + + this.threePrimeTag = value; + } + + public String getFivePrimeTag() { + + return fivePrimeTag; + } + + public void setFivePrimeTag(String value) { + + this.fivePrimeTag = value; + } + + public String getSequence() { + + return sequence; + } + + public void setSequence(String value) { + + this.sequence = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/PauseType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/PauseType.java new file mode 100644 index 0000000000..fa75d6fb0a --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/PauseType.java @@ -0,0 +1,37 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v12.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlType; + +/** + * This step allows to pause at a certain temperature. It is typically the + * last step in an amplification protocol. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "pauseType", propOrder = {"temperature"}) +public class PauseType { + + protected float temperature; + + public float getTemperature() { + + return temperature; + } + + public void setTemperature(float value) { + + this.temperature = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/PcrFormatType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/PcrFormatType.java new file mode 100644 index 0000000000..1dbc149b69 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/PcrFormatType.java @@ -0,0 +1,98 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v12.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlType; + +/** + *
+ *        The format of the run - This allows the software to display the data
+ *        according to the qPCR instrument run format.
+ *        Rotor formats always have 1 column; rows correspond to the number
+ *        of places in the rotor.
+ *        
+ *        Values for common formats are:
+ *        
+ *        Format            |    rows    |   columns   |  rowLabel  | columnLabel
+ *        --------------------------------------------------------------------------
+ *        single-well       |     1      |      1      |    123     |     123
+ *        48-well plate     |     6      |      8      |    ABC     |     123
+ *        96-well plate     |     8      |     12      |    ABC     |     123
+ *        384-well plate    |    16      |     24      |    ABC     |     123
+ *        1536-well plate   |    32      |     48      |    ABC     |     123
+ *        3072-well array   |    32      |     96      |   A1a1     |    A1a1
+ *        5184-well chip    |    72      |     72      |    ABC     |     123
+ *        32-well rotor     |    32      |      1      |    123     |     123
+ *        72-well rotor     |    72      |      1      |    123     |     123
+ *        100-well rotor    |   100      |      1      |    123     |     123
+ *        free format       |    -1      |      1      |    123     |     123
+ *        
+ *        If rows are -1 then the software should not try to reconstruct a plate and 
+ *        just display all react data in list (1 column) form.
+ *        
+ *        If columns is 1 then the software should not display a column label.
+ * 
+ */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "pcrFormatType", propOrder = {"rows", "columns", "rowLabel", "columnLabel"}) +public class PcrFormatType { + + protected int rows; + protected int columns; + @XmlElement(required = true) + protected String rowLabel; + @XmlElement(required = true) + protected String columnLabel; + + public int getRows() { + + return rows; + } + + public void setRows(int value) { + + this.rows = value; + } + + public int getColumns() { + + return columns; + } + + public void setColumns(int value) { + + this.columns = value; + } + + public String getRowLabel() { + + return rowLabel; + } + + public void setRowLabel(String value) { + + this.rowLabel = value; + } + + public String getColumnLabel() { + + return columnLabel; + } + + public void setColumnLabel(String value) { + + this.columnLabel = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/PrimingMethodType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/PrimingMethodType.java new file mode 100644 index 0000000000..d0321fe7cf --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/PrimingMethodType.java @@ -0,0 +1,54 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v12.model; + +import jakarta.xml.bind.annotation.XmlEnum; +import jakarta.xml.bind.annotation.XmlEnumValue; +import jakarta.xml.bind.annotation.XmlType; + +@XmlType(name = "primingMethodType") +@XmlEnum +public enum PrimingMethodType { + + @XmlEnumValue("oligo-dt") + OLIGO_DT("oligo-dt"), // + @XmlEnumValue("random") + RANDOM("random"), // + @XmlEnumValue("target-specific") + TARGET_SPECIFIC("target-specific"), // + @XmlEnumValue("oligo-dt and random") + OLIGO_DT_AND_RANDOM("oligo-dt and random"), // + @XmlEnumValue("other") + OTHER("other"); + + private final String value; + + PrimingMethodType(String v) { + + value = v; + } + + public String value() { + + return value; + } + + public static PrimingMethodType fromValue(String v) { + + for(PrimingMethodType c : PrimingMethodType.values()) { + if(c.value.equals(v)) { + return c; + } + } + throw new IllegalArgumentException(v); + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/QuantityType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/QuantityType.java new file mode 100644 index 0000000000..79afd2f94a --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/QuantityType.java @@ -0,0 +1,51 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v12.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlSchemaType; +import jakarta.xml.bind.annotation.XmlType; + +/** + * A quantity is always defined by its value and its unit. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "quantityType", propOrder = {"value", "unit"}) +public class QuantityType { + + protected float value; + @XmlElement(required = true) + @XmlSchemaType(name = "string") + protected QuantityUnitType unit; + + public float getValue() { + + return value; + } + + public void setValue(float value) { + + this.value = value; + } + + public QuantityUnitType getUnit() { + + return unit; + } + + public void setUnit(QuantityUnitType value) { + + this.unit = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/QuantityUnitType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/QuantityUnitType.java new file mode 100644 index 0000000000..f390b193b9 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/QuantityUnitType.java @@ -0,0 +1,56 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v12.model; + +import jakarta.xml.bind.annotation.XmlEnum; +import jakarta.xml.bind.annotation.XmlEnumValue; +import jakarta.xml.bind.annotation.XmlType; + +@XmlType(name = "quantityUnitType") +@XmlEnum +public enum QuantityUnitType { + + @XmlEnumValue("cop") + COP("cop"), // + @XmlEnumValue("fold") + FOLD("fold"), // + @XmlEnumValue("dil") + DIL("dil"), // + @XmlEnumValue("ng") + NG("ng"), // + @XmlEnumValue("nMol") + N_MOL("nMol"), // + @XmlEnumValue("other") + OTHER("other"); + + private final String value; + + QuantityUnitType(String v) { + + value = v; + } + + public String value() { + + return value; + } + + public static QuantityUnitType fromValue(String v) { + + for(QuantityUnitType c : QuantityUnitType.values()) { + if(c.value.equals(v)) { + return c; + } + } + throw new IllegalArgumentException(v); + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/Rdml.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/Rdml.java new file mode 100644 index 0000000000..5826cbf77b --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/Rdml.java @@ -0,0 +1,143 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v12.model; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.datatype.XMLGregorianCalendar; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlSchemaType; +import jakarta.xml.bind.annotation.XmlType; + +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = {"dateMade", "dateUpdated", "id", "experimenter", "documentation", "dye", "sample", "target", "thermalCyclingConditions", "experiment"}) +@XmlRootElement(name = "rdml") +public class Rdml { + + @XmlSchemaType(name = "dateTime") + protected XMLGregorianCalendar dateMade; + @XmlSchemaType(name = "dateTime") + protected XMLGregorianCalendar dateUpdated; + protected List id; + protected List experimenter; + protected List documentation; + protected List dye; + protected List sample; + protected List target; + protected List thermalCyclingConditions; + protected List experiment; + @XmlAttribute(name = "version", required = true) + protected String version; + + public XMLGregorianCalendar getDateMade() { + + return dateMade; + } + + public void setDateMade(XMLGregorianCalendar value) { + + this.dateMade = value; + } + + public XMLGregorianCalendar getDateUpdated() { + + return dateUpdated; + } + + public void setDateUpdated(XMLGregorianCalendar value) { + + this.dateUpdated = value; + } + + public List getId() { + + if(id == null) { + id = new ArrayList<>(); + } + return this.id; + } + + public List getExperimenter() { + + if(experimenter == null) { + experimenter = new ArrayList<>(); + } + return this.experimenter; + } + + public List getDocumentation() { + + if(documentation == null) { + documentation = new ArrayList(); + } + return this.documentation; + } + + public List getDye() { + + if(dye == null) { + dye = new ArrayList<>(); + } + return this.dye; + } + + public List getSample() { + + if(sample == null) { + sample = new ArrayList<>(); + } + return this.sample; + } + + public List getTarget() { + + if(target == null) { + target = new ArrayList<>(); + } + return this.target; + } + + public List getThermalCyclingConditions() { + + if(thermalCyclingConditions == null) { + thermalCyclingConditions = new ArrayList<>(); + } + return this.thermalCyclingConditions; + } + + public List getExperiment() { + + if(experiment == null) { + experiment = new ArrayList<>(); + } + return this.experiment; + } + + public String getVersion() { + + if(version == null) { + return "1.2"; + } else { + return version; + } + } + + public void setVersion(String value) { + + this.version = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/RdmlIdType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/RdmlIdType.java new file mode 100644 index 0000000000..a79aee9468 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/RdmlIdType.java @@ -0,0 +1,62 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v12.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlType; + +/** + * This element can be used to assign a publisher and id to the RDML file. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "rdmlIdType", propOrder = {"publisher", "serialNumber", "md5Hash"}) +public class RdmlIdType { + + @XmlElement(required = true) + protected String publisher; + @XmlElement(required = true) + protected String serialNumber; + @XmlElement(name = "MD5Hash") + protected String md5Hash; + + public String getPublisher() { + + return publisher; + } + + public void setPublisher(String value) { + + this.publisher = value; + } + + public String getSerialNumber() { + + return serialNumber; + } + + public void setSerialNumber(String value) { + + this.serialNumber = value; + } + + public String getMD5Hash() { + + return md5Hash; + } + + public void setMD5Hash(String value) { + + this.md5Hash = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/ReactType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/ReactType.java new file mode 100644 index 0000000000..b7937acd12 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/ReactType.java @@ -0,0 +1,69 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v12.model; + +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.List; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlSchemaType; +import jakarta.xml.bind.annotation.XmlType; + +/** + * A reaction is an independent chemical reaction corresponding for example + * to a well in a 96 well plate, a capillary in a rotor, a through-hole on + * an array, etc. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "reactType", propOrder = {"sample", "data"}) +public class ReactType { + + @XmlElement(required = true) + protected IdReferencesType sample; + @XmlElement(required = true) + protected List data; + @XmlAttribute(name = "id", required = true) + @XmlSchemaType(name = "positiveInteger") + protected BigInteger id; + + public IdReferencesType getSample() { + + return sample; + } + + public void setSample(IdReferencesType value) { + + this.sample = value; + } + + public List getData() { + + if(data == null) { + data = new ArrayList<>(); + } + return this.data; + } + + public BigInteger getId() { + + return id; + } + + public void setId(BigInteger value) { + + this.id = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/RunType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/RunType.java new file mode 100644 index 0000000000..c2595cdec3 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/RunType.java @@ -0,0 +1,164 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v12.model; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.datatype.XMLGregorianCalendar; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlSchemaType; +import jakarta.xml.bind.annotation.XmlType; + +/** + * A run is a set of reactions performed in one "run", for example + * one plate, one rotor, one array, one chip. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "runType", propOrder = {"description", "documentation", "experimenter", "instrument", "dataCollectionSoftware", "backgroundDeterminationMethod", "cqDetectionMethod", "thermalCyclingConditions", "pcrFormat", "runDate", "react"}) +public class RunType { + + protected String description; + protected List documentation; + protected List experimenter; + protected String instrument; + protected DataCollectionSoftwareType dataCollectionSoftware; + protected String backgroundDeterminationMethod; + @XmlSchemaType(name = "string") + protected CqDetectionMethodType cqDetectionMethod; + protected IdReferencesType thermalCyclingConditions; + @XmlElement(required = true) + protected PcrFormatType pcrFormat; + @XmlSchemaType(name = "dateTime") + protected XMLGregorianCalendar runDate; + protected List react; + @XmlAttribute(name = "id", required = true) + protected String id; + + public String getDescription() { + + return description; + } + + public void setDescription(String value) { + + this.description = value; + } + + public List getDocumentation() { + + if(documentation == null) { + documentation = new ArrayList<>(); + } + return this.documentation; + } + + public List getExperimenter() { + + if(experimenter == null) { + experimenter = new ArrayList<>(); + } + return this.experimenter; + } + + public String getInstrument() { + + return instrument; + } + + public void setInstrument(String value) { + + this.instrument = value; + } + + public DataCollectionSoftwareType getDataCollectionSoftware() { + + return dataCollectionSoftware; + } + + public void setDataCollectionSoftware(DataCollectionSoftwareType value) { + + this.dataCollectionSoftware = value; + } + + public String getBackgroundDeterminationMethod() { + + return backgroundDeterminationMethod; + } + + public void setBackgroundDeterminationMethod(String value) { + + this.backgroundDeterminationMethod = value; + } + + public CqDetectionMethodType getCqDetectionMethod() { + + return cqDetectionMethod; + } + + public void setCqDetectionMethod(CqDetectionMethodType value) { + + this.cqDetectionMethod = value; + } + + public IdReferencesType getThermalCyclingConditions() { + + return thermalCyclingConditions; + } + + public void setThermalCyclingConditions(IdReferencesType value) { + + this.thermalCyclingConditions = value; + } + + public PcrFormatType getPcrFormat() { + + return pcrFormat; + } + + public void setPcrFormat(PcrFormatType value) { + + this.pcrFormat = value; + } + + public XMLGregorianCalendar getRunDate() { + + return runDate; + } + + public void setRunDate(XMLGregorianCalendar value) { + + this.runDate = value; + } + + public List getReact() { + + if(react == null) { + react = new ArrayList<>(); + } + return this.react; + } + + public String getId() { + + return id; + } + + public void setId(String value) { + + this.id = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/SampleType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/SampleType.java new file mode 100644 index 0000000000..af38d65172 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/SampleType.java @@ -0,0 +1,157 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v12.model; + +import java.util.ArrayList; +import java.util.List; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlSchemaType; +import jakarta.xml.bind.annotation.XmlType; + +/** + * A sample is a defined template solution. Dilutions of the same + * material differ in concentration and are considered different samples. + * A technical replicate samples should contain the same name (reactions + * are performed on the same material), and biological replicates should + * contain different names (the nucleic acids derived from the different + * biological replicates are not the same). Serial dilutions in a standard + * curve must have a different name. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "sampleType", propOrder = {"description", "documentation", "xRef", "annotation", "type", "interRunCalibrator", "quantity", "calibratorSample", "cdnaSynthesisMethod", "templateQuantity"}) +public class SampleType { + + protected String description; + protected List documentation; + protected List xRef; + protected List annotation; + @XmlElement(required = true, defaultValue = "unkn") + @XmlSchemaType(name = "string") + protected SampleTypeType type; + @XmlElement(defaultValue = "false") + protected Boolean interRunCalibrator; + protected QuantityType quantity; + @XmlElement(defaultValue = "false") + protected Boolean calibratorSample; + protected CdnaSynthesisMethodType cdnaSynthesisMethod; + protected TemplateQuantityType templateQuantity; + @XmlAttribute(name = "id", required = true) + protected String id; + + public String getDescription() { + + return description; + } + + public void setDescription(String value) { + + this.description = value; + } + + public List getDocumentation() { + + if(documentation == null) { + documentation = new ArrayList<>(); + } + return this.documentation; + } + + public List getXRef() { + + if(xRef == null) { + xRef = new ArrayList<>(); + } + return this.xRef; + } + + public List getAnnotation() { + + if(annotation == null) { + annotation = new ArrayList<>(); + } + return this.annotation; + } + + public SampleTypeType getType() { + + return type; + } + + public void setType(SampleTypeType value) { + + this.type = value; + } + + public Boolean isInterRunCalibrator() { + + return interRunCalibrator; + } + + public void setInterRunCalibrator(Boolean value) { + + this.interRunCalibrator = value; + } + + public QuantityType getQuantity() { + + return quantity; + } + + public void setQuantity(QuantityType value) { + + this.quantity = value; + } + + public Boolean isCalibratorSample() { + + return calibratorSample; + } + + public void setCalibratorSample(Boolean value) { + + this.calibratorSample = value; + } + + public CdnaSynthesisMethodType getCdnaSynthesisMethod() { + + return cdnaSynthesisMethod; + } + + public void setCdnaSynthesisMethod(CdnaSynthesisMethodType value) { + + this.cdnaSynthesisMethod = value; + } + + public TemplateQuantityType getTemplateQuantity() { + + return templateQuantity; + } + + public void setTemplateQuantity(TemplateQuantityType value) { + + this.templateQuantity = value; + } + + public String getId() { + + return id; + } + + public void setId(String value) { + + this.id = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/SampleTypeType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/SampleTypeType.java new file mode 100644 index 0000000000..7c4ef3d02d --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/SampleTypeType.java @@ -0,0 +1,60 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v12.model; + +import jakarta.xml.bind.annotation.XmlEnum; +import jakarta.xml.bind.annotation.XmlEnumValue; +import jakarta.xml.bind.annotation.XmlType; + +@XmlType(name = "sampleTypeType") +@XmlEnum +public enum SampleTypeType { + + @XmlEnumValue("unkn") + UNKN("unkn"), // + @XmlEnumValue("ntc") + NTC("ntc"), // + @XmlEnumValue("nac") + NAC("nac"), // + @XmlEnumValue("std") + STD("std"), // + @XmlEnumValue("ntp") + NTP("ntp"), // + @XmlEnumValue("nrt") + NRT("nrt"), // + @XmlEnumValue("pos") + POS("pos"), // + @XmlEnumValue("opt") + OPT("opt"); // + + private final String value; + + SampleTypeType(String v) { + + value = v; + } + + public String value() { + + return value; + } + + public static SampleTypeType fromValue(String v) { + + for(SampleTypeType c : SampleTypeType.values()) { + if(c.value.equals(v)) { + return c; + } + } + throw new IllegalArgumentException(v); + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/SequencesType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/SequencesType.java new file mode 100644 index 0000000000..396acbccd3 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/SequencesType.java @@ -0,0 +1,77 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v12.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlType; + +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "sequencesType", propOrder = {"forwardPrimer", "reversePrimer", "probe1", "probe2", "amplicon"}) +public class SequencesType { + + protected OligoType forwardPrimer; + protected OligoType reversePrimer; + protected OligoType probe1; + protected OligoType probe2; + protected OligoType amplicon; + + public OligoType getForwardPrimer() { + + return forwardPrimer; + } + + public void setForwardPrimer(OligoType value) { + + this.forwardPrimer = value; + } + + public OligoType getReversePrimer() { + + return reversePrimer; + } + + public void setReversePrimer(OligoType value) { + + this.reversePrimer = value; + } + + public OligoType getProbe1() { + + return probe1; + } + + public void setProbe1(OligoType value) { + + this.probe1 = value; + } + + public OligoType getProbe2() { + + return probe2; + } + + public void setProbe2(OligoType value) { + + this.probe2 = value; + } + + public OligoType getAmplicon() { + + return amplicon; + } + + public void setAmplicon(OligoType value) { + + this.amplicon = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/StepType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/StepType.java new file mode 100644 index 0000000000..ecf9674f54 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/StepType.java @@ -0,0 +1,105 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v12.model; + +import java.math.BigInteger; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlSchemaType; +import jakarta.xml.bind.annotation.XmlType; + +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "stepType", propOrder = {"nr", "description", "temperature", "gradient", "loop", "pause", "lidOpen"}) +public class StepType { + + @XmlElement(required = true) + @XmlSchemaType(name = "positiveInteger") + protected BigInteger nr; + protected String description; + protected TemperatureType temperature; + protected GradientType gradient; + protected LoopType loop; + protected PauseType pause; + protected LidOpenType lidOpen; + + public BigInteger getNr() { + + return nr; + } + + public void setNr(BigInteger value) { + + this.nr = value; + } + + public String getDescription() { + + return description; + } + + public void setDescription(String value) { + + this.description = value; + } + + public TemperatureType getTemperature() { + + return temperature; + } + + public void setTemperature(TemperatureType value) { + + this.temperature = value; + } + + public GradientType getGradient() { + + return gradient; + } + + public void setGradient(GradientType value) { + + this.gradient = value; + } + + public LoopType getLoop() { + + return loop; + } + + public void setLoop(LoopType value) { + + this.loop = value; + } + + public PauseType getPause() { + + return pause; + } + + public void setPause(PauseType value) { + + this.pause = value; + } + + public LidOpenType getLidOpen() { + + return lidOpen; + } + + public void setLidOpen(LidOpenType value) { + + this.lidOpen = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/TargetType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/TargetType.java new file mode 100644 index 0000000000..1abbb8762e --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/TargetType.java @@ -0,0 +1,164 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v12.model; + +import java.util.ArrayList; +import java.util.List; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlSchemaType; +import jakarta.xml.bind.annotation.XmlType; + +/** + * A target is a defined PCR reaction. PCR reactions for the same gene + * which differ in primer sequences are considered different targets. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "targetType", propOrder = {"description", "documentation", "xRef", "type", "amplificationEfficiencyMethod", "amplificationEfficiency", "amplificationEfficiencySE", "detectionLimit", "dyeId", "sequences", "commercialAssay"}) +public class TargetType { + + protected String description; + protected List documentation; + protected List xRef; + @XmlElement(required = true) + @XmlSchemaType(name = "string") + protected TargetTypeType type; + protected String amplificationEfficiencyMethod; + protected Float amplificationEfficiency; + protected Float amplificationEfficiencySE; + protected Float detectionLimit; + @XmlElement(required = true) + protected IdReferencesType dyeId; + protected SequencesType sequences; + protected CommercialAssayType commercialAssay; + @XmlAttribute(name = "id", required = true) + protected String id; + + public String getDescription() { + + return description; + } + + public void setDescription(String value) { + + this.description = value; + } + + public List getDocumentation() { + + if(documentation == null) { + documentation = new ArrayList<>(); + } + return this.documentation; + } + + public List getXRef() { + + if(xRef == null) { + xRef = new ArrayList<>(); + } + return this.xRef; + } + + public TargetTypeType getType() { + + return type; + } + + public void setType(TargetTypeType value) { + + this.type = value; + } + + public String getAmplificationEfficiencyMethod() { + + return amplificationEfficiencyMethod; + } + + public void setAmplificationEfficiencyMethod(String value) { + + this.amplificationEfficiencyMethod = value; + } + + public Float getAmplificationEfficiency() { + + return amplificationEfficiency; + } + + public void setAmplificationEfficiency(Float value) { + + this.amplificationEfficiency = value; + } + + public Float getAmplificationEfficiencySE() { + + return amplificationEfficiencySE; + } + + public void setAmplificationEfficiencySE(Float value) { + + this.amplificationEfficiencySE = value; + } + + public Float getDetectionLimit() { + + return detectionLimit; + } + + public void setDetectionLimit(Float value) { + + this.detectionLimit = value; + } + + public IdReferencesType getDyeId() { + + return dyeId; + } + + public void setDyeId(IdReferencesType value) { + + this.dyeId = value; + } + + public SequencesType getSequences() { + + return sequences; + } + + public void setSequences(SequencesType value) { + + this.sequences = value; + } + + public CommercialAssayType getCommercialAssay() { + + return commercialAssay; + } + + public void setCommercialAssay(CommercialAssayType value) { + + this.commercialAssay = value; + } + + public String getId() { + + return id; + } + + public void setId(String value) { + + this.id = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/TargetTypeType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/TargetTypeType.java new file mode 100644 index 0000000000..ebb89b42a9 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/TargetTypeType.java @@ -0,0 +1,48 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v12.model; + +import jakarta.xml.bind.annotation.XmlEnum; +import jakarta.xml.bind.annotation.XmlEnumValue; +import jakarta.xml.bind.annotation.XmlType; + +@XmlType(name = "targetTypeType") +@XmlEnum +public enum TargetTypeType { + + @XmlEnumValue("ref") + REF("ref"), // + @XmlEnumValue("toi") + TOI("toi"); + + private final String value; + + TargetTypeType(String v) { + + value = v; + } + + public String value() { + + return value; + } + + public static TargetTypeType fromValue(String v) { + + for(TargetTypeType c : TargetTypeType.values()) { + if(c.value.equals(v)) { + return c; + } + } + throw new IllegalArgumentException(v); + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/TemperatureType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/TemperatureType.java new file mode 100644 index 0000000000..5afdfed3e8 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/TemperatureType.java @@ -0,0 +1,98 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v12.model; + +import java.math.BigInteger; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlSchemaType; +import jakarta.xml.bind.annotation.XmlType; + +/** + * This step keeps a constant temperature on the heat block. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "temperatureType", propOrder = {"temperature", "duration", "temperatureChange", "durationChange", "measure", "ramp"}) +public class TemperatureType { + + protected float temperature; + @XmlElement(required = true) + @XmlSchemaType(name = "positiveInteger") + protected BigInteger duration; + protected float temperatureChange; + protected int durationChange; + @XmlSchemaType(name = "string") + protected MeasureType measure; + protected float ramp; + + public float getTemperature() { + + return temperature; + } + + public void setTemperature(float value) { + + this.temperature = value; + } + + public BigInteger getDuration() { + + return duration; + } + + public void setDuration(BigInteger value) { + + this.duration = value; + } + + public float getTemperatureChange() { + + return temperatureChange; + } + + public void setTemperatureChange(float value) { + + this.temperatureChange = value; + } + + public int getDurationChange() { + + return durationChange; + } + + public void setDurationChange(int value) { + + this.durationChange = value; + } + + public MeasureType getMeasure() { + + return measure; + } + + public void setMeasure(MeasureType value) { + + this.measure = value; + } + + public float getRamp() { + + return ramp; + } + + public void setRamp(float value) { + + this.ramp = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/TemplateQuantityType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/TemplateQuantityType.java new file mode 100644 index 0000000000..2655c70691 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/TemplateQuantityType.java @@ -0,0 +1,48 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v12.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlSchemaType; +import jakarta.xml.bind.annotation.XmlType; + +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "templateQuantityType", propOrder = {"conc", "nucleotide"}) +public class TemplateQuantityType { + + protected float conc; + @XmlElement(required = true) + @XmlSchemaType(name = "string") + protected NucleotideType nucleotide; + + public float getConc() { + + return conc; + } + + public void setConc(float value) { + + this.conc = value; + } + + public NucleotideType getNucleotide() { + + return nucleotide; + } + + public void setNucleotide(NucleotideType value) { + + this.nucleotide = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/ThermalCyclingConditionsType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/ThermalCyclingConditionsType.java new file mode 100644 index 0000000000..94d277b3b6 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/ThermalCyclingConditionsType.java @@ -0,0 +1,92 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v12.model; + +import java.util.ArrayList; +import java.util.List; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlType; + +/** + * A cycling program for PCR or to amplify cDNA. + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "thermalCyclingConditionsType", propOrder = {"description", "documentation", "lidTemperature", "experimenter", "step"}) +public class ThermalCyclingConditionsType { + + protected String description; + protected List documentation; + protected Float lidTemperature; + protected List experimenter; + @XmlElement(required = true) + protected List step; + @XmlAttribute(name = "id", required = true) + protected String id; + + public String getDescription() { + + return description; + } + + public void setDescription(String value) { + + this.description = value; + } + + public List getDocumentation() { + + if(documentation == null) { + documentation = new ArrayList<>(); + } + return this.documentation; + } + + public Float getLidTemperature() { + + return lidTemperature; + } + + public void setLidTemperature(Float value) { + + this.lidTemperature = value; + } + + public List getExperimenter() { + + if(experimenter == null) { + experimenter = new ArrayList<>(); + } + return this.experimenter; + } + + public List getStep() { + + if(step == null) { + step = new ArrayList<>(); + } + return this.step; + } + + public String getId() { + + return id; + } + + public void setId(String value) { + + this.id = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/XRefType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/XRefType.java new file mode 100644 index 0000000000..9631021235 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v12/model/XRefType.java @@ -0,0 +1,44 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v12.model; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlType; + +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "xRefType", propOrder = {"name", "id"}) +public class XRefType { + + protected String name; + protected String id; + + public String getName() { + + return name; + } + + public void setName(String value) { + + this.name = value; + } + + public String getId() { + + return id; + } + + public void setId(String value) { + + this.id = value; + } +} diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v13/model/PcrFormatType.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v13/model/PcrFormatType.java index 96f0517e62..3ba853c3a0 100644 --- a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v13/model/PcrFormatType.java +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/internal/v13/model/PcrFormatType.java @@ -17,34 +17,33 @@ import jakarta.xml.bind.annotation.XmlType; /** - * - * The format of the run - This allows the software to display the data - * according to the qPCR instrument run format. - * Rotor formats always have 1 column; rows correspond to the number - * of places in the rotor. - * - * Values for common formats are: - * - * Format | rows | columns | rowLabel | columnLabel - * ------------------------------------------------- - * single-well | 1 | 1 | 123 | 123 - * 48-well plate | 6 | 8 | ABC | 123 - * 96-well plate | 8 | 12 | ABC | 123 - * 384-well plate | 16 | 24 | ABC | 123 - * 1536-well plate | 32 | 48 | ABC | 123 - * 3072-well array | 32 | 96 | A1a1 | A1a1 - * 5184-well chip | 72 | 72 | ABC | 123 - * 32-well rotor | 32 | 1 | 123 | 123 - * 72-well rotor | 72 | 1 | 123 | 123 - * 100-well rotor | 100 | 1 | 123 | 123 - * free format | -1 | 1 | 123 | 123 - * - * If rows are -1 then the software should not try to reconstruct a plate and - * just display all react data in list (1 column) form. - * - * If columns is 1 then the software should not display a column label. - * - * + *
+ *        The format of the run - This allows the software to display the data
+ *        according to the qPCR instrument run format.
+ *        Rotor formats always have 1 column; rows correspond to the number
+ *        of places in the rotor.
+ *        
+ *        Values for common formats are:
+ *        
+ *        Format            |    rows    |   columns   |  rowLabel  | columnLabel
+ *        --------------------------------------------------------------------------
+ *        single-well       |     1      |      1      |    123     |     123
+ *        48-well plate     |     6      |      8      |    ABC     |     123
+ *        96-well plate     |     8      |     12      |    ABC     |     123
+ *        384-well plate    |    16      |     24      |    ABC     |     123
+ *        1536-well plate   |    32      |     48      |    ABC     |     123
+ *        3072-well array   |    32      |     96      |   A1a1     |    A1a1
+ *        5184-well chip    |    72      |     72      |    ABC     |     123
+ *        32-well rotor     |    32      |      1      |    123     |     123
+ *        72-well rotor     |    72      |      1      |    123     |     123
+ *        100-well rotor    |   100      |      1      |    123     |     123
+ *        free format       |    -1      |      1      |    123     |     123
+ *        
+ *        If rows are -1 then the software should not try to reconstruct a plate and 
+ *        just display all react data in list (1 column) form.
+ *        
+ *        If columns is 1 then the software should not display a column label.
+ * 
*/ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "pcrFormatType", propOrder = {"rows", "columns", "rowLabel", "columnLabel"}) diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/io/PCRReader.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/io/PCRReader.java index c32740425d..4fdd0e460e 100644 --- a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/io/PCRReader.java +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/io/PCRReader.java @@ -11,156 +11,60 @@ *******************************************************************************/ package org.eclipse.chemclipse.pcr.converter.supplier.rdml.io; +import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; import java.security.InvalidParameterException; import java.util.Enumeration; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; -import javax.xml.datatype.XMLGregorianCalendar; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; -import org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v13.model.DataType; -import org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v13.model.DpAmpCurveType; -import org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v13.model.DyeType; -import org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v13.model.ExperimentType; -import org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v13.model.IdReferencesType; -import org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v13.model.ObjectFactory; -import org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v13.model.PcrFormatType; -import org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v13.model.Rdml; -import org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v13.model.ReactType; -import org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v13.model.RunType; -import org.eclipse.chemclipse.pcr.converter.supplier.rdml.model.IVendorPlate; -import org.eclipse.chemclipse.pcr.converter.supplier.rdml.model.VendorPlate; -import org.eclipse.chemclipse.pcr.converter.support.AmplificationAnalysis; -import org.eclipse.chemclipse.pcr.model.core.Channel; -import org.eclipse.chemclipse.pcr.model.core.ChannelSpecification; -import org.eclipse.chemclipse.pcr.model.core.DetectionFormat; -import org.eclipse.chemclipse.pcr.model.core.IChannelSpecification; +import org.eclipse.chemclipse.pcr.converter.supplier.rdml.model.IPCRReader; import org.eclipse.chemclipse.pcr.model.core.IPlate; -import org.eclipse.chemclipse.pcr.model.core.IWell; -import org.eclipse.chemclipse.pcr.model.core.Position; -import org.eclipse.chemclipse.pcr.model.core.Well; -import org.w3c.dom.Document; -import org.w3c.dom.NodeList; +import org.eclipse.chemclipse.xxd.converter.supplier.io.exception.UnknownVersionException; import org.xml.sax.SAXException; -import jakarta.xml.bind.JAXBContext; import jakarta.xml.bind.JAXBException; -import jakarta.xml.bind.Unmarshaller; public class PCRReader { public IPlate read(File file) throws IOException, SAXException, JAXBException, ParserConfigurationException, InvalidParameterException { - IPlate plate = null; try (ZipFile zipFile = new ZipFile(file)) { Enumeration zipEntries = zipFile.entries(); while(zipEntries.hasMoreElements()) { ZipEntry zipEntry = zipEntries.nextElement(); if(!zipEntry.isDirectory()) { if(zipEntry.getName().equals("rdml_data.xml")) { - plate = readData(zipFile.getInputStream(zipEntry)); - break; + IPCRReader reader = chooseReader(zipFile.getInputStream(zipEntry)); + return reader.readData(zipFile.getInputStream(zipEntry)); } } } } - return plate; + return null; } - private IPlate readData(InputStream inputStream) throws SAXException, IOException, JAXBException, ParserConfigurationException, InvalidParameterException { + private IPCRReader chooseReader(InputStream inputStream) throws IOException { - IVendorPlate vendorPlate = new VendorPlate(); - Rdml rdml = getRDML(inputStream); - setDate(vendorPlate, rdml); - setDefaultDetectionFormat(vendorPlate); - readExperiment(vendorPlate, rdml); - AmplificationAnalysis.calculateCrossingPoints(vendorPlate); - return vendorPlate; - } - - private static Rdml getRDML(InputStream inputStream) throws SAXException, IOException, JAXBException, ParserConfigurationException { - - DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); - DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); - Document document = documentBuilder.parse(inputStream); - NodeList topNode = document.getElementsByTagName("rdml"); + IPCRReader pcrReader = null; // - JAXBContext jaxbContext = JAXBContext.newInstance(ObjectFactory.class); - Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); - return (Rdml)unmarshaller.unmarshal(topNode.item(0)); - } - - private void setDate(IVendorPlate vendorPlate, Rdml rdml) { - - XMLGregorianCalendar dateMade = rdml.getDateMade(); - if(dateMade != null) { - vendorPlate.setDate(dateMade.toGregorianCalendar().getTime()); - } - } - - private void readExperiment(IVendorPlate vendorPlate, Rdml rdml) throws InvalidParameterException { - - for(ExperimentType experiment : rdml.getExperiment()) { - vendorPlate.setName(experiment.getId()); - vendorPlate.setDetailedInfo(experiment.getDescription()); - for(RunType run : experiment.getRun()) { - PcrFormatType pcrFormatType = run.getPcrFormat(); - int w = 0; - for(ReactType react : run.getReact()) { - IdReferencesType sample = react.getSample(); - IWell well = new Well(); - well.setPosition(calculateCoordinate(w + 1, pcrFormatType)); - well.putHeaderData(IWell.SAMPLE_ID, sample.getId()); - Channel channel = createChannel(rdml); - for(DataType data : react.getData()) { - for(DpAmpCurveType adp : data.getAdp()) { - channel.getFluorescence().add((double)adp.getFluor()); - } - } - well.getChannels().put(0, channel); - well.putHeaderData(IWell.SAMPLE_SUBSET, "Default"); - vendorPlate.getWells().add(well); - w++; - } + try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))) { + final String header = bufferedReader.readLine(); + if(header.contains("1.3")) { + pcrReader = new PCRReaderVersion13(); + } else if(header.contains("1.2")) { + pcrReader = new PCRReaderVersion12(); + } else if(header.contains("1.1")) { + pcrReader = new PCRReaderVersion11(); + } else { + throw new UnknownVersionException(); } } - } - - private Channel createChannel(Rdml rdml) { - - Channel channel = new Channel(); - channel.setId(0); - for(DyeType dye : rdml.getDye()) { - channel.setDetectionName(dye.getId()); - } - channel.setValid(true); - return channel; - } - - private void setDefaultDetectionFormat(IVendorPlate vendorPlate) { - - DetectionFormat detectionFormat = new DetectionFormat(); - IChannelSpecification channelSpecification = new ChannelSpecification(); - channelSpecification.putHeaderData(IChannelSpecification.NAME, "Default"); - detectionFormat.getChannelSpecifications().add(channelSpecification); - vendorPlate.setDetectionFormat(detectionFormat); - } - - private static Position calculateCoordinate(int id, PcrFormatType pcrFormatType) { - - id--; // adjust for 0-based indexing - int row = id % pcrFormatType.getRows(); - int column = id / pcrFormatType.getRows(); - char rowLetter = (char)('A' + row); - int columnNumber = column + 1; - Position position = new Position(String.valueOf(rowLetter), columnNumber); - position.setId(id); - return position; + return pcrReader; } } \ No newline at end of file diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/io/PCRReaderVersion11.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/io/PCRReaderVersion11.java new file mode 100644 index 0000000000..7d2887acc2 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/io/PCRReaderVersion11.java @@ -0,0 +1,146 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.io; + +import java.io.IOException; +import java.io.InputStream; +import java.security.InvalidParameterException; + +import javax.xml.datatype.XMLGregorianCalendar; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v11.model.DataType; +import org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v11.model.DpAmpCurveType; +import org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v11.model.DyeType; +import org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v11.model.ExperimentType; +import org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v11.model.IdReferencesType; +import org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v11.model.ObjectFactory; +import org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v11.model.PcrFormatType; +import org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v11.model.Rdml; +import org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v11.model.ReactType; +import org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v11.model.RunType; +import org.eclipse.chemclipse.pcr.converter.supplier.rdml.model.IPCRReader; +import org.eclipse.chemclipse.pcr.converter.supplier.rdml.model.IVendorPlate; +import org.eclipse.chemclipse.pcr.converter.supplier.rdml.model.VendorPlate; +import org.eclipse.chemclipse.pcr.converter.support.AmplificationAnalysis; +import org.eclipse.chemclipse.pcr.model.core.Channel; +import org.eclipse.chemclipse.pcr.model.core.ChannelSpecification; +import org.eclipse.chemclipse.pcr.model.core.DetectionFormat; +import org.eclipse.chemclipse.pcr.model.core.IChannelSpecification; +import org.eclipse.chemclipse.pcr.model.core.IPlate; +import org.eclipse.chemclipse.pcr.model.core.IWell; +import org.eclipse.chemclipse.pcr.model.core.Position; +import org.eclipse.chemclipse.pcr.model.core.Well; +import org.w3c.dom.Document; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; + +public class PCRReaderVersion11 implements IPCRReader { + + @Override + public IPlate readData(InputStream inputStream) throws SAXException, IOException, JAXBException, ParserConfigurationException, InvalidParameterException { + + IVendorPlate vendorPlate = new VendorPlate(); + Rdml rdml = getRDML(inputStream); + setDate(vendorPlate, rdml); + setDefaultDetectionFormat(vendorPlate); + readExperiment(vendorPlate, rdml); + AmplificationAnalysis.calculateCrossingPoints(vendorPlate); + return vendorPlate; + } + + private static Rdml getRDML(InputStream inputStream) throws SAXException, IOException, JAXBException, ParserConfigurationException { + + DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); + Document document = documentBuilder.parse(inputStream); + NodeList topNode = document.getElementsByTagName("rdml"); + // + JAXBContext jaxbContext = JAXBContext.newInstance(ObjectFactory.class); + Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); + return (Rdml)unmarshaller.unmarshal(topNode.item(0)); + } + + private void setDate(IVendorPlate vendorPlate, Rdml rdml) { + + XMLGregorianCalendar dateMade = rdml.getDateMade(); + if(dateMade != null) { + vendorPlate.setDate(dateMade.toGregorianCalendar().getTime()); + } + } + + private void readExperiment(IVendorPlate vendorPlate, Rdml rdml) throws InvalidParameterException { + + for(ExperimentType experiment : rdml.getExperiment()) { + vendorPlate.setName(experiment.getId()); + vendorPlate.setDetailedInfo(experiment.getDescription()); + for(RunType run : experiment.getRun()) { + PcrFormatType pcrFormatType = run.getPcrFormat(); + int w = 0; + for(ReactType react : run.getReact()) { + IdReferencesType sample = react.getSample(); + IWell well = new Well(); + well.setPosition(calculateCoordinate(w + 1, pcrFormatType)); + well.putHeaderData(IWell.SAMPLE_ID, sample.getId()); + Channel channel = createChannel(rdml); + for(DataType data : react.getData()) { + for(DpAmpCurveType adp : data.getAdp()) { + channel.getFluorescence().add((double)adp.getFluor()); + } + } + well.getChannels().put(0, channel); + well.putHeaderData(IWell.SAMPLE_SUBSET, "Default"); + vendorPlate.getWells().add(well); + w++; + } + } + } + } + + private Channel createChannel(Rdml rdml) { + + Channel channel = new Channel(); + channel.setId(0); + for(DyeType dye : rdml.getDye()) { + channel.setDetectionName(dye.getId()); + } + channel.setValid(true); + return channel; + } + + private void setDefaultDetectionFormat(IVendorPlate vendorPlate) { + + DetectionFormat detectionFormat = new DetectionFormat(); + IChannelSpecification channelSpecification = new ChannelSpecification(); + channelSpecification.putHeaderData(IChannelSpecification.NAME, "Default"); + detectionFormat.getChannelSpecifications().add(channelSpecification); + vendorPlate.setDetectionFormat(detectionFormat); + } + + private static Position calculateCoordinate(int id, PcrFormatType pcrFormatType) { + + id--; // adjust for 0-based indexing + int row = id % pcrFormatType.getRows(); + int column = id / pcrFormatType.getRows(); + char rowLetter = (char)('A' + row); + int columnNumber = column + 1; + Position position = new Position(String.valueOf(rowLetter), columnNumber); + position.setId(id); + return position; + } +} \ No newline at end of file diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/io/PCRReaderVersion12.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/io/PCRReaderVersion12.java new file mode 100644 index 0000000000..65c759f816 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/io/PCRReaderVersion12.java @@ -0,0 +1,146 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.io; + +import java.io.IOException; +import java.io.InputStream; +import java.security.InvalidParameterException; + +import javax.xml.datatype.XMLGregorianCalendar; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v12.model.DataType; +import org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v12.model.DpAmpCurveType; +import org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v12.model.DyeType; +import org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v12.model.ExperimentType; +import org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v12.model.IdReferencesType; +import org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v12.model.ObjectFactory; +import org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v12.model.PcrFormatType; +import org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v12.model.Rdml; +import org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v12.model.ReactType; +import org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v12.model.RunType; +import org.eclipse.chemclipse.pcr.converter.supplier.rdml.model.IPCRReader; +import org.eclipse.chemclipse.pcr.converter.supplier.rdml.model.IVendorPlate; +import org.eclipse.chemclipse.pcr.converter.supplier.rdml.model.VendorPlate; +import org.eclipse.chemclipse.pcr.converter.support.AmplificationAnalysis; +import org.eclipse.chemclipse.pcr.model.core.Channel; +import org.eclipse.chemclipse.pcr.model.core.ChannelSpecification; +import org.eclipse.chemclipse.pcr.model.core.DetectionFormat; +import org.eclipse.chemclipse.pcr.model.core.IChannelSpecification; +import org.eclipse.chemclipse.pcr.model.core.IPlate; +import org.eclipse.chemclipse.pcr.model.core.IWell; +import org.eclipse.chemclipse.pcr.model.core.Position; +import org.eclipse.chemclipse.pcr.model.core.Well; +import org.w3c.dom.Document; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; + +public class PCRReaderVersion12 implements IPCRReader { + + @Override + public IPlate readData(InputStream inputStream) throws SAXException, IOException, JAXBException, ParserConfigurationException, InvalidParameterException { + + IVendorPlate vendorPlate = new VendorPlate(); + Rdml rdml = getRDML(inputStream); + setDate(vendorPlate, rdml); + setDefaultDetectionFormat(vendorPlate); + readExperiment(vendorPlate, rdml); + AmplificationAnalysis.calculateCrossingPoints(vendorPlate); + return vendorPlate; + } + + private static Rdml getRDML(InputStream inputStream) throws SAXException, IOException, JAXBException, ParserConfigurationException { + + DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); + Document document = documentBuilder.parse(inputStream); + NodeList topNode = document.getElementsByTagName("rdml"); + // + JAXBContext jaxbContext = JAXBContext.newInstance(ObjectFactory.class); + Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); + return (Rdml)unmarshaller.unmarshal(topNode.item(0)); + } + + private void setDate(IVendorPlate vendorPlate, Rdml rdml) { + + XMLGregorianCalendar dateMade = rdml.getDateMade(); + if(dateMade != null) { + vendorPlate.setDate(dateMade.toGregorianCalendar().getTime()); + } + } + + private void readExperiment(IVendorPlate vendorPlate, Rdml rdml) throws InvalidParameterException { + + for(ExperimentType experiment : rdml.getExperiment()) { + vendorPlate.setName(experiment.getId()); + vendorPlate.setDetailedInfo(experiment.getDescription()); + for(RunType run : experiment.getRun()) { + PcrFormatType pcrFormatType = run.getPcrFormat(); + int w = 0; + for(ReactType react : run.getReact()) { + IdReferencesType sample = react.getSample(); + IWell well = new Well(); + well.setPosition(calculateCoordinate(w + 1, pcrFormatType)); + well.putHeaderData(IWell.SAMPLE_ID, sample.getId()); + Channel channel = createChannel(rdml); + for(DataType data : react.getData()) { + for(DpAmpCurveType adp : data.getAdp()) { + channel.getFluorescence().add((double)adp.getFluor()); + } + } + well.getChannels().put(0, channel); + well.putHeaderData(IWell.SAMPLE_SUBSET, "Default"); + vendorPlate.getWells().add(well); + w++; + } + } + } + } + + private Channel createChannel(Rdml rdml) { + + Channel channel = new Channel(); + channel.setId(0); + for(DyeType dye : rdml.getDye()) { + channel.setDetectionName(dye.getId()); + } + channel.setValid(true); + return channel; + } + + private void setDefaultDetectionFormat(IVendorPlate vendorPlate) { + + DetectionFormat detectionFormat = new DetectionFormat(); + IChannelSpecification channelSpecification = new ChannelSpecification(); + channelSpecification.putHeaderData(IChannelSpecification.NAME, "Default"); + detectionFormat.getChannelSpecifications().add(channelSpecification); + vendorPlate.setDetectionFormat(detectionFormat); + } + + private static Position calculateCoordinate(int id, PcrFormatType pcrFormatType) { + + id--; // adjust for 0-based indexing + int row = id % pcrFormatType.getRows(); + int column = id / pcrFormatType.getRows(); + char rowLetter = (char)('A' + row); + int columnNumber = column + 1; + Position position = new Position(String.valueOf(rowLetter), columnNumber); + position.setId(id); + return position; + } +} \ No newline at end of file diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/io/PCRReaderVersion13.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/io/PCRReaderVersion13.java new file mode 100644 index 0000000000..87c84dcdc2 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/io/PCRReaderVersion13.java @@ -0,0 +1,146 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.io; + +import java.io.IOException; +import java.io.InputStream; +import java.security.InvalidParameterException; + +import javax.xml.datatype.XMLGregorianCalendar; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v13.model.DataType; +import org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v13.model.DpAmpCurveType; +import org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v13.model.DyeType; +import org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v13.model.ExperimentType; +import org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v13.model.IdReferencesType; +import org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v13.model.ObjectFactory; +import org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v13.model.PcrFormatType; +import org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v13.model.Rdml; +import org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v13.model.ReactType; +import org.eclipse.chemclipse.pcr.converter.supplier.rdml.internal.v13.model.RunType; +import org.eclipse.chemclipse.pcr.converter.supplier.rdml.model.IPCRReader; +import org.eclipse.chemclipse.pcr.converter.supplier.rdml.model.IVendorPlate; +import org.eclipse.chemclipse.pcr.converter.supplier.rdml.model.VendorPlate; +import org.eclipse.chemclipse.pcr.converter.support.AmplificationAnalysis; +import org.eclipse.chemclipse.pcr.model.core.Channel; +import org.eclipse.chemclipse.pcr.model.core.ChannelSpecification; +import org.eclipse.chemclipse.pcr.model.core.DetectionFormat; +import org.eclipse.chemclipse.pcr.model.core.IChannelSpecification; +import org.eclipse.chemclipse.pcr.model.core.IPlate; +import org.eclipse.chemclipse.pcr.model.core.IWell; +import org.eclipse.chemclipse.pcr.model.core.Position; +import org.eclipse.chemclipse.pcr.model.core.Well; +import org.w3c.dom.Document; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; + +public class PCRReaderVersion13 implements IPCRReader { + + @Override + public IPlate readData(InputStream inputStream) throws SAXException, IOException, JAXBException, ParserConfigurationException, InvalidParameterException { + + IVendorPlate vendorPlate = new VendorPlate(); + Rdml rdml = getRDML(inputStream); + setDate(vendorPlate, rdml); + setDefaultDetectionFormat(vendorPlate); + readExperiment(vendorPlate, rdml); + AmplificationAnalysis.calculateCrossingPoints(vendorPlate); + return vendorPlate; + } + + private static Rdml getRDML(InputStream inputStream) throws SAXException, IOException, JAXBException, ParserConfigurationException { + + DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); + Document document = documentBuilder.parse(inputStream); + NodeList topNode = document.getElementsByTagName("rdml"); + // + JAXBContext jaxbContext = JAXBContext.newInstance(ObjectFactory.class); + Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); + return (Rdml)unmarshaller.unmarshal(topNode.item(0)); + } + + private void setDate(IVendorPlate vendorPlate, Rdml rdml) { + + XMLGregorianCalendar dateMade = rdml.getDateMade(); + if(dateMade != null) { + vendorPlate.setDate(dateMade.toGregorianCalendar().getTime()); + } + } + + private void readExperiment(IVendorPlate vendorPlate, Rdml rdml) throws InvalidParameterException { + + for(ExperimentType experiment : rdml.getExperiment()) { + vendorPlate.setName(experiment.getId()); + vendorPlate.setDetailedInfo(experiment.getDescription()); + for(RunType run : experiment.getRun()) { + PcrFormatType pcrFormatType = run.getPcrFormat(); + int w = 0; + for(ReactType react : run.getReact()) { + IdReferencesType sample = react.getSample(); + IWell well = new Well(); + well.setPosition(calculateCoordinate(w + 1, pcrFormatType)); + well.putHeaderData(IWell.SAMPLE_ID, sample.getId()); + Channel channel = createChannel(rdml); + for(DataType data : react.getData()) { + for(DpAmpCurveType adp : data.getAdp()) { + channel.getFluorescence().add((double)adp.getFluor()); + } + } + well.getChannels().put(0, channel); + well.putHeaderData(IWell.SAMPLE_SUBSET, "Default"); + vendorPlate.getWells().add(well); + w++; + } + } + } + } + + private Channel createChannel(Rdml rdml) { + + Channel channel = new Channel(); + channel.setId(0); + for(DyeType dye : rdml.getDye()) { + channel.setDetectionName(dye.getId()); + } + channel.setValid(true); + return channel; + } + + private void setDefaultDetectionFormat(IVendorPlate vendorPlate) { + + DetectionFormat detectionFormat = new DetectionFormat(); + IChannelSpecification channelSpecification = new ChannelSpecification(); + channelSpecification.putHeaderData(IChannelSpecification.NAME, "Default"); + detectionFormat.getChannelSpecifications().add(channelSpecification); + vendorPlate.setDetectionFormat(detectionFormat); + } + + private static Position calculateCoordinate(int id, PcrFormatType pcrFormatType) { + + id--; // adjust for 0-based indexing + int row = id % pcrFormatType.getRows(); + int column = id / pcrFormatType.getRows(); + char rowLetter = (char)('A' + row); + int columnNumber = column + 1; + Position position = new Position(String.valueOf(rowLetter), columnNumber); + position.setId(id); + return position; + } +} \ No newline at end of file diff --git a/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/model/IPCRReader.java b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/model/IPCRReader.java new file mode 100644 index 0000000000..634154e8b0 --- /dev/null +++ b/chemclipse/plugins/org.eclipse.chemclipse.pcr.converter.supplier.rdml/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/model/IPCRReader.java @@ -0,0 +1,28 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.model; + +import java.io.IOException; +import java.io.InputStream; +import java.security.InvalidParameterException; + +import javax.xml.parsers.ParserConfigurationException; + +import org.eclipse.chemclipse.pcr.model.core.IPlate; +import org.xml.sax.SAXException; + +import jakarta.xml.bind.JAXBException; + +public interface IPCRReader { + + IPlate readData(InputStream inputStream) throws IOException, SAXException, JAXBException, ParserConfigurationException, InvalidParameterException; +} diff --git a/chemclipse/tests/org.eclipse.chemclipse.pcr.converter.supplier.rdml.fragment.test/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/fragement/test/io/Test_Example_11_ITest.java b/chemclipse/tests/org.eclipse.chemclipse.pcr.converter.supplier.rdml.fragment.test/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/fragement/test/io/Test_Example_11_ITest.java new file mode 100644 index 0000000000..3eeb3f6ec6 --- /dev/null +++ b/chemclipse/tests/org.eclipse.chemclipse.pcr.converter.supplier.rdml.fragment.test/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/fragement/test/io/Test_Example_11_ITest.java @@ -0,0 +1,69 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.fragement.test.io; + +import java.io.File; +import java.time.LocalDateTime; +import java.time.Month; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.util.Date; + +import org.eclipse.chemclipse.pcr.converter.supplier.rdml.PathResolver; +import org.eclipse.chemclipse.pcr.converter.supplier.rdml.core.PCRImportConverter; +import org.eclipse.chemclipse.pcr.converter.supplier.rdml.fragment.test.TestPathHelper; +import org.eclipse.chemclipse.pcr.model.core.IChannel; +import org.eclipse.chemclipse.pcr.model.core.IPlate; +import org.eclipse.chemclipse.pcr.model.core.IWell; +import org.eclipse.chemclipse.processing.core.IProcessingInfo; +import org.eclipse.core.runtime.NullProgressMonitor; + +import junit.framework.TestCase; + +public class Test_Example_11_ITest extends TestCase { + + private IPlate plate; + + @Override + protected void setUp() throws Exception { + + super.setUp(); + File importFile = new File(PathResolver.getAbsolutePath(TestPathHelper.EXAMPLE_1_1)); + IProcessingInfo importProcessingInfo = PCRImportConverter.getInstance().convert(importFile, new NullProgressMonitor()); + plate = importProcessingInfo.getProcessingResult(); + } + + @Override + protected void tearDown() throws Exception { + + super.tearDown(); + } + + public void testDate() { + + LocalDateTime localDateTime = LocalDateTime.of(2011, Month.JANUARY, 9, 17, 04, 55); + ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.systemDefault()); + Date date = java.util.Date.from(zonedDateTime.toInstant()); + assertEquals(date, plate.getDate()); + } + + public void testWells() { + + assertEquals(90, plate.getWells().size()); + IWell well = plate.getWell(0); + assertEquals("A1: gDNA", well.getLabel()); + IChannel channel = well.getChannels().get(0); + assertEquals(0, channel.getId()); + assertEquals("SYBRGreen I", channel.getDetectionName()); + assertEquals(668.4299926757812, channel.getFluorescence().get(0)); + } +} diff --git a/chemclipse/tests/org.eclipse.chemclipse.pcr.converter.supplier.rdml.fragment.test/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/fragement/test/io/Test_Example_12_ITest.java b/chemclipse/tests/org.eclipse.chemclipse.pcr.converter.supplier.rdml.fragment.test/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/fragement/test/io/Test_Example_12_ITest.java new file mode 100644 index 0000000000..4c3cc63d70 --- /dev/null +++ b/chemclipse/tests/org.eclipse.chemclipse.pcr.converter.supplier.rdml.fragment.test/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/fragement/test/io/Test_Example_12_ITest.java @@ -0,0 +1,69 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.fragement.test.io; + +import java.io.File; +import java.time.LocalDateTime; +import java.time.Month; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.util.Date; + +import org.eclipse.chemclipse.pcr.converter.supplier.rdml.PathResolver; +import org.eclipse.chemclipse.pcr.converter.supplier.rdml.core.PCRImportConverter; +import org.eclipse.chemclipse.pcr.converter.supplier.rdml.fragment.test.TestPathHelper; +import org.eclipse.chemclipse.pcr.model.core.IChannel; +import org.eclipse.chemclipse.pcr.model.core.IPlate; +import org.eclipse.chemclipse.pcr.model.core.IWell; +import org.eclipse.chemclipse.processing.core.IProcessingInfo; +import org.eclipse.core.runtime.NullProgressMonitor; + +import junit.framework.TestCase; + +public class Test_Example_12_ITest extends TestCase { + + private IPlate plate; + + @Override + protected void setUp() throws Exception { + + super.setUp(); + File importFile = new File(PathResolver.getAbsolutePath(TestPathHelper.EXAMPLE_1_2)); + IProcessingInfo importProcessingInfo = PCRImportConverter.getInstance().convert(importFile, new NullProgressMonitor()); + plate = importProcessingInfo.getProcessingResult(); + } + + @Override + protected void tearDown() throws Exception { + + super.tearDown(); + } + + public void testDate() { + + LocalDateTime localDateTime = LocalDateTime.of(2011, Month.JANUARY, 9, 17, 04, 55); + ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.systemDefault()); + Date date = java.util.Date.from(zonedDateTime.toInstant()); + assertEquals(date, plate.getDate()); + } + + public void testWells() { + + assertEquals(90, plate.getWells().size()); + IWell well = plate.getWell(0); + assertEquals("A1: gDNA", well.getLabel()); + IChannel channel = well.getChannels().get(0); + assertEquals(0, channel.getId()); + assertEquals("SYBRGreen I", channel.getDetectionName()); + assertEquals(668.4299926757812, channel.getFluorescence().get(0)); + } +} diff --git a/chemclipse/tests/org.eclipse.chemclipse.pcr.converter.supplier.rdml.fragment.test/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/fragement/test/io/Test_Example_13_ITest.java b/chemclipse/tests/org.eclipse.chemclipse.pcr.converter.supplier.rdml.fragment.test/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/fragement/test/io/Test_Example_13_ITest.java new file mode 100644 index 0000000000..7ec09a1dc2 --- /dev/null +++ b/chemclipse/tests/org.eclipse.chemclipse.pcr.converter.supplier.rdml.fragment.test/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/fragement/test/io/Test_Example_13_ITest.java @@ -0,0 +1,69 @@ +/******************************************************************************* + * Copyright (c) 2023 Lablicate GmbH. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthias Mailänder - initial API and implementation + *******************************************************************************/ +package org.eclipse.chemclipse.pcr.converter.supplier.rdml.fragement.test.io; + +import java.io.File; +import java.time.LocalDateTime; +import java.time.Month; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.util.Date; + +import org.eclipse.chemclipse.pcr.converter.supplier.rdml.PathResolver; +import org.eclipse.chemclipse.pcr.converter.supplier.rdml.core.PCRImportConverter; +import org.eclipse.chemclipse.pcr.converter.supplier.rdml.fragment.test.TestPathHelper; +import org.eclipse.chemclipse.pcr.model.core.IChannel; +import org.eclipse.chemclipse.pcr.model.core.IPlate; +import org.eclipse.chemclipse.pcr.model.core.IWell; +import org.eclipse.chemclipse.processing.core.IProcessingInfo; +import org.eclipse.core.runtime.NullProgressMonitor; + +import junit.framework.TestCase; + +public class Test_Example_13_ITest extends TestCase { + + private IPlate plate; + + @Override + protected void setUp() throws Exception { + + super.setUp(); + File importFile = new File(PathResolver.getAbsolutePath(TestPathHelper.EXAMPLE_1_3)); + IProcessingInfo importProcessingInfo = PCRImportConverter.getInstance().convert(importFile, new NullProgressMonitor()); + plate = importProcessingInfo.getProcessingResult(); + } + + @Override + protected void tearDown() throws Exception { + + super.tearDown(); + } + + public void testDate() { + + LocalDateTime localDateTime = LocalDateTime.of(2011, Month.JANUARY, 9, 17, 04, 55); + ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.systemDefault()); + Date date = java.util.Date.from(zonedDateTime.toInstant()); + assertEquals(date, plate.getDate()); + } + + public void testWells() { + + assertEquals(90, plate.getWells().size()); + IWell well = plate.getWell(0); + assertEquals("A1: gDNA", well.getLabel()); + IChannel channel = well.getChannels().get(0); + assertEquals(0, channel.getId()); + assertEquals("SYBRGreen I", channel.getDetectionName()); + assertEquals(668.4299926757812, channel.getFluorescence().get(0)); + } +} diff --git a/chemclipse/tests/org.eclipse.chemclipse.pcr.converter.supplier.rdml.fragment.test/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/fragment/test/TestPathHelper.java b/chemclipse/tests/org.eclipse.chemclipse.pcr.converter.supplier.rdml.fragment.test/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/fragment/test/TestPathHelper.java index 93bc476d3e..96dbd86023 100644 --- a/chemclipse/tests/org.eclipse.chemclipse.pcr.converter.supplier.rdml.fragment.test/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/fragment/test/TestPathHelper.java +++ b/chemclipse/tests/org.eclipse.chemclipse.pcr.converter.supplier.rdml.fragment.test/src/org/eclipse/chemclipse/pcr/converter/supplier/rdml/fragment/test/TestPathHelper.java @@ -16,4 +16,8 @@ public class TestPathHelper extends PathResolver { public static final String TESTFILE_RAW_5 = "testdata/test_5_raw_data.rdml"; + // + public static final String EXAMPLE_1_1 = "testdata/example_1_1.rdml"; + public static final String EXAMPLE_1_2 = "testdata/example_1_2.rdml"; + public static final String EXAMPLE_1_3 = "testdata/example_1_3.rdml"; } diff --git a/chemclipse/tests/org.eclipse.chemclipse.pcr.converter.supplier.rdml.fragment.test/testdata/example_1_1.rdml b/chemclipse/tests/org.eclipse.chemclipse.pcr.converter.supplier.rdml.fragment.test/testdata/example_1_1.rdml new file mode 100644 index 0000000000000000000000000000000000000000..171c4e9366d3e50e3442a65f42158f3c3819fad1 GIT binary patch literal 75794 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

5+5CqmT`T|416S@5XR^IAWG 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 literal 0 HcmV?d00001 diff --git a/chemclipse/tests/org.eclipse.chemclipse.pcr.converter.supplier.rdml.fragment.test/testdata/example_1_2.rdml b/chemclipse/tests/org.eclipse.chemclipse.pcr.converter.supplier.rdml.fragment.test/testdata/example_1_2.rdml new file mode 100644 index 0000000000000000000000000000000000000000..048d215c696c60d08e2a9d98daee11230b76c554 GIT binary patch literal 75810 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

aNh9g)CQ+Bg^F1%)$7s{MC8+cRf%M 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%0A;r)lB;Zx?Ya*G72Eg7 z{aAdbZ!Tph(+U&#$dr19ZsIS#dmuVWYTNuM+s-%kk&_zzf#@~#Z7Bm+Fd1u0w%y*& z$fTJzt3>yC^zF?1gXfN~@$Ed2KVNSp?^I?7=*=Zxp^|yuwXjNlqwBks+)NX5L$uH# z6WwP-gzfz`WC4*s4b2|;a?8LczKBJ-TgK0U&D^l2rI_gg>L6)rt90xXj%QK&{*9Sh zwADyIB(6iA)g$jLfUa=!By_l4c(cDXEBsXpeiyR+Ygiu)Ot9Fm*`m3ysV(_w7(22d z{TZoJ8#`T=jo*Loiy2_97Y&&SJUz9_`fO`M((HvPIVg0rsN*rq;g1oEuE(&^nx z+H5ePkIwykDMo!(^$C8`ay-g9$gE_Q-*x!{KnKs@946w(6QXqZD&_DfOs~bqQ`p;L|RGAmgWRB+MJK)4;1$~ct)rzUQj<97*XY9 zGB^FSe1|>0Q-!dlX*or#Z?$g3kS$8LAwSW$W9qBFqiuY~%?BDaXngUNOIG#}6JOER z72Sts1bHe#E5f=q!)fVn=>H39zKTqZ%~fpkX^+xd<)hk#pNk&P+?Qj7K5N%rJ@ywo z(tpR$3$M7j(HdO-Mc+Zx%WAs_hxQ5+DSaUD zYw%CuQkJ9n@fg54R^7qcr+FZ>?P9F%)Nm7Akuenbcq(sD!E}0(E=h=4zXCb*jMG$- zF?p%td#23F6WwG^k`xC*>9$v|f_6oErOD|?ALH4}lGfhS{`foWE{wY68P5!XR@h&o z!JcauKV;TI?G5$Azd8z4Kz)$(*{LJ29zIzpRh7cFqEp% zEgi2JLiXe)8f}R)$IfP}|IoRIMM=wOr8|mXTR!~f8{Z zGezjcP>AbbnF|KKFFZ8^-Un(d>8dbHo|?lUIrX(e0ys0Jg^^G!h=HeGlT;g>n0k9Bk~tHq`$l4e+5p(=aVLiv!dBM)`Hs8K6aK#! zag%5e!w$MLm-q{)<0Zbf0EA!0xO2xNpsK!8EttP}bV6pBUPzAf=Y;P2c=21LEc z8p+eQ!h%n%)@t0JRc1+)zJ@wMq4-bp^pL{LA(tPI4^qsAuv)y|wlzdPD!;!V2Vq<4 z74CRXx?6HV^dz|48!LbsqM$~rHoxvykAo3{0eAggoP2?r0%nKbOb8NX8F?j+NK9w~ zH;CcZ0efH3273*hJysh=K%#-UR+V5WXD?Sl;cnEjP};vCpcMYyQW`}PFU;KgWgk$^ zITS6Aa$!i@cdQaY8s;>eN~?(Jl*(@nBeBvsGF)WZ*h7Tjo>izhs`?vBx@4mlCa6<- zk662!c$N+<`Er=c3se5{1<-UDshVz2}~bpUo~UYI9g58-?PeDW5o=P~k0 ziAy;_r8~umGnq4M1|Q2$^Y`yh@#y)?1T)<$;~D(UW@g~rxJbpcGJfxc^H5UY)xe~a zUfXrc^PwL{@JGjdFh9_{rlzMNS6?%_lOV?UP)0>KM1dvu&v#4HZ{?_Ab89Nx=D>Y0 z749jooDM|Yx%Yx`>pa79Az>^1f8(nZ9(0RwyP3ab#njEh971lOusWNj=HZ{EO z<=Ytf4$clNnBa(`>G4E14;{H`-$vUyD5?w#s&q0ij#Dy$uhXlVE3!@38p(9pvrYG; z4A}*@yRhWvb;L$bZCP?@z+>@9#X>^WKHa(F2C-U;G1y8lO^H&c+K^?90$$vxcZ z4;u@LdpPAy-gIWYxuidIr)yPe*K#JSuy7F@3wxr0*zlxRpPX`9to3l&A(=1-UrtOP zpQAh;R_3Zh9|L^&QRF{Y$Y{F4BR!aV(V>o5_5@SkLYzGU#`JjlYH1Atqy!*XV80L* zp3)zXC)3^H{ADm`bg^@cF}SEvq73GDp0nDzv_zU(d1r#HW@$GwCJQzmdl@obF715E%u zMw|c3sORtL-OGo`)(xrU0cGzBWd=$yf4+NL76X&oX25cQ#%^Q_(rC{^w)8_0%DY9& zM9l0!qS1uVcc}a3Ya+Gb47;tVhy?y&fMtJ*%B#OtFljPC@YxCOPmV zXEkA;wI1PfLgEzeis45Eo3k%5)Z;YH`&yDrm;n>W&Y1=`M}8g9g8jU|xlXg&tC&QjLBN?Jf!QH1BS8M9;ml9Vai zz|$g(#Xb;TYd!D=cpFA) z^%YTp#d8UO$3ZP;C{=!7HB1ng3uTJSXz(1gFAoFc)(IIjy3L?0d8vh*VK&NCM-X7H zA zyHUAq=g^@AJZx1TzsCuFUH_@Z!x)$c4UOhkhROpZ$q%R(n8zS84picK$UArb^B255 z8Y;~a`nb_{1#T}2PV-k6l+%Sl{GJtt#lfauWH7&Y1Bpc%%tX@MJ+dIh=P(8k82gsu zVy=+}mf{~p74#U#;QS1~{=cBQq6b~Xb$?GW87MXFClSv@7CxBQcti$0wR(irIIt4W zg}NDADw}b8wqu-OzhXX8K^5>nh0MY{mYJWP`I#CgtqYi>qx`5@?7t5JX+ksgmzg&V z3d=emYsu@Nm00G=X}XsDM_Wa#Mz zKZuKPNO>N?Jl1s%w9Gsk)GIIjc){6a7%BW!^3m*n`EjspzEoyo@aC++0&_0zJ3sJ4 z#N0%(<$jz)#a%v({#xm9qVy@aP>B+q?!yP?ey9*72)Dgi_?gAiak`~;HS&f>Ir6O6 zr%SknajRFVWkP@kcCYHK>k9rqgih-ykjJ|n>>n3~Nde@}NO}Uw)+&=SP55C9gI}j(l_+v&l1cZqsWXvrkrwoXz(UJ&PQd9e zoO9xmxgSP793j|>MzIl-Mzk`YXlV=jJ)aSvm8H6&E#4Z;#Q662Zdvz`&q(Fc?KAFZ zC&R&Rus62bsY2I6`CZI!>j&4twiLP(32Lr9lHbv-MOv|sE_3J~eNRyPfT-6GzzR)6 zsGqS%ifDr;*`Bcr)Xl1VW!O@2*S&xlRmGuQhzqb;+dd^BvmynLGxo}owNCiEaKOP; z4P<|avmjUtHH@b(K|bZuFoUb)<|Ac|wdvWfxGmAYWe-!J{~?%q#gHTxA6Kn?#-G&Q zkuu!Z^$Li>=?m{=3baY_58NI{)DU__deVs`2>^h|r_Jg zJD>}2q^ z54>imX>qK$P&z{{wjmMP8;9s(1ohufQG0hj-uIEYrk}ExXUZp7rjP)&HCzU4cZq*A z?ui>*RQgl+X`)z3)eslVcG#%HTIDHE)x~o{8rD{YDCqI7xu^|l%NLg_nCM+MAwsUE zSnWG2u+UWZDCq*ib@fy))e4N;^~;Y}Pjq8{tM?oT%Mr^NgCEBk=of*rK5Ay!*~SCT z8XkF1pWr_!=eX;8o-O`Lr<7vJRFgOu7Ac(GFQap%6%vcmeYcH~&PTraP&;!%t>m8{ zD5Jankf>0RjR?;-*f!2#6LUQ*^rp9PpEBxJNNdwh5!@o~I}HKCOq#|`e%C#|KNx|J zW^JN28Spp$$6oAB|Kd$KO?=r?3@w){=1p`Z*D#A-12kvT=F=`SM+@+l)mXZASQ%-@ z`$-nUuJw{q+!N2xjhDn4T0F~yem_sOjJ=}nI`#O5yr~sb@w!Fp4on70)ofO{T>tXY z_l$j|2E*tb@knbc&kOZ2UsZqi^lc zMjd*)w|c5T>y-2usS2s9k@3r^qGAHq5UcCSKO`MLh*r1jz$aG9eh5tFko$8=6{MB; zr;(SgUW_Sfse{f!W5w^=&Gy(oyi5kYF-~{t8QB2X6LYm3FatFaRB?WJZ@n_x6MLh8 z6k+x;t#~#8#J|$=VK4`__RtCYC2`#ECL+^|N8ElAgq(_uBCpRF*c=I}oSax)dYEp? zLmz-x^)~Bn!N6o>@umjOfj9n#jzrYuCS{{ri5j5Ibj=n0j&f4Dx78;29ytfOKUhym z_n=x|JITHgDr6DfPG$s-=T|O9&+WZQsu!VqKPva0`90xl=`age45c(|lz#`0iDQ+K z%@@44_>zBJcW_(StXrfOQbpE`rG{8GcITK^r2i0NYXGuDs+G?RloFbl@7;o$BDh+| zS>7C9L{mtVmpabhd)R0S8;E7Gck3;{2R{70`$DD$%yBIjSR_)8>X;_CWV^!mJ`6fZC7ZdRq5kZt5Upuq_E zmH&E$zef^K`}T87ov%C+~q1>Cl<)1 zTRttoinaBBo_?4TFIAI}?tM+d(7)Ah$+_mr;)NMYkAoW}qlAgjBzUkQeQr?!iTr43 zNMW5=))FDL=uOn(#?2Nu!Nj(eT&NH*U&d?WjmtAYJ|RXzWP!gA7W(E%GgKKHMqt7+ zqJt6haMJ-MK3e#rk7Sv@fhDFYtUqrTZ*57Z95x_^iFefF%tsJ5btdVUK*RwUhsLa$ ztbIQLi{ul_Vc;#)eTDbL*WehB(qu7M-J@(e;GWJ?)Dshjs*kO>wN&z2wa+Gk+4A$7Wvp%H1jM8XCVEiEQ=xr+nK(E(lb7Nm@BzbI~ z@7(>>`;YKj3+3d=GDT~fLvCv*a(|SSBAzxrF_$?U;_uHQ)Lr~-h5^Npe~0R2le#-p zv<%ZXxC_XK>R}Ya5Q3*e%Go`yQO3Z9qa6jL`rV6!F^v9b&o_?pTmoyzW47z1BUuTK zDS4!SNvN@VxuI;^T~!@M1MG91w@dT}%XN#q9DoqNr7aSi0-8NiG~V7=Z-~Jry~r!rx?@l&^fA71eVnO$$O0E3>ID0j|BM9Gn1`S8 z=7ax!7dN<17e|HGC*xoOJ@Piwlo?G4WfvMq`5K4d3ekTcZM-uZmvG7JxSTW~mGv~( z5!#+5-@GHNfplZ~4Q#q^Yr?}u9|iEn&~x&A5b{XEAZnPHE^co4AD42p)7$zSolTsEox~Btv&9d0>Tx!$~${_ z@hoH*7o7cx?6wO$^qijSkZ`fJX z=H{YtD9+pDoMwC0$WO9&b>aJm)Kz7<7fT&Q@6qaT8#-nh|7ct=Ud)|`cxU@aRtS={ z^eoTM|2la<2#1fOyvy5w2m!4I3rib z-c#}@*9)<4_O1c$+splq6Q;_0_u@cAhAIKs@$4gOaS|{=z#eE&f^X?V-FQ z_CF2>BQVNv#={D;U`UDIEk+Z!O7e|wKx7ZhD#g6%{~t!!9Ar|V`yBQYoN|g`gNP=% zRsEjxK9+;+*RZpF{_W}eD!e`DlJdBgoEzAetx zglB$PoiFq0b0J9)Ddt|__0R7wVduc6&LUXKq{&+HA9BbQii}1W8;LLi{}T~8gh5`2 z3m(DtjRGJB=?y2qv`G_oS4Y@Ogu!rO*kir|s8H@C^M?s{)q}pE@4!#GXy}=uGyrO?+=!Jsxrs zaa^%NB4rZ3LKo9NbjEDmnd4?QTqgDn2U5jqpX7DDHmN-rY0Nxe-378U<{(T4a)H@Y zs(`J+mh43!-XCF72FoLKayQCY?+*uocJEfT)^@hF%-Vc-|c)x%!uv@1&iHA|Nix4bB9x3ovcxI zUv~lMO`EdM!Ds?(ugevWE@K{}*BW8!Hkdvnk7makoSJcH0!Xs|-8ug!q710iX+_G9 zJ~jMgyAPz=_$#6cn8_-6n#3y<&ZO6q__c{Ws~p}3Z1#dNW&q8I@?F2oDQLNgqMZ!Y zq}tviYVWpD-uv1Soc zU|hqsELF6DAa;rVLsP0R#%S8nQUZ*FdjNj@MVOZFH027W=`TF~_fYT_+Ddj-46Kgz z6tN=Cp#S*rzDEJ{j>eilFS>{4UpvtcNVhxjzm?sST2&! zRm2JA+5A>6F3uA|dzqksCUD<=EPsJ%D%48*0=3zu>M(zcJw1;hT_DY@n|pUVqGEbR zc!ZQIB+hd%@t%i5)`Z9e@C%BfCoI-;Fpr@n7;+0T!>qI~MX5blIxWkmW-gvPQM4MJ zY2;SpZaYxwv`$y@3I-a^@K`{RKGSV@IcPuin_>Yq0Fp=h4JPoWnH!fIvcW~m4)qz< znZcm4hH$xV8WO5a(2H+7BDe43mWh9tnG{KH1FHV#J#JL)Z5WbVX(Ar*kNPXn?5-Rz z&vC0?EWo%2XsDzY4Wt#;pdw}lmOGtV^7#8LqIpqoOKeOomFD>KkQ`Y`4AW0yvbL<` zowc(hiTA(^2VamadvNNI%<#V+9%_7v@Ub!lS$dQ?ZPE#v^5zEQ_$Ay5R$hB`_kG>v z>qv^6y3K%C>JR^;=*r`n{{Q%wDEBcVcaCj7bL5t@95Xi8HgcA7Ol~;~9d0)Fe4HV6 zxKg4BQIV153WcIW6h$SXyWi*c*X!~5Y@dDh+1{V`=kL}9{)o*3WE{P0xC!MDHyw>$m<82TM zi`;c2nUWv&Q_7s9n+N1hTuk~b#$7axmZav|yIzH_o^UQ^#!$5`wQ`?QZ;S&*nwhSB zb#mNDyeaD@`L$9FY>Brq2ttkXs0~HetNdPi{Ea&@P3c#; z*^>dW8wwrh&d=|E%rZWob`4EwxbS!G{*UkPd%&-Udcfsuoky%Z@z+eagN(3yXLb+s z2}44UP0AAfaV%VAun|8ccQ1+d)>>mv(Q12y7FBx9{eig?9#Fd`)0J&oBi?Xcp1f9coC^29s_*` zOR9xL-!Q?FqY8tg#G~sT_3)64%6y<5T_w5_B~bkIg^J}y-;H!v(nx`8FCJ4=Zi~hw zANv~L)Gt}w5p<@!l4kE^w5|H)IEC5jtsJ4eJpVi=QVdbDtRo|lMs(zaSN?bhAjqhu z3hiQe<0zrwxDxtdqV?JX)$c|xUg}F6&SVOG#Cs%c!*R-JMqExL8bzL8&XBg_V#QtM zso0=$FNUxAQeHs);cnLG2?+!^y?9!nzb1`Tm97WS&Z`{U7ZeRnKOJ^qGH-Yf2O-BYdqyU@|Xrk+<~e~AY8SQi)Y+i?_czh$5u!pniMdQM1HeZVK+ zMhX?PW!c)y7Fc*5BzuNx6QbZ;q?@%Y;yiX0-&!=zb;V2xbgwhN?oT-3@?YW-nupbU zQ+&pday9$siyU_Qs^ew`IEq_&a8UqJHe99>wiTZ956i5aZayr>|VdxH%Mrm5nC;)f~tK zG70h$_ig0ZRpsb&LxZqg1CNM!$NHVhNO8L@A0VSBN92UGEpmu>;)UQ7!{~!u*WW30 zS=64k`h#s^V4$IaiM|OcBdp(Ki+kY}$d)@cam!MzqSBbeyv)W}fI=Y;NmKXPxZK&; z3gq8b7D)cmQXHb9MkE!$KN(XQ=WJYwvO-x%tQC^Va<+b^e@r^gEBEn9o8C7c`t?g`rr zOTn<~2AgdiVUc4av$7b~M3=NkGwZg8L0-FW+|sW1yfXc;q(1P@RW1x!dOA$`};uD%SYZv0E;_;ZVGWubm)EwVHbt5T~k2KjMSBdU^Cc;{U z%Rjk-eQ7^|%`=hU;hx^}*EMg1BxlFFpd()m*V^+lzi%p7%Q7uFDH0`tM7?ty%G(ug zAKdk_(Z{?5XCEleorL;mosRXMYY;1x88XXj-*ax$GHgrQuJfEa0dN2GLe!+dD|%7K z|4Zi3dkRIT19QK24=P&Xi-xz4ocjWZmTSB#XTeGDZsa{DnR9l?BElxhh3)mEDjt%# z(}ejVG{s!F%BOHHV+ngDRcy_KbRzJT(gTHk=zZmM4JDS&h~p?DgL_9Y|XE} z-PJrtO~6}vg_I`x5IP*TfKtU+$wE?u0+z{ICN4gZJYF(nE^v6x!<_SQzf^yPr_#0Y zxjWy#xm`Urbq%e^_7$$d`zx}q$l~JBimcuJ+1Z|QVV}=(i#ssx%Yw(nwS-+iaoe@? zUyTpVWVo%}R*8n2h1{|fuxodA>XCXP7fYDF$cH!!w>uCuKr}Vqh1h;g=Xc=tUxDJB zKPE+lW(uS@S9@MQh(EHF*Ka39{hy z`V1Xv#PJ)MEP4CrQ&yO$p+SIGHjh67e#UZYPih%(+53=qe#N)#vT@Fo_vp+$d`9uDCO!J4WX@4TylhDArw5YasR+)%qcH3-tCx4jUL3 zbO;5GYff6$2d|VxTp%~tW!Uw zMOo%q(30ky0Bt3rQJulXG=ODAL82-CXTnid3>~mtX%>YfCXxArkrWc6gri$v&9?~- z^yM)Tc!9A%msEJ>a<#(4PI%_mvm$*14UKyPJF}fC0`9s+RN$yqy*){stQ9PyEJ^GO zmq&)MB@COsYNNq-E5-)D#aGHBA_-eJ%P`T5w`So<`0GTjaWu{HA3o^T9VQ`^`e6ei za6au)t$gl^Xr}7bcV~HPMjTCjW~EZ_v1o~_9)9e!ewme4*^ecuEr=-IInA#J=DLaD zqbZnYi)m-@f_ldUtSgP)`wALO6lbVY-~WkfUq_?;s*&!t&0~HJ6ndP&{B0B`knZU% zLAJCLZl-j|NU0eTv2M!e1rW7oh@fqgozSDJI48Kzd_`*hG^Tx9AT$I?nMTD4QskNr zH)Syp#KlWr_H(m-B;~(!K+{*o8$5064CHnlPuXOoUh!_uSx!oA(onYr$1ng>N#GmV zm4});d~*T-eNXe#5QGG`yGbHUvT39;AtA^VMYG(}I;KBB)W-J5Ar7XB=zELvl8R`S z18pdN`1#9BNn+7V9fr_au9y!-S`mgX^5Ng|ai~H6QR^J%bk!CbjrS_+9a5Tx3*#!$ zX?hVh`CpU$dV?D{h%XNVpWOD6MIPl%>rgd3Tu?WE;gNlradK3E!jDKk9`+H#BTB$C zqd6xHJHkeYST{lpJp1wuA1CjTe?i@t;s)I~&HtAtvs_6G9wvvqIMhEsNp_jTY#AK6 z^^lUhRUj~`ldc!WRGE;0o8eB*SXEn9J_-3xA24|uoqHJHzGRV9Eo~#CrJnyx)o0apo-F z18IExF<)ktWB~B=T7994QF-{u3-&Eti2)`N@%Wa=hD-Z0N!Je6&|}WWJI4IriesZJ zlKLu(o;QA3L;DUSWNYHTCE?vFn@@uuen_Hj)P>ID$qPbk`YcUwMRghb6(iiz;%bbK zAO8;}Pv^|XeB4N~*#ZpT3tI%ZDf>K^)00z~ke|}WmUbXNe-DNcI>UVrkM-VB4|2%I zcQ(az1^&YB|3^9Z_=)=2JXPgEVY_N>Qi9Kvl!G{0^yz<(y7;;xCf{%GKM9frc>?(0 z#T`jj0wkEd7t-dj7%$V@Ss7q8r-19$K5Lsp5~T?xnw*;=DK|bNi@ttAVK=X*!1pT2 zMS0w$K0cvMb)F(UyqkV}o+|R|X~|w5($5TsZXQyvna(T!nHdMfD+tYea9#MK6tZ|a z{6|2V5!F8W&VG~<^Z1a!ixH@jzumO|H5}(9=7fC#KsjwQgyZq4kmupq#{4+u{3p4e zm6WG?YT8_v^=Qi<+BNZu^8uLhfcFq{^4!0lfEC)E^Xa8-(=%U9a0$zYcOEI6c@snu zM~nQ^5r(zf_vQc+!(w4f{n0!Xn8S*VVzsW4Uxjyl8_iS6>>X_A=e%q71l~V!quJ6! zp3U4yONmQmb|2Y4t4Aq@zxYva!L%mzv6}A`1cv}m8Y|$ULqpj-Eq5xlsQ#qq1u^>X zEvE^aq1@2|2q|_~6Sde=LeBIX+Y*24b#Se_B~>Ht5SpSySe!WO^2+bY%!QHy1A91g z{qDJU*BOIKhirM720keT%$Ew5_-3x6uU8IUB`B^ItDiRDoE42lOe5p;m-${+yQxqaTQ}FB-C#Z_^UDQc-|F ziafpd{L~WN>}99)l+Fs9Xop6*+k^{e86xtrz;D*_(ZzHoqJi);*zu@J7U6em!ReL? zt2ZvHzjR<{sr=we(_3GtGVoKeZRd8Rt)eHbR-~jQfPRntQN#aHPnqhMC_SNQxItvl zc8l@jb`mpce+}lUC9+(w>KpQm`I37Yj%L?1tS7(PEWx5}jTa)QDlUtE*47s(8Yap_ zm&}@--^L*&#?dy(`&aj`Fy{vF>hPFppWbxitv&yt;$EdbcKV0~)L$#^RT$&HSKg-( zK5zk=Mn44vXS>g(Upi74%zM1OOYnk9q6OdQ!*KGnd+M;)GA;P#wNQ3N_aXQdiKpM{ z6t*he^ZOLT#XivH(x*h!-#I8A$pEecQGASRV60N2P0j`lescM(VswMR;dQhw`b&k@ z)_bdi`2t!YW~TZz`zZVwY340?FD}lVR*IG}Q_@jxm>(t_wJrUAV%(IWzS0$)HO);$ zhtxXV-G>hO{5ARWAv>(q&x=&GEunqhrf}zFv^qAj$@-Ipk|xr_wp)O$NoljX=xmgzo>cDBqZMdM3h`b|B%wAs`j2V&LaLQT*F)zK{OOj%nl*!{ljEj zKM_K1DTJJYG|TUs2{o37sS-w=C*W%EZbI(z%W!PTGD^<7l0RDFe#dE9bc;t6b^#YJ zaXBD3S5=BV))0!L5tO{@5cjTOoh}+{bX3~cNUGhnE&hPI7m=-p_HQh&U{xvMP@orx z7_|?7kH*2wZrt)~ld?@#*|7{IG7~)0kn8EDiN4l1jfG{i>bXcxjef;&<_vK1dTHDqaItKfgLJu7=LntlT<2t0NrD_H=3 ztnief{u2qq%R)^L=}Hd&f|@cBDe3v=Jl`2R4Bx9fuWQOy{BW~4vdkKv zBs(T&sf_$P?&*4MXCaG2N<%N`TtrpU#CsNN_fa;I{a!i#T-{)U?RB>axoz z*~jtMj<-KBIYliAoNs0sQ?!H5DIt%JRSf1okf=LDRl#EePeON5$!8C(*RD#o;P=D3 zQunK^Y@IO`qjAZzRr7CTucy-XCl`53M4X#g?3%6eRF=}pftfkzyUKK;k_Mh=Jx6rj zOjf{wJ3?fS*{a~Xu^Ds$=Fmy4sA9DcLMKrLY2?a~qS@mf=c$19xcu31=$pN7HxzFs z;+crgZ^6rgM7@18G(7Wu*eG!SQR)j;^@^Ye%c%J{c_a4(rc5b5HEE24B&q|_Ye z=AKhe%N`O5^;ag6(%&A;!ken(WE`a^h*xgdE@mEKMr0fv%?eJj#K-v6V3m-Ed2$Db z3do-XQwK9no?mFsC`PxtILEjo!qtp8%}7%32mz;aD7MELv&rMlQ zO31Am*B01Yy(!hlue?qfrRha5^16Gawa~e{S1Yv8kHfaFj+KECOJZJk*=KPJ3ZFFn zdzl-Otb36E$;_t>^%LH!EBGJ$tED9osJnQr8i>zWU9DnwJC-@WsM5$kb9XTEVSh~B z!+afy%FNOcTwC?5oW`pnUz5>^l(k(#)hd%mW7>b38Gawr`%rTP8yRqETEGZ>mn0|6 z`g^~>bm|5A+rLf~_&+#qXk7v#+JF1^RDZ((|L5}4i98ZK*1s5bjn{Pw=k+FX6OO)g zr{}cq$*R>cUm2yQzL(?ljrLB z4n^-zz(=Xc73)N}-_o*dP?KO2d%ETWk!It)Ix8}8!ml*I>?ClDA@x|V?q1n#4jOqY zqTn`X^iqAUH%_Z;^a#KG9I(q;kV#6lZ>z3cL)7)fmYbVD1vy}1X=WGzP~{bwqAWHdjbehWY63PZo=hD2oAx`!C~CVjXYID zXYZ`F!f9i4IvM0G@{cuo=jni&07H?LcL zL859er_5PW_6S;uz3cU8-kBTC@0}u`gw&7L9A$iuf1zbg?KGH4A)4dU6c5wva8q-n zFM!BZm0&0j=5JZXDYEx14KljTQ2%%5fq*ZVIX)}qa+Tc=nZj0|6fj<*h-OkWttuwI z4{fOL^xe4Tlxm`d5Oe<4iAGT&rkf{1;r-V(m|F$5xtOlqNc@l@r5UY$-~C;iQZOhh z(;Oqq?#iCyXgD*zqlFBk7ccq<+*mfwhrLWZE6Z+^j{5RAL_GU(2-sU+0I9@$n4J@; z@U}Cy9GPhCPo?}Dd`jd8msI6r7w3if?+jT|wa(`pk&snOfZ1f&2r;|U&E9$s`u3Ss zkMkCi!t=@UxG{#gqokOc_%?9u+@p~pbNsH>-b^$YdiO!t;mWsw*3N_1#vBHptf5OD zBhS1DL8~KTvu7C(h{JRdbEsgCpji6cufT4Buhto-zQ#o-M7&TIT*^XAvsx9rENfMp zS9HPS9y(N8s*&@1d-cTX)4pyi9!q>&>ZLg=?Y6xwOVz5Bjjfa;bOCI;eZHh8bmZ8} z3R-Il@mkv<*UxA zd#RYM7MC)K<6-15Ny$riG1gOgzV=#`X4Z6xYR)Yh0>4z_gipgXm#AAbu{wIsiYKc) zdHFQRcx3{K1FMd}-$6nTXh^m4)eV#k2!#{}W89v{79gf_rgp!=aayJ9t|j2UG74J1vqaYjp;US+tl3fVEgzgbA2WKd8bc)c z8&1gDHtT3N6Tr^kGIJwx{BH>smn3z%DLXw*YR%CKLtg50RZqxir zN@TTN%Jo`}8#kBCSbeL#u}mzWKRv;g=j1uQ)yamvlnoFe^V~6qdbLQJoITvkS9epi zK3A{8FkOkbadt{9LOG6@kg^*MV;4O1c;o9#ALDs}-FeL;8NPgY<9K(|E54JU!b-m} zrK8TbSc!Pyx}9H!0lx0+BP&n=7Zxi={>kb;?nwWRJ%H}ygOL-0H4c^lY$UA0-_DWlX67$nBi0JO>U|5ZZR(Ji~y-srr>gu}7a$6VH{$0m_?+qm1wuwu`4nT+3=CZ(#FBjH$>S*^_G< z49`Ihp3tesQ4D{CmM8xt%InHO_xc%fZpskx!kvjgS$Lt|^`0jk8j0XK{{Gq~v>BVp zt+z~xNpnlb9Er`=6NW8eDE9n}q5XM~*quv$tikFg@Q^qElO++$(HXcwfZs3ovrM-p z_Kq)(IXct>5mCmA77#2V_H8tzD{T)D=QmaW^R@7n)1;_PAElm(RsE zTV#dfj)R?kr$_*PGT%=aW{Wm~;Nj#xqES)l9 zIzapbQAT)(O(#JRlj?sR4@24r%kk3Zv!vd1!Z7s<3H*he-RQsfRntx|YdH2Nd{Qi1=a&g7u9)KoFTZQ+w`_iiT4yfA$eUI6lMuwu z-_FY;`Af5Zja$1&B=}!OyQM)`&O;+v#~j24`^G{lA^>_-E8<3IE;OyLmr!mG-8wry zC8PF<-M^pRQH^a+tZ3Iw!>+&I*-4%TRP~B~^BUmO^?SdrN8^{*b*QHn^qOqvcfKPf zzlITwEcOjb4K_3uevIciLsS$vX77s(B4(9`s5C&)d^6oWW_9{)%M9S$n%f~8_e=b+ z#V79qbJm!FmS6G#`e6G;NC0mT45rgPqh00x>##zg~}#6?o>kIANus=NJlxrdbV zIu5j27Y_n2xM*f4k`#+80&?&-H-lS_9)OK+hCUfPVRx2~;BxB9&Uq7#7Rusrn~PXm zyap}nh(_SOL- z&H;`;aP2^Vjqbit`gi?$n8_$TPtrsKdeB|CScgr(Kjkl}#dC3oOqWPWTrJn69u!n+ z#dQFMv&ZniTAp^?xtME&*Iq?MfVK4H>#>M>+kk9C1AcpXmS31;=ZUVPUb@Y%iLy@_ z(?%9OugEhcb=h@Y>t2;_5)NFc9XAI+CzosCEubZS{A@BkBIzYr_SLbX6{0#gJY`P( zCCw<8Fvk~s*eZzTDeQ;|*u7e1w@xV@t+Lx%=b>ro7IrlASVC!l0Y})J^X2560?K0P zNDtu&B0Tg=PEja>n{?s0wO(bK{lZNiOBJ--PcJ-zd~hwBSp?Vav_5o78QrBpu7O&$ zc8-x&qz%!Eq6}-&vq2gv+O@68dRyM!!0`5ZUNQWTybwsRrwSKd8~bfi6dc;U;ea4p zeLhWLItJTlRlv1{@9)F4Q$!N|@Cf$HTrM90oL6zqkN+G0$@DG^*;D(sEWQHIkVOab zRY)ke`Z5eBLzI~U|FyF=rj`Qo=Pn?MzDAx>dAm5k*pdGN@NNV7W;@;AfzblK!jdLu z2xsV&XT5wSij6KPHpjQB6YD&!gczV=_+ub%T5wEPP?|k)^wEF~z{qIT%_1fhFwIT! zmJJ@v_`zRIo)Vpu#%`5ce-(sK3tK<|di{gYCm08aOvtK5ePWw5ML*EQyA;K1U6DIFz#&i~4-sYiKU@H;$r(_UBDCi1yi)Y!@xsv}3BVKjb5m)a55 zpN<(7{CS)o#{M&Xqh+lEGa6>=URI5X_KDnS=b@4w+6dbb74Mzq3lSHwxXwckm$$9F zG5aOX3)EY0aJmT;25t%~S`_N-sxbiaIlxrgA}Qgj*fYXt=aPmS#<(7UhY|q}T^6C@ z?7z2t0M7eTJ_L^R0541-sMp6e`LD->g%OEDTn4SbFD#|eHC<4P%DE)>SB?YT44`(y zY7#*NpF`q)Yhw5ah36@fy38I~6Zx4!Cv59b=(p3T1VakVuf?|r(7*lOY?v54l=1X$ z6=q#0mWhM=^vbBH;lLA0f#PjtHKah8?Yfc0&5afe(c55}%4GnE?jkPwB zL!YS$hApXIS>401REo=H0D%$ycRw5>S);ROMpn~0i@G%C{5T4#S7&C{km>;>*3D8Y=b5E!QtslC$S~D?v@U{x&Mw0-PRyJ zKrEFu&op(X+B8c{KZF{ZbHxC;%^3d5vhD`pj(v6XX1lr+_D*e}qJjU(R>8x$5G;SO zO1&y)eczxgbkN;_AIDoMPoF6@_#w+Mmkr|-Bx8Z2kEV3pqJhFE(FbytB{me~spmos z?yHNjp7*8k7zT*3&Axqm205H|?o1kMELqb*AA8WQR!D;pSQb(+Q>RL@9n_?L-mwow zIHx^h<0sx?E~VeoidMXjRevIlZ7%K1O(BNrJTu89rQvxC=(B5{lh80o`y*{fY<;YA zPNA6nd7!JD0Z7IWxNTDd%aw>6OUdutm}W{MnGeRYPUNOIm>u2zG;dTC{sBcBgRfR#^(aB0?=wGjw%5RRXAY6fO6lm;ooZ+ z06wxb|G?@L)Uj=pPYU9>9SbK<+6yQ!fTs$z6_8!QRLR4)d{|;={V&9uskeW`zMX+W zW~JTKM_Oa9i(Q2Ewl`!}WvSQup`-)ohsa493Q6+9=QF;`uhRW=#}Sz0t_Hi*D;Nw?zhSn=ktp>TymGNMB|_;F`d<$33m zh@clRn~RcL_C3~@4dY8Hb_I5eAVyUx$M98c(=~65Dv3)2M)MivmHA9=4uAf zNHe@dllqY9c*)YsKi;v3@2tL+oLnZo_2lVck9y#-@Wm)`Td$hk$W))*LF|n{qC71y z<`8UgEVc79y2zUNuFCVIZAylg-h#O;ET#I4tfxFLte0OQ!<%PbN|tq11r2A5N^NXH z*?w}6;fggJ+4iXDue4nqaMz&8nn?h~Wgpe5;E3=&dd64vb^xEAngLM9yMfOrXnr$D zO*p2TORA443M9gu?mQlP;cr1|2hR39)!~SI2%Jd87$pvbcbF1M?MIubw7P|>1Y2As z?hinOzq-9NK=1x7-4anu2Yl^fasle~`MkN}YN?r91UeA%P`eF7oKCqH@Ik)EOa$?~ zi6luoFI%-y%?bhQj((E2>)NrP1CfC|%~DUA8S>-GMPjx%0w0k|pND095=G>7$j!9T z45)v&xUV7etxZnZG9J7wWfH58nP2>A77P+UKe644+7<+fkzdx^^?|RJIj;3urjO3b zlJzH*Dj(m+XT-?z`in##zW?-e>3aie%?WWm=2=i)NNa)tj>i0;+EEhTR@gg2^h4+{jaEU|ATPlx=gLzHB)>jW6adE z=gus)vJy)&>Eh}P4lIZW|A`^Brh6|p$-nsGCY*4ww74!q@$Dw_y{yO%Em z7cEDE&;`pQXWwBOAnHy|Nhy2eBkS5QBQGCr7rl9Qzfse->G*u&S37R>b=PvKPTwxm z`mmhyDj!Q7DVXc!zH#S{e}~BDF$()Sv_gAYOG`KLO00$nm;luG=~C2xBHHOKbKZ4P@* z*EK$f=+s$j7u}yK^<;YW%+AdyW#V%u1b(#_xOb1nES$1k&}6Gnzdkmp-@1h0*r$qX zpoo3dS%~+`h)b`=!j&f8%$NpS(RYG*7n2Ly|2EluyNqM zc}-1w_?1ZMgOH-6Z4uLg^3&dB@$$Pt$x?oNR0=UD=r6#HZP(2-w&P-e@WrRUVNzrr z9=CR&OB7R4;ZJip_h9#m##;kCGJnMfFco%hE$T@^+qg_L|zSt{zJjg4;m2G z=Vi$NGE413;Own7pYWtb(}L7PFxzO>1Gx)HKX0`DXHN%2Q;+Uqppp@ebOWe9llpzc zdfOkF6ZbR-q`(pQP6nTfr6I+Cb9`0^ zL0M+qZz@Gl{U0N%?jfPXZsiYTw!#NNX%O+M9q70GYS#gnbnIE!(ln{>&6S_3NW=CX z_H)@<-M)??#?*$})Dz+Ft|Ls~SMGc!*h0yvhbLqOXw!Z)qiadlW^^F&mppI@;nS<^ zr-}w?pX&)E=JjO!OEw&znRS_F9r8U9GZA5B?duP8+4cHLT;0dU-8oum+3`_pv>&{eY3-HT^UI{5!c5)hDdk0?^*?d``g!JHR@V9U(X2jyLZ7ijz7D%?zJcqc zg8hE>U*S7CK;-A-ba`q7*VKTw9+1F;Iphn4IJ@aSnDy2#MAJ2uXEw?7#w*+3f96H% zAv5&o%o!JMh+i|NXbJrLe(wIy@wUr`I@GTfnoR)S;Zd5ZbL!8nyg=--P;dd>S%wwHtkYa{DCwZT)N49J`v;@&__xdFW`tV$)u?$fv!Lg9qnQXm{{Gd>pswE zpIv4H96hJffpr{6zu4G);Jy8>s6HTiQhmpn`v7x;w3vBjT&VRJf$$Mynk8j+W}?_2b+Ad>sZI#xTgMOb zOO{HePS>ZjqX_1qcdBKyf@>U6g&%HL?iB_5{7$m7sUMl@znS0i(I9ns zP<2lXm=!oF0i;t}H2!11Tl5)Aq&~(T`rMsnpO$mh#$c^kH76%pE_J#tq(X&&&%U7w zF^dG1p|u`*G-vA_U;z8YFR5h3kIoxqKH@;4{*|M+x)tHQQkrG7ox!_PD*PbVby>qy z(!o5$^64s^0Nt^od>W3=dZsFi30XynA>)QDY+>%kHB}eUVyw>L4p$mx^sYYMw-~s4 zq|1+lpn4opns6@y54|4PrG*FI}CaZK`j-LyTx4IC+Rom(;)nIZlPWSmx+0 zK#bLKv4e+*GDt2}qHekihN?WV-1n6aYF?MA+}?43vAs~xMRnYf=_*no{`5b5p4)c) zha#Ni!8hELmG#sSs$$U_$7x8JRepEioO+LN9)=-zZ ztOa=?3pGQAL=v&mr05^QOiv_G3a`IiO~RGRwDIAQYS@=UMfm)kCTMYrO+;aE=1tK; zSxQv^mR!J1wj4a#w;6JSU!b4~B&GMk?A-dSf39D$NHiJCy2-2{;1aqlPc$mIb$Haj zRHBh$@3GrPM9oH;KhpYgV#sHEVPKW`G-Klc<$BFIXD0 zt;#jCK|mk5zv(}ek>d)$8c30c|NKWh29{7Y)f# zT%wQT1bT-yXCq3^XPB$ z-LJ>0G|#8F@TW=9Bb{?=1q@pB^^U=_n{)bpuDJ%`nFVrsGUYPk+FYfwtNWc(;dP|C zxZGt|0sRKTB@01W3SiDk7^dOO*>_d^x#6|TsgdINkWG<#aDV49NUgj#+>{ExN>WYU za8+VA&P%jgwS9*l+C5^=a{F)%^#kN0XCSUZ{(9Hnxz;u0ymK|Wh9X?xq!{UiI^DJ$ zJ7jmAa=Y0jMF4)X_?f*u{P-7iY0Ha8NZm)ie-IN2=Q&k(@T|DQrL@!Sx0_}UrCMnq ziM?h<#o_MN+~0ted`!*J$5O*TCiNmALsNdfX#T-X1n(~qA^LeOx!6%kCQ3bil#<+b zeGJf5W0HP9NV{3l{m=V_(!hW9rOT!zYYuFSZj46~#9rrfuY+{B{x335J#NyWOvk1? zfw}>W8i6+uv!vF{HW_K?GrKGQAqv? z@xOI*^t?f*VFV|J!VhK}Q-rwF}MUKQ&mlXk-D#TEA zf~|KwAjR+Ag_k1#qQyZhdh*I6DVqmCm}uFlQXNjrK7rX%cwUET#(jA1a%#mm&7bJb z2+tr$J?2O0OXe;c`3K7sX>#IFlE`7nT)m~mPf}9k`5C=1`BbJ6_BjsDY7^G)guS@U zhWT~SY@?l&S3;32(uw6-UE#F9VYglJk@^p{GC_Rv-8zTJW{~8O)oUj3qBX+mo0Rwn zYr<20J)dXw0h2^ElhrLpc6tWM^#$t@!^rsA5GR6@%(KbR$F)mJKNujXW$yA~Dt%?P zjw{b-v%UxC_q?Qi5T{v6Qki=nt5pBGctOeoYIay3Qz<=vYg{k3S1j=X$FvKo%{6PF zMzpXOqO!>o>}`hUm=b!!M1Ka+Gu3(c;rafJIEVx)6-V_jo$x%`>j}>Xz-Sp<3R+<%UpH=xaT-1n`((g=065CIadhXsCEfK1sz`PQ zcqt=ugYn7hqTNg5^(9_I1|Ydv$@ghKcqle4w?&<6JgnO1@O#tRgS! zoUQty0sd&kSGO{A{^dyg@C7p;2p2zUB;?w!%vqXIX8;pD!m0s2l_ZviMI)Ow-WlNY z3tXzP=mEnq?G&Pttm6Dg6vReI_LlICY-3p3eO zkX}}J*c8~WA)_=PTI%a#@#-NRt{JRNCN|_t#2rx&BnAaczamMJy9V&ZOlT|*$vbhW z_Ztb`9)U)-V=n7APp)3jnNoL}t&H%qKR79NX4lkacLwnUmD+O-g5zHZjc_Idq}heq zW5G7Ed*4?@Rm9L#wE#I7MC2z21)fbTK&A)W~ z8D4)SIaK-wntQIE((j0V;NpNwV6E8VUoW_A7klY|p8r0+i{9|njrod8k0`{!r#V5z z;t01g<<%h|(Ppktk^v9)jP?ij->=-JS4+r!D2VX|g=fZE50VG>u6?5;o|&BP2Qm*U zJj*4`=jU4yIsVJRhZgts~K7r2a^WHDM8! zpwQ~6e}5qpmDv5Pzb5Hlo26{_ljEd?lymKDKFI^=dRQy#i(W^lMirm)fdHUQ&6eN~ zUpZea$@t=M^dYxyChRifvoa`dk$XxXcyg#9G`Y%3hSAX#IbMgU{f1~BvqhixO0AQ)ZAp+MohR# z8SI-F`*HM2BcjJ{Seo;`tgPKI236j{+gOMONsTdcF#;^%(yVbbn6uC3O<9L$h?=3JL(aeUGMH!(LvZwVl$=xZ6 z!9q8s@fgv1S~r^z+UGQ7FJeR4Q3jirw-Xas-*aRdbtLYw2@?(njn?iy)vG@5c>Rt0 zW7=%(@=+Rk=Bg7~a8~E_1Hwh8x#$y$B)L}ZO{vG#^;4Yp+nOyyXLHHa2*KFOwP;zb zy}N9^<4Ep%g@MaOw2s)9*q9&YX6L1LN@9PQ6ThCB9L+0{Q4M>W_)N+}V=p!D2tqG@ zN_0XO&}a!<>kL!|-81vP8qs3uj=*pXoP)>hyk4@?3$cH%Js@rU9>f1%MSuC2f93lH zZL2g)VeGDP&Y2hlUQy$rK%1IESg?uAL2%nsmcF-S(YtWWuLQQK2m)1QK#U~x)>rF>g+jY z2T{Onl(j||k~E=j{l~Pxej(@Ej+MnRF65BqyC@e)6{DsDp-E9Vi?xgmTGD>-o+sY* z>8-yrmQgzBw-zW?3~Du8iQsdunbNXp8bq47%5_|nEQ9{^4=0X$Rum+wxzEaDXHt%r z;u~jm`Px0+38rQ|l2Z?E*VJyPHataY~j@IV{_c$(g!!UT-P)9cfu>%i4KTC`{<5K@4ot zdx)i@<~mXTjaMhLffB5P967G^^|G`c3&Wh=ivcGkA8b=|OVA%LXzyH`4#eYBb;Ty? z&}1Q=P#Haz;c?A3fp~c7lgY(8^p;2OgGdV+S_!oVR+^p07_#*_nbSGPI5}(u! z`!MWA+fVwZcbec_cU@T8a8eOuQF=ad1xEFk1du89GQppoyiSp zw#aR8?25V*%vr#gJJ^+{3RThSqedQ+^ulO0$-?pYF-9vNqpCuO zf4Cb3+pb=t{q;Ibz>TewX3c8T(I+EDjVodl$G1r}>FD|gHie!pulLLC2v@{RWaXSY zdk++0)b1dTp8Ale|6l;zE>B8z2uXj#i>-(`DwH%M4bcUbR4?WxbLCzU5oxG?`d>bM z>%sNYzCsNc^yi+D)f4!MK$5;Kof{pSc{JWP~^7MyS%A z2wDrKuKwD8srty*bG%M!!vxrtQPbBwkJTYt9Pz- z<=>9xD@uGB{bV;ypUk9EV6Kj}>UTdLrA0SXS589C`;{u^-tHAUZrwXB-R(b;xXHMu3>z~3$I(^CHSzy{NhOtmG?D|35(XlpOJa-~IY6Waf;6I1N(f5B zIMUG@f^>%lyE76k)=Tkg4OtU-V)S z*PsID$L~?La&Ki+r^L*f;?z14UD5%q!0bic>52F9Q;GrQ^Sh08tRIyFcm`7;Obg_K z;iKzDQTn?bGElM8(z@L_qQDG|k6^a(<7Mvza=%BLXL|JQM?`StM(#6S`VfS7C4J8- z0}Pr;izaWj%v@hi9axr?fa)gC+|{P>^fqQD|9qjo<)@oX z5objDsc*TT^Q4z*GOM)I9WoL~H(<{Cu|zq;-+sAt*}E3JIdQ$sDxq+Tn>s7Bo88PZ zx=?`8Ae-umN{BOJQBi9mR;HwHQ|uf$mj$_u+L7gug5Jz{zun4m5^($h9JaG!MWEyR z-=IaIqe>5CfmF^3zAJ-xTrQ=oxq>hhMZ@H|o(0xRNxypKj9ODFHpah-7594ipMvlv zZZWI3R|ar&(8(W?0k(PB|88f2$Ah{hPQCcPt)rWykNoDO{VWWa3M317I$9i~{0@W4 zXglwucgX_F6m6?}TXY#xB}ee|J5fzYVt9z>2p%WNJc5ATZWyrV%g~40#(k@J9<7h| zkpa#ovcVT;r!W3BcV5n@{hLwyJNDqkzwH-)S2|z5t7!RlsrbbWnl7&Ip5AJ%dxc=J z_3{WJiGsgRIJ_q&o4}6OxgC%AnV5Ha%5Igt-537>yJg|ZjZ3l8QW9MwoZP8`X>}wi zFjp4*@rytHR=jie<&CwAOeO3+R^QPE6Jz-A;&DEFR-Sc6Y%2D=@0e5~Sa)reE|_t! zUy*ZQbd_vLIvC=E`8L=>q)nCy?(=7@K2Fm#b;_}t*SaI=U=Q7H5z?_|W2kuf7`uw% zw5G|IBA2~WgYx$-s=P`e4n3zZ$;c(M90;lubp3cmT>Qz@HGE21t1v!%x&bjZ@!hO{2IMhx-y}U}qLu1?2;7{oRX~2D z%B70^(L&AHaG@BlDZAMELra2=9|vi4^KSOBy>CM9kDl65F?fc>e0^^z&EUIzn1jqG z>!J+Bz59cHj1>!f_Ft{je`pupavpg%+LG`}Lu256pgd|4T{P%!_WG=9UBMg9$;SW7 zDetL*+=_z*wdI(CC8qDgO${Aa+ycif4|IAeKbwPNx~ijae6)o?U&_4zbX|Z?)(@8< zBO9H1NcxVvZn}zYIcUjjm%}|jkBT|xGI;VN%c;~o9VPpcm!}dnPNBQ4akU)8-KA9I zuBZ!%3JkkiK5FL>6a7!yZ$3sWiPdtLsqi0lb)A7Tkdb7SU8(64jTYC9`KL)yq5a@a z!lujy-6(fJ7s5E2qgA4&4u0l@xX8|3rLXaC`jxO(1G&k5=oXRQG?~$NB(_~SfC}QS zp5{bK!5GtxYS~Wl^Lb-yV%sWxtT$ej<2vqzL6^4wQnYo+wh-Y90?_(?3(*^Ue(4Nq zQ&d(O0aNQ@KMFSe()&x7OHA$oCjvC$9HyqUsgQlV?l5P)p)ea zo3I3`=oEr}Np;sKr~btr+nLZc&lyj)75kOqqC~_-IAakHGwoAKagKRD^hiRVbg8PF zkQkq$yyQ zdqpM<8^UdM<2L`cpZ)6Y`7QleVXcN-X~y&%`H{z@|3|^I@XmySc~4KAz5PHT#HuNw zX^Ju3Sb?L*wm}P%XShyhjmS1=#mQu#o}j+&SDtT6T`%TOxpVUVOK)J3*N(t~qWPTN z{-P_7SZeM-JKGj>W4DLeTw&ct%$X{d)c<@tjnjhaXtJe}^2WEQfa*joOuuTHj8xTJ zlTrezwy|kQ^;wi5Ap2CbqNcxTC`bK}>_LO`>-h4S27z=)CGnWsP=S6&rgBQ0XwvKjVF@_PstVa#OCN)>+pClsT-=}CE?DqOyH_G3PP2-c_$@+4Kz(r~lYAd;8t2%j|Tdc7* zATzLZQret(zup}8JCOZ4LONwg-`plRRv%u^nTpNO2i~n7$ft0W$Qo8)P~-ZM{Cr9J zz^wU30Z4BlaZW~{J`=sH9RImAgn%1BP3KlFVlyF$gTN=O@up zklodEh5DDu(#eoO6V&cZ1S`B9;felDViM;4qpJzTEovS33!jsy zX=%iY*qyvyQ7DaPMz83RYU+$=>e0_T2}fljg(4M>;HW4~Z;?6Tf}IswR^GYdVCobf zRX|C~`a}0r0)gnU`okrSxKVq}LncDC_P2oLAm#b&*kgOC$+udusS&21Rk;{||Yr*I&jAxJHy2|6Pt6PL@o9#C?5)JSnzz^96?}pIy}jq}_?@q@YSNZKrof z1-9Ws@`f)<;P3WC7gf`Tx+|-uwBH&|6^JBCarCD(Q4BD(6eg5b$O6vN<$(|}^^+xu zq@wAHLkbQ~LeE_s!IajSNg@%#ueDR{Ism6*Sff(!l zkF}!pZr3~&*rDfC=*HP@(J70hBJukL#;@)(s!qPu^eP!UDVx2r_6)pXSLo3?cH+K& z--#QD*0-w^*z^R^JE^^h#18PH?jP0R_+@H1sWNQ%3cAT`^pMkV(TKUazP_&32KU-7k|gwBv*l z1oDq%&Xku^>pnjj69BdyBEScvwNhq;!OG8i`D~Cdd6qk*mT&Wgetd|;lSK7@e;WUn zs|n;|$+S?aWX=z^e>apVdWvGF2OvHIari#bYo4jUiig?+EELho=b`*Z)-JoHiQ@vs za;eiLZ36>(2(HP{0+Jc-&jJO;G5kv-It#NqX%Hs&QiZqKVDbu$Dc=)n!4!R2;OA9c zHIXrVgG`p4=Kmi_agE`3ZWz!L`oxZvtsO+6F+q8&(jcUILIfUP2tJcHwz;JR)Pltl z5{85y#?G#_9%((+#JBX}JFF`4@81bKh!O4$$#D*}$1~gD<*-LnU-&Oy<@I^Reet8m zH>l=^Di4@Cr3W`%I&%^lCEF&X6Chr_`!wI+i?Uj`?!-aF3{E`dVj)U+@tt3yQ|`zY zrHNgY)7#_PT7^TTppPtg$6V{=}PxWUd=K zrK+o#FsjkGi5ByZ+P&noyPDs}t+`~7q~d;pm@5>i?4f+9o2R|Pbg};C!yQEa{D(WA zy|-%8GV1l*-ZQvd%oTX`lpOEhixzC#q!(^i*buVWW#8T|3X%_tXjyKwTU{CbRh5e# zYdin-j@{b=&*59{6nQ)B4Y6JX8R$#)WZNg^c@5*8*xjLbD_h17vOWz)2peK&Pa{ST z>B)VQWZkn%+FCF_>0b(bzk`{^w&lEMbnYn`=PshiMl)ChB+0m!X{|@wvT|^`{X@x-4N=(;HA|M6N5M$du>Oh6gpB za&>f7sItf7ZLhw-gRGA~mV%$DGWB2*m+@{T&2_=d9xM&Y`d$eczk}1rDVi&mUFyEx z42dSs720yR{@usYyN>zq@Ovu1r%mXF=V{VpFOt)=L+R+40_fJhPN~RKT)Q`8)2;s| zWzmn$DXQnbo5Jv<$Qo;ntZQuoic9h`voGtk#^x*`kI8%Azpa&xGE98k2BavMR^Xja={Q;@z|j2KCS~( za{AZV7=k~zQv1|$^vmfdf5|=^6K0wjc_|-Ed$q#&A1X&U76`pWtJ3-kM>q6-@Cy(+ zM>=JFbiRHr8rrocwEZAnY;<;lTyWnK^FiWOShI3e?3$zz?CyK1I)!2L>{rbZ^jGAp4^#W~U1RdDKQ&XZ z$7b~{LC;+eihODIPUMraHB7#HIbx6f@)JxbrG!7Hqi_km$OO(j{qa984sYN&O zKvEK^`TiX@@+c^*oh*&AJZX8BRT%zX*I%|Ruf5we*_Ck9+ms%|;G#|sM+!D97JU|XE@Ci-$TZR$_$3Ex4RuS# zr75Z`7Cn1@cmL)$%YGV3t*sC!d+-zV&9ale&>|Wy3vY{rtrja^>}La5_iJ&wB1-xA zG&zj$hwCoOygzb%g0RC+9b>?H9K`8>3XR1I#(T!BY4Uh#1!E2H@i-lug?D5wR|+ zvTxNPeFD%o8ZW59 zEpz`sWEwIkZcuKRK7fu>XJSQ4sFYneJ509xb&S62D`Z@Zeo6asm-KML`_5`K_Ky<( z2C`l#fU(4ET4ETn=}t8uIxM!QN>?oONONDaSmxCC-VoYu4@W;dqo9u#tml2ZrSB2D9Tk2Rp7vugVsBiN*^DVj zd!S)(ZXR$hk3G|NtL~YWT-+@+{tP|9Km#$-rc3?XN1n zp1VKh_`2_bBeJKYi&F96phjmZ6*H4{pztvA*BqAN7gdHVu$|T2BK`CQ`!K`AHgS{qE-|lqt3Mq_D`8 zyz*5j#?~@tRopKe?czXMJ}CXLRgl(p^b$gT86j}Mh@nx~$B$0}GK>St2eqr3U%S#2 zISJ9D{%FA)r1|}cS=W>Pk`VXWfdvlPgbcb|5^b>`_xBnfhVxKSOd%KrhpISd5 z79a=nXML$Vy7Ol_Gu?fz8SVuwAKnmcjB$wuv^Nx}bW5`P>oP?3KWG%ra$g>$+?twD z(oFmOrB5Q`PHrcqBL3kGLdnkSC{+lLNkgyWY0Nx+w7xR*$x{;gGUYFLSD5~>9HOkT z!}0F$g{K&ksTXs=0J?MP=Li|lit~aWYh-=&&!-}{h~&Y-YF}um7Ed|84Idkwf8*88 zgPp!>9tamAF%DWOGqdZz8Ya<8=FswZzzP*3AbiV z;tB*F(2T*=)JlZ>3*l}sSY`^{Sgf}G$=!fLIR7>EY5G>>q`#<#;|e1BEZ|la$pQS< zhzw9H`9#|viLetBEY5aC2^8P*`ox_Edk$$mr^TY|HBg+?D4h+D6nT5J4yT4#=ywGU zi?S9V1-8KQ;wb{(x33WzQNf#7*Ehx#jauVUVY`JSB)oI#lu3tl25hXPL{Cn^%q$*~ zMnk0Q&F&Oqr_%z8KdPC_CFFKb#L>o}PTugC0Y4R=YxqGmf#ehDxS3E6jV47 zs=Bvm>L3O+y18>&Sq93O_ehZD@Q-JUjf;ohVL$t5I0LeEMyc95Mr*m|u2O?2e-zc69=j`a*MiGfM4(lx-teEeI4$dfh z`(D&Wd6L1I1XLnpcu^n&{g4)W=1uh*rX)p3FubR@CGazWa^!Uq>24VQG|5@TVkiwp zojgwz{Jb50Djx)WO2`m?MF5%nMa=&TOmE`5k_RDP=$-qWB6!ozw72Os+##1OT7Sa( zzL8GB|H%PH*KGH^P2H4al8~ADr?)8K#O$3?Juhw@g}^mgUrD!>`ZiBnFe`nv1gz&_ zNu)VVJvml=M2pLG#eMKoO?tlUCYrUdmN9}gH<=x;vJH1kP|dCY=q!W{4_; zWH8U5@*$4;ueWzAl5R^_0Y<9a3YsBso9qGnnIr9_&UoXN7GggD8=Hk{f{$qe)*h=U99fE3BamfV&9Z;sLS3h^;d5h=1wmqO*w2u0`}7r`{yHMIHJb8P z6;xVPv`DJLqMolj-GYEqKVZihUv8oyZ`Bd^xVD7Us`AlohggU!e{cxk_2kZt+rA%i<+AxJdo@+ z)dPfGxypNMg&YVJ+Gn^!v-r}S1O#qR)rj(`M7^(D@`n*_yUxov(8|WMOF<`jUqfQKDGDmcWkQZv2l(BkHvdAb z#ZtFWM0k_RsSnP8!(yq?L5hI?iuz!@0x;Qk|6v^?NX%!yZUuARdVCnPLnMygXQ?H$ zf}DLSM{y5H&`iLQ^NNAdwqo<1K(7m8sZ1s@Mc8alN-fqWnB_YT0eSM>27^%Ly3P9C zab3TdW0y*ru({wc*r6n_89C!Ks!;QOiPP*TTd&l?IT3I-J<s!CP7zyt`9^Z*c5i zdPWl|64IN6I(-@EqFXY{L)QP$vhCK7`(HO>1kLtxe#J7ZQ2Y0K>O{6O{WdL ztc0g4H6{81fsA{;ev)4WgR9u7iU#3tm_*?+B`+1NmzEuYI}6R$ZJFP$@VaY;j|7Ha z^^2%FNRT27^2a2uheG^5j#El)1-qn9Ixb5B4qI?y+eNzIn$w(&kihwj< zt3whKD3|W0fMmJo96g{V_DdV;eE!;p)CIF1;AP}gg&34i+B_gonRqJ&lvO6O%c1&y zism0wS|Ncl9|?uj74Ko?iwkv5J@@!sWrh^ZyLVaj98J=SO<{}kpEvSKMT*q25}(~9 z{`sQd%5w9{3!Z^j^R;Krz59yJ^0=n~PoKoqw5m)YUQ9)g5rvq0u{$b7bII+~2>N*PCB0iZ`kpjL(g@dTD~93|^UofK z4q)DM0ox!d9rx-kQOSSuEIRYF=f%>9zL(0?DL?{j!v63PD<-2~Y^+U5?fTR!Jv5kY z!7GL_bpidB!E zFBhA<9eG42f6rQ%sC?DHT(%|&eZ%3N($b&o_V`KVjRagMBNU_J76 z#rqK&KNQ4ug^Q~EqnmuRhWM3!f7%uT^%hv+H?_&FAp3|F4fOfbZio&gnSTkIj(hZI zZ)9kfsdPjX&eG-zvuXh$nvd11)1dpJqjhVMyhl1#zcMt3)1C`88*Lr;hLMC(g1dt} z8&^gKrSo_87uX}dW)Riov(Ne^)64G06x+~3Euab{+KP*l0aSxDaN1>`)m+^dRl0eN z(K_2Y3ZR=ysuQ~;C@3LZUPxc-P6%L?IFYTDs{Ly7AhkGQslch%RCH=^&_ymu^NbI> zGWZ)z{rY?!C3;yQcbWJ(Z#pDW2uooatp28Y$aDdHEroBeK(tcbaImgO#4n1a4T9yYUph_J-${noenr*R5}=MSesf<>fsatz*?txEJhGNllJF0ba>UiDg6=Oi<%1qD zr9RVQP0?h3rFe|FEH%!O6)4vYD{ah!0Di9O(I#lcJwYuyP0J*wPd}Br90Ulj$SK1( z(Ugg|qmdLjdb`CchqKZt5CgWTz!SHxGlke*IuG%CCH^hdZq8j=k+_QU(=pgBXE|;U|~m*y$>rq)D;Z` zNgz5$nhxp-_~wRRVJwLKxXB}e5PQj`r8%Xx5*Met%ZE z-?vo&!q)d+A@B$1zLw7pzZHNGHLF?0idGO(A?q<+H>}bP6w7nHS!6zAFEyMIK24An zf3S)|ykwMj6`We{OJ_LOuKGN8_ZxR(w~F76Q`+>$g|(XA=l)f5tXo&N27koz$axPc zAJlzLtYkQ#VNEY|sQS!m#k?Q%-pSVZrjgIg372Y)Rb+^bnIZdWs+}MVxlq%s@+(wn z>%hOiX~AM)ztZz<=7@dIMgS~W ze%)@+PoFEwwX$UscJ(Y-HO*E^YbEC0w0GkuO;0nmp}wE~-x!i1*0b0TktO&xhijm% z)C`=r9&pGQY481dsgi?z+NWQ5=$bKNOfLZ=z~wi&MMYSovNw-r+JCn1l3v2N(~x-T z=r4N04V(Lq(RxW}sblQF{R=%Qy^@|z9O+0bjUcQj57nKKSYXWgnm7OTY=rtWfp^mf zmhya2MeL$_<99Fi}BnX~0cEWV{qsL$#i={C8!Gx?bqM@t z>1iA)@VaHkP3|k|(Gd7&MysIjhb2Xw66u5&LwAwDPZ8(QL<+NUypEw1H8NJKPuv0V z$aAXMg?Of2x;=me63RH*XNTv=Pvhi%i^obJDB|+?HM0v%ts$sBomg=go z*^?V3D`^0HfrrTfGYN8fw;m3I){Zxto$UZ%#;-w~uz$4J79b5JKAjM_an)=fd1kTt zdT}dgY{VF>m}7u;Tvk8R%Q2YW4)0SCkTlQ_lC4inCA?JnOZ!#T<4GHhGX1w5?MGff z%lg6sYE8D#AMZuJq6r4@4xNM>mqMlUMc$Dmc>7&{A2>(u?FGPRe(H%Z&)&XDP7cnFlz4L8efd+ng1^V_>f4dZmQ&>&z%m#dfaMBbWy0GsdUdk#C~xRA~c&L zHuMS*ZwRQO`Ws8Wwi3|LuRacdq<@G>?4l!3*^WWd@Xw03st_1y?G)nb>*-F8p^O>sNmMkH5QI9efdM~&bbP6w|OW5ds7^Fo2|6*@%wogxH_n`nczO6;l z@G?kqRCu!n#8*H_trNJe#_UB9`7qW00#5gtpZtD@Wo;q((vw6%jK&?Z; z@8ESqn!qW#W$^XJx$2O}Eg4P{8u^ME4S)V7IkL?gEh`8rmLlt2D^wsn7?C3hL zk7Hq6da8x;7NwVg?3bmsr9W1_qMY~!u-SoijkNF^^~k1@g#&MjUB~eZkYsf&m-te~ zzy+s&L*jc4$clY_5^{&mg}$$+?1b&nJ9dAb0p&f}8}(gTA7%di-oN>Xb#QJ@Nk&!X zM)07A1R?NQRiHJZylDCvudbSV!{8G=;QLwJ#&%77 zg;gv#78Oc#N`f$N1SFyHNTcX1$E-CMd5M3qFP;$Di0o; z_>xfCqwK(bml`hbcZ3-c0L0 zS4o4ELutKXNW|h^XBS@Xq1*pyoMDg6Klz>K49g+G2kIU=p48ofUco@&2 zAV;CLK?Tt@6aacDAB^BB8~Z7x#zi7(8LTj0C^+v)Vj=ThqChtv@Vqt!RM?kZf%EQLcRa( z`zN-E0--nY@IZYG&QJUc>D~_hshjIg5T1cpM0~u9zxwqkW8){FMnh4pJA}^qE<&w zabFmD+FgZP7+e~gW?ERN@vFB8-WBG~yC?02p~kn1SRV7}svSPO>PY3ywxYEutoUB! zJZNfVR05kS(M_BlXqj^GB~ACo^H_3yBophz|3<+%F*9=fy2X@iN92i+2lObRbJIZ; zn%T-7-LMZo#phLizRa2*SQT}f_*WsgLS2U&BjrVqNgoZaiPE^bz`3CZFD9)56c7&t z);3@%y{3FGJ^a8QcWNir`N}D2ZoI-%a#00}Z<+d(+D_%WJ(ho^oCZ7a8MvDTHa>7c zwFnaWY4$^O5q+E~MTr&s{kha)PMo?#r?6jb5YFw1>Il&MKlQx0s*U`^D2RkyGQ?Vn zJWwuq`ZufElksAlNN*P1{gLY$%&0e6yI;`%wXK>yY;tgNh8ea_~W)b}I((LCf=e8S&srd-hjlgki-) zZ*G9Eg8gBibP zKE*qN%4-mahLAt!_RX6NCyg7*<4Wb85OZ05NgTuw~{Rb=OejB>tzBjD!my!wCvc%6lqVT(OiVq#YYmIJTbY)E< z!@T?hM=t5Cp^VQxsZpwF)wSKv!?cR=6`u!4QG=nTbUzXkO#H9p*8US^#Pa>AZ>On` zKZ+n;zZRTUM=aBDUht$~Ge_e(k~ft8Gp)#?K&dtkS@nb*5#u-09`Qk6Q6+G|>~3{0 z)`(A$0YP~$938n_J4R(agKqy2&F71C+a|?_FH>|L(yR;}45!Y-OC9ngV|B}aynU20 zqP+9Fj||v;jLJsYQvmQ_6Z_$V;i=nwptccq`o;c_7h!zcdNe_7Vuom4#B4ZvDE+6i zb|t5Zce9O7YJ5lLq6dfJ_`YoG$2v?p7|N@!cGw0B>E#fH3RHbn*b2%Ny;F>8wUu1g z{(*RAtZKllNQ4Vv@_D%2Dox<1~qGFTP8^qVqHA6o~z||D0}N-gedq5)Q>$gphd8otTtB zd@38c0@CL>#yY%$Ke0<)k7oEY6fDjZ0M;vBmEuSy(UX(~VxSIcAn39nu2BQ^JM?#~ zuK>p9VRGusQ(XPlOn6KznCfWuK^V10lJW>SXO^b$z@EfHjXK!%W1Fr}`s~1Q{PiWV z;2-H7C3gXg5WBR~YmmWtfD{2p`_l^T(?8=t+$;3@r5!qf{1roC3LAla9L=Axdy6%e?Tno(E<~!wZVJNY9pC2xa z(PrZ4$ZSt~iHSwuL+Cq|Kj9swq^TV9UaSx#d>Zp6hI$yAQ)OXE`l)4~ia&=p##=Tu z33>*;dDR0wq7vP32mepd2De&!6x#x`rAJJYwG*q9h-!mK)#Qr)cbe*M@gxvsf#2{F zqG%JgUjEUovi*SFYn92URPRR;Sk#_R;&%0LgashIi&A@N(x%&mpyuJX`2Z-U6mi_D zLa}9LBaG2)rN1B+VeuO=8t&#jKD{CfVzNR@+qI9 zVgDxi4V?&bJ8oO0;2-98b%I2?E-BUwcZbB=_?r-uPl+TtW)>*RNT=tIL`Z*G5d^j; zqT8ET_2KUowyxA>fZgCMt3Jo%xmz}ia!T?*a6cBZ>)71-2jQO_j{5iOkYw*-C9wJ5 zzn?EENP1+%KME^+!cvyLeMYM55Wil!HfySDina?2S~I70QCz4~8$YUiFxE**k>-ln z^x|g?qJ+M$qP6b|6*%q_uWQi?s6Pf?bZ7XD757O`sL*YhZoyq^zVhBDuH;4o?6;uf zy|1rK5&j-$Y8qQx9rgAl+)5<%Sl`71uvz*QL?lj^re2~h{9$X~83v|E0x;1QBP5e) zS6-*55ka8ImY}M}v1sb!@aNe%y2INo3>~)@B&SfAZn+%2vqi50J9r{~BR4&hTNZ%o zo^6E~BY;B(fS?nzaN4Z`Z8{jG5^xKkDQ95r+WDHtmt*fs0H3wWjwB7B1`6_ZNwBFF z_A}L~+{gLwTCh$tl@v9zn}6Qh!eizBg}+S;>Tcz3YYNwjHYBAyHnt2Ibz&8lXbFsz z*j?ZBCXNPjQV4mPbxK%{V#p7|9D~n#J1bvbY%76z5;)qL?2`A?oQVl^Xa(yzYv(t_ zylO)*M~t%L=C&Q*6j;GSA69VTJyt~1cmU|lHw~+8d<`W!u7R0{KYC2?Zk0ssDg=k(F-<&FuJ&m@;UNsv} z&b)arb`|mN%dTQlK)fVphD$eCHT3O^9xJl!nC#DB}H5k1<=*ISx@Jlzyk%GF$5|(5&7vBmbxIOJeNp=rK`!i)`#| zU%dwJz~~BvpGke@21^hjjeEQ2HkRwY>Z@${Xs%ya+c3MJYVRd3w=1GZ(w^!@;3Qu8IbJGp*B z4wuV?l^^~7N1Y2{(7)XU@Grd&tJIwz?*?jqjr0P3Q&ci+VJaVl!7lr+ESnndlU=@o zWv~@*!63UBXi1C57fzl9Z@Wgxt*)16N?TvjWW|o#$Bflvy8qKpHYkUzW zKiYdrPR4V%I%El`^kfbZqpQ--2Wx=B9SN9&YHMc6Z1ZQZ=0?#4WUyqPoaWX@ zi8h*Z&uY{yF7DR3w`I=s-2?}JPlU9xX!Upv&|#GE%xfOZEBLTd2YAiYa5dXCF#`AK z-Zp%_Vtpm~mdHWtYk;9dlP%DM2^qc-hBCkKxKSrqj*TVw!?ilsU3ym@Y;C5`%EJG&B29)(A ztTp@j4VkCD#H-X!iXzQ+B^3+zy#?nN-yg3y41r@E-=u#IbpcAfF;sMKEA%!(p~E7J zuaJ^X0f!_3G@3;c2f3zVpbRs`IC5dK)uqbB82&7A=R&HP8-DpeCMsTV3#kV_CSDVb za)d(sW7QV89wYQvOk_UAnT_Y+FtrMPhzB=}>epEIL}7KbrAqZ{AQ@GTCC)!d7%Ay| z9LlO>Y8`;^^qwr1--YWhdOvvO$1lrs-31aO?`$WT=fC{vF&}d-IM2H>WEN@oBErbs zuu*^ID$LIzzV6R}*~4czPn9N+2QV?^uQ zXu%l)T-`Y5$>S?11t=yw>$ zos{yhx(g`B_>uQKMm)ZuW-*&(gmweMB8D73g&P0P!YN{Rv$|~1N?M$=)N1wdNn*ECbj+<8z(K^*+ihnsnG8+$vN;tAx@$9 zZJ&J7Cb_#RW`O6`xpG@kKBt|NTt3QUcHI8QTWtwC0e~SNrj!^v6-rDBci#|CooS63 z&-Rn@SN$|`UtleKBebgZy723nmxwWXa%@^_#xkD}R3t!h`&le2*VxIS8<(e#&(OPTWpnLR1Y_?o%HZ+NIgTC*G{m zRE<=YPzE%dC`7l$k@7a~OK&HB^A~4|IVZ=V0_-e`k~bC>{mru`_0G#Tiy*$$>sf=j z;-l~Ue2HhN$Ul~_%-B19ntCaNz%*yl~u*od+@hJDpD0wqj$hh(YK197Ik1(w&1LS$d7fv zDu-4eY@}rL^)JoN`y>8!8!X}+w$dd%;Q+sLC_=b;-Fn#Cd6~pJ39Xx489IjRZj2o< zlkka=Pzt1bh(R+qATE<83#HdK6<4xvt<` zPahS*y_FFid?t^z6+1r5t)XXVHZL)pQJ@C`ewRq74*LOQY@Gszz!dur^7J}pI}yor ze|d=%@>Fxg;=c~aHnUf$j|p(8yt{q*lSJ3o(Lpg0Cm)+5jH8G~Cv03PEz*x%CeovO z;9>+Tv2>WYOY*Ye>*gIdmPF`^k{QVei0p|u;x+>HoLBEfk?f6gbyvTA8tU0>Lanad z@FzWlu?ZBD4dza**Xj|g_C-BX!Q<<%J)6ymk?{Q(#QeK=Av{}<_fIa;Iy4C231>P? zIvwJkq9@KI4cAgE0NR&5k(BdU8X+*}u%; zH`c7gQ-_}eL(INA+FR)6XLbN18U4@4#}(D4kmO#PQE_rEa{+PKTIa;cnH*AvT3Z&th%qaVC&i?M}T(*&OHpuQ>?ntDE@vgBh>8(?Bdd6M@Z&#0Jsp(aiSu6HUbSW1c~e2;q0S z)?P%;npvktAR?g{3w|u=J4j93pjW>6Z{Ds|5;0tQd)~urO)gnrq*5O0&6YCr$-}IN zgGjp>+{zu$YjVxXn~N#*B_g(JSzgS*g@m~2)u89Ffa9^Fg@f5L<980OL1D{om1wA0 zu>0vF;-H>)<37jUDrxlgMDq|qQPM!BZ$($q@UCg(e^P1Hvcv-tb<8?uk~a+AY&kbM z8fIKFn^Qm>mQ25M{hDuUq(JpAO6ixf^)nAC;x-O7B{irHl$SQ$XCzc)9Q-cR?HJbpYSac?&-P!# zW1htW3lrVQY59@ufWSX7Bm~Af>Gy~N|>;pWBp%@8_L5mbv{pD zpDU7bi=RME#a1=SYR*aL=#Odo=x85_L0OKaP}C!d=()*U&>1x@oOQV*kp^+Quqpss zIVor)z$5p(XIhyk)ogI(8;ZCsa7FkByXfZMwXCfnO+aqDM-y$?lspUJ0?>8~v@%sizRsx5mnP?`Sg??&DycG8RoJ3YJE9VV3d#{A{(sXUfL zr0hfDHwF2-?jNWKxVxekyEdYm`~KEBnbD~65o{{g)_Y7KzCCH(KW#2jwhIMp-;P+L zQcj;PkU!KUu=rVpim&Z%!g8ChjEvQoBOWgCudJ1_h@PC76JxNZ#)SRxX98M;zCZ=> zc3Uxmc;;D{5ZlJgs-3?%F^EU)Q0agon=ikQ_ARvm{1q+BH}`aa;lPgsh}vJ-VTNN6 zn58RoSv}mhT>bYiauQNw^Qa@&_|95_%N9#x9Y|m4VxK`? ztzRKYU~PKU&<4^5Vh1uI8=vS*5Y^cok=!7}hVyak*8-6Jb+*H34!ggg(2E%p;$Yfw z(rxI{g{OT4il}6Q*fJr`m&-=HuPT3%Y7kcl)}gKHt9Gpj@`EObCHi`qI`9`Y=>PnC zY5bB2AX)D~C1T*d@8eYi{vT229nRMOhyAM2nkDvXt>9QCW+=5sVkW3nMa3#=m0GP$ ztP-Jiti-IEHLAX?En=3oT2*_u)M(N5oZoX@&-MJ1#L01l$Y7p5-fTG(0lUi;2C}C|%ay(Qy`0JT#5GGV8vttTMsR59q!N zlreZ`p^yjWq^(_4?8pt4L2m9qd95K$b~bT<;kRy##Tu#QW*%5>zx_8-j_5wWN$J9K z$w-{vC`9t=)k4*tw$ycJt~imeQq%3{Um&n-wlW^nA|x}r@D3CEahUylCPG~sO+K=g zST6^m5N9JYA5W_M@4=P#3F@Exk}L>rt0C7$-N{Ov2vFqmI5lSc5-mnpre+UbQ+sed z6#h*yO8(NCJ8<%Q4D`D4V(VbONfy7&d%+#F8ohYz2PQ)6o4diInA6!F`=@Q=2ercY zjV3=~PVt>0E;x2gmP#@3{DpMUzERK9DOQPVD|+*S{44AMe1!|*1Dn2?`RgM|r&FPk z{3|(cA)}EU*}f^0;fubAkF117U5)$78aXTM9a^js3Ox%+%u!l{n^E@$#?CkhS>wGq zD>;nye|hEC-x_85d;*1m*FHlRK5!6f@MYP)sTPHM>L20&okij4Y~*+Ey2oqknUxC+ zA-Rq)j6Q|-+!WkmBQXn$MnO7S>^O+rNHT<5Wkdp^xMVChQmwe3Ir-fxEE819HbW=k zWWJH3+B+Tf2qSc7zBSy(I$ACJ8!9;FLo8F^ae;5vq-_{ghi)nTq5T0AgkpSDrE~|5 zVTy}*zbxgADbjy9dSRkxK83lCF6^MhO{Lnq@gIK5SLt7=M3COQQgSk{(_Ml+iRj;h zRwD~`81}WYav#cXXa04g?oBF|!)Rapu!EvY{MaCeY1Vu>NA&$L=otkR-7{ypZZ%)^ z!%C~Ppf9Rf8ya*OBg&Q46T%&-1mBiU6@qhw_5zuO$GssUb z9q_z%yl1rxdaKQPs7Nv+QtI+h;Lo@H7@#B;RDj?`h&6qf3wdG3zc3!anq!`>1pmPA z9p!TnMqWM?9`rmO*aEd1$_xAMbT(3h;za8%Bp$#>oJY0EV=M*(?#dJQG=-KbKpAl7 z8ssdR7qsRK-8$H{YJc1QVup@F73hK}(~z<3iv_0VQv$*nNqEJy{0DDhfpBIoHTgL| z-Z$Z3-5mETK@CfduIL@7QD!kco9zHg#z7Meg3|$jy~kJ3u~KewjGGJkU)3B9uBg3h z{T9KY5Y@hHF_9juQfeBwJcZ}DcmP({IX(9AWFfqsk#8vQLSrQiIPjt3eEC+#NR3+BG5)mi7H@ zvC+WVMgQjX2GLm;7tjb`{oiLlv2kL}B%O6{2PHTNqz5 zw78HL0~o+*#eA=iB85hI%DS2tz=Q)=i-GTpMt3OcXqSW12P6(23-1yjyh$)2kfeWa zMtTO%6!zD)Fit#6nWVj&$w?Y8W9)NGm&Y_QCKSo9|5u9e2KPVk-Z%fMQGeIJ{5$*d z_lL#5Q;UBGs*nGi5&nID{14KAdkYV&sCdyJyWTXLjZ1EjS^prR$xa142eCyBp9)>D z6?UqKhA1s&GWV3tj5TLrNd z@?D2_Avm8`hPQ%t;(?n=JwZdj)X-hhk)?t^&mB0yQ`FRaRoXM3?hU(Q$*}YVq`4zj zQsE7*k}@=tbsRDgc>Pe_%3Ff~gsAysP6< zk!0tymQ@M0)RTEoa$A%fF~f=+^VGVj8N}n}Ez9D!6*+pg;8DO72Of89#hR-zHMhO8 z2AK3@G-)|9hO&>kjP!mhV>aIlnq&i@7hHabCweg2({plkyx;Gg#$an#2ZvyXX`3BC@k|Tv3!*|ftYM}jsA{c z|IEF(OwaMApjE=QPxo}yQAX_w3F@WR1>pUN0ZP?(~p zPuV-0`Ab<6!ziyTXMpRazfeMTo5>g2fKYqIs%U$m>Yv)MIqQb)$Gcys(Ub&l`V z2JUlx6~ylwP-~eWR^+a|w-mEF zsBPFXI-n!lDN?^mOmydyj!e6O^Ut5G$c(3ub03z|Vx>8Xf($fFtxIqKcTI;6GeyS@JU z{yPI1MoT^%zWFEYa_j8(s}$ITE6-eyI~FMRt2z|kMOLP7x>pM!8;~_G#E{5J@nwT5 zp0TWVp@`;mZJ*vJG<=@Y_gsTtqFKXmAu{<~1I}cwvSc}c!F|>8Nn+yh!?aq8vdN*v&QCbhv z>yJC-^a)^%=W54}WTCP7iWWC}wYM#_mqVAVR5zpd;as@}Qsj|fKYX&5(` zuWNW$N}A7z;lKW+9k`qe{9+Al*$<7|)D^rB@XVKa*}_Tq{Nzvg`eQVAI4kY@V+XQGZcU@m2n%68z&I zDp~e|o2a;>U)m0uY!P|;v3TC#!clwE(Pz@Fr_n-Y68HIjEjb91J-V+aS4JI*PAS6V z(#KQujVcqYsh6Lz7-D~4R>`^-JW?kUc+L2!>dQ{G?u@(9QZ-gz;v{G2A73-(#!UkF zaf4Q|2`86Fx%LoGu}2jaRnq@9jrv3MSoDEJSqzK*wx|EAixp872cUaKH`ln?lUMWH zD6bqk5~?xkegx?FP zk2M6Q=jj4iNWqqTT15vqG~=aw=4gatdZqIL+u22E5No7_j9)kxUA*R~NC zF|=Bl{dqAJWf%OiQLuf$;m3os)(7HB@{$OfpML}lu$yTOe592B^!pd@mr0sgN2sMj z9$ZpNFL=GfkWeXE{@)`igKfccABtGgv=f~H+~^m#F-PG$cVqnDoY$#$#H_k^R93_g zx9(k$uyTmk<<`VvCIIju#yw8hsvB{8LkxjFR5q^|sMeWa0C^ZYm)=MsnEFixBDlu5 zuBKO{zu?ubw!$xcn|4H2f?XNA!CS>!D)*JrAl|N%2Nsly2FnmI7n)%^4aJTinJd@$ zOol*R60w-UX&{h+LX6654$T*gosCsCiW^npArbx~?Oqze&Qr6s-gsQ{M_$li58F%e z2^amjx!RP(ggpy#ZHewLK=ow}dC~mILM4ADuowa5V6!`v+^EpHu&;ebw!jle^K}`_ z@OMcKxs>TPrB!gsD3cwo+%xR|PvA+*7}vcMKe6G;hLU-|E?U&PggOuEss?BK2MZU0 zX=?Io%}Z4cO6A{%sDPuMYo+@CqQ(C7h+gKD1?Y?mYIUEbB&u>(&B$cK-suv#8LQG2 z3+x_zq5>*C-!1#b;4PF`lu9~f;wiRB#;T|Y wOZG;k_#X0aZTR?g&>Qj;tHeHY= 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 literal 0 HcmV?d00001